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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)

6735aa4777de402592fbe82e8b40ee3d.png

Pre


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


7d25c351775a4215931517284149cda5.png

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


f4c158cf684441de816484b085c2dd5d.png


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


假设我们一个微服务部署了三台服务器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 (无修改)


首先屏蔽细粒度配置


#自定义Ribbon的细粒度配置 (推荐)
#artisan-pay-center:
#  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#
#artisan-product-center:
#  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# ribbon 饥饿加载 解决第一次耗时多的问题


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

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 设置负载均衡策略

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();
    }
}

开发自定义策略 (权重访问)

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提供的功能


验证

c6ac28ab474740a78da4e67b5d2fdab7.png

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


65eb06a09dc6402885e6aaf504248f24.png


访问10次

331df64afe7847aaa6f08cc6168b45f4.png

观察请求日志


image.png


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

image.png


源码


https://github.com/yangshangwei/SpringCloudAlibabMaster

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
9月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
5413 105
|
10月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
454 26
|
9月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
8230 121
|
10月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
7314 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
9月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
11月前
|
机器学习/深度学习 算法 数据可视化
近端策略优化算法PPO的核心概念和PyTorch实现详解
本文深入解析了近端策略优化(PPO)算法的核心原理,并基于PyTorch框架实现了完整的强化学习训练流程。通过Lunar Lander环境展示了算法的全过程,涵盖环境交互、优势函数计算、策略更新等关键模块。内容理论与实践结合,适合希望掌握PPO算法及其实现的读者。
1663 2
近端策略优化算法PPO的核心概念和PyTorch实现详解
|
10月前
|
存储 并行计算 算法
【动态多目标优化算法】基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2023研究(Matlab代码实现)
【动态多目标优化算法】基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2023研究(Matlab代码实现)
428 4

热门文章

最新文章