Spring Cloud Feign组件负载均衡详解

知道Feign组件,肯定知道还有一个Ribbon组件,我们来看一下这两个的区别。

  1. Ribbon和Feign简单介绍

    spring cloud的 Netflix 中提供了两个组件实现软负载均衡调用:ribbon 和 feign。

    Ribbon

    是一个基于 HTTP 和 TCP 客户端 的负载均衡的工具。
    它可以 在客户端 配置 RibbonServerList(服务端列表),使用 HttpClient 或 Sprig的RestTemplate模拟http请求,就跟我们平常调用hhtp接口的操作比较相似。Ribbon在调取服务的过程,使用的http的服务地址是注册中心的服务地址,多个相同的服务在注册中心注册,通过Ribbon,就可以实现对相同服务的负载均衡。

    Feign

    Feign是在 Ribbon的基础上进行了一次改进升级,是一个使用起来更加方便的 HTTP 客户端。
    其采用接口的方式, `只需要创建一个接口,在接口上面添加@FeignClient注解并指明要调取的服务提供者mingc,然后在接口方法上通过@RequestMapping注解加上服务提供者的接口地址,即可实现服务的调用 ,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求,通过接口抽象,使项目看起来层次比较清晰明了,所以大家一般都选择Feign是在。

    因为Feign本身里面就包含有了Ribbon,因为ribbon具有负载均衡功能,所以feign也继承了此功能。

  2. 负载均衡的实现

    在上篇博客中,最后我们已经实现了Feign的负载均衡。

    blog传送门

    项目代码传送门

    项目模块结构图

    在这里插入图片描述

    通过在cloud-consumer模块中加入负载均衡bean配置,即可实现默认的轮训负载均衡机制。

    package com.consumer.config;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @author: yhl
     * @DateTime: 2019/12/9 13:37
     * @Description:
     */
    
    @Configuration
    public class ConfigBean {
        /**
         * 默认按顺序轮询
         * @return
         */
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    }
    

    我们重点说一下负载均衡均衡策略的切换。

  3. 复杂均衡策略的切换

    先了解一下Ribbon中实现了那几种负载均衡算法。

    我们先看一下,Ribbon负载均衡设计类结构,首先在idea中找到抽象类AbstractLoadBalancerRule.java

    在类中的类名上右键选择查看类图

    在这里插入图片描述

    结构如下,可以看出是实现了两个规范接口。

    在这里插入图片描述

    我们继续查看AbstractLoadBalancerRule.java的实现类,在上面的类图AbstractLoadBalancerRule的框上鼠标右键,选择show implmentations,出现如下内容:

    在这里插入图片描述

    我们可以看出AbstractLoadBalancerRule有这么多实现类,通过类名,我们就可以看出这是负载均衡实现的算法类。

    介绍一下 Ribbon的几个比较常用的负载均衡实现

    策略类 命名 说明
    RandomRule 随机策略 随机选择 Server
    RoundRobinRule 轮训策略 按顺序循环选择 Server
    RetryRule 重试策略 在一个配置时问段内当选择 Server 不成功,则一直尝试选择一个可用的 Server
    BestAvailableRule 最低并发策略 逐个考察 Server,如果 Server 断路器打开,则忽略,再选择其中并发连接最低的 Server
    AvailabilityFilteringRule 可用过滤策略 过滤掉一直连接失败并被标记为 circuit tripped 的 Server,过滤掉那些高并发连接的 Server(active connections 超过配置的网值)
    ResponseTimeWeightedRule 响应时间加权策略 根据 Server 的响应时间分配权重。响应时间越长,权重越低,被选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。这个策略很贴切,综合了各种因素,如:网络、磁盘、IO等,这些因素直接影响着响应时间
    ZoneAvoidanceRule 区域权衡策略 综合判断 Server 所在区域的性能和 Server 的可用性轮询选择 Server,并且判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 Server

    具体可参考:https://www.jianshu.com/p/186b4ceea6fc, 感谢作者。

    Ribbon默认使用的是RoundRobinRule轮训策略。

    那么在我们在项目中到底如何切换自己想要的均衡策略模式呢?我们尝试实现其中的一种

    在cloud-consumer模块中的application.文件中加入如下配置:

    cloud-service:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    

    cloud-service为服务提供者在注册中心的服务名称。参数value为复杂均衡实现类在Ribbon包中的路径,如RandomRule随机策略的类路径类为:com.netflix.loadbalancer.RandomRule。切换的话只需要更改其他的算法实现类的类路径。(个人觉得这个方法好蹩脚,必须知道负载均衡相关的算法类)

    还有其他的配置方式,具体的请参考:https://blog.csdn.net/wo18237095579/article/details/83384134
    感谢作者。

  4. 实现自定义负载均衡策

    创建自定义策略类,继承抽象类AbstractLoadBalancerRule,重写choose方法为自己的负载均衡逻辑,在配置类中添加下bean配置。

    @Bean
    public IRule myRule()
    {
        return new CustomeRule(); //自定义负载均衡规则
    }
    

    具体可参考:https://www.cnblogs.com/yufeng218/p/10952724.html,感谢作者。

发布了23 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_35457078/article/details/103473132