zoukankan      html  css  js  c++  java
  • Ribbon负载均衡的使用与切换算法【转】

    原文链接:https://www.cnblogs.com/draymond/p/12725899.html

     (本文在原文的基础上添加了一些解释性的图片与描述)

    Ribbon的作用

      客户端的负载均衡,与RestTemplate结合使用

    1:pom

      eureka的客户端与nocos的客户端pom依赖,都集成了ribbon,所以不再需要重复添加依赖(当然想添加的话也可以添加)

         如下图为Eureka client端依赖包中,可以看到已经继承了Ribbon的依赖包

    2:书写配置类,将RestTemplate注入到spring容器中

    @Component
    @Configuration
    public class AppConfiguration {
        
        @LoadBalanced   // 负载均衡
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

       @LoadBalanced // 负载均衡  1)该注解标记使用负载均衡,不标记则会导致:客户端发现服务实例有多个,不知道调用哪一个的问题。 2)默认使用RoundRibbon轮询算法

    3:RestTemplate的使用

        private RestTemplate restTemplate;
    
        private String url = "http://CLOUD-PAYMENT-SERVICE";  //注意最好是一定要跟Eureka上保持一致,都是大写的!正式环境从配置文件中读取
    
    
        @RequestMapping("/get/{id}")
        public BaseResult findById(@PathVariable("id") Integer id) {
            ResponseEntity<BaseResult> forEntity = restTemplate.getForEntity(url + "/payment/get/" + id, BaseResult.class);
            BaseResult body = forEntity.getBody();
            return body;
        }

    4:替换负载规则

      4.1 负载均衡的策略

        负载均衡
        步骤:
            第一步:选择eurekaServer,他优先选择在同一区域内负载较少的server
            第二步:根据用户指定的策略,从server取到的服务注册列表中选择一个地址
    策略Irule: RoundRobinRule 轮询 WeighedResponseTimeRule 响应速度快的实例选择权重大 RandomRule 随机 RetryRule 先按照RoundRobinRule策略获取,失败后会重试(重试试还是找本次获取的实例,还是找另一个??) BestAvailableRule 过滤掉多次访问而处于短路器跳闸状态的服务,然后选择一个并发小的 ZoneAvoidanceRule 默认规则,符合判断server所在域的性能和server的可用性选择服务器 根据响应时间加权 替换负载规则 备注:自定义rebion不应该放到@ComponentScan下,否则会被所有的客户端共享,springBootApplication注解,默认带上@ComponentScan下 备注:eureka-client依赖,默认集成了ribbon

    lRule:根据特定算法中从服务列表中选取一个要访问的服务

    IRule接口及其实现类如下图所示:

    4.2 自定义负载均衡(负载规则替换)

    注意配置细节:

    官方文档明确给出了警告:

     即:

    这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,

    否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。

    在项目的主启动类中,@SpringBootApplication注解默认就包含了@Component注解,因此Ribbon配置类所在包路径,一定不能与主启动类同包

     如下图,可以看到,自定义的规则类CloudRondowRule,并不在主启动类OrderMain80所在的com.draymond.springcloud包下!main方法在springcloud包下,CloudRondowRule规则的定义在myRule包下,这样就不会扫描到了CloudRondowRule!

     自定义规则类具体实现如下:

     @Configuration
    public class CloudRondowRule {
    
        @Bean
        public IRule iRule() {
            return new RandomRule();  //随机的规则
        }
    }

    5:标记客户端使用定义的负载均衡的切换规则

    @EnableEurekaClient
    @SpringBootApplication
    @RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = CloudRondowRule.class)  
    public class OrderMain80 {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderMain80.class);
        }
    }

    6:调用客户端的接口测试

    注意,我这里在测试时遇到个bug,那就是我在更换成Random随机算法之后,在接口调用测试中,实际调用起来表现的还是RounRibbon轮询算法,并没有表现出随机性。

    这是因为虽然服务入驻到Eureka之后,从Eureka上看到的服务名是大写的,如下图。

    但是在刚开始时我项目中配置的服务名是小写cloud-payment-service的,改为大写之后再进行测试,就可以了!

  • 相关阅读:
    论文摘记 2017.4.6-4.9
    P4 PI库安装
    Markdown中的表格
    Easy install ryu
    《重构网络-SDN架构与实现》阅读随笔
    解决Github Desktop Repo publish 失败问题
    解决 "OperationalError: (sqlite3.OperationalError) no such table: ..."问题
    初始化 Flask 虚拟环境 命令
    Flask: socket.error: [Errno 48] Address already in use 问题
    【转】TCP端口号记录
  • 原文地址:https://www.cnblogs.com/suhaha/p/14641091.html
Copyright © 2011-2022 走看看