负载均衡 @ Lin | 2023-09-13T14:21:26+08:00 | 1 分钟阅读 | 更新于 2023-09-13T14:21:26+08:00

一、负载均衡的两种方式

image-20230710170617433 image-20230710170647054

二、Ribbon

image-20230710170706858 image-20230710170730954

ribbon支持的配置:

image-20230710170814084 image-20230710170838647

例如:

image-20230710170904190

内置的负载均衡规则,默认ZoneAvoidanceRule

image-20230710170917265 image-20230710170939900 image-20230710170958950

扩展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) {
    }
}

© 2019 - 2024 Lin 的博客

Powered by Hugo with theme Dream.

avatar
关于我

Lin 的 ❤️ 博客

记录一些 🌈 生活上,技术上的事

职业是JAVA全栈工程师