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(); } }