Spring Cloud Feign"/>
Spring Cloud Feign
原文网址:Spring Cloud Feign--使用Nacos作为Ribbon的负载均衡策略_IT利刃出鞘的博客-CSDN博客
简介
本文介绍Spring Cloud的Ribbon如何整合Nacos负载均衡器。
之前介绍过,可以通过修改Nacos的权重来控制流量,但是这只对网关进来的请求有效,对于feign调用是无效的,因为Ribbon默认用的是自己的负载均衡器(ZoneAvoidanceRule)。想要feign调用支持Nacos权重配置,就要自定义负载均衡策略,将Nacos权重的策略作为ribbon的负载均衡器。
自定义Nacos负载均衡器
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 comflix.client.config.IClientConfig;
import comflix.loadbalancer.AbstractLoadBalancerRule;
import comflix.loadbalancer.BaseLoadBalancer;
import comflix.loadbalancer.Server;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class NacosWeightLoadBalancerRule extends AbstractLoadBalancerRule {/*** NacosDiscoveryProperties内置了基于权重的负载均衡算法*/@Autowiredprivate NacosDiscoveryProperties nacosDiscoveryProperties;/*** 读取配置文件并初始化NacosWeightedRule*/@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}/*** 实现基于权重的负载均衡算法*/@Overridepublic 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;}}
}
指定自定义的负载均衡器
法1:配置类
import org.springframework.cloudflix.ribbon.RibbonClients;@Configuration
@RibbonClients(defaultConfiguration = {NacosWeightLoadBalancerRuleConfiguration.class})
public class DefaultRibbonLoadBalancerConfiguration {
}
import org.springframework.cloudflix.ribbon.RibbonClients;
import comflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;public class DefaultRibbonLoadBalancerConfiguration {@Beanpublic IRule iRule(){return new NacosWeightLoadBalancerRule();}}
注意
不能将上边的两个类整合成一个,否则feign调用会失败。
法2:配置文件
order服务(调用者)application.yml:
# 被调用的微服务名
storage:ribbon:# 指定使用Nacos提供的基于权重的负载均衡NFLoadBalancerRuleClassName: com.order.nacos.NacosWeightLoadBalancerRule
更多推荐
Spring Cloud Feign
发布评论