![](/img/2016.png)
一、负载均衡的两种方式
![image-20230710170617433](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170617433.png)
![image-20230710170647054](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170647054.png)
二、Ribbon
![image-20230710170706858](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170706858.png)
![image-20230710170730954](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170730954.png)
ribbon支持的配置:
![image-20230710170814084](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170814084.png)
![image-20230710170838647](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170838647.png)
例如:
内置的负载均衡规则,默认ZoneAvoidanceRule
![image-20230710170917265](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170917265.png)
![image-20230710170939900](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170939900.png)
![image-20230710170958950](https://cdn.jsdelivr.net/gh/recordnote/cdn/img/image-20230710170958950.png)
扩展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) {
}
}