前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud 连载(五) : Feign轻松实现Rest接口调用(附视频)

SpringCloud 连载(五) : Feign轻松实现Rest接口调用(附视频)

作者头像
不安分的猿人
发布2020-03-02 11:41:02
1.1K0
发布2020-03-02 11:41:02
举报
文章被收录于专栏:不安分的猿人不安分的猿人

上期回顾

上期我们讲了SpringCloud中Ribbon负载均衡.学会了现实中一个非常实用的技能.有兴趣的同学可以看一下.

SpringCloud 连载(四) : Ribbon负载均衡与自定义算法

本期内容

Feign:

1:Feign是什么?

2:如何使用?

Feign是什么

Feign主要用于客户端调用WebService接口,让调用接口像调用对象的方法一样简单。

比如:

创建一个公共的common组件,在里面写一个接口,声明几个方法,然后让服务端去实现这个接口,同时把这个接口打成的jar丢给客户端的工程师调用,工程师通过Spring Autowired去把这个对象取出来,就可以直接调用服务端实现的方法,有点像gRpc技术.

通过SpringCoud的封装使其支持springMVC注解与

HttpMessageConerters,他可以与Eureka和Ribbon配合使用以支持负载均衡.

通俗的说:

Fegin是一个声明式的Web服务客户端,使得开发web客户端变的更加简单.

使用:只需要创建一个接口,然后在上面添加注解就可以了。

以往使用调用Rest Api:

之前我们使用Ribbon+RestTemlate对Http进行请求封装访问,我们需要写入服务的地址等信息,实际开发中会有很多微服务接口,我们就得定义好多微服务的地址.Fegin在这些的基础上做了一些优化,使得我们在使用的时候,像声明一个 Service一样直接调用接口的方法.

如何使用

第一步:新创建一个模块;

名称:msc-consumer-department-80-feign

内容与msc-consumer-department-80相同;

pom中加入fegin的GAV配置;

代码语言:javascript
复制
<!--Feign 开始-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--Feign 结束-->

第二步:在msc-api的pom.xml中加入对feign的支持

因为有可能其他模块也要调用,所以我们把这个类放在一个公共的模块中.

在msc-api的pom.xml中加入对feign的支持

代码语言:javascript
复制
<!--Feign 开始-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--Feign 结束-->

第三步:在msc-api模块中创建一个接口类;

注意:

1:里面的方法和Server端Controller里面方法相同.(可不同)

2:每个方法的RequestMapping一定要与Server端Controller里面的注解相同(路径保持一致)

3:添加注解@FeignClient(value = "MSC-DEPARTMENT")参数就是Eureka中注册部门Server的实例名称

** 这个类可以看作是Server端Controller类的一个接口。

请输入标题

代码语言:javascript
复制
package com.xiaobaibi.webservice;

import com.xiaobaibi.bean.Department;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.*;

import java.util.List;

// 开启Feign,并告诉服务我指向的是Eureka中的哪个微服务
@FeignClient(value = "MSC-DEPARTMENT")
public interface DeparmentWebService {

    /**
     * 新增部门
     * @param department
     * @return
     */
    @PostMapping(value = "/department/insert")
    public boolean insertDept(Department department);
    /**
     * 根据 ID 查询
     * @return
     */
    @GetMapping(value = "/department/get/{dId}")
    public Department getDepartmentById(@PathVariable("dId") Long dId);

    /**
     * 全查
     * @return
     */
    @GetMapping(value = "/department/list")
    public List<Department> list();
}

第五步:在客户端的主启动类中加入注解,参数传入第四步接口的包名;

代码语言:javascript
复制
@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})

该注解用于让Spring将这个类注入到容器中.

注意:这个一定要在客户端,就是启用Rest API的模块;

代码语言:javascript
复制
package com.xiaobaibi.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient
// 对部门微服务加负载均衡自定义算法
@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})
public class MscConsumerApplication_Feign {

    public static void main(String[] args) {
        SpringApplication.run(MscConsumerApplication_Feign.class,args);
    }
}

第六步:客户端Controller调用;

之前我们是通过RestTemplete输入Rest地址,现在我们把第四步创建的接口当做一个Service直接声明调用就可以了,同其他的Service一样直接Autowired即可。

代码语言:javascript
复制
/**
 * Feign方式的 Service
 */
@Autowired
private DeparmentWebService deparmentWebService;
代码语言:javascript
复制
@RestController
@RequestMapping(value = "/consumer")
public class DepartConsumerController {
    /**
     * Feign方式的 Service
     */
    @Autowired
    private DeparmentWebService deparmentWebService;

    /**
     * 新增部门
     * @param department
     * @return
     */
    @RequestMapping(value = "/insert")
    public boolean insertDept(Department department){
        return deparmentWebService.insertDept(department);
    }
    /**
     * 根据 ID 查询
     * @return
     */
    @RequestMapping(value = "/get/{dId}")
    public Department getDepartmentById(@PathVariable("dId") Long dId){
        return deparmentWebService.getDepartmentById(dId);
    }

    /**
     * 全查
     * @return
     */
    @RequestMapping(value = "/list")
    public List<Department> list(){
        return deparmentWebService.list();
    }
}

总结

如此即可,我们相当于创建一个接口,这个接口可以看作是Server端Controller的接口,之后加入Feign的注解后,在调用的地方直接创建一个service进行调用,非常的方便,另外,该技术自带Ribbon负载均衡功能(默认轮询)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 不安分的猿人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档