原文网址:Spring Cloud Feign--使用Nacos作为Ribbon的负载均衡策略_IT利刃出鞘的博客-CSDN博客
本文介绍Spring Cloud的Ribbon如何整合Nacos负载均衡器。
之前介绍过,可以通过修改Nacos的权重来控制流量,但是这只对网关进来的请求有效,对于feign调用是无效的,因为Ribbon默认用的是自己的负载均衡器(ZoneAvoidanceRule)。想要feign调用支持Nacos权重配置,就要自定义负载均衡策略,将Nacos权重的策略作为ribbon的负载均衡器。
- import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
- import com.alibaba.cloud.nacos.ribbon.NacosServer;
- import com.alibaba.nacos.api.exception.NacosException;
- import com.alibaba.nacos.api.naming.NamingService;
- import com.alibaba.nacos.api.naming.pojo.Instance;
- import com.netflix.client.config.IClientConfig;
- import com.netflix.loadbalancer.AbstractLoadBalancerRule;
- import com.netflix.loadbalancer.BaseLoadBalancer;
- import com.netflix.loadbalancer.Server;
- import org.springframework.beans.factory.annotation.Autowired;
- import lombok.extern.slf4j.Slf4j;
-
- @Slf4j
- public class NacosWeightLoadBalancerRule extends AbstractLoadBalancerRule {
- /**
- * NacosDiscoveryProperties内置了基于权重的负载均衡算法
- */
- @Autowired
- private NacosDiscoveryProperties nacosDiscoveryProperties;
-
- /**
- * 读取配置文件并初始化NacosWeightedRule
- */
- @Override
- public void initWithNiwsConfig(IClientConfig iClientConfig) {
-
- }
-
- /**
- * 实现基于权重的负载均衡算法
- */
- @Override
- public Server choose(Object o) {
- try {
- BaseLoadBalancer loadBalancer = (BaseLoadBalancer)this.getLoadBalancer();
- //请求的微服务名称
- String name = loadBalancer.getName();
- //获得Nacos的应用
- NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
- //Nacos client通过基于权重的负载均衡算法,返回一个实例
- Instance instance = namingService.selectOneHealthyInstance(name);
- return new NacosServer(instance);
- } catch (NacosException e) {
- log.error("获取服务实例异常", e);
- return null;
- }
- }
- }
- import org.springframework.cloud.netflix.ribbon.RibbonClients;
-
- @Configuration
- @RibbonClients(defaultConfiguration = {NacosWeightLoadBalancerRuleConfiguration.class})
- public class DefaultRibbonLoadBalancerConfiguration {
- }
- import org.springframework.cloud.netflix.ribbon.RibbonClients;
- import com.netflix.loadbalancer.IRule;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- public class DefaultRibbonLoadBalancerConfiguration {
-
- @Bean
- public IRule iRule(){
- return new NacosWeightLoadBalancerRule();
- }
-
- }
注意
不能将上边的两个类整合成一个,否则feign调用会失败。
order服务(调用者)application.yml:
- # 被调用的微服务名
- storage:
- ribbon:
- # 指定使用Nacos提供的基于权重的负载均衡
- NFLoadBalancerRuleClassName: com.order.nacos.NacosWeightLoadBalancerRule