负载均衡使用
1、概念
负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。
作用
高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。
高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等。
2、策略算法
策略 | 方式 | 描述 |
轮询 | 一般为默认方式 | 每个请求按先后顺序逐一分派到不一样的后端网络服务器,假如后端开发网络服务器down掉,能全自动去除。 适合场景:各服务器处理能力相近,且每个事务工作量差异不大。如果存在较大差异,那么处理较慢的服务器就可能会积压请求,最终无法承担过大的负载。 |
weight | 权重方式 | 特定轮询概率,weight和浏览比例成正比,用于后端开发网络服务器性能不匀的状况。 |
ip_hash | 依据ip分配方式 | 每个请求按浏览ip的hash结果分派,这样每一个浏览量固定不动浏览一个后端开发网络服务器,能够处理session的难题。 适合场景:保证特定用户总是请求到相同的服务器,若服务器宕机,会话会丢失。 |
least_conn | 最少连接方式 | 把请求转发给连接数较少的后端服务器。 适合场景:适用于对系统负载较为敏感或请求连接时长相差较大的场景。 |
fair(第三方) | 响应时间方式 | 按后端服务器的响应时间来分配请求,响应时间短的优先分配 |
url_hash(第三方) | 依据URL分配方式 | 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。 |
随机 | 随机算法 | 算法将请求随机分发到候选服务器。 适合场景:适合服务器硬件相同的场景。 |
3、主流负载方案
目前主流的负载方案分为以下两种:
集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。
客户端根据自己的请求情况做负载均衡,Ribbon、LoadBalancer 就属于客户端自己做负载均衡。
大白话就是:服务端负载均衡就是客户端不知道服务提供方的地址,请求到了服务器后,再根据服务端配置的ip进行负载均衡。客户端负载均衡就是客户端要调用服务端,从注册中心获取到服务提供方的所有实例的ip地址,然后再进行负载均衡。
3.1 客户端的负载均衡
例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。
![](https://img-blog.csdnimg.cn/img_convert/222e03d6fd0f43cb8914b63f1db596ab.jpeg)
3.2 服务端的负载均衡
例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
![](https://img-blog.csdnimg.cn/img_convert/bc5d93e2f0109895eee4be5370662503.png)
4、LoadBalancer
在spring-cloud2020后eureka移除了ribbon。需要使用LoadBalance来设置自定义的负载均衡。eureka自带了LoadBalance依赖,所以只需加入eureka客户端依赖。和ribbon一样需要配置RestTemplate实现远程调用。
4.1 提供的负载均衡策略
LoadBalancer默认提供了两种负载均衡策略:
RandomLoadBalancer - 随机分配策略
(默认) RoundRobinLoadBalancer - 轮询分配策略
4.2 自定义负载均衡策略
现在我们希望修改默认的负载均衡策略,可以进行指定,比如我们现在希望用户服务采用随机分配策略,我们需要先创建随机分配策略的配置类(不用加@Configuration):
public class LoadBalancerConfig {
//将官方提供的 RandomLoadBalancer 注册为Bean
@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}
接着我们需要为对应的服务指定负载均衡策略,直接使用注解即可:
@Configuration
@LoadBalancerClient(value = "userservice", //指定为 userservice 服务,只要是调用此服务都会使用我们指定的策略
configuration = LoadBalancerConfig.class) //指定我们刚刚定义好的配置类
public class BeanConfig {
@Bean
@LoadBalanced
RestTemplate template(){
return new RestTemplate();
}
}
参考:
https://blog.csdn.net/wanghangzhen/article/details/118554304
https://www.jianshu.com/p/2d70a367f9d2
https://blog.csdn.net/qq_40182873/article/details/128210251
https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126045371
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击