Ribbon负载均衡的使用与切换算法

作用

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

1:pom

eureka的客户端与nocos的客户端pom依赖,都集成了ribbon,所以不再需要重复添加依赖

2:将RestTemplate注入到spring容i中

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

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

3:RestTemplate的使用

@Autowired
    private RestTemplate restTemplate;

    private String url = "http://CLOUD-PAYMENT-SERVICE";  //正式环境从配置文件中读取


    @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 负载均衡的策略

ribbon
    负载均衡
    步骤:
        第一步:选择eurekaServer,他优先选择在同一区域内负载较少的server
        第二步:根据用户指定的策略,从server取到的服务注册列表中选择一个地址
    策略Irule:
        RoundRobinRule
            轮询
        WeighedResponseTimeRule
            响应速度快的实例选择权重大
        RandomRule
            随机
        RetryRule
            先按照RoundRobinRule策略获取,失败后会重试(重试试还是找本次获取的实例,还是找另一个??)
        BestAvailableRule
            过滤掉多次访问而处于短路器跳闸状态的服务,然后选择一个并发小的
        ZoneAvoidanceRule
            默认规则,符合判断server所在域的性能和server的可用性选择服务器
        根据响应时间加权

    替换负载规则

        备注:自定义rebion不应该放到@ComponentScan下,否则会被所有的客户端共享,springBootApplication注解,默认带上@ComponentScan下

      备注:eureka-client依赖,默认集成了ribbon

  4.2 自定义负载均衡

@Configuration
public class CloudRondowRule {

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

Ribbon负载均衡的使用与切换算法

main方法在springcloud包下,CloudRondowRule规则的定义在myRule包下,这样就不会扫描到了CloudRondowRule

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:调用客户端的接口测试