SpringCloud-Ribbon(自定义负载均衡算法)

注明:此项目为本人学习尚硅谷老师的教学视频然后整理核心的配置文件,所有的项目均在以下地址下载。
https://github.com/xwbGithub/microservicecloud下载

本项目请参考microservicecloud-consumer-dept-80项目(负载均衡客户端),

Ribbon自身的负载均衡算法

RoundRobinRule(轮询算法)

RandomRule(随机算法)

AvailabilityFilteringRule():会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问

WeightedResponseTimeRule():根据平均响应的时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够会切换到WeightedResponseTimeRule

RetryRule():先按照RoundRobinRule的策略获取服务,如果获取失败则在制定时间内进行重试,获取可用的服务。

BestAviableRule():会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务

ZoneAvoidanceRule():默认规则,符合判断server所在区域的性能和server的可用性选择服务器

自定义负载均衡算法

官方文档指出:

这个自定义的类不能放在@ComponentScan所扫描的当前包以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是我们达不到特殊化指定的目的了

为何不能放在此位置:源码解析如下:


 
 
  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Inherited
  5. @SpringBootConfiguration
  6. @EnableAutoConfiguration
  7. @ComponentScan(
  8. excludeFilters = { @Filter(
  9. type = FilterType.CUSTOM,
  10. classes = {TypeExcludeFilter.class}
  11. ), @Filter(
  12. type = FilterType.CUSTOM,
  13. classes = {AutoConfigurationExcludeFilter.class}
  14. )}
  15. )
  16. public @interface SpringBootApplication {

因为主启动类已经有ComponentScan,这个注解了,所以说不能放在和主启动类同包下。

自定义算法RandomRule_ZY 必须继承AbstractLoadBalanceRule类


 
 
  1. /**自定义的负载均衡算法*/
  2. public class RandomRule_ZY extends AbstractLoadBalancerRule {
  3. // total = 0 // 当total==5以后,我们指针才能往下走,
  4. // index = 0 // 当前对外提供服务的服务器地址,
  5. // total需要重新置为零,但是已经达到过一个5次,我们的index = 1
  6. // 分析:我们5次,但是微服务只有8001 8002 8003 三台,OK?
  7. private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
  8. private int currentIndex = 0; // 当前提供服务的机器号
  9. public Server choose(ILoadBalancer lb, Object key) {
  10. if (lb == null) {
  11. return null;
  12. }
  13. Server server = null;
  14. while (server == null) {
  15. if (Thread.interrupted()) {
  16. return null;
  17. }
  18. List<Server> upList = lb.getReachableServers();
  19. List<Server> allList = lb.getAllServers();
  20. int serverCount = allList.size();
  21. if (serverCount == 0) {
  22. return null;
  23. }
  24. //private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
  25. //private int currentIndex = 0; // 当前提供服务的机器号
  26. if (total < 5) {
  27. server = upList.get(currentIndex);
  28. total++;
  29. } else {
  30. total = 0;
  31. currentIndex++;
  32. if (currentIndex >= upList.size()) {
  33. currentIndex = 0;
  34. }
  35. }
  36. if (server == null) {
  37. Thread.yield();
  38. continue;
  39. }
  40. if (server.isAlive()) {
  41. return (server);
  42. }
  43. server = null;
  44. Thread.yield();
  45. }
  46. return server;
  47. }
  48. @Override
  49. public Server choose(Object key) {
  50. return choose(getLoadBalancer(), key);
  51. }
  52. @Override
  53. public void initWithNiwsConfig(IClientConfig clientConfig) {
  54. }
  55. }

如果想使用某个自定义算法则注入到bean中即可。


 
 
  1. /**
  2. * 自定义负载均衡算法
  3. */
  4. @Configuration
  5. public class MySelfRule {
  6. @Bean
  7. public IRule myRule() {
  8. //return new RoundRobinRule();//轮询算法
  9. //return new RandomRule();//随机算法
  10. return new RandomRule_ZY();
  11. }
  12. }

在主启动类中添加ribbon注解


 
 
  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @RibbonClient(name = "MICROSERVICECLOUD-DEPT", configuration = MySelfRule.class)
  4. public class DeptConsumer80_App {
  5. public static void main(String[] args) {
  6. SpringApplication.run(DeptConsumer80_App.class, args);
  7. }
  8. }

特别注意的是@RibbonClient(name = "MICROSERVICECLOUD-DEPT", configuration = MySelfRule.class)

name指定针对哪个服务 进行负载均衡,而configuration指定负载均衡的算法具体实现类

测试:启动80负载均衡微服务,然后启动一个7001微服务注册中心,然后启动8001,8002,8003,访问80负载均衡客户端,每次刷新的结果都是按照新写的负载均衡算法去执行,达到效果。

至此:自定义负载均衡算法开发完毕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值