【SpringCloud】Ribbon

Ribbon

负载均衡原理

  1. order-service 发起 user-service 请求,被ribbon进行拦截;
  2. ribbon会向注册中心拉取user-service 相对应的服务;
  3. 注册中心返回user-service服务列表;
  4. 由ribbon的负载均衡机制去选择一个服务进行访问;默认采用的是轮训的机制。

负载均衡流程

请求示例

配置

@Configuration
public class RestTemplateConfiguration {

    /**
     * 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }
}

接口调用

@RequestMapping("consumer")
@RestController
public class ConsumerController {
    /**
     * spring提供的一个用于访问rest接口的模板对象
     * 提供了多重便捷访问远程HTTP服务的方法,简单的RestFul 服务模板
     */
    @Resource
    private RestTemplate restTemplate;
    
    /**
     * 服务地址
     */
    private static final String REST_FIX_URL_PREFIX = "http://XY-PROVIDER";
    
    @GetMapping("/getProvider")
    public String getConsumerByIp() {
        String res = restTemplate.getForObject(REST_FIX_URL_PREFIX + "/helloProvider", String.class);
        return res;
    }
}

Debug 效果如下所示

暂时先保留

负载均衡策略

内置负载均衡类 说明
RoundRobinRule 简单的轮训服务列表来选择服务器。Ribbon的默认规则
AvailabilityFilteringRule 对以下两种服务器进行忽略:
(1)在默认的情况下:这台服务器如果3次连接失败,这台服务器就会被设置“短路”状态。短路状态将持续30S,如果在此连接失败,短路的持续时间就会几何级增加
(2)并发数较高的服务器。如果一个服务器的并发连接数过高,配置了此规则的而客户端也会将忽略,可以有客户端的ActiveConnectionsLimit属性进行配置
WeightedResponseTimeRule 为每一个服务器赋予一个权重。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择
ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架。而在对Zone内的多个服务器进行轮询
BestAvailableRule 忽略那些短路的服务器,并选择并发数较低的服务器
RandomRule 随机选择一个可用的服务器
RetryRule 重试机制的选择逻辑

负载均衡策略配置

负载均衡策略配置的方式有两种:
代码方式、配置文件方式

代码方式

配置灵活,修改时需要重新打包发布,针对全局配置。

指定为随机策略

 @Bean
    public IRule randomRule(){
        return new RandomRule();
    }

配置文件方式

直观、方便、无需重新打包,但无法做全局配置

# 指定某个服务
xy-provider:
  ribbon:
    # 指定负载均衡规则
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

饥饿加载

配置方式

ribbon:
  eager-load:
    # 开启饥饿加载
    enabled: true
    # 指定饥饿加载的服务器列表名称
    clients: 
      - xy-provider

开启前

第一次访问时耗时会比较长,因为会去注册中心拉取注册列表缓存到本地。
之后的访问耗时都会很短,因为少了一步操作。

浏览器请求耗时

控制台

  1. 从注册中心拉取所有的实例(服务)
  2. 然后拉取我们需要的服务,由负载均衡去选择访问节点。

开启后

控制台

开启饥饿加载后,重新启动,我们会发现项目一启动,就去加载服务列表。

浏览器

跟没开启之前,耗时会相差很多。

posted @ 2023-06-08 09:20  Hello、Lin  阅读(13)  评论(0编辑  收藏  举报