SpringCloud-Ribbon学习笔记
Ribbon使用
1.当引入了nacos服务发现就可以不用再引入ribbon依赖,nacos中用到了ribbon做负载均衡。
2.RestTemplate 添加@LoadBalanced注解,让RestTemplate在请求时拥有客户端负载均衡的能力
3.使用微服务名发起调用
LoadBalanced原理解析
看源码的思路,很多框架代码时间都会遵循开闭原则,它会提供接口支持你对他的功能扩展,但不支持你修改,因此有时候看源码只需要记住核心接口自顶向下的看,对看源码有很大的帮助,尽量的避免打断电debug的方式,因为在响应式编程中很容易被一些回调函数扰乱思路,或者也有能在一些框架中会有一些定时任务不知道从哪就触发你的断点,例如nacos框架中就有很多定时任务检查心跳,健康状态。
1.@LoadBalanced会在restTemplate发起调用的时候,通过LoadBalancedInterceptor拦截器讲nacos获取到的实例列表中mall-order(spring.applicationa.name)替换成 对应的ip地址。在通过LoadBalanceCliet调用http接口
LoadBalanced.java
@LoadBalanced使用了@Qualifier,@Qualifier用于筛选限定注入Bean。@LoadBalanced利用@Qualifier作为restTemplates注入的筛选条件,筛选出具有负载均衡标识的RestTemplate。
LoadBalancerAutoConfiguration.java
被@LoadBalanced注解的restTemplate会被定制,添加LoadBalancerInterceptor拦截器,SmartInitializingSingleton这个是spring的一个扩展点,是在所有的bean初始化完成之后调用的,所以使用restTemplates需要在bean初始化完成之后在进行调。假设在@PostCpnstruct中调用则restTemplate不会具有负载均衡功能。假设在@PostCpnstruct中调用则restTemplate不会具有负载均衡功能,例如提前的获取token,提前对数据预热
LoadBalancerCliet实现了ServiceInstanceChooser,ServiceInstanceChooser遵循了SpringCloud的规范,服务的选择器,对于负载均衡来说就是在服务的列表中选择出一个服务出来。
如果不使用@LoadBalanced注解,也可以通过添加LoadBalancerInterceptor拦截器让restTemplate起到负载均衡器的作用。
Ribbon扩展功能
IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。
IRule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳区域的实例进行访问。
IPing:Ribbon的实例检查策略,默认采用DummyPing实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。一般不会去使用,还是会影响性能的,因为请求之前还是要再调用一次。
ServerList:服务实例清单的维护机制,默认采用ConfigurationBasedServerList实现。
ServerListFilter:服务实例清单过滤机制,默认采ZonePreferenceServerListFilter,该策略能够优先过滤出与请求方处于同区域的服务实例。(这个功能在弱化,尽量使用IRule)
ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域感知的能力。
IRule详解
- RandomRule: 随机选择一个Server。
- RetryRule: 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。
- RoundRobinRule: 轮询选择, 轮询index,选择index对应位置的Server。
- AvailabilityFilteringRule: 过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。
- BestAvailableRule: 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过。
- WeightedResponseTimeRule: 根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低。
- ZoneAvoidanceRule: 默认的负载均衡策略,即复合判断Server所在区域的性能和Server的可用性选择Server,在没有区域的环境下,类似于轮询(Zone---华北华中华南这样的区域,region---亚洲南美北美这样比较打的区域)
- NacosRule: 优先调用同一集群的实例,基于随机权重
全局配置:
调用的微服务,一律使用指定的负载均衡策略
局部配置:
调用指定微服务时,使用对应的负载均衡策略
修改application.yml
自定义负载均衡策略
通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。
实现基于Nacos权重的负载均衡策略
配置自定义的策略
1)全局配置
2)局部配置:
修改application.yml
饥饿加载
在进行服务调用的时候,如果网络情况不好,第一次调用会超时。Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。
开启饥饿加载,解决第一次调用慢的问题
参数说明:
- ribbon.eager-load.enabled:开启ribbon的饥饿加载模式
- ribbon.eager-load.clients:指定需要饥饿加载的服务名,也就是你需要调用的服务,如果有多个服务,则用逗号隔开
LoadBalancer
Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代Ribbon。
Spring官方提供了两种客户端都可以使用loadbalancer:
RestTemplate
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。
WebClient
WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。
3.1 RestTemplate整合LoadBalancer
1)引入依赖
注意: nacos-discovery中引入了ribbon,需要移除ribbon的包
如果不移除,也可以在yml中配置不使用ribbon。默认情况下,如果同时拥有RibbonLoadBalancerClient和BlockingLoadBalancerClient,为了保持向后兼容性,将使用RibbonLoadBalancerClient。要覆盖它,可以设置spring.cloud.loadbalancer.ribbon.enabled属性为false。
2)使用@LoadBalanced注解修饰RestTemplate,开启客户端负载均衡功能
@Configuration public class RestConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
3) 使用
@RestController @RequestMapping("/user") public class UserController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/findOrderByUserId/{id}") public R findOrderByUserId(@PathVariable("id") Integer id) { String url = "http://mall-order/order/findOrderByUserId/"+id; R result = restTemplate.getForObject(url,R.class); return result; } }
3.2 WebClient整合LoadBalancer
1)引入依赖
2) 配置WebClient作为负载均衡器的client
3) 使用
原理: 底层会使用ReactiveLoadBalancer
引入webFlux
相关文章
- EasyCVR对接华为iVS订阅摄像机和用户变更请求接口介绍
- 精选 | 腾讯云CDN内容加速场景有哪些?
- 模块化网络防止基于模型的多任务强化学习中的灾难性干扰
- 用搜索和注意力学习稳健的调度方法
- 用于多变量时间序列异常检测的学习图神经网络
- 助力政企自动化自然生长,华为WeAutomate RPA是怎么做到的?
- 使用腾讯轻量云搭建Fiora聊天室
- TSRC安全测试规范
- 云计算“功守道”
- 助力成本优化,腾讯全场景在离线混部系统Caelus正式开源
- Flink 利器:开源平台 StreamX 简介
- 腾讯云实践 | 一图揭秘腾讯碳中和?解决方案
- 深度学习中的轻量级网络架构总结与代码实现
- 信息系统项目管理师(高项复习笔记三)
- Adobe国际认证让科技赋能时尚
- c++该怎么学习(面试吃土记)
- 面试官问发布订阅模式是在问什么?
- 面试官:请实现一个通用函数把 callback 转成 promise
- 空中悬停、翻滚转身、成功着陆,我用强化学习「回收」了SpaceX的火箭
- 中山大学林倞解读视觉语义理解新趋势:从表达学习到知识及因果融合