朋也的博客 » 首页 » 文章

SpringCloud学习记录 - Ribbon

作者:朋也
日期:2021-01-01


版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

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

Ribbon是什么东西?

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

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

负载均衡的规则有哪些?

使用@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://tomoya92.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>