目录
1、我通过浏览器直接访问userservice/user/1,无法访问,说明是负载均衡做了相应的处理
一、负载均衡流程
1、我通过浏览器直接访问userservice/user/1,无法访问,说明是负载均衡做了相应的处理
2、我们来看一下代码中负载均衡的流程是怎样的
1.我们找到LoadBalancerInterceptor,发现它实现了一个接口ClientHttpRequestInterceptor
2.进入接口查看
根据翻译来看,这是一个请求拦截器接口
3.通过断点的方式,我们查看一下拦截之后发生了什么
4.将orderservice设置在调试模式下运行
5.通过浏览器发起请求
6.进入断点
7.往下走,看到url为刚才我无法访问的地址
8.继续执行,它将主机名获取到了
9.并且交给了RibbonLoadBalancerClient的对象去执行
10.我们步入此断点
发现它通过serviceId创建了一个loadBalancer对象
11.观察此对象,发现它成功拉取到了服务地址
所以,它通过serviceId(服务名称userservice)拿到了服务地址
12.既然拿到了地址,那是怎么进行负载均衡的呢,我们继续步入
可以看到,它调用了父类的方法
步入方法,它现在又调用了一个rule的对象
而对象中有这么几个类,分别为:
- 轮询
- 随机
- 重试
13.它默认的规则是轮询,所以我们拿到了地址端口8081
14.然后将服务名改为拿到的server,就可以访问了
3、图像流程
- order-service发起请求
- 请求被拦截器拦截了,并交给了负载均衡客户端
- 客户端通过url获取到服务名称,并发送给负载均衡动态服务列表
- 这个动态服务列表使用服务名像eureka拉取服务列表
- 通过负载均衡规则选择一个服务,返回给客户端
- 客户端根据服务地址修改url,发起请求
- 访问服务
二、负载均衡策略
1、修改负载均衡策略
(方式一)
只需要在OrderApplication中加入
java
@Bean
public IRule randomRule(){
return new RandomRule();
}
将负载均衡规则由默认的轮询更改为了随机
(方式二)
修改yml
2、两种方式的区别
- 方式一是全部服务都采取随机
- 方式二是只有userservice采取随机
三、饥饿加载
1、测试
(1)将order重启
(2)发送http请求,发现用时为400ms
(3)再次发送请求,用时为66ms
(4)这是因为默认为懒加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
(5)修改为饥饿加载
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
java
ribbon:
eager-load:
enabled: true
clients: userservice