alibaba / spring-cloud-alibaba

Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware.
https://sca.aliyun.com
Apache License 2.0
27.47k stars 8.19k forks source link

add 基于spring cloud loadbalancer实现nacos权重路由 #2136

Closed XuDaojie closed 2 years ago

XuDaojie commented 2 years ago

Describe what this PR does / why we need it

  1. 修改nacos-discovery文档 nacos 有权重路由的功能,但在spring cloud alibaba、nacos文档中均未提及如何开启此功能,即使通过搜索引擎,有找到的也基本是要自己实现的,不过看了下源码,实际已经提供了完整的实现,只需添加配置即可。
  2. 新增基于Spring Cloud LoadBalancer的Nacos权重路由实现 未来 spring cloud Netflix 应该会被完全移除,目前似乎只剩下ribbon了
  3. 修改.gitignore文件 使用idea插件预览adoc html文件时默认会在文档目录生成html文件,对生成的HTML文件进行忽略

Does this pull request fix one issue?

None

Describe how you did it

参考的NacosRule(目前已实现的基于Ribbon的方法)、RoundRobinLoadBalancer(spring cloud loadbalancer 默认的轮询实现)

Describe how to verify it

nacos-discovery.adoc中添加了使用方法

Special notes for reviews

CLAassistant commented 2 years ago

CLA assistant check
All committers have signed the CLA.

theonefx commented 2 years ago

ServiceInstanceSupplier is Deprecated, please use the ServiceInstanceListSupplier replace it.

HaojunRen commented 2 years ago

com.alibaba.cloud.nacos.ribbon.ExtendBalancer

Is ExtendBalancer banded with Ribbon?

XuDaojie commented 2 years ago

ServiceInstanceSupplier is Deprecated, please use the ServiceInstanceListSupplier replace it.

这个我也注意到了,我发现RoundRobinLoadBalancer中同时使用了ServiceInstanceListSupplierServiceInstanceSupplier,并且优先使用ServiceInstanceListSupplier,根据注释似乎是期望ServiceInstanceSupplier.java被移除后再将serviceInstanceSupplier属性移除,我预计可能是为了保证兼容性,所以也做了保留。

目前最新spring cloud commons 3.x 已经删除了ServiceInstanceSupplier.java,但2.2.x最新版中依然保留了ServiceInstanceSupplier.java

HaojunRen commented 2 years ago

2021.x版用新的,2.2.x如果没有新的,就仍旧用旧的,@theonefx,H版同时包含两种Loadbalancer,是否要merge到2.2.x?

XuDaojie commented 2 years ago

com.alibaba.cloud.nacos.ribbon.ExtendBalancer

Is ExtendBalancer banded with Ribbon?

这个类不依赖ribbon,我更新了文档,在pom中排除了spring-cloud-starter-netflix-ribbon依然可用,可以将nacos-discovery-consumer-sclb-example中ConsumerSCLBApplication的第82行替换成configuration = NacosLoadBalancerClientConfiguration.class进行测试

HaojunRen commented 2 years ago

我建议ExtendBalancer应该移动位置,否则给使用者一种错觉:ExtendBalancer放在ribbon的包下,是ribbon独有的。可以考虑如下的包名

com.alibaba.cloud.nacos.balancer
HaojunRen commented 2 years ago

有四个事项

XuDaojie commented 2 years ago

有四个事项

  • 权重路由,在SCA 202x版也是缺失的,不仅仅是SCA 2.2.x,所有应该需要在两个版本添加
  • 为保持统一用户,Spring Cloud LoadBalancer应该跟Ribbon最好保持一致,例如,加上开关控制,也需要通过@ConditionalOnClass注解根据哪种负载均衡包来开启哪种负载均衡下的权重路由
  • PR里的代码是否借鉴Spring Cloud LoadBalancer的源码,是否考虑过兼容源码里的一些其它特性,例如:区域亲和性Zone,即会不会加上权重路由把区域亲和性冲掉了
  • 在Spring Cloud H版和2020版的Spring Cloud LoadBalancer实现方式有所差异,如果merge到SCA 202x,需要做充分的兼容性测试

谢谢指导 但还有俩问题

  1. SCA 202x也要添加此功能应该还要再提交一个新的pr吧?而不是在当前pr里同时兼容吧?Spring Cloud LoadBalancer 2020版和H版比移除了不少类。
  2. 如果是创建新的pr,是不是指当前2.2.x的分支和2020是完全平行的了,SCA最新的master代码不会被合并到2020里?
theonefx commented 2 years ago

有四个事项

  • 权重路由,在SCA 202x版也是缺失的,不仅仅是SCA 2.2.x,所有应该需要在两个版本添加
  • 为保持统一用户,Spring Cloud LoadBalancer应该跟Ribbon最好保持一致,例如,加上开关控制,也需要通过@ConditionalOnClass注解根据哪种负载均衡包来开启哪种负载均衡下的权重路由
  • PR里的代码是否借鉴Spring Cloud LoadBalancer的源码,是否考虑过兼容源码里的一些其它特性,例如:区域亲和性Zone,即会不会加上权重路由把区域亲和性冲掉了
  • 在Spring Cloud H版和2020版的Spring Cloud LoadBalancer实现方式有所差异,如果merge到SCA 202x,需要做充分的兼容性测试

