• Spring Cloud Feign--使用Nacos作为Ribbon的负载均衡策略


    原文网址:Spring Cloud Feign--使用Nacos作为Ribbon的负载均衡策略_IT利刃出鞘的博客-CSDN博客

    简介

            本文介绍Spring Cloud的Ribbon如何整合Nacos负载均衡器。

            之前介绍过,可以通过修改Nacos的权重来控制流量,但是这只对网关进来的请求有效,对于feign调用是无效的,因为Ribbon默认用的是自己的负载均衡器(ZoneAvoidanceRule)。想要feign调用支持Nacos权重配置,就要自定义负载均衡策略,将Nacos权重的策略作为ribbon的负载均衡器。

    自定义Nacos负载均衡器

    1. import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
    2. import com.alibaba.cloud.nacos.ribbon.NacosServer;
    3. import com.alibaba.nacos.api.exception.NacosException;
    4. import com.alibaba.nacos.api.naming.NamingService;
    5. import com.alibaba.nacos.api.naming.pojo.Instance;
    6. import com.netflix.client.config.IClientConfig;
    7. import com.netflix.loadbalancer.AbstractLoadBalancerRule;
    8. import com.netflix.loadbalancer.BaseLoadBalancer;
    9. import com.netflix.loadbalancer.Server;
    10. import org.springframework.beans.factory.annotation.Autowired;
    11. import lombok.extern.slf4j.Slf4j;
    12. @Slf4j
    13. public class NacosWeightLoadBalancerRule extends AbstractLoadBalancerRule {
    14. /**
    15. * NacosDiscoveryProperties内置了基于权重的负载均衡算法
    16. */
    17. @Autowired
    18. private NacosDiscoveryProperties nacosDiscoveryProperties;
    19. /**
    20. * 读取配置文件并初始化NacosWeightedRule
    21. */
    22. @Override
    23. public void initWithNiwsConfig(IClientConfig iClientConfig) {
    24. }
    25. /**
    26. * 实现基于权重的负载均衡算法
    27. */
    28. @Override
    29. public Server choose(Object o) {
    30. try {
    31. BaseLoadBalancer loadBalancer = (BaseLoadBalancer)this.getLoadBalancer();
    32. //请求的微服务名称
    33. String name = loadBalancer.getName();
    34. //获得Nacos的应用
    35. NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
    36. //Nacos client通过基于权重的负载均衡算法,返回一个实例
    37. Instance instance = namingService.selectOneHealthyInstance(name);
    38. return new NacosServer(instance);
    39. } catch (NacosException e) {
    40. log.error("获取服务实例异常", e);
    41. return null;
    42. }
    43. }
    44. }

    指定自定义的负载均衡器

    法1:配置类

    1. import org.springframework.cloud.netflix.ribbon.RibbonClients;
    2. @Configuration
    3. @RibbonClients(defaultConfiguration = {NacosWeightLoadBalancerRuleConfiguration.class})
    4. public class DefaultRibbonLoadBalancerConfiguration {
    5. }
    1. import org.springframework.cloud.netflix.ribbon.RibbonClients;
    2. import com.netflix.loadbalancer.IRule;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. public class DefaultRibbonLoadBalancerConfiguration {
    6. @Bean
    7. public IRule iRule(){
    8. return new NacosWeightLoadBalancerRule();
    9. }
    10. }

    注意

    不能将上边的两个类整合成一个,否则feign调用会失败。

    法2:配置文件

    order服务(调用者)application.yml:

    1. # 被调用的微服务名
    2. storage:
    3. ribbon:
    4. # 指定使用Nacos提供的基于权重的负载均衡
    5. NFLoadBalancerRuleClassName: com.order.nacos.NacosWeightLoadBalancerRule

  • 相关阅读:
    运用精益管理思想提升MES管理系统建设水平
    用Postman发送xml数据
    React 中事件的类型定义
    80个在线小游戏源码
    不知道10年老电脑如何重装系统?其实很简单
    python提高运算速度的方法:内存缓存+磁盘缓存
    but it set boost_system_FOUND to FALSE so package “boost_system“ is
    lintcode 553 · 炸弹袭击【中等 数组+bfs+模拟】
    Apache Calcite - 自定义标量函数
    B - 缺失的数据范围
  • 原文地址:https://blog.csdn.net/feiying0canglang/article/details/126992735