说明

  为了实现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).

Ribbon 官网介绍

方式二、属性配置(通过配置文件的方式)

这种方式比较简单,直接在.yml或者.properties文件配置即可

在本例中我们在内容中心配置如下(value是所选择负载均衡策略的全路径)

user-center:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

两种方式的对比

配置方式 优点 缺点
代码配置 基于代码,更加灵活 有小坑(父子上下文), 线上修改需重新打包、发布
属性配置 易上手,配置更加直观,线上修改无需打包、发布,优先级更高 极端场景下没有代码配置灵活

最佳实践

  • 尽量使用属性配置,属性方式实现不了再考虑代码配置。因为属性配置没有父子上下文的坑,并且更加直观。

  • 在同一个微服务内的配置方式尽量保持单一性,两种方式不要混用,避免增加问题定位的复杂性

自定义Ribbon客户端策略的更多相关文章

  1. spring cloud 自定义ribbon客户端

    一.自定义Ribbon客户端-[方式一]配置类 1.1.自定义负载规则 增加RibbonConfiguration.java配置类 public class RibbonConfiguration { ...

  2. 0404-服务注册与发现-客户端负载均衡-两种自定义方式-Ribbon通过代码自定义配置、使用配置文件自定义Ribbon Client

    一.官方文档解读 官方地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_cust ...

  3. SpringCloud系列八:自定义Ribbon配置

    1. 回顾 上文使用Ribbon实现了客户端侧的负载均衡.但是很多场景下,我们可能需要自定义Ribbon的配置,比如修改Ribbon的负载均衡规则. Spring Cloud允许使用Java代码或属性 ...

  4. 【Ribbon篇四】自定义负载均衡策略(4)

    官方文档特别指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制 ...

  5. 自定义Ribbon的负载均衡策略

    自定义负载均衡策略 官方文档指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们 ...

  6. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    一.Ribbon中的负载均衡策略 1.Ribbon中支持的负载均衡策略 AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端se ...

  7. 笔记:Spring Cloud Ribbon 客户端配置详解

    自动化配置 由于 Ribbon 中定义的每一个接口都有多种不同的策略实现,同时这些接口之间又有一定的依赖关系,Spring Cloud Ribbon 中的自动化配置能够很方便的自动化构建接口的具体实现 ...

  8. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)

    1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...

  9. 使用Java代码自定义Ribbon配置

    很多场景下,需要实现不同的微服务采用不同的策略,例如修改Ribbon的负载均衡规则等.Spring Cloud允许使用Java代码自定义Ribbon的配置. 在Spring Cloud中,Ribbon ...

随机推荐

  1. Android Vitamio初探

    GitHub: https://github.com/yixia/VitamioBundle 1.下载完毕导入用Android Studio打开 2.新建Mode,引入依赖 dependencies ...

  2. VUE中使用XLSX实现导出excel表格

    简介 项目中经常会用导出数据的场景,这里介绍 VUE 中如何使用插件 xlsx 导出数据 安装 ## 1.使用 npm 或 yarn 安装依赖(三个依赖) npm install -S file-sa ...

  3. python基础入门之三 —— 字符串

    1.格式 一对引号和三对引号可以表示字符串 (三引号保留换行) 2.下标 从0开始循序向下分配 str1='abcdefg' print(str1) print(str1[0]) print(str1 ...

  4. 【pattern】设计模式(3) - Observer观察者模式

    源码地址:https://github.com/vergilyn/design-patterns 另外一个大神很全的Github:https://github.com/iluwatar/java-de ...

  5. hydra-爆破工具的使用

    0x01简介 hydra 是一个支持众多协议的爆破工具,在kali上集成,但也可以在windows上下载运行: github上的源码: https://github.com/vanhauser-thc ...

  6. PostgreSQL内核学习笔记四(SQL引擎)

    PostgreSQL实现了SQL Standard2011的大部分内容,SQL处理是数据库中非常复杂的一部分内容. 本文简要介绍了SQL处理的相关内容. 简要介绍 SQL文的处理分为以下几个部分: P ...

  7. Java-利用位数猜年龄

    题目: 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学.一次,他参加某个重要会议,年轻的脸孔引人注目.于是有人询问他的年龄,他回答说:“ ...

  8. W25Q64BV(FLASH)(SPI)中文手册

    64兆位串行SPI FLASH存储器 1.常规介绍 W25Q64BV(64兆位)串行FLASH存储器为一个空间大小,引脚,功耗限制的系统提供解决方案.25Q系列的灵活性和性能良好超越了普通的串行FLA ...

  9. 抛弃VMware吧,使用Win10自带的Hyper-V创建虚拟机

    个人博客 地址:https://www.wenhaofan.com/article/20190619221449 介绍 Hyper-V是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化. 启动 ...

  10. MyBatis的延迟加载和缓存机制

    延迟加载: 什么是延迟加载: MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. MyBatis根据对 ...