客户端负载实现
1、知道自己的请求目的地(虚拟主机名,默认是spring.application.name)
2、获取所有服务端地址列表(也就是注册表)。
3、选出一个地址,找到虚拟主机名对应的ip、port(将虚拟主机名 对应到 ip和port上)。
4、发起实际请求(最朴素的请求)。
Ribbion原理
- 拦截请求。
- 获取url。
- 通过url中 serviceName 获取 List。
- 通过负载均衡算法选取一个ServiceInstance。(负载算法可插拔自定义,并且可以通过配置文件或代码自定义)
- 替换请求,将原来url中的 serviceName换成ip+port。
核心ILoadBalance
里面包括了所有的 服务提供者集群 的:ip和端口。每个服务都有一个ILoadBalancer,ILoadBalancer里面有该服务列表。
1、ILoadBalancer 承接 eureka 和 ribbon。获取服务地址列表,选择一个。
2、每个服务都有ILoadBalancer。
3、选择服务用 IRule(负载均衡策略)。
处理无用的服务:
两种方法:
1.更新机制,更新最新的服务。
2.ping机制,试试服务好不好。
负载均衡策略
默认:ZoneAvoidanceRule(区域权衡策略)
BestAvailableRule(最低并发策略)
RoundRobinRule(轮询策略)
。。。
配置饥饿加载
ribbon:
eager-load:
enabled: true
clients:
- SERVICE-NAM
总结
- 几种负载均衡。(硬,软(服务端,客户端(Ribbon)))
- Ribbon可以单独使用。需要提供服务地址列表。
- 原理。拦截请求,然后替换地址(servicename到ip+port)。
- 源码。ILoadBalancer,Map<服务名,ILoadBalancer>
- @LoadBalanced,拦截器。(LoadBalancerInterceptor中intercept)
- 自定义配置:java配置,yml配置。
- 自定义负载均衡策略
自定义负载配置
1,java
//所有client走入该配置
@RibbonClients(defaultConfiguration = RibbonConfiguration.class)
//RibbonConfiguration中可使用ribbon提供负载,或自定义负载
//单个client走入该配置
@RibbonClient(name = "service-name",configuration = RibbonConfiguration.class)
2,yml
//不添加service-name为所有
service-name:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
//自定义策略
service-sms:
ribbon:
# 自定义负载策略
NFLoadBalancerRuleClassName: com.mybalance.RaymondRule