本篇继先前发布的1.2 eureka注册中心,完成服务注册的内容。
目录
环境搭建
采用eureka+ribbon的方式,对多个user服务发送请求,并实现负载均衡
负载均衡原理
负载均衡源码追踪
负载均衡策略
如何选择负载均衡策略?
饥饿加载
环境搭建
给order模块和user模块建立独立的数据库,使用bybatis访问数据库
user模块编写接口根据id获取用户信息:
返回样例:
order模块编写接口根据id获取订单信息以及对应的用户信息:
返回样例:
采用eureka+ribbon的方式,对多个user服务发送请求,并实现负载均衡
根据1.2 eureka注册中心,完成服务注册将服务注册至euraka,注册两个user服务(复制方法在末尾)
通过浏览器访问euraka,可以看到注册了两个user实例
改写order模块接口,将实际ip:端口,修改为服务名(通过服务名访问)
在RestTemplate的bean上添加@LoadBalanced注解,实现负载均衡
重启服务,访问order模块接口10次
可以看到,user服务被调用了5次
user2服务也被调用了5次
user和user2服务都被调用了5次,实现了使用eureka注册实例,ribbon负载均衡访问。
负载均衡原理
负载均衡流程简要:
某服务发出请求,被Ribbon拦截,Ribbon从eureka中拉取对应服务名称的服务列表,找到服务名对应的访问ip端口,经过负载均衡处理,发出真实的带ip端口的请求。如下图
负载均衡源码追踪
在前面提到过,某服务发出请求,被Ribbon拦截,即LoadBalancerInterceptor,这个类会在对请求进行拦截,然后从eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。
查看这个类,实现了客户端http请求拦截器接口
在这个接口里有一个方法
LoadBalancerInterceptor类自然是重写了intercept方法,在这里打个断点。
发送请求,可以看到,程序在这里停止了,证明这个请求确实被拦截了
可以看到刚刚发送的请求地址
继续,能看到服务名称被获取:usersvice
拿到了服务名称,按照流程,应该要找eureka获取服务列表了
这里已经看到了ribbon的字眼了
服务名称被交给了这个方法,步进查看
步入
可以看到,已经获取了usersvice的两个服务的ip和端口了,即获取了服务列表。接下来就该到负载均衡了
步入
步入
步过到此,看到chooseServer方法,选择服务,步入
进入 chooseServer,步过到choose,注意rule(rule可是规则的意思啊,猜测以下,是负载均衡的规则)
点开这个rule查看, 看到IRule,查看IRule的实现类
可以看到几个熟悉的字眼,Random(随机),RoundRobin(轮询),说明找对了
再回来看这里的rule,是ZoneAvoidanceRule,是某种规则
继续,执行返回到刚刚的方法,发现已经选择了 localhost:8081 ip和端口
接下来就是一路返回,最后发出真实的ip和端口的请求咯
负载均衡策略
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 重试机制的选择逻辑 |
如何选择负载均衡策略?
非常简单,在配置类配置ribbon的策略就行
方式1:定义IRule的bean,返回策略规则
@Bean
public IRule randomRule(){
return new RandomRule();
}
方法2:配置文件配置策略规则
userservice: #给某个微服务配置负载均衡规则
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
饥饿加载
当第一次访问服务的时候,由于Ribbon默认使用懒加载,导致时间会很长。
可以使用饥饿加载,服务一启动就加载,降低第一次的访问时耗、
如何配置饥饿加载?
修改配置文件:
ribbon:
eager-load:
enabled: true
clients: userservice
文章参考、图片来源:
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务_哔哩哔哩_bilibili