Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)
Posted 小小工匠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)相关的知识,希望对你有一定的参考价值。
文章目录
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 (无修改)
首先屏蔽细粒度配置
#自定义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提供的功能
验证
权重的取值 0 ~ 1 , 修改两个节点的访问权重 0.9 和 0.1
访问10次
观察请求日志
当调整为 0.5:0.5 , 再此请求10次
源码
https://github.com/yangshangwei/SpringCloudAlibabMaster
以上是关于Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)
Spring Cloud Alibaba发布第二个版本,Spring 发来贺电
Spring Cloud Alibaba-MyShop-项目介绍