使用 LoadBalancerClient 和 @LoadBalanced 注解需要注意的事项

使用 LoadBalancerClient 负责均衡客户端时:

情况一:

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @GetMapping("/test")
    private String test(){
        String url = "http://%s:%s/say?msg=123";
        String host = loadBalancerClient.choose("springcloud-provider").getHost();
        int port = loadBalancerClient.choose("springcloud-provider").getPort();
        url = String.format(url,host,port);
        return restTemplate.getForObject(url,String.class);
    }
}

流程:通过 LoadBalancerClient 获取 IP、端口号,补全 url 的信息,再通过 RestTemplate 发送请求,且 LoadBalancerClient 遵守 IRule 负载均衡策略。

 @Bean // 配置Ribbon负载均衡算法
    public IRule getIRule(){

        // 随机负载均衡算法
        IRule rule = new RandomRule();

//        2.权重响应时间分配规则 代替ResponseTimeRule 响应时间加权策略
//        WeightedResponseTimeRule responseTimeRule=new WeightedResponseTimeRule();
//        3.最低并发策略 分配的时候选择目前并发量最小的
//        BestAvailableRule bestAvailableRule=new BestAvailableRule();
//        4.轮训策略
//        RoundRobinRule rule=new RoundRobinRule();
//        5.重试策略 如果在配置时间内,无法选择服务,尝试选择一个服务 重试机制
//        RetryRule retryRule=new RetryRule();
//        6.区域感知策略 就近访问
//        ZoneAvoidanceRule zoneAvoidanceRule=new ZoneAvoidanceRule();
//        7.可用过滤策略 可用根据阈值进行服务过滤
//        AvailabilityFilteringRule filteringRule=new AvailabilityFilteringRule();
        return rule;
    }

情况二:给 RestTemplate 实例添加 @LoadBalanced 注解,会拦截 RestTemplate 发送的请求,并会根据请求中的 serviceId ,遵守 负载均衡策略 替换为 对应的 ip 和端口号。

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

如果请求中没有 serviceid ,这会提示:

No instances available

posted @ 2024-09-27 11:19  隔岸观雨  阅读(84)  评论(0编辑  收藏  举报