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 {
@Bean
public IRule ribbonRule(){
// 负载均衡策略为随机
// return new RandomRule();
// 根据权重 这个类是自己写的根据权重判断
return new NacosWeightedRule();
}
/**
* 配置 ping的规则
* @return
*/
@Bean
public IPing ping(){
return new PingUrl();
}
}
写自己的负载均衡算法:
继承AbstractLoadBalancerRule
, 实现里面的 choose()
方法:
/**
*
* nacos自带的 根据权重的负载均衡策略,,,, 需要配置在ribbon的负载均衡中
*/
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {
@Autowired
NacosDiscoveryProperties nacosDiscoveryProperties;
/**
* 初始化规则,, 获取配置信息,,以便在choose中使用
* @param clientConfig
*/
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
/**
* 返回与该规则关联的负载均衡器,,, 负载均衡器维护了服务实例列表
* @return
*/
@Override
public ILoadBalancer getLoadBalancer() {
return super.getLoadBalancer();
}
/**
* 选择一个服务实例来处理请求,,, 在这个方法中实现自己的负载均衡策略
* @param key
* @return
*/
@Override
public 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() : 根据负载均衡规则,选择一个实例来处理请求