简介:
基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模板请求自动转换成客户端负载均衡地服务调用。
工具类框架。不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建地微服务和基础设施中。
由于微服务间地调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的;Fegin也是基于Ribbon实现的工具。
一、客户端负载均衡
因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。
服务端负载均衡,其中分为硬件负载均衡和软件负载均衡。
硬件负载均衡:主要通过在服务器节点之间安装专门用于负载均衡的设备,如:F5等。
软件负载均衡:通过在服务器上安装一些具有均衡负载功能或模块的软件来完成请求分发工作,如:Nginx等。
服务清单所存储的位置。
心跳来维护服务端清单的健康性,只是这个步骤需要与服务注册中心配合完成。
通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用非常的简单,只需如下两步:
(1)、服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
(2)、服务消费者直接通过调用被@LoadBalance的注解修饰过的RestTemplate来实现面向服务的接口调用。
二、RestTemplate详解
RestTemplate该对象会使用Ribbon的自动化配置。
@LoadBalanced开启客户端负载均衡。
1、在RestTemplate中,对GET请求有两个方法调用实现:getForEntity函数 和 getForObject函数。
2、在RestTemplate中,对POST请求有三个方法调用实现:postForEntity函数 、postForObject函数 和 postForLocation函 数。
3、在RestTemplate中,对PUT请求可以通过put方法进行调用实现。
4、在RestTemplate中,对DELETE请求可以通过delete方法进行调用实现。
三、负载均衡策略
1、RandomRule:从服务实例清单中随机选择一个服务实例的功能。
2、RoundRobinRule:按照线性轮询的方式一次选择每个服务实例的功能。
3、WeightedResponseTimeRule:根据实例的运行情况来计算权重,并根据权重来挑选实例。
四、自动化配置
引入Spring Cloud Ribbon的依赖之后,就能够自动化构建下面这些接口的实现:
- IClientConfig:Ribbon的客户端配置。
- IRule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区环境下选出最佳区域的实例进行访问。
- IPing:Ribbon的实例检查策略。
- ServiceList<Server>:服务实例清单的维护机制。
- ServerListFilter:服务实例清单过略机制,默认采用ZonePreferenceServerListFilter实现,该策略能够优先过滤出与请求调用方处于同区域的服务实例。
- ILoadBalancer:负载均衡器,具备了区域的感知能力。
五、参数配置
1、全局配置:ribbon.<key>=<value>,其中<key>代表Ribbon客户端配置的参数名,<value>代表对应参数的值。
例子:ribbon.ConnectTimeout=250;//配置Ribbon创建连接的超时时间
2、指定客户端配置:<client>.ribbon.<key>=<value>,其中<client>代表了客户端的服务名。
例子:假如有一个服务消费者通过RestTemplate来访问hello-service服务的/hello接口,这时我们会这样调用
restTemplate.getForEntity("http://hello-service/hello",String.class).getBody();如果没有服务治理框架的帮助,我们需要为客户端指定具体的实例清单,可以指定服务名来做详细的配置:hello-service.ribbon.listOfServer=localhost:8081,localhost:8082。
CommonClientConfigKey这个类来查看<key>。
六、与Eureka结合
当在Spring Cloud的应用中同时引入Spring Cloud Ribbon和Spring Cloud Eureka依赖时,会触发Eureka中实现的对Ribbon的自动化配置。
- 将服务清单列表交给Eureka的服务治理机制来进行维护。
- 将实例检查的任务交给了服务治理框架进行维护
在与Spring Cloud Eureka结合使用的时候,我们的配置将会变的更加简单。不再需要通过类似 hello-service.ribbon.listOfServer的参数来指定具体的服务实例清单,因为Eureka将会为我们维护所有的实例清单。
在Spring Cloud Ribbon与Spring Cloud Eureka结合的工程中,我们也可以通过参数配置的方式来禁用Eureka对Ribbon服务实例的维护实现。只需要在配置文件中加入ribbon.eureka.enabled=false,这时我们对于服务实例的维护就又将回归到使用<client>.ribbon.listOfServers参数配置的方式来实现了。
七、重试机制
区别就是:Eureka为了实现更高的服务可用性,牺牲一定的一致性,在极端情况下它宁愿接受故障的实例也不要丢掉“健康”实例。
由于Spring Cloud Eureka在可用性与一致性上的取舍,不论是由于触发了保护机制还是服务剔除的延迟,引起服务调用到故障实例的时候,我们还是希望能够增强对这类问题的容错。所以,我们在实现服务调用的时候,通常会加入一些重试机制。