客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks]
ribbon:英[ˈrɪbən]美[ˈrɪbən]
n. 带; 绶带; (打印机的) 色带; 带状物;
v. 把…撕成条带; 用缎带装饰; 形成带状;
LB方案分类
目前主流的LB方案可分成两类:
- 一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;
- 另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
软负载均衡:
软负载均衡的实现方式有两种,分别是服务端的负载均衡和客户端的负载均衡
服务端负载均衡:当浏览器向后台发出请求的时候,会首先向反向代理服务器发送请求,反向代理服务器会根据客户端部署的ip:port映射表以及负载均衡策略,来决定向哪台服务器发送请求,一般会使用到nginx反向代理技术。
客户端负载均衡:当浏览器向后台发出请求的时候,客户端会向服务注册器(例如:Eureka Server),拉取注册到服务器的可用服务信息,然后根据负载均衡策略,直接命中哪台服务器发送请求。这整个过程都是在客户端完成的,并不需要反向代理服务器的参与。
Ribbon介绍
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon的主要组件与工作流程
Ribbon的核心组件(均为接口类型)有以下几个:
ServerList
用于获取地址列表。它既可以是静态的(提供一组固定的地址),也可以是动态的(从注册中心中定期查询地址列表)。ServerListFilter
仅当使用动态ServerList时使用,用于在原始的服务列表中使用一定策略过虑掉一部分地址。IRule
选择一个最终的服务地址作为LB结果。选择策略有轮询、根据响应时间加权、断路器(当Hystrix可用时)等。
Ribbon在工作时首选会通过ServerList来获取所有可用的服务列表,然后通过ServerListFilter过虑掉一部分地址,最后在剩下的地址中通过IRule选择出一台服务器作为最终结果。
与Eureka结合使用
当与Eureka组合使用Ribbon时,ServerList
接口会使用DiscoveryEnabledNIWSServerList
实现,该实现会通过 EurekaClient 向Eureka服务器获取可用的服务列表。ServerListFilter
默认实现为ZonePreferenceServerListFilter
,其作用是过虑掉不同zone下的服务(即优先选择同一个zone下的地址)。IRule
使用ZoneAvoidanceRule
实现,它是一种复合策略,同时使用ZoneAvoidancePredicate
和AvailabilityPredicate
来判断是否选择某个server,前者以一个区域为单位判断可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的server;后者用于过滤掉连接数过多和断路器处于打开状态的server。该复合策略经过上述两次过虑后最终选择出一个地址作为LB结果。
Ribbon自带负载均衡策略比较
策略名 | 策略声明 | 策略描述 | 实现说明 |
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule | 选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。 |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 | 轮询index,选择index对应位置的server |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
ZoneAvoidanceRule | public class ZoneAvoidanceRule extends PredicateBasedRule | 复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 |
Ribbon架构图
这里以随机访问策略来举个栗子:
1、ribbon配置文件添加:随机访问策略
service-B.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
其中service-B是我注册到Eureka的serviceID,一共起了3个示例。
2、main类注册:
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
} @Bean
public IRule ribbonRule() {
return new RandomRule();//这里配置策略,和配置文件对应
}
一定记得加第二个注册,很多文章没有。里面配具体的策略。
3、Controller:
@RestController
public class ConsumerController { @Autowired
private RestTemplate restTemplate; @Autowired
private LoadBalancerClient loadBalancerClient; @RequestMapping(value = "/add", method = RequestMethod.GET)
public String add(@RequestParam Integer a,@RequestParam Integer b) {
this.loadBalancerClient.choose("service-B");//随机访问策略
return restTemplate.getForEntity("http://service-B/add?a="+a+"&b="+b, String.class).getBody(); } }
关于负载均衡相关的四个配置项
这些配置项的前缀是【客户端名称】.ribbon
The supported properties are listed below and should be prefixed by <clientName>.ribbon.
:
NFLoadBalancerClassName
: should implementILoadBalancer
NFLoadBalancerRuleClassName
: should implementIRule
NFLoadBalancerPingClassName
: should implementIPing
NIWSServerListClassName
: should implementServerList
NIWSServerListFilterClassName
should implementServerListFilter
其中比较重要的是NFLoadBalancerRuleClassName
,我们可以通过这个配置项定制需要的负载均衡规则,可以是ribbon提供的原生的几种规则类,也可以是自己实现的规则类,这些类都实现了IRule接口。
NFLoadBalancerPingClassName
用于配置查看服务器是否存活。
NFLoadBalancerRuleClassName
指定负载均衡器的实现类。当然,可以设置自己实现的负载均衡器。
NIWSServerListClassName
是服务器列表的处理类,用来维护服务器列表的。Ribbon已经实现了动态服务器列表。
NIWSServerListFilterClassName
是服务器的拦截类。
负载均衡的两种配置方法:
一种直接调用ConfigurationManager获取配置实例,然后设置配置属性;一种是在application.yml中配置。
客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍的更多相关文章
- Spring Cloud Netflix概览和架构设计
Spring Cloud简介 Spring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策 ...
- Spring Cloud netflix 概览和架构设计
pring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等 ...
- Spring Cloud之负载均衡组件Ribbon原理分析
目录 前言 一个问题引发的思考 Ribbon的简单使用 Ribbon 原理分析 @LoadBalanced 注解 @Qualifier注解 LoadBalancerAutoConfiguration ...
- SpringCloud学习笔记(10)----Spring Cloud Netflix之声明式 REST客户端 -Feign的高级特性
1. Feign的默认配置 Feign 的默认配置 Spring Cloud Netflix 提供的默认实现类:FeignClientsConfiguration 解码器:Decoder feignD ...
- Spring Cloud Netflix Eureka源码导读与原理分析
Spring Cloud Netflix技术栈中,Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用,因此对Eureka还是有很大的必要进行深入研究. 本文主要分为四部分,一是对项目构建 ...
- SpringCloud学习笔记(2)----Spring Cloud Netflix之Eureka的使用
1. Spring Cloud Netflix Spring Cloud Netflix 是Spring Cloud 的核心子项目,是对Netflix公司一系列开源产品的封装.它为Spring Bo ...
- [Java复习] Spring Cloud - Netflix
Spring Cloud Netflix常用组件 服务注册与发现:Eureka 服务负载均衡:Ribbon 服务声明式客户端:Feign 服务熔断:Hystrix 服务网关: Zuul Eureka: ...
- Spring Cloud Netflix Zuul 重试会自动跳过经常超时的服务实例的简单说明和分析
在使用E版本的Spring Cloud Netflix Zuul内置的Ribbon重试功能时,发现Ribbon有一个非常有用的特性: 如果某个服务的某个实例经常需要重试,Ribbon则会在自己维护的一 ...
- 分布式微服务技术之 Spring Cloud Netflix
1 背景 Netflix 是全球十大视频网站中唯一收费站点,是美国互联网流媒体播放商,由于访问量巨大,转型为云计算公司. 由Netflix公司主持开发了一套代码框架和库Netflix OSS即open ...
随机推荐
- c++——引用的使用
1.使用引用避免拷贝 c++中拷贝大的类类型对象或容器对象比较低效,甚至有的类型不支持拷贝,这种情况下只能通过引用形参访问该类型的对象 当函数无需修改引用形参的值时,最好使用常量引用 例1:返回两个字 ...
- hdu6440 Dream(费马小定理)
保证 当 n^p=n(mod p) 是成立 只要保证n*m=n*m(mod p); #include<bits/stdc++.h> using namespace std; int ma ...
- itcast-spring-三大框架整合
三大框架架构(整合原理) struts整合到spring hibernate整合到spring 导包 eclipse需要导入 myeclipse不用 单独配置spring容器 单独配置stru ...
- sql表连接方式
表连接有几种? sql表连接分成外连接.内连接和交叉连接. 一.外连接 概述: 外连接包括三种,分别是左外连接.右外连接.全外连接. 对应的sql关键字:LEFT/RIGHT/FULL OUTER ...
- docusaurus 生成的website 通过circleci部署gh-pages
docusaurus 是facebook 开源的一款文档脚手架工具,可以快速的进行文档生成,基于markdown 同时已经内置了gh-pages 发布的命令,对于ci 工具,我们只需要简单的配置就可以 ...
- SPA项目中,404页面 和 登陆页面 对应的路由,应该怎样控制?
SPA项目中,404页面 和 登陆页面 对应的路由,应该怎样控制? 可以这样做: 登陆之前,所有页面跳到 登陆页面:包括随便输入的路由地址. 登陆后,跳到相应页面:随便输入的.不存在的路由地址,才跳到 ...
- malloc的使用、用malloc动态分配内存以适应用户的需求的源代码实例
int len; ; printf("please enter the size that you want: "); scanf("%d", &len ...
- Python MySQLdb 插入数据
其实python链接MySQL的方法很多,比较常用的是MySQLdb这个模块,由于自己准备往数据库里面插入一条日期数据,在格式化的日期数据的时候一直报错,所以这里简单写了一个往MySQL数据库的插入数 ...
- JS 从HTML页面获取自定义属性值
<select id="nextType" data-parameter="@Model.NextType"> <option value=& ...
- MAC JDK默认安装路径 JAVA路径
打开终端,执行 /usr/libexec/java_home -V 默认JDK1.6(Apple自带JDK)路径: /System/Library/Java/JavaVirtualMach ...