SpringCloud入门实战(4)-Ribbon使用
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST请求自动转换成客户端负载均衡的服务调用。本文主要介绍Ribbon的基本使用,文中使用到的软件版本:Spring Boot 2.2.5.RELEASE、Spring Cloud Hoxton.SR3、Java 1.8.0_191。
1、Ribbon原理
![](https://img2020.cnblogs.com/blog/1846282/202008/1846282-20200824152914908-905573758.png)
服务列表:通过注册中心获取可用的服务列表
服务过滤:对原始服务列表使用一定策略进行过滤,并返回有效的服务器列表给客户端负载均衡器使用
服务心跳检测:用来检测一个微服务实例是否可用;如果检测到某服务实例不可用,则会从列表中及时移除
负载均衡策略:在多个服务实例中选择一个有效的服务实例,并进行相应的服务请求处理
2、Ribbon负载均衡策略
策略类 | 命名 | 描述 |
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(ribbon默认策略) |
RetryRule | 重试策略 | 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
ResponseTimeWeightedRule | 响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
3、常用参数设置
ribbon.MaxAutoRetries=0 #对当前实例的重试次数,默认0
ribbon.MaxAutoRetriesNextServer=1 #切换实例的重试次数,默认1
ribbon.ReadTimeout=5000 #请求处理的超时时间,默认5秒
ribbon.ConnectTimeout=2000 #请求连接的超时时间,默认2秒
ribbon.OkToRetryOnAllOperations=false #对所有操作请求都进行重试,默认false
4、使用
4.1、引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
如果使用的eureka-client等服务发现组件,则默认包含了robbin。
4.2、定义RestTemplate
package com.abc.scdemo.client.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
4.3、调用服务
@RequestMapping("/getUser") public CallResult<User> getUser(long id) { logger.info(id + ""); CallResult<User> result; try { MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("id", id + ""); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity(map, null); ParameterizedTypeReference type = new ParameterizedTypeReference<CallResult<User>>(){}; //scdemo-server为服务名 //ResponseEntity<User> responseEntity = restTemplate.postForEntity("http://scdemo-server/user/getUser", map, User.class); ResponseEntity<CallResult<User>> responseEntity = restTemplate.exchange("http://scdemo-server/user/getUser", HttpMethod.POST, requestEntity, type); result = responseEntity.getBody(); } catch (Exception e) { result = new CallResult<>(-1, "发生异常"); e.printStackTrace(); } return result; }
4.4、feign
如果使用feign调用服务,里面默认包含了robbion,不需要特殊处理。
4.5、说明
Robbion负载均衡器是spring Cloud默认的负载均衡器,但现在已处于维护的状态,不建议使用,Spring Cloud推荐使用BlockingLoadBalancerClient来作为负载均衡器;可以把spring.cloud.loadbalancer.ribbon.enabled设为false来停用Robbion。