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

相关推荐
烨鹰5 分钟前
戴尔电脑安装Ubuntu双系统
linux·运维·ubuntu
HX科技28 分钟前
Debian系统_主板四个网口1个配置为WAN,3个配置为LAN
linux·运维·网络·debian
草药味儿の岁月1 小时前
Docker镜像分层存储原理:UnionFS技术深度解析
运维·docker·容器
阳区欠5 小时前
【Linux】进程通信
linux·运维·服务器·共享内存·进程通信·system v·管道文件
may_一一5 小时前
终端SSH连接工具SecureCRT安装和连接Linux
运维·服务器·ssh
姓刘的哦6 小时前
Ubuntu环境安装
linux·运维·ubuntu
半路_出家ren6 小时前
网络安全设备介绍:防火墙、堡垒机、入侵检测、入侵防御
安全·网络安全·负载均衡·堡垒机·防火墙·网络安全设备·上网行为管理
春生黎至10056 小时前
GZ073网络系统管理赛项赛题第1套模块A:网络构建解题笔记
运维·网络
IT程序媛-桃子6 小时前
【网安面经合集】42 道高频 Web 安全面试题全解析(附原理+防御+思路)
运维·网络·安全·面试
❀͜͡傀儡师7 小时前
多台服务器上docker部署 Redis 集群
运维·服务器·redis