SpringCloud之Ribbon组件
** ribbon组件的作用是做client的负载均衡,需配合RestTemplate完成服务间通信**。
** 使用方式有3中:DiscoverClient、LoadBancerClient、@LoadBalanced**
1.使用DiscoverClient(文中所有代码均是,用户服务调用订单服务)
List<ServiceInstance> orders = discoveryClient.getInstances("order");
String result=restTemplate.getForObject(orders.get(0).getUri()+"/order/test",String.class);
discoveryClient.getInstances(“order”),会在服务注册中心拉取服务名为order的服务列表到本地,并做缓存。DiscoverClient没有负载均衡。
2.使用LoadBancerClient
ServiceInstance order = loadBalancerClient.choose("order");
String result = restTemplate.getForObject(order.getUri() + "/order/test", String.class);
ServiceInstance order = loadBalancerClient.choose(“order”); 这里是LoadBancerClient拉取名为order的服务列表并采用choose方法做负载均衡(默认是轮询)
3.使用@LoadBalanced
这种方式是通过把RestTemplate写入到IOC容器中:
@Configuration
public class RestTemplteConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@LoadBalanced作用在配置类的方法上,其目的就是对RestTemplate进行加强。在需要用到的地方进行注入RestTemplate就行了
@Autowired
private RestTemplate restTemplate;
使用时如下:
String result=restTemplate.getForObject("http://order/test",String.class);
原先的RestTemplate是这样调用的:
String result=restTemplate.getForObject("http://localhost:8989/test",String.class);
使用@LoadBalanced之后的,是将localhost:8989替换为你要调用的服务名,我这里要调用的就是order。他会根据order去注册中心拉取order列表,并进行负载均衡选择出一个服务然后将地址中的order替换掉,最后组成一个完整的url。
使用Ribbon+RestTemplate的缺点
使用Ribbon+RestTemplate,会将服务间的调用“写死”,有100个服务调用,这段代码就要写100次。这里你可能会像那我把他封装成一个方法不就好了嘛。这样做确实不错,但是一个方法只能对应两个服务之间的调用,那我某个服务调用了另外100个服务岂不是要写100个方法?最好的办法是使用openfeign组件