我们已经学会如何通过LoadBalancerClient
接口来获取某个服务的具体实例,并根据实例信息来发起服务接口消费请求。但是这样的做法需要我们手工的去编写服务选取、链接拼接等繁琐的工作,对于开发人员来说非常的不友好。
1.认识ribbon
Spring Cloud Ribbon
是基于Netflix Ribbon
实现的一套客户端负载均衡的工具。它是一个基于HTTP
和TCP
的客户端负载均衡器
。它可以通过在客户端中配置ribbonServerList
来设置服务端列表去轮询访问以达到均衡负载的作用。
当Ribbon
与Eureka
联合使用时,ribbonServerList
会被DiscoveryEnabledNIWSServerList
重写,扩展成从Eureka
注册中心中获取服务实例列表。同时它也会用NIWSDiscoveryPing
来取代IPing
,它将职责委托给Eureka
来确定服务端是否已经启动。
我们在使用Spring Cloud Ribbon
的时候,不论是与Eureka
还是Consul
结合,都会在引入Spring Cloud Eureka
或Spring Cloud Consul
依赖的时候通过自动化配置来加载上述所说的配置内容,所以我们可以快速在Spring Cloud
中实现服务间调用的负载均衡。
来看看如何使用Spring Cloud Ribbon
来实现服务的调用以及客户端均衡负载。
2.修改启动类
为RestTemplate增加@LoadBalanced注解
@SpringBootApplication
public class LovingApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(LovingApplication.class, args);
}
}
3.修改调用controller
去掉原来通过LoadBalancerClient选取实例和拼接URL的步骤,直接通过RestTemplate发起请求。
@Autowired
private RestTemplate restTemplate;
@GetMapping("/contact/{goodsId}")
public ServerResponse contact(@PathVariable("goodsId") Long goodsId) {
GoodsInfo goodsInfo = restTemplate.getForObject("http://product/product/search/"+goodsId, GoodsInfo.class);
return ServerResponse.createBySuccess(goodsInfo);
}
4.ribbon 原理
上述RestTemplate
的3种调用方式,及其以下组件的底层都是基于ribbon的负载均衡策略的
1.RestTemplate
2.Feign
3.Zuul
Ribbon主要内容由三部分组成:
1.ServerList
2.IRule
3.ServerListFilter
ServerList(获得服务列表)->ServerListFilter(过滤一部分服务)->IRule(根据规则选择服务)
网友评论