一、负载均衡的两种方式
二、Ribbon
ribbon支持的配置:
例如:
内置的负载均衡规则,默认ZoneAvoidanceRule
扩展Ribbon支持nacos权重:
权重使用场景:0~1,权重越大,实例被请求的概率越大,可设置性能较差的服务器权重低一些。
利用Nacos Client的能力
思路:
在阅读代码Nacos源码的过程中,发现Nacos Client本身就提供了负载均衡的能力,并且负载均衡算法正是我们想要的根据权重选择实例!
代码在 com.alibaba.nacos.api.naming.NamingService#selectOneHealthyInstance
,只要想办法调用到这行代码,就可以实现我们想要的功能啦!
代码:
@Slf4j
public class NacosWeightRandomV2Rule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties discoveryProperties;
@Override
public Server choose(Object key) {
DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
String name = loadBalancer.getName();
try {
Instance instance = discoveryProperties.namingServiceInstance()
.selectOneHealthyInstance(name);
log.info("选中的instance = {}", instance);
/*
* instance转server的逻辑参考自:
* org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList.instancesToServerList
*/
return new NacosServer(instance);
} catch (NacosException e) {
log.error("发生异常", e);
return null;
}
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}