Spring Cloud中使用Feign实现负载均衡详解

2022年7月18日12:15:47

本文属于【夯实Spring Cloud】系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货。系列目录如下:

【夯实Spring Cloud】Dubbo沉睡5年,Spring Cloud开始崛起!
【夯实Spring Cloud】Spring Cloud中基于maven的分布式项目框架的搭建
【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解
【夯实Spring Cloud】Spring Cloud中如何完善Eureka中的服务信息
【夯实Spring Cloud】Spring Cloud中使用Eureka集群搭建高可用服务注册中心
【夯实Spring Cloud】Spring Cloud中的Eureka和Zookeeper的区别在哪?
【夯实Spring Cloud】Spring Cloud中使用Ribbon实现负载均衡详解(上)
【夯实Spring Cloud】Spring Cloud中使用Ribbon实现负载均衡详解(下)
【夯实Spring Cloud】Spring Cloud中自定义Ribbon负载均衡策略
【夯实Spring Cloud】Spring Cloud中使用Feign实现负载均衡详
【夯实Srping Cloud】Spring Cloud中使用Hystrix实现断路器原理详解(上)
【夯实Srping Cloud】Spring Cloud中使用Hystrix实现断路器原理详解(下)
【夯实Spring Cloud】Spring Cloud中使用Zuul实现路由网关详解
【夯实Spring Cloud】Spring Cloud分布式配置中心详解
【夯实Spring Cloud】未完待续


前面几篇文章,对 Ribbon 负载均衡做了详细的分析,这一节来介绍一下使用 Feign 负载均衡。在介绍之前,我们先来对 Feign 做一下简单的介绍,先来理解一下什么是 Feign。

1. Feign 是什么?

我们看一下官方的解释:Feign 是一个声明式 WebService 客户端。使用 Feign 能让编写的 WebService 客户端更加简洁,它的使用方法式定义一个接口,然后在上面添加注解。Spring Cloud 对 Feign 进行了封装,使其支持了 Spring MVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡。

2. 为什么要使用 Feign?

Feign 旨在使编写 Java Http 客户端变得更容易。

前面在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用

所以,Feign 在此基础上做了进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义。使用 Feign 只需要创建一个接口并使用一个注解来配置它即可。这就类似于我们在 dao 层的接口上标注 @Mapper 注解一样。这样的话,即完成了对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时的开发量。

我们用实例来说明。

3. Feign 的使用

3.1 依赖导入

<!--eureka Client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- feign的支持 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

3.2 启动类注解配置

@SpringBootApplication@EnableEurekaClient@EnableFeignClientspublicclassOrderConsumerFeign{publicstaticvoidmain(String[] args){
        SpringApplication.run(OrderConsumerFeign.class, args);}}

启动类需要添加注解@EnableFeignClients,表示启用 Feign 客户端。

3.3 Feign 客户端

我们先来回忆一下,提供订单的服务名称为:MICROSERVICE-ORDER,然后订单服务中提供的两个获取订单信息的接口url如下:

/**
 * feign客户端
 * @author shengwu ni
 */@FeignClient(value="MICROSERVICE-ORDER")publicinterfaceOrderClientService{@GetMapping("/provider/order/get/{id}")
    TOrdergetOrder(@PathVariable(value="id") Long id);@GetMapping("/provider/order/get/list")
    List<TOrder>getAll();}

可以看到,Feign 客户端要添加@FeignClient 注解,value 属性表示作用到哪个微服务上,这里表示负载均衡作用到请求订单服务上。要记住,Feign 也是客户端的负载均衡。

方法内定义了两个接口,接口上即和普通的 SpringMVC 没什么区别,url 即订单提供服务的url。这就是 Feign 客户端,通过注解 + 接口的方式来和订单服务的接口绑定。

3.4 Feign 客户端的使用

定义好了 Feign 客户端接口后,我们就可以在代码里通过@Resource 正常引入进来,然后通过普通的方法调用即可实现对订单服务的调用,如下:

@RestController@RequestMapping("/consumer/order")publicclassOrderConsumerController{/**
     * 上面定义的 Feign Client
     */@Resourceprivate OrderClientService orderClientService;@GetMapping("/get/{id}")public TOrdergetOrder(@PathVariable Long id){return orderClientService.getOrder(id);}@GetMapping("/get/list")public List<TOrder>getAll(){return orderClientService.getAll();}}

启动 eureka 集群、三个订单提供服务和这个带有 Feign 的服务消费方(端口 9001)。通过在浏览器中访问:http://localhost:9001//consumer/order/get/1 可以看到,轮流访问三个订单服务。说明 Feign 默认是集成了 Ribbon 的轮询方案。

4. Feign 如何结合 Ribbon 切换均衡算法

以上就是 Feign 的使用,很简单,也符合我们平时的接口调用习惯。但是这是默认的轮询负载均衡算法。在上一节我们知道,Ribbon 中支持很多自带的均衡算法,我们只要在代码中根据具体情况,选择合适的均衡算法即可。甚至我们可以选择自己自定义的均衡算法。

那么使用 Feign 的时候,如何去切换到 Ribbon 中其他均衡策略呢?甚至切换到自定义的策略呢?

也很简单,我们可以在 application.yml 配置文件中来指定,如下:

# feign和ribbon结合,指定策略。feign默认的是轮询的策略,这里的配置可以自定义MICROSERVICE-ORDER:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

MICROSERVICE-ORDER 表示作用到哪个微服务,com.netflix.loadbalancer.RandomRule 即前面介绍 Ribbon 时里面的随机策略,当然,我们也可以指定为其他策略,包括我们自己定义的,只要把相应的包路径写到这即可,很方便。

重新启动一下服务消费方的程序,访问上面那个测试 url,可以看到三个订单服务是随机调用的,说明配置生效。

  • 作者:武哥聊编程
  • 原文链接:https://blog.csdn.net/eson_15/article/details/86590402
    更新时间:2022年7月18日12:15:47 ,共 3507 字。