谢谢指导 但还有俩问题

  1. SCA 202x也要添加此功能应该还要再提交一个新的pr吧?而不是在当前pr里同时兼容吧?Spring Cloud LoadBalancer 2020版和H版比移除了不少类。
  2. 如果是创建新的pr,是不是指当前2.2.x的分支和2020是完全平行的了,SCA最新的master代码不会被合并到2020里?

会合并过去,然后再做兼容性调整。除非是只属于202x的特性直接提交到2020分支,否则暂时还是优先在master分支做处理

XuDaojie commented 2 years ago

有四个事项

  • 权重路由,在SCA 202x版也是缺失的,不仅仅是SCA 2.2.x,所有应该需要在两个版本添加
  • 为保持统一用户,Spring Cloud LoadBalancer应该跟Ribbon最好保持一致,例如,加上开关控制,也需要通过@ConditionalOnClass注解根据哪种负载均衡包来开启哪种负载均衡下的权重路由
  • PR里的代码是否借鉴Spring Cloud LoadBalancer的源码,是否考虑过兼容源码里的一些其它特性,例如:区域亲和性Zone,即会不会加上权重路由把区域亲和性冲掉了
  • 在Spring Cloud H版和2020版的Spring Cloud LoadBalancer实现方式有所差异,如果merge到SCA 202x,需要做充分的兼容性测试

谢谢指导 但还有俩问题

  1. SCA 202x也要添加此功能应该还要再提交一个新的pr吧?而不是在当前pr里同时兼容吧?Spring Cloud LoadBalancer 2020版和H版比移除了不少类。
  2. 如果是创建新的pr,是不是指当前2.2.x的分支和2020是完全平行的了,SCA最新的master代码不会被合并到2020里?

会合并过去,然后再做兼容性调整。除非是只属于202x的特性直接提交到2020分支,否则暂时还是优先在master分支做处理

已重新提交代码

  1. 无法兼容202x,实现负载均衡需要实现ReactorServiceInstanceLoadBalancer接口,此接口中choose方法参数和响应中依赖的类,在Spring Cloud Commons 3.0.x中已移除
  2. zone、cache等功能本身在serviceInstanceListSupplierProvider中通过委托模式已经处理好了
  3. 新增了开关参数,loadbalancer.nacos.enbaled=true时会全局生效 但这块感觉和ribbon不完全一致 ribbon的ribbon.nacos.enabled=true 只是控制是否自动创建ServerList \ NacosServerIntrospector(如需路由规则生效还要添加ribbon的配置,并只针对指定的服务生效) 这俩类一个用于处理获取可用的服务列表,一个处理是否以https形式调用服务,但这两个功能在sclb中使用NacosDiscoveryClient已经处理好了,所以我觉得可能不加开关配置更接近ribbon目前的使用方式,或者换成loadbalancer.nacos.default.enbaled会不会更好?
HaojunRen commented 2 years ago

loadbalancer.nacos.enbaled=true,enabled是不是拼写错了?

XuDaojie commented 2 years ago

loadbalancer.nacos.enbaled=true,enabled是不是拼写错了?

代码里用的这个loadbalancer.nacos.enabled

HaojunRen commented 2 years ago

其实,个人倾向这个PR直接去2021版本,H版使用Reactor负载均衡很少吧?

XuDaojie commented 2 years ago

其实,个人倾向这个PR直接去2021版本,H版使用Reactor负载均衡很少吧?

0.0 那现在这个都已经整好了啊


我看了下如果要实现2021版把当前已移除的类换成同名的新类差不多就行了

那如果要实现2021版的话我可以自己从2020.0.0里切个分支出来再把当前分支合并进去改吗?或者你们合并的时候再改下?

HaojunRen commented 2 years ago

如果要Merge,估计要到下个版本了,这个版本目前都测试完毕。需要@theonefx 来定夺

yuhuangbin commented 2 years ago

我也是建议这个pr不需要兼容两个分支,直接提交到2021.x分支,2021.x以下的版本,默认使用ribbon就好。ServiceInstanceSupplier 在新版本的Spring Cloud Loadbalancer中已经被移除了,避免兼容问题。

HaojunRen commented 2 years ago

其实,个人倾向这个PR直接去2021版本,H版使用Reactor负载均衡很少吧?

0.0 那现在这个都已经整好了啊

我看了下如果要实现2021版把当前已移除的类换成同名的新类差不多就行了

那如果要实现2021版的话我可以自己从2020.0.0里切个分支出来再把当前分支合并进去改吗?或者你们合并的时候再改下?

你可以改成向2021.x版commit,这次2021.x不会发版,估计你的PR上改一下版本号即可

XuDaojie commented 2 years ago

我也是建议这个pr不需要兼容两个分支,直接提交到2021.x分支,2021.x以下的版本,默认使用ribbon就好。ServiceInstanceSupplier 在新版本的Spring Cloud Loadbalancer中已经被移除了,避免兼容问题。

那H版我就只补充下文档吧

HaojunRen commented 2 years ago

可以着手在2021分支上推送你的PR,谢谢

XuDaojie commented 2 years ago

可以着手在2021分支上推送你的PR,谢谢

已经提交了PR了,是使用2020.0.0分支吧