朋也的博客 » 首页 » 文章
作者:朋也
日期: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>