• content

上一篇在User模块里调用Order的时候用到了一个注解 @LoadBanlance 这货就是Ribbon里的

Ribbon是什么东西?

一个基于Http和TCP的客户端负载均衡工具,它解决的是微服务之间的负载均衡问题,是一个部署在客户端的负载均衡工具(nginx是一个服务端的负载均衡工具)

spring-cloud-starter-netflix-eureka-client 包里已经引入了 ribbon,所以可以直接使用

负载均衡的规则有哪些?

  • AvailabilityFilteringRule
  • BestAvailableRule 会过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  • PredicateBasedRule 这是一个抽象类,提供一个choose的模板,通过调用AbstractServerPredicate实现类的过滤方法来过滤出目标的服务,再通过轮询方法选出一个服务。
  • RandomRule 随机
  • RetryRule 重试,先按照RoundRobinRule获取服务,如果失败则在指定时间内重试获取可用的服务
  • RoundRobinRule 轮询
  • WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快的实例权重越大,越容易被选中
  • ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务

使用@LoadBalance注解默认使用的是轮询,如何换成其它的规则来调用服务?

自定义的规则类不能被@ComponentScan扫描到,否则自定义的规则会被所有Ribbon客户端共享 见:https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#_customizing_the_ribbon_client

自定义一个rule配置类,注意这个类的包名为 com.example.myrule 而UserApplication的包名为 com.example.springcloud

package com.example.myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyRuleConfig {

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

}

在UserApplication.java上配置上调用这个自定义的rule

链文接原: https://atjiu.github.io/2021/01/01/spring-cloud-ribbon/

@RibbonClient(name = "ORDER", configuration = MyRuleConfig.class)
public class UserApplication {
}

重启User服务,再次访问 localhost:18081/createOrder?userId=123

多刷几次就会发现 order1, order2是随机出现的


上面说到了 spring-cloud-starter-netflix-eureka-client 这个包里已经引入了 ribbon ,用 @LoadBalance 注解是没问题,但自定义Rule的时候就找不到 IRule 接口了,解决办法是先从 spring-cloud-starter-netflix-eureka-client 里把 ribbon 给移除,然后再重新引入

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>