自定义Ribbon客户端策略
说明
为了实现Ribbon细粒度的划分,让调用不同的微服务时采用不同的客户端负载均衡策略, 通常情况下我们会自定义配置策略。
本文以内容中心(content-center)调用户中心微服务(user-center)为例子进行演示

内容中心包结构如下图所示:

版本选择
| Spring Boot | Spring Cloud | Spring Cloud Netflix Ribbon |
|---|---|---|
| 2.1.5.RELEASE | Greenwich.SR3 | 2.1.3.RELEASE |
方式一、通过Java代码配置
RandomConfiguration.java
package ribbonconfiguration;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* description: 随机的负载均衡策略
* jdk: 1.8
*/
@Configuration
public class RandomConfiguration {
@Bean
public IRule randomRule() {
return new RandomRule();
}
}
UserCenterConfiguration.java
package com.itnotes.contentcenter.configuration;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Configuration;
import ribbonconfiguration.RandomConfiguration;
/**
* description:
* jdk: 1.8
*/
@Configuration
@RibbonClient(name = "user-center", configuration = RandomConfiguration.class)
public class UserCenterConfiguration {
}
这样我们就能实现,从内容中心调用用户中心微服务时走自定义的策略,不过通过这种方式实现时有一个坑需要注意,那就是自定义的策略所在类(RandomConfiguration.java)不能被@SpringBootApplication的@ComponentScan给扫描到,因为他们存在父子上下文的问题,如果被扫描到,那么内容中心所有的RibbonClient都会走该策略,其他策略会失效。
我们可以看一下官网的说明
The CustomConfiguration clas must be a @Configuration class, but take care that it is not in a @ComponentScan for the main application context. Otherwise, it is shared by all the @RibbonClients. If you use @ComponentScan (or @SpringBootApplication), you need to take steps to avoid it being included (for instance, you can put it in a separate, non-overlapping package or specify the packages to scan explicitly in the @ComponentScan).
方式二、属性配置(通过配置文件的方式)
这种方式比较简单,直接在.yml或者.properties文件配置即可
在本例中我们在内容中心配置如下(value是所选择负载均衡策略的全路径)
user-center:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
两种方式的对比
| 配置方式 | 优点 | 缺点 |
|---|---|---|
| 代码配置 | 基于代码,更加灵活 | 有小坑(父子上下文), 线上修改需重新打包、发布 |
| 属性配置 | 易上手,配置更加直观,线上修改无需打包、发布,优先级更高 | 极端场景下没有代码配置灵活 |
最佳实践
尽量使用属性配置,属性方式实现不了再考虑代码配置。因为属性配置没有父子上下文的坑,并且更加直观。
在同一个微服务内的配置方式尽量保持单一性,两种方式不要混用,避免增加问题定位的复杂性
自定义Ribbon客户端策略的更多相关文章
- spring cloud 自定义ribbon客户端
一.自定义Ribbon客户端-[方式一]配置类 1.1.自定义负载规则 增加RibbonConfiguration.java配置类 public class RibbonConfiguration { ...
- 0404-服务注册与发现-客户端负载均衡-两种自定义方式-Ribbon通过代码自定义配置、使用配置文件自定义Ribbon Client
一.官方文档解读 官方地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_cust ...
- SpringCloud系列八:自定义Ribbon配置
1. 回顾 上文使用Ribbon实现了客户端侧的负载均衡.但是很多场景下,我们可能需要自定义Ribbon的配置,比如修改Ribbon的负载均衡规则. Spring Cloud允许使用Java代码或属性 ...
- 【Ribbon篇四】自定义负载均衡策略(4)
官方文档特别指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制 ...
- 自定义Ribbon的负载均衡策略
自定义负载均衡策略 官方文档指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们 ...
- spring cloud中通过配置文件自定义Ribbon负载均衡策略
一.Ribbon中的负载均衡策略 1.Ribbon中支持的负载均衡策略 AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端se ...
- 笔记:Spring Cloud Ribbon 客户端配置详解
自动化配置 由于 Ribbon 中定义的每一个接口都有多种不同的策略实现,同时这些接口之间又有一定的依赖关系,Spring Cloud Ribbon 中的自动化配置能够很方便的自动化构建接口的具体实现 ...
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...
- 使用Java代码自定义Ribbon配置
很多场景下,需要实现不同的微服务采用不同的策略,例如修改Ribbon的负载均衡规则等.Spring Cloud允许使用Java代码自定义Ribbon的配置. 在Spring Cloud中,Ribbon ...
随机推荐
- 关于在Spring项目中使用thymeleaf报Exception parsing document错误
今天在使用SpringBoot的过程中,SpringBoot版本为1.5.18.RELEASE,访问thymeleaf引擎的html页面报错Exception parsing document: 这是 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(6)
目录 /dev 目录是干什么的? /proc 和 /sys 目录是干什么的? udev 这个软件是干什么用的? 目录映射是临时性的,还是永久性的? 命令行里大括号 "{}" 的作用 ...
- ClrFromCSharp_2_2_生成部署打包应用程序
1,在\reps\CSharpFromCSarp\CSharpFromCSarp_2_2,建立新解决方案和解决项目 并且输入以下代码 namespace ClrFromCSharp_2_2 { cla ...
- ConcurrentHashMap的size()方法(1.7和1.8)
在1.7和1.8版本中,计算size()方法有写不同.先介绍1.7版本的实现. 1.7版本 在1.7版本中,有一个重要的类Segment,利用它来实现分段锁 static final class Se ...
- W25Q64BV(FLASH)(SPI)中文手册
64兆位串行SPI FLASH存储器 1.常规介绍 W25Q64BV(64兆位)串行FLASH存储器为一个空间大小,引脚,功耗限制的系统提供解决方案.25Q系列的灵活性和性能良好超越了普通的串行FLA ...
- opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)
图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...
- 【笔记】机器学习 - 李宏毅 - 8 - Backpropagation
反向传播 反向传播主要用到是链式法则. 概念: 损失函数Loss Function是定义在单个训练样本上的,也就是一个样本的误差. 代价函数Cost Function是定义在整个训练集上的,也就是所有 ...
- Pikachu-Unsafe Filedownload(不安全的文件下载)
不安全的文件下载概述 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文 ...
- 使用FRP做内网穿透
Github地址:https://github.com/fatedier/frp 什么是FRP? frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 h ...
- .net core3.0 webapi搭建(一)
一.创建WebApi项目: 生成项目之后,控制器默认生成了一个WeatherForecastController 我们可以直接启动项目,F5调试,默认进入WeatherForecastControll ...