woshikid / blog

Apache License 2.0
8 stars 1 forks source link

Spring Cloud LoadBalancer学习笔记 #173

Open woshikid opened 2 years ago

woshikid commented 2 years ago

POM

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

自定义服务列表

spring:
  cloud:
    discovery:
      client:
        simple:
          instances:
            test: # springApplicationName
              - instanceId: test-1
                host: server1
                port: 80
              - instanceId: test-2
                host: server2
                port: 80

自动获取服务列表(依赖注册中心)

使用LoadBalancer

@Autowired
private LoadBalancerClient loadBalancerClient;

ServiceInstance serviceInstance = loadBalancerClient.choose(springApplicationName);
String url = serviceInstance.getUri().toString();

注入RestTemplate

@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder
        .setConnectTimeout(Duration.ofMillis(1000)) // 连接超时
        .setReadTimeout(Duration.ofMillis(1000)) // 请求超时
        .build();
}

String response = restTemplate.getForObject("http://%s/test".formatted(springApplicationName), String.class);

RestTemplate自动重试(依赖Spring Retry) 默认配置

spring:
  cloud:
    loadbalancer: # 默认为RoundRobinLoadBalancer
      retry: # 局部配置为spring.cloud.loadbalancer.clients.<springApplicationName>.retry
        maxRetriesOnSameServiceInstance: 0 # 当前服务器重试次数
        maxRetriesOnNextServiceInstance: 1 # 尝试切换服务器次数
        retryOnAllOperations: false # 重试非GET请求
        retryableStatusCodes: [] # 默认404,500都不重试