本篇文章为大家展示了Spring Cloud如何实现远程调用负载均衡,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
成都创新互联-专业网站定制、快速模板网站建设、高性价比扶沟网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式扶沟网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖扶沟地区。费用合理售后完善,十多年实体公司更值得信赖。负载均衡
使用微服务后,为了能够承担高并发的压力,同一个服务可能会启动多个实例。这时候消费者就需要负载均衡,把请求分散到各个实例。负载均衡主要有两种设计:
服务端负载均衡客户端负载均衡
对于传统的分布式服务来说,大多使用服务端负载均衡。一般会使用Nginx或者ELB等工具作为负载均衡器,如下图:
传统负载均衡
而在Spring Cloud中,使用的是「客户端负载均衡」的方式,使用「Ribbon」组件来实现客户端的负载均衡。只要引入了微服务注册中心依赖,就会自动引入Ribbon依赖。客户端负载均衡原理如下图:
客户端负载均衡
Ribbon的原理
Ribbon利用了RestTemplate的拦截器(接口是ClientHttpRequestInterceptor)机制,在拦截器中实现的负载均衡。负载均衡的基本实现就是利用从「服务注册中心」获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行HTTP调用。
详情可以查看LoadBalancerInterceptor这个类,位于org.springframework.cloud.client.loadbalancer包下。
使用Ribbon
首先定义一下生产者「service-user」,我这里使用容器启动了多个生产者实例,每个实例具有不同的id,我的示例代码里面启动了两个实例:
service-user-1
service-user-2
代码:
@RestController @RequestMapping public class HelloController { @Value("${spring.cloud.consul.discovery.instanceId}") private String instanceId; @GetMapping("hello") public String hello() { return String.format("hello, this is %s", instanceId); } }