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 的源码

相关推荐
JosieBook3 小时前
【远程运维】Linux 远程连接 Windows 好用的软件:MobaXterm 实战指南
linux·运维·windows
羚羊角uou5 小时前
【Linux】命名管道
linux·运维·服务器
IT 小阿姨(数据库)5 小时前
PgSQL监控死元组和自动清理状态的SQL语句执行报错ERROR: division by zero原因分析和解决方法
linux·运维·数据库·sql·postgresql·centos
逍遥浪子~6 小时前
docker实践(一)
运维·docker·容器
AI云原生6 小时前
如何使用Docker快速运行Firefox并实现远程访问本地火狐浏览器的教程
运维·docker·云原生·容器·serverless·firefox·kubeless
今生相伴9916 小时前
ELFK:企业级日志管理的完整解决方案——从入门到精通
运维·elk·elasticsearch
小猪咪piggy7 小时前
【JavaEE】(24) Linux 基础使用和程序部署
linux·运维·服务器
IT 小阿姨(数据库)8 小时前
PgSQL中pg_stat_user_tables 和 pg_stat_user_objects参数详解
linux·运维·数据库·sql·postgresql·oracle
❀͜͡傀儡师8 小时前
Docker部署搜索引擎SearXNG
运维·docker·容器·searxng
虎头金猫8 小时前
如何在Linux上使用Docker在本地部署开源PDF工具Stirling PDF:StirlingPDF+cpolar让专业操作像在线文档一样简单
linux·运维·ubuntu·docker·pdf·开源·centos