首先声明Ribbon不是SpringCloud Alibaba的组件,Ribbon是Netflix的组件,但是在持续更新~

Ribbon不需要额外添加,在引用SpringCloud的时候就自动加入了
image.png

一、轮询查询

使用

在restTemplate配置类中添加注解@LoadBalanced即可

  1. @Configuration
  2. public class ConsumerConfig {
  3. @Bean
  4. @LoadBalanced
  5. public RestTemplate restTemplate(){
  6. return new RestTemplate();
  7. }
  8. }

在ConsumerController类中

  1. @GetMapping("/index")
  2. public String index(){
  3. return this.restTemplate.getForObject("http://provider/index",String.class);
  4. }

会自动到nacos服务里找到provider服务,负载均衡从多个实例里调用

结果

nacos服务
image.png

调用结果:
image.pngimage.png

二、随机查询

Ribbon默认是轮询查询,如果要随机负载需要在application.yml添加配置

  1. provider:
  2. ribbon:
  3. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

三、权重查询

创建新的权重配置类NacosWeightedRule.java

  1. package com.jili.config;
  2. import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
  3. import com.alibaba.cloud.nacos.ribbon.NacosServer;
  4. import com.alibaba.nacos.api.exception.NacosException;
  5. import com.alibaba.nacos.api.naming.NamingService;
  6. import com.alibaba.nacos.api.naming.pojo.Instance;
  7. import com.netflix.client.config.IClientConfig;
  8. import com.netflix.loadbalancer.AbstractLoadBalancerRule;
  9. import com.netflix.loadbalancer.BaseLoadBalancer;
  10. import com.netflix.loadbalancer.ILoadBalancer;
  11. import com.netflix.loadbalancer.Server;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. @Slf4j
  15. public class NacosWeightedRule extends AbstractLoadBalancerRule {
  16. //注册nacos信息
  17. @Autowired
  18. private NacosDiscoveryProperties nacosDiscoveryProperties;
  19. @Override
  20. public void initWithNiwsConfig(IClientConfig iClientConfig) {
  21. //读取配置文件
  22. }
  23. @Override
  24. public Server choose(Object o) {
  25. ILoadBalancer loadBalancer = this.getLoadBalancer();
  26. BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) loadBalancer;
  27. //获取要请求的微服务名称
  28. String name = baseLoadBalancer.getName();
  29. //获取服务发现的相关API
  30. NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
  31. try {
  32. Instance instance = namingService.selectOneHealthyInstance(name);
  33. log.info("选择的实例是port={},instance={}",instance.getPort(),instance);
  34. return new NacosServer(instance);
  35. } catch (NacosException e) {
  36. e.printStackTrace();
  37. return null;
  38. }
  39. }
  40. }

修改配置文件application.yml

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule ==>
NFLoadBalancerRuleClassName: com.jili.config.NacosWeightedRule(权重配置类名)

  1. server:
  2. port: 8180
  3. provider:
  4. ribbon:
  5. NFLoadBalancerRuleClassName: com.jili.config.NacosWeightedRule

在nacos服务器上修改权重便可人为控制流量
image.png