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原理

服务列表:通过注册中心获取可用的服务列表
服务过滤:对原始服务列表使用一定策略进行过滤,并返回有效的服务器列表给客户端负载均衡器使用
服务心跳检测:用来检测一个微服务实例是否可用;如果检测到某服务实例不可用,则会从列表中及时移除
负载均衡策略:在多个服务实例中选择一个有效的服务实例,并进行相应的服务请求处理

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.inspur.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。

原文地址:https://www.cnblogs.com/wuyongyin/p/13522238.html