一、关于负载均衡
负载均衡一般分为服务器端负载均衡
和客户端负载均衡
服务器端负载均衡
,比如Nginx、F5这些,请求到达服务器之后由这些负载均衡器根据一定的算法将请求路由到目标服务器处理。客户端负载均衡
,比如我们要说的Ribbon,服务消费者客户端会有一个服务器 地址列表,调用方在请求前通过一定的负载均衡算法选择一个服务器进行访问,负 载均衡算法的执行是在请求客户端进行- Ribbon是Netflix发布的负载均衡器。Eureka一般配合Ribbon进行使用,Ribbon利 用从Eureka中读取到服务信息,在调用服务提供者提供的服务时,会根据一定的算 法进行负载
二、Ribbon高级应用
在RestTemplate上添加对应注解即可
@Bean
// Ribbon负载均衡
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
三、Ribbon负载均衡策略
Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为 com.netflix.loadbalancer.IRule ,类树如下
修改负载均衡策略
#针对的被调用方微服务名称,不加就是全局生效 lagou-service-resume:
ribbon:
NFLoadBalancerRuleClassName:
com.netflix.loadbalancer.RandomRule #负载策略调整
四、Ribbon核心源码剖析
Ribbon工作原理
Ribbon给restTemplate添加了一个拦截器
Ribbon细节结构图
图中核心是负载均衡管理器LoadBalancer(总的协调者,相当于大脑,为了做事 情,协调四肢),围绕它周围的多有IRule、IPing等
- IRule:是在选择实例的时候的负载均衡策略对象
- IPing:是用来向服务发起心跳检测的,通过心跳检测来判断该服务是否可用
- ServerListFilter:根据一些规则过滤传入的服务实例列表
- ServerListUpdater:定义了一系列的对服务列表的更新操作