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() : 根据负载均衡规则,选择一个实例来处理请求
相关推荐
布朗克16836 分钟前
Go 入门到精通-09-复合类型之Map
开发语言·后端·golang·map
程序员爱钓鱼1 小时前
Rust 开发环境安装(Windows|macOS|Linux)
后端·rust
爱勇宝9 小时前
第 1 章:别把“需求文档”当成真正的需求
前端·后端·程序员
IT_陈寒14 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码15 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo15 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志16 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..16 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects16 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰16 小时前
一些基础和问题解决
后端