Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon
客户端负载均衡:Spring Cloud Ribbon
一、负载均衡概念
负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容。因为负载均衡对系统的高可用性、
网络压力的缓解和处理能力的扩容的重要手段之一。通常所说的负载均衡指的是服务端负载均衡,分为
硬件负载均衡和软件负载均衡,服务端负载均衡架构方式:
负载均衡都会维护一个下挂可用的服务端清单,并通过心跳检测来剔除故障的服务端节点。
客户端负载均衡与服务端负载均衡最大的不同点在于服务清单的位置,在客户端负载均衡
中,所有的客户端节点都维护着自己要访问的服务端清单,这些清单都来自于服务注册中心。
二、快速入门
代码详情见:https://gitee.com/tangjiapi/RibbonDemon.git
三、Spring Cloud Ribbon 实战
1.Ribbon负载均衡策略与自定义配置
在Ribbon中有丰富的负载均衡策略可供选择:
策略类 命名 描述
RandomRule 随机策略 随机选择server
RoundRobinRule 轮询策略 按顺序选择server(默认策略)
RetryRule 重试策略 在一个配置时间段内当选择server不成功,则一直尝试选择一个可用的server
BestAvailableRule 最低并发策略 逐个考察server,如果server断路器打开,则忽略,在选择其中并发链接最低的server
AvailabilityFilterRule 可用过滤策略 过滤掉一直链接失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)
ResponseTimeWeightRule 响应时间加权策略 根据server的响应时间分配权重。响应时间越长,权重越低,被选择到的概率就越低
ZoneAvoidanceRule 区域权衡策略 综合判断server所在区域的性能和server的可用轮询选择server,并且判定一个AWS Zonede的运行性能是否可用,剔除不可用的Zone中的所有Server.
1)全局策略设置
@Configuration
public class TestConfiguration {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
凡是通过ribbon的请求都会按照配置的规则进行。
2)基于注解的策略设置
/**
* 声明,用于排除
* @author Tang Jiujia
* @since 2019-03-26
*/
public @interface AvoidScan {
}
@Configuration
@AvoidScan
public class TestConfiguration {
@Autowired
IClientConfig config;
@Bean
public IRule ribbonRule(IClientConfig config) {
return new RandomRule();
}
}
@SpringBootApplication
@EnableDiscoveryClient
@RibbonClient(name = "client-a", configuration = TestConfiguration.class)
//让Spring不去扫描@AvoidScan注解的类,因为我们的配置是对单个服务源生效,
// 所以不能应用于全局,如果不排除会报错
@ComponentScan(excludeFilters = {@ComponentScan.Filter
(type = FilterType.ANNOTATION, value = {AvoidScan.class})})
public class RibbonLoadbalancerApplication { public static void main(String[] args) {
SpringApplication.run(RibbonLoadbalancerApplication.class, args);
} /**
* 用于负载均衡
* */
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3)基于配置文件的策略设置
client-a:
ribbon:
NFLoadBalanceRuleClassName: com.netflix.loadbalancer.RandomRule
2.Ribbon超时与重试
F版中的Ribbon重试机制是默认开启的,需要添加对于超时时间与重试策略的配置:
client-a:
ribbon:
ConnectTimeout: 30000
ReadTimeout: 30000
MaxAutoRetries: 1 #对第一次请求的服务的重试次数
MaxAutoRetriesNextServer: 1 #要重试的下一个服务的最大数量
OkToRetryOnAllOperations: true
3.Ribbon的饥饿加载
Ribbon在进行客户端负载均衡时并不是在启动时就加载上下文,而是在实际请求时才去
创建,因此这个特性往往会让我们第一次调用时显得疲软乏力,严重时会引起调用超时。
所有我们可以通过指定Ribbon客户端的名称来开启饥饿加载,即在启动的时候就加载所有
配置项的应用程序上下文。
ribbon:
eager-load:
enabled: true
clients: client-a, client-b, client-c
4.利用配置文件自定义Ribbon客户端
使用配置文件的优先级最高,高于注解和源码中的bean
5.Ribbon脱离Eureka使用
默认情况下,Ribbon客户端会从Eureka注册中心读取服务注册列表,来达到一种
动态的负载均衡。但如果Eureka是一个供很多人使用的公共注册中心,极可能产生
服务侵入性问题,所以就不要从Eureka读取服务列表了,而应该在Ribbon客户端自行指定
服务地址,让Ribbon脱离Eureka来使用。
首先,需要在Ribbon中禁用Eureka功能:
ribbon:
eureka:
enable: false
然后对源服务设定地址列表:
client:
ribbon:
listOfServers: http://localhost:, http://localhost:
Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon的更多相关文章
- Spring Cloud Ribbon---微服务调用和客户端负载均衡
前面分析了Eureka的使用,作为服务注册中心,Eureka 分为 Server 端和 Client 端,Client 端作为服务的提供者,将自己注册到 Server 端,Client端高可用的方式是 ...
- Spring Cloud 微服务六:调用链跟踪Spring cloud sleuth +zipkin
前言:随着微服务系统的增加,服务之间的调用关系变得会非常复杂,这给运维以及排查问题带来了很大的麻烦,这时服务调用监控就显得非常重要了.spring cloud sleuth实现了对分布式服务的监控解决 ...
- Spring Cloud微服务笔记(三)服务治理:Spring Cloud Eureka快速入门
服务治理:Spring Cloud Eureka 一.服务治理 服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现. 1.服务注册: 在服务治理框架中,通常会构 ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- 【SpringCloud微服务实战学习系列】客户端负载均衡Spring Cloud Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的RES模板 ...
- Spring Cloud官方文档中文版-客户端负载均衡:Ribbon
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_spring_cloud_netflix 文中例子我做了一些测试在:h ...
- Spring Cloud微服务笔记(五)Feign
Feign 一.Feign概述 Feign是一个声明式的Web Service客户端.在Spring Cloud 中使用Feign,可以做到 使用HTTP请求访问远程服务,就像调用本地方法一样,同时它 ...
- Spring Cloud微服务笔记(二)Spring Cloud 简介
Spring Cloud 简介 Spring Cloud的设计理念是Integrate Everything,即充分利用现有的开源组件, 在它们之上设计一套统一的规范/接口使它们能够接入Spring ...
- Spring Cloud微服务笔记(一)微服务概念
微服务概念 一.什么是微服务架构 微服务,是一个小的.松耦合的分布式服务. 为什么需要微服务: 1)单体系统部署在一个进程中,修改了一个小功能,为了部署上线就会影响其他功能. 2)单体应用各个功能模块 ...
随机推荐
- IE8 环境的 JQuery 中的 $.ajax 拒绝访问---解决方案
需求是兼容到 IE8. $.ajax 总是请求失败,直接跳转到 error 函数中,报错:拒绝访问. 网上的一些解决方法都试过了还是没有用,比如再请求之前设置 jQuery.support.cors ...
- Ubuntu18.04格式化U盘为NTFS的方法
1.先安装工具ntfs-3g sudo apt-get install ntfs-3g 2.找到需要格式化的U盘在系统中的序号 df -h 找到U盘的序列号后记下来,例如“/dev/sdd1” 3.解 ...
- LOJ #6485 LJJ 学二项式定理
QwQ LOJ #6485 题意 求题面中那个算式 题解 墙上暴利 设$ f(x)=(sx+1)^n$ 假设求出了生成函数$ f$的各项系数显然可以算出答案 因为模$ 4$的缘故只要对于每个余数算出次 ...
- docker方式mysql设置字符集
在docker上部署mysql时,mysql的默认字符集是latin1,这样如果日后有中文会出现异常,不能存储等,因为latin1是不支持中文的. 所以需要将字符集调整为utf8. 方法: 首先启动m ...
- opencv基础教程
1,基本语法 环境:python3.6.6+numpy+opencv3 安装:没有详细编译,直接pip install opencv-python 矩阵和图片: img=numpy.zeros((3, ...
- 使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)
爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 ...
- 数据库入门-pymysql模块的使用
一.pymysql模块安装 由于本人的Python版本为python3.7,所以用pymysql来连接数据库(mysqldb不支持python3.x) 方法一: #在cmd输入 pip3 instal ...
- 04-HTTP协议和静态Web服务器
一.HTTP协议(HyperText Transfer Protocol) 超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...
- 怎么在PDF上进行文字修改
文件相信大家不论是工作中还是在学习生活中都会有遇到,有时候我们会遇到PDF文件中的文字有时候会有错误的时候,这个时候就需要对修改PDF文件上的文字,那么具体要怎么做呢,PDF文件需要借助软件才可以编辑 ...
- Spring出现事务代理的原因
JdbcTemplate 在配置事务代理之前,JdbcTemplate 的关闭策略,就是操作完立刻关闭!意味着,默认情况是JdbcTemplate操作是不支持事务的!!! 但是我们的程序是需要支持事务 ...