Ribbon是一个客户端负载均衡器,它为您提供了对HTTP和TCP客户机行为的大量控制。Feign已经使用了Ribbon,所以,如果您使用@FeignClient,这个部分也适用。而本文主要介绍如何单独使用ribbon。
1.maven添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.application.properties提供如下配置:
client.ribbon.listOfServers=\
localhost:8081,localhost:8082
其中client表示服务提供方的名称,localhost:8081,localhost:8082表示服务提供方的IP:HOST列表
3.api使用:
方法1:使用LoadBalancerClient
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/test/{id}")
public String test(@PathVariable("id") int id) {
//使用loadBalancerClient
ServiceInstance serviceInstance = loadBalancerClient.choose("order-demo");
String clientPath = "/orders";
URI client = URI.create(String.format("http://%s:%s/%s", serviceInstance.getHost(), serviceInstance.getPort(), clientPath));
return restTemplate.getForObject(client,String.class);
}
}
方法2:
restTemplate使用@LoadBalanced注解
@Configuration
public class RestTemplateConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.build();
}
}
使用restTemplate调用,路径上的client为服务提供方的名称,对应application.properties中的client
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/test/{id}")
public String test(@PathVariable("id") int id) {
//restTemplate定义上用@LoadBalanced注解
return restTemplate.getForObject("http://client/orders", String.class);
}
}
如果您需要提供您自己的IRule实现来处理一个特殊的路由需求,如“canary”测试,传递一些信息给IRule的选择方法。
public interface IRule{
public Server choose(Object key);
public void setLoadBalancer(ILoadBalancer lb);
public ILoadBalancer getLoadBalancer();
}