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

相关推荐
桥田智能2 分钟前
气爪在自动化装配线中是如何应用的?
运维·自动化
€☞扫地僧☜€2 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
其乐无涯2 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流2 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩2 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布2 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花2 小时前
第六章:DNS域名解析服务器
运维·服务器
✿ ༺ ོIT技术༻2 小时前
Linux:认识文件系统
linux·运维·服务器
会掉头发2 小时前
Linux进程通信之共享内存
linux·运维·共享内存·进程通信
我言秋日胜春朝★2 小时前
【Linux】冯诺依曼体系、再谈操作系统
linux·运维·服务器