前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)

Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)

作者头像
小小工匠
发布2022-02-04 15:13:27
8670
发布2022-02-04 15:13:27
举报
文章被收录于专栏:小工匠聊架构

文章目录

在这里插入图片描述
在这里插入图片描述

Pre

我们看下Nacos Server上的服务详情中有个权重

在这里插入图片描述
在这里插入图片描述

Spring Cloud Alibaba - 07 Ribbon 应用篇及内置的负载均衡算法

在这里插入图片描述
在这里插入图片描述

没有根据权重访问的策略, 自己写个行不 ?

假设我们一个微服务部署了三台服务器A,B,C.其中A,B,C三台服务的性能不一,A的性能最牛逼,B次之,C最差.那么我们设置权重比例 为5 : 3:2 那就说明 10次请求到A上理论是5次,B服务上理论是3次,B服务理论是2次.

工程

artisan-cloud-customcfg-ribbon-order (修改)

artisan-cloud-customcfg-ribbon-pay (无修改)

首先屏蔽细粒度配置

代码语言:javascript
复制
#自定义Ribbon的细粒度配置 (推荐)
#artisan-pay-center:
#  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#
#artisan-product-center:
#  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

# ribbon 饥饿加载 解决第一次耗时多的问题

然后通过代码设置一个全局配置 指定 GlobalRibbonConfig

代码语言:javascript
复制
package com.artisan.config;

import com.globalconfig.GlobalRibbonConfig;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Configuration;

/**
 * @author 小工匠
 * @version 1.0
 * @description: Ribbon 全局配置,通过代码实现
 * @date 2022/2/3 0:05
 * @mark: show me the code , change the world
 */


@Configuration
@RibbonClients(defaultConfiguration = GlobalRibbonConfig.class)
public class CustomRibbonConfig2 {
}

GlobalRibbonConfig 设置负载均衡策略

代码语言:javascript
复制
package com.globalconfig;

import com.artisan.customrules.ArtisanWeightedRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 小工匠
 * @version 1.0
 * @description: 全局负载均衡策略
 * @date 2022/2/3 0:06
 * @mark: show me the code , change the world
 */

@Configuration
public class GlobalRibbonConfig {

    @Bean
    public IRule globalConfig() {
        // 根据权重的规则
        return new ArtisanWeightedRule();
    }
}
开发自定义策略 (权重访问)
代码语言:javascript
复制
package com.artisan.customrules;

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 com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author 小工匠
 * @version 1.0
 * @description: 自定义权重策略
 * @date 2022/2/3 0:08
 * @mark: show me the code , change the world
 */
@Slf4j
public class ArtisanWeightedRule extends AbstractLoadBalancerRule {


    @Autowired
    private NacosDiscoveryProperties discoveryProperties;

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
        //读取配置文件并且初始化,ribbon内部的, 几乎用不上
    }

    @Override
    public Server choose(Object key) {
        try {
            log.info("key:{}", key);
            BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
            log.info("baseLoadBalancer--->:{}", baseLoadBalancer);

            //获取微服务的名称
            String serviceName = baseLoadBalancer.getName();

            //获取Nacos服务发现的相关组件API
            NamingService namingService = discoveryProperties.namingServiceInstance();

            //获取 一个基于nacos client 实现权重的负载均衡算法
            Instance instance = namingService.selectOneHealthyInstance(serviceName);

            //返回一个server
            return new NacosServer(instance);
        } catch (NacosException e) {
            log.error("自定义负载均衡算法错误");
        }
        return null;
    }
}

可以看到,这里的权重访问主要是依赖Nacos提供的功能

验证

在这里插入图片描述
在这里插入图片描述

权重的取值 0 ~ 1 , 修改两个节点的访问权重 0.9 和 0.1

在这里插入图片描述
在这里插入图片描述

访问10次

在这里插入图片描述
在这里插入图片描述

观察请求日志

在这里插入图片描述
在这里插入图片描述

当调整为 0.5:0.5 , 再此请求10次

在这里插入图片描述
在这里插入图片描述

源码

https://github.com/yangshangwei/SpringCloudAlibabMaster

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/02/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Pre
  • 工程
    • 首先屏蔽细粒度配置
      • 然后通过代码设置一个全局配置 指定 GlobalRibbonConfig
        • GlobalRibbonConfig 设置负载均衡策略
          • 验证
          • 源码
          相关产品与服务
          负载均衡
          负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档