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(); }