spring cloud 實現基於Nacos權重的負載均衡


 

package com.water.step.service.user.nacos;

import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties;
import org.springframework.cloud.alibaba.nacos.ribbon.NacosServer;

/**
 * 基於Nacos權重的負載均衡
 *
 * @Author Administrator
 * @create 2020/10/14 20:54
 */
@Slf4j
public class NacosWeightLoadBalancerRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
        // 讀取配置文件,並初始化NacosWeightLoadBalancerRule
    }

    @Override
    public Server choose(Object o) {
        DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
        // 請求的微服務名稱
        String applicationName = loadBalancer.getName();
        try {
            // nacos 通過基於權重的負載均衡算法,算出一個健康的服務實例以供調用
            Instance instance = nacosDiscoveryProperties.namingServiceInstance().selectOneHealthyInstance(applicationName);
            return new NacosServer(instance);
        } catch (NacosException e) {
            log.error("獲取服務實例異常:{}", e.getMessage());
        }
        return null;
    }
}

 

局部配置:調用指定服務提供的服務時,使用基於Nacos權重的負載均衡算法

下面以調用為step-service-order的微服務請求為例:

在application.yaml文件中新增以下代碼:

# 被調用的微服務名
step-service-order: ribbon:
# 指定使用Nacos提供的基於權重的負載均衡 NFLoadBalancerRuleClassName: com.water.step.service.user.nacos.NacosWeightLoadBalancerRule

 

全局配置:調用其他微服務,一律使用基於Nacos權重的負載均衡算法

 

package com.water.step.service.user.nacos;

import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule ribbonRule() {
        return new NacosWeightLoadBalancerRule();
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM