春云如何实现远程调用负载均衡

  介绍

本篇文章为大家展示了春云如何实现远程调用负载均衡,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

使用微服务后,为了能够承担高并发的压力,同一个服务可能会启动多个实例。这时候消费者就需要负载均衡,把请求分散到各个实例。负载均衡主要有两种设计:

服务端负载均衡客户端负载均衡

对于传统的分布式服务来说,大多使用服务端负载均衡。一般会使用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可以与微服务注册中心和丝带组合使用以支持负载均衡。

春云如何实现远程调用负载均衡