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();
        }
    }
    

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

  1. 复杂均衡策略的切换

    先了解一下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
    感谢作者。

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容