知道Feign组件,肯定知道还有一个Ribbon组件,我们来看一下这两个的区别。
-
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也继承了此功能。
-
负载均衡的实现
在上篇博客中,最后我们已经实现了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(); } }
-
复杂均衡策略的切换
先了解一下Ribbon中实现了那几种负载均衡算法。
我们先看一下,Ribbon负载均衡设计类结构,首先在idea中找到抽象类AbstractLoadBalancerRule.java
在类中的类名上右键选择查看类图
结构如下,可以看出是实现了两个规范接口。 我们继续查看AbstractLoadBalancerRule.java的实现类,在上面的类图AbstractLoadBalancerRule的框上鼠标右键,选择show implmentations,出现如下内容:我们可以看出AbstractLoadBalancerRule有这么多实现类,通过类名,我们就可以看出这是负载均衡实现的算法类。
介绍一下 Ribbon的几个比较常用的负载均衡实现
策略类 命名 说明 RandomRule 随机策略 随机选择 Server RoundRobinRule 轮训策略 按顺序循环选择 Server RetryRule 重试策略 在一个配置时问段内当选择 Server 不成功,则一直尝试选择一个可用的 Server BestAvailableRule 最低并发策略 逐个考察 Server,如果 Server 断路器打开,则忽略,再选择其中并发连接最低的 Server AvailabilityFilteringRule 可用过滤策略 过滤掉一直连接失败并被标记为
的 Server,过滤掉那些高并发连接的 Server(active connections 超过配置的网值)circuit tripped
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,
感谢作者。
-
实现自定义负载均衡策
创建自定义策略类,继承抽象类AbstractLoadBalancerRule,重写choose方法为自己的负载均衡逻辑,在配置类中添加下bean配置。
具体可参考:https://www.cnblogs.com/yufeng218/p/10952724.html,感谢作者。@Bean public IRule myRule() { return new CustomeRule(); //自定义负载均衡规则 }