Ribbon :处理客户端负载均衡和容错的解决方案
配置Ribbon的负载均衡
Rule
接口: 定义客户端负载均衡的规则
- RandomRule :随机选择
- RoundRobinRule
- ZoneAvoidanceRule
配置ribbon的负载均衡策略
- 在配置文件中配置
user-center:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 在java代码中配置
/**** 不同的服务使用不同的ribbon策略* @RibbonClient : 表示这个配置是为xxx服务的**/
//@Configuration
//@RibbonClient(name = "user-center",configuration = RibbonConfiguration.class)// 全局服务设置@RibbonClients(defaultConfiguration = RibbonConfiguration.class)
public class UserCenterRibbonConfiguration {
}
如果是为某个微服务单独配置负载均衡策略 @RibbonClient
指定配置文件的位置,,,这个配置文件不能被springboot扫描到,,父子上下文环境,,就像spring和springmvc的环境,,不能重叠,,如果重叠,相当于会变成全局的配置
Ribbon的配置文件
@Configuration
public class RibbonConfiguration {@Beanpublic IRule ribbonRule(){// 负载均衡策略为随机
// return new RandomRule();// 根据权重 这个类是自己写的根据权重判断return new NacosWeightedRule();}/*** 配置 ping的规则* @return*/@Beanpublic IPing ping(){return new PingUrl();}
}
写自己的负载均衡算法:
继承AbstractLoadBalancerRule
, 实现里面的 choose()
方法:
/**** nacos自带的 根据权重的负载均衡策略,,,, 需要配置在ribbon的负载均衡中*/
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {@AutowiredNacosDiscoveryProperties nacosDiscoveryProperties;/*** 初始化规则,, 获取配置信息,,以便在choose中使用* @param clientConfig*/@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}/*** 返回与该规则关联的负载均衡器,,, 负载均衡器维护了服务实例列表* @return*/@Overridepublic ILoadBalancer getLoadBalancer() {return super.getLoadBalancer();}/*** 选择一个服务实例来处理请求,,, 在这个方法中实现自己的负载均衡策略* @param key* @return*/@Overridepublic Server choose(Object key) {try {/*** BaseLoadBalancer : 基本的负载均衡策略: 比如:轮询(round robin),随机选择(Random),,,*/BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();// 想要请求的微服务的名称String name = loadBalancer.getName();// 负载均衡算法,,, nacos内置了基于权重的算法NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();// nacos client 自动通过基于权重的负载均衡算法,给我们一个实例Instance instance = namingService.selectOneHealthyInstance(name);log.info("port = {},instance = {}",instance.getPort(),instance);return new NacosServer(instance);} catch (NacosException e) {throw new RuntimeException(e);}}
}
在nacos中设置的权重就会生效:
用到的类
ILoadBalancer
: 是 netflix ribbon中负责管理服务实例列表
和 提供负载均衡策略
的核心接口
- getAllServers() 返回当前负载均衡器中维护的所有服务实例的列表
- addServers() 向负载均衡器中添加service
- chooseServer() : 根据负载均衡规则,选择一个实例来处理请求