目录
[二、Spring Cloud LoadBalance](#二、Spring Cloud LoadBalance)
[1、使用 Spring Cloud LoadBalance](#1、使用 Spring Cloud LoadBalance)
[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 的源码