Ribbon使用

Ribbon :处理客户端负载均衡和容错的解决方案

配置Ribbon的负载均衡

Rule接口: 定义客户端负载均衡的规则

  • RandomRule :随机选择
  • RoundRobinRule
  • ZoneAvoidanceRule

配置ribbon的负载均衡策略

  • 在配置文件中配置
yml 复制代码
user-center:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • 在java代码中配置
java 复制代码
/**
 *
 * 不同的服务使用不同的ribbon策略
 * @RibbonClient : 表示这个配置是为xxx服务的
 *
 */
//@Configuration
//@RibbonClient(name = "user-center",configuration = RibbonConfiguration.class)
    // 全局服务设置
    @RibbonClients(defaultConfiguration = RibbonConfiguration.class)
public class UserCenterRibbonConfiguration {
}

如果是为某个微服务单独配置负载均衡策略 @RibbonClient 指定配置文件的位置,,,这个配置文件不能被springboot扫描到,,父子上下文环境,,就像spring和springmvc的环境,,不能重叠,,如果重叠,相当于会变成全局的配置

Ribbon的配置文件

java 复制代码
@Configuration
public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule(){
        // 负载均衡策略为随机
//        return new RandomRule();

        // 根据权重      这个类是自己写的根据权重判断
        return new NacosWeightedRule();
    }

    /**
     * 配置 ping的规则
     * @return
     */
    @Bean
    public IPing ping(){
        return new PingUrl();
    }
}

写自己的负载均衡算法:

继承AbstractLoadBalancerRule , 实现里面的 choose()方法:

java 复制代码
/**
 *
 * nacos自带的   根据权重的负载均衡策略,,,,    需要配置在ribbon的负载均衡中
 */
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {

    @Autowired
    NacosDiscoveryProperties nacosDiscoveryProperties;


    /**
     * 初始化规则,, 获取配置信息,,以便在choose中使用
     * @param clientConfig
     */
    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {

    }

    /**
     * 返回与该规则关联的负载均衡器,,, 负载均衡器维护了服务实例列表
     * @return
     */
    @Override
    public ILoadBalancer getLoadBalancer() {
        return super.getLoadBalancer();
    }

    /**
     * 选择一个服务实例来处理请求,,,   在这个方法中实现自己的负载均衡策略
     * @param key
     * @return
     */
    @Override
    public Server choose(Object key) {
        try {
            /**
             * BaseLoadBalancer :  基本的负载均衡策略:  比如:轮询(round robin),随机选择(Random),,,
             */
            BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();

            // 想要请求的微服务的名称
            String name = loadBalancer.getName();

            // 负载均衡算法,,,     nacos内置了基于权重的算法
            NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();

            // nacos client 自动通过基于权重的负载均衡算法,给我们一个实例
            Instance instance = namingService.selectOneHealthyInstance(name);

            log.info("port = {},instance = {}",instance.getPort(),instance);


            return new NacosServer(instance);
        } catch (NacosException e) {
            throw new RuntimeException(e);
        }
    }
}

在nacos中设置的权重就会生效:

用到的类

ILoadBalancer : 是 netflix ribbon中负责管理服务实例列表 和 提供负载均衡策略的核心接口

  • getAllServers() 返回当前负载均衡器中维护的所有服务实例的列表
  • addServers() 向负载均衡器中添加service
  • chooseServer() : 根据负载均衡规则,选择一个实例来处理请求
相关推荐
苍何6 小时前
开源微信流 APP,手机微信聊天记录,可以直接给 WorkBuddy 和 Obsidian 了
后端
智驭未来掌门人7 小时前
Qt 项目不建议导入 CLion 说明
后端
Lumos_7 小时前
P1 签名 (PKCS#1) vs 裸签 (Raw Signature)
后端
今天早睡7 小时前
调用真实模型,用 Pydantic 校验后再路由
后端
智驭未来掌门人7 小时前
CLion 创建并运行 Qt 项目指南
后端
数据库小学妹7 小时前
OLAP数据库怎么选、怎么优化?路线、提速与边界
运维·数据库·后端
加洛斯7 小时前
万字推演Elasticsearch修炼方法,从炼气到元婴
后端·elasticsearch·面试
当时只道是寻常_7 小时前
WorkBuddy中调用本地ComfyUi工作流免费生图
后端
用户394995084637 小时前
Python 导入机制实战:改了代码为什么不生效
后端
房西杭7 小时前
GM指令:add_exp 增加经验
后端