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,感谢作者。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值