本篇文章为大家展示了春云如何实现远程调用负载均衡,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
使用微服务后,为了能够承担高并发的压力,同一个服务可能会启动多个实例。这时候消费者就需要负载均衡,把请求分散到各个实例。负载均衡主要有两种设计:
服务端负载均衡客户端负载均衡
对于传统的分布式服务来说,大多使用服务端负载均衡。一般会使用Nginx或者ELB等工具作为负载均衡器,如下图:
传统负载均衡
而在春天的云计算中,使用的是“客户端负载均衡”的方式,使用“丝带”组件来实现客户端的负载均衡。只要引入了微服务注册中心依赖,就会自动引入丝带依赖。客户端负载均衡原理如下图:
客户端负载均衡
<强>丝带的原理强>
带利用了创建RestTemplate的拦截器(接口是ClientHttpRequestInterceptor)机制,在拦截器中实现的负载均衡。负载均衡的基本实现就是利用从“服务注册中心”获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行HTTP调用。
详情可以查看LoadBalancerInterceptor这个类,位于org.springframework.cloud.client。loadbalance包下。
<强>使用丝带强>
首先定义一下生产者“倾诉”,我这里使用容器启动了多个生产者实例,每个实例具有不同的id、我的示例代码里面启动了两个实例:
service-user-1
引用>
service-user-2代码:
@RestController @RequestMapping 公开课HelloController { @ value (“$ {spring.cloud.consul.discovery.instanceId}“) 私人字符串instanceId; @GetMapping (“hello") 公共字符串hello () { 返回String.format(“你好,我是% s", instanceId); } }然后对于消费者“服务订单”,可以使用Java声明式注解的方式来使用丝带,只需要在消费者给创建RestTemplate类型的豆配上一个@LoadBalanced就可以了。然后再配置一下负载均衡策略:
@ configuration 公开课RibbonConfig { @ bean @LoadBalanced 公众创建RestTemplate ribbonRestTemplate () { 返回新创建RestTemplate (); } @ bean 公共IRule ribbonRule () { 返回新RandomRule ();//随机负载均衡 } }然后就可以直接使用自动注入的创建RestTemplate类型的Bean了:
@RestController @RequestMapping 公开课HelloController { @ autowired 创建RestTemplate创建RestTemplate; @GetMapping(“/带/service-user") 公共字符串ribbonService () { 返回restTemplate.getForObject (“http://service-user/hello" String.class); } }这个时候访问消费者的/带/倾诉,刷新几次,就会看到下面两个随机的响应:
你好,这是service-user-2
引用>
你好,这是service-user-1
查看IRule接口的实现类,可以看到丝带的所有负载均衡策略,查看各实现类顶部的注释可以看到它的具体策略:
负载均衡器
<李> RandomRule:随机选择,李> <>李RoundRobinRule:轮询,李> <>李WeightedResponseTimeRule:根据每个服务的响应时间设置权重,响应时间越长,所占权重越少,李> <>李AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为电路跳闸的后端服务器,并过滤掉那些高并发的的后端服务器(活跃连接超过配置的阈值),李> <李> ZoneAvoidanceRule:使用CompositePredicate根据区域和可用性过滤服务器的规则。李> <李> BestAvailableRule:选择一个最小的并发请求的服务器;李> <>李RetryRule:在现有的策略基础上,添加重试机制,因为IRule支持“级联”。李>
春云提供了OpenFeign组件(以前叫假装)来进行远程的HTTP调用。它是对创建RestTemplate的一个封装。
假装是一个声明式Web服务客户端。使用假装能让编写Web服务客户端更加简单.Spring云对装进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters.Feign可以与微服务注册中心和丝带组合使用以支持负载均衡。
春云如何实现远程调用负载均衡