• Spring Cloud Alibaba 03:Ribbon负载均衡


    Nacos中默认继承Ribbon

    在上一篇文章基础上,Consumer模块配置类新增@LoadBalanced注解

    @Configuration
    public class ConsumerConfig {
    
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    }
    

    ConsumerController改造

    @RestController
    public class ConsumerController {
    
        private final DiscoveryClient discoveryClient;
        private final RestTemplate restTemplate;
        //访问服务提供者服务的前缀,http://服务名
        private static final String REST_URL_PREFIX = "http://provider";
    
        @Autowired
        public ConsumerController(DiscoveryClient discoveryClient, RestTemplate restTemplate) {
            this.discoveryClient = discoveryClient;
            this.restTemplate = restTemplate;
        }
    
    
        @GetMapping("/instances")
        public List<ServiceInstance> getInstances() {
            return discoveryClient.getInstances("provider");
        }
    
        @GetMapping("/index")
        public String index() {
            return "consumer远程调用provier:" + this.restTemplate.getForObject(REST_URL_PREFIX + "/index", String.class);
        }
    }
    

    默认采用轮询算法,常用的还有随机和权重算法

    随机

    server:
      port: 9090
    
    # 负载均衡策略 服务名+ribbon+策略(不配置默认使用轮询策略)
    provider:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    

    Nacos 权重

    public class NacosWeightedRule extends AbstractLoadBalancerRule {
    
        private static final Logger log = LoggerFactory.getLogger(NacosWeightedRule.class);
    
        @Autowired
        private NacosDiscoveryProperties nacosDiscoveryProperties;
    
        @Override
        public void initWithNiwsConfig(IClientConfig iClientConfig) {
            //读取配置文件
        }
    
        @Override
        public Server choose(Object o) {
            ILoadBalancer loadBalancer = this.getLoadBalancer();
            BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) loadBalancer;
            //获取要请求的微服务名称
            String name = baseLoadBalancer.getName();
            //获取服务发现的相关API
            NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
            try {
                Instance instance = namingService.selectOneHealthyInstance(name);
                log.info("选择的实例是port={},instance={}", instance.getPort(), instance);
                return new NacosServer(instance);
            } catch (NacosException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
    server:
      port: 9090
    
    # 负载均衡策略 服务名+ribbon+策略(不配置默认使用轮询策略)
    provider:
      ribbon:
        NFLoadBalancerRuleClassName: com.godfrey.config.NacosWeightedRule
    

    默认权重都是1,修改权重再进行测试

  • 相关阅读:
    Kubernetes——Pod对象的声明周期(Pod的相位、创建过程、重要行为、探测、重启策略、终止过程)
    多表查询
    七种JOINS SQL
    k8s创建server报错x509: certificate has expired or is not yet valid
    dockercompose安装etcd
    树莓派3B ssh配置
    系统集成项目管理工程师2022年上半年下午案例分析题及答案
    信息系统项目管理师2022年上半年下午案例分析题及答案
    UE4笔记RHI相关
    Civil 3d 几何空间点重新编号
  • 原文地址:https://www.cnblogs.com/MessiXiaoMo3334/p/14075316.html
Copyright © 2020-2023  润新知