spring cloud 客户端负载均衡 - Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的,Ribbon不像注册中心、网关那样需要单独部署,它是作为一个工具直接集成到Service里。后面要讲到的Feign里面也集成了Ribbon。
1、手动搭建一个客户端负载均衡
准备工作:
- 准备一个由 peer1、peer2 构成的配置中心
- 准备一个由 service-1(8091)、service-1(8092) 构成的服务端集群
- 准备一个Ribbon客户端
添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
Ribbon客户端,使用@EnableDiscoveryClient向Eureka注册:
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonServiceApplication {
public static void main(String[] args) {
SpringApplication.run( RibbonServiceApplication.class, args );
} /**
* 实例化RestTemplate,通过@LoadBalanced注解开启均衡负载
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
调用Service-1提供的服务:
@Service
public class UserService { @Autowired
private RestTemplate restTemplate; public UserDto getUser(Long userId) {
ResponseEntity<UserDto> responseEntity = restTemplate.getForEntity("http://service-1/getUser/{1}", UserDto.class, userId);
return responseEntity.getBody();
}
}
依次启动注册中心、Service-1两个实例和Ribbon,全部启动成功后,可以看到service-1启动了两个实例,如下图所示:

访问 Ribbon 客户端接口:http://localhost:9000/user/getByUserId

刷新页面,后端Service-1的两个实例分别输出日志:
service-1:8091
8091 provides service
service-1:8092
8092 provides service
8092 provides service
系统架构如图所示:

2、Ribbon配置
自动化配置
上面搭建负载均衡过程中没有任何Ribbon相关的配置,是因为Spring Cloud整合Eureka和Ribbon时做了很多默认配置。
在没有引入Spring Cloud Eureka时,Spring Cloud Ribbon 已经默认实现了这些配置bean:
IClientConfig :Ribbon客户端配置,默认采用 com.netflix.client.config.DefaultClientConfigImpl
IRule :Ribbon的负载均衡策略,默认采用 com.netflix.loadbalancer.ZoneAvoidanceRule
IPing:Ribbon实例心跳检查策略,默认采用 com.netflix.loadbalancer.NoOpPing,通过看实现可以看出:不会检查实例是否可用,始终返回true

ServerList:服务实例清单维护列表,默认采用 com.netflix.loadbalancer.ConfigurationBasedServerList
ServerListFilter :服务实例清单过滤机制,默认采用 org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter
ILoadBalancer :负载均衡器,默认采用 com.netflix.loadbalancer.ZoneAwareLoadBalancer
自定义配置:代码+RibbonClient方式
@RibbonClient(value = "service-1", configuration = MyRibbonConfig.class)
public class RibbonServiceApplication {
自定义负载为随机时:
@Configuration
public class MyRibbonConfig {
@Bean
public IRule ribbonRule() { new RandomRule(); }
}
当自定义负载换为轮询时:
@Configuration
public class MyRibbonConfig {
@Bean
public IRule ribbonRule() { new RoundRobinRule(); }
}
分别在上面两种情况下刷新页面 http://localhost:9000/user/getByUserId (以刷新8次为例,观察service-1两个实例控制台打印的log):
- 当为 RandomRule 时发现service-1在8091和8092两个实例随机提供服务。
- 当为 RoundRobinRule 时发现service-1在8091和8092两个实例轮流提供服务。
自定义配置:代码+配置文件方式(Components of load balancer)
在properties里配置,通过反射方式创建,配置方式如下:
以 `<clientName>.ribbon.` 为前缀,加上下面的属性名(属性名来自 org.springframework.cloud.netflix.ribbon.PropertiesFactory 类):
NFLoadBalancerClassName
NFLoadBalancerRuleClassName
NFLoadBalancerPingClassName
NIWSServerListClassName
NIWSServerListFilterClassName
配置ribbon负载方式(针对service-1服务设置):
service-1:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
将自定义类赋给对应的属性可以做到服务级别的自定义配置。
3、附录
本文Demo地址:Ribbon Service
spring cloud 客户端负载均衡 - Ribbon的更多相关文章
- 客户端负载均衡Ribbon
客户端负载均衡Ribbon 一.Ribbon是什么 二.Ribbon实现客户端负载均衡 三.Ribbon负载均衡策略 四.Rest请求模板类解读 4.1 RestTemplate的GET请求 第一种: ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)
在使用RestTemplate来消费spring boot的Restful服务示例中,我们提到,调用spring boot服务的时候,需要将服务的URL写死或者是写在配置文件中,但这两种方式,无论哪一 ...
- spring cloud 之 客户端负载均衡 Ribbon
一.负载均衡 负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意 ...
- Spring Cloud第四篇 | 客户端负载均衡Ribbon
本文是Spring Cloud专栏的第四篇文章,了解前三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状; L ...
- Spring Cloud之负载均衡组件Ribbon原理分析
目录 前言 一个问题引发的思考 Ribbon的简单使用 Ribbon 原理分析 @LoadBalanced 注解 @Qualifier注解 LoadBalancerAutoConfiguration ...
- 【Dalston】【第二章】客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- 客户端负载均衡Ribbon之二:Loadbalance的源码
Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法. 像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡 ...
随机推荐
- 2019-09-16 curl简单操作
1.get请求 (使用file_get_contents()函数也可以实现get请求) //http_build_query() 构造一个url字符串 function http_get($url) ...
- 使用Keepalived实现MySQL双主高可用
MySQL双主配置 环境准备: OS: CentOS7 master:192.168.1.10 backup:192.168.1.20 VIP:192.168.1.30 一.安装MySQL数据库. 在 ...
- jvm运行时数据区之程序计数器
什么是程序计数器? 程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 :在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解 ...
- 【MySQL】rds 不支持镜像表/联合表,怎么办?
出于对业务的不了解,往往会让人做出错误的判断 CREATE TABLE `new_tables` ( `customer_id` int(11) NOT NULL AUTO_INCREMENT C ...
- ajax+vue简单使用
<script type="text/javascript" src="http://cdn.bootcss.com/vue/2.2.2/vue.min.js&qu ...
- 我是这样手写Spring的,麻雀虽小五脏俱全
人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...
- Flask中before_request与after_request使用
目录 1.前提,装饰器的弊端 2.before_request与after_request 2.1 before_request分析: 2.2 after_request分析: 3.before_re ...
- lua 的匹配规则
匹配规则 .(点): 与任何字符配对 %a: 与任何字母配对 %c: 与任何控制符配对(例如\n) %d: 与任何数字配对 %l: 与任何小写字母配对 %p: 与任何标点(punctuation)配对 ...
- A站(ACFun)爬虫爬取并播放、下载视频(JAVA)
本文使用的工具有vlc+ffmpeg+phantomjs 一般视频网站的视频地址暴露的方式有两种: 1.html直接暴露 2.通过ajax异步返回. A站使用的方式是第二种.针对第一种方式,直接使用j ...
- docker学习10-注册docker hub账号
前言 Docker Hub是Docker的远程镜像仓库,是 docker 官网推出的 docker 仓库的一个公共服务器,在上面可以有私有和公有的镜像. 类似于 github,可以上传自己镜像文件,也 ...