SpringCloud 负载均衡

目录

一、负载均衡

1、问题

2、什么是负载均衡

服务端负载均衡

客户端负载均衡

[二、Spring Cloud LoadBalance](#二、Spring Cloud LoadBalance)

[1、使用 Spring Cloud LoadBalance](#1、使用 Spring Cloud LoadBalance)

2、负载均衡策略

[3、LoadBalancer 原理](#3、LoadBalancer 原理)


一、负载均衡

1、问题

我们来看一下前面写的代码:

java 复制代码
List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
String uri = instances.get(0).getUri().toString();

在分布式架构中,一个应用通常是多实例部署的,假设我们当前的 product-service 也是多机部署的话,会出现什么问题呢?

如果⼀个服务对应多个实例呢? 流量是否可以合理的分配到多个实例呢?

点击 service

然后直接 run 就行了

此时, 9091 和 9092 都可以在 Eureka 注册中心查看了

我们对程序重新进行访问刷新,观察订单服务的日志

此时我们会发现,我们虽然启动了多个程序,但是始终访问的都只有其中一个服务,会导致 9091和 9092 的浪费

实际上,每次请求访问的时候是随机的,多次访问也有可能会出现 9091 和 9092

假设,我们希望第一请求对应第一台机器,第二次请求对应第二台机器....那么我们该如何实现呢?

我们可以运用取余的方法 请求计数器 % 实例数进行实现


2、什么是负载均衡

负载均衡是高并发高可用系统必不可少的组件

负载可以理解为流量、压力

均衡可以理解为把流量进行合理的分配

当服务流量增大时, 通常会采用增加机器的方式进行扩容, 负载均衡就是用来在多个机器或者其他资源中, 按照⼀定的规则合理分配负载.

负载均衡主要分为服务端负载均衡和客户端负载均衡

服务端负载均衡

比如订单服务调用商品服务,此时订单服务就是客户端,商品服务就是服务端

Nginx 就是一个比较有名的负载均衡器,请求会先到达负载均衡器,然后通过负载均衡算法,在多个服务器之间进行访问

客户端负载均衡

客户端负载均衡是在客户端进行负载均衡算法的分配

客户端先在注册中心获取服务列表,接下来客户端把负载均衡以代码公共类库的方式放在客户端,然后客户端获取服务列表之后,根据算法进行选择访问

最新版本的 Spring Cloud 负载均衡集成的是 Spring Cloud LoadBalance

二、Spring Cloud LoadBalance

1、使用 Spring Cloud LoadBalance

1、添加注解

2、修改远程调用代码


2、负载均衡策略

负载均衡策略是⼀种思想, 即按照什么样的策略进行负载的分配

Spring Cloud LoadBalancer 仅支持两种负载均衡策略: 轮询策略随机策略

轮训:服务器轮流处理用户请求

随机选择:随机选择一个后端的服务器处理新的请求

Spring Cloud LoadBalancer 默认的策略是轮训策略

如果想要实现自定义的负载均衡策略或者采用随机选择的策略该如何实现呢?

我们可以先将这个类导入项目中

java 复制代码
public class CustomLoadBalancerConfiguration {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

有以下几点注意事项:

1、我们可以通过 @LoadBalancerClient 或者 @LoadBalancerClients 注解进行配置

2、我们不能使用 @Configuration 注解

3、在组件扫描范围内

我们会发现,这个注解里面有两个参数:name 和 value

name 表示当前这个负载均衡客户端对哪个服务生效


3、LoadBalancer 原理

LoadBalancer 的实现, 主要是 LoadBalancerInterceptor , 这个类会对 RestTemplate 的请求进行拦截, 然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的地址信息,替换服务id

LoadBalancerInterceptor 的源码

相关推荐
甲鱼9291 天前
MySQL 实战手记:日志管理与主从复制搭建全指南
运维
碳基沙盒3 天前
OpenClaw 多 Agent 配置实战指南
运维
蝎子莱莱爱打怪6 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
DianSan_ERP7 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅7 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒7 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
zhangfeng11337 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh
ZeroNews内网穿透7 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全
失重外太空啦7 天前
nginx
运维·nginx
Gofarlic_oms17 天前
避免Kisssoft高级分析模块过度采购的科学评估方法
大数据·linux·运维·人工智能·matlab