使用Ribbon做Spring Cloud Alibaba负载均衡

概念

Ribbon不需要cloud-Alibaba的组件 但是默认也会被导入进去 默认采用轮询优化负载均衡 使用方式也很简单

简单使用

在之前的RestTemplte配置加上注解@LoadBalanced即可导入ribbon

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

有了ribbon后我们调用服务就非常简单了

    @GetMapping("/getPort")
    public String getPort(){
       return this.restTemplate.getForObject("http://provider/getPort",String.class);
    }

测试时会发现8081 8082两个服务会轮流被使用 即轮询算法

配置ribbon使用其他的算法

随机算法

在yml加上配置代码即可

provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

基于权重的算法

编写配置文件

provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.jie.config.NacosWeightedRul

实现对应类

@Slf4j
public class NacosWeightedRul extends AbstractLoadBalancerRule {
    @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){
            return null;
        }
    }
}

在nacos我们吧8082服务权重加大
使用Ribbon做Spring Cloud Alibaba负载均衡
测试使用可以发现基本大部分都是在使用8082服务

上一篇:SpringCloud Alibaba微服务原理与实战-读书笔记


下一篇:SpringCloud Alibaba-2-微服务环境搭建