Ribbon服务实例选择与更新机制

本文介绍了Ribbon中服务实例的选择和服务实例列表的更新机制。重点解析了ILoadBalancer、IRule、Predicate等核心组件的功能及其实现原理,并详细描述了PollingServerListUpdater如何通过定时任务更新服务实例。
摘要由CSDN通过智能技术生成

简介

用来了解下Ribbon选择服务实例和服务实例列表更新机制;

选择服务实例

服务实例选择涉及到如下几个类:

  • 1.ILoadBalancer:负载均衡对象,用于封装ServerList;
  • 2.IRule:实例选择规则对象,决定采用何种规则进行实例选择;
  • 3.Predicate:断言类,选择规则的具体实现;
  • 4.LoadBalancerStats:用于保存实例状态的缓存类;

更新过程

Ribbon更新服务实例主要依靠的对象有:

  • PollingServerListUpdater:该对象是用来更新服务实例包装类,其该类启动时通过初始化一个LazyHolder,LazyHolder是一个定时任务Excutor的包装类,该Executor会定时调用updateAction.doUpdate()方法进行service instance更新,源码如下:

    @Override
    public synchronized void start(final UpdateAction updateAction) {
        if (isActive.compareAndSet(false, true)) {
            final Runnable wrapperRunnable = new Runnable() {
                @Override
                public void run() {
                    if (!isActive.get()) {
                        if (scheduledFuture != null) {
                            scheduledFuture.cancel(true);
                        }
                        return;
                    }
                    try {
                        updateAction.doUpdate();//服务实例更新
                        lastUpdated = System.currentTimeMillis();
                    } catch (Exception e) {
                        logger.warn("Failed one update cycle", e);
                    }
                }
            };
//获取定时Executor进行任务调度
            scheduledFuture = getRefreshExecutor().scheduleWithFixedDelay(
                    wrapperRunnable,
                    initialDelayMs,
                    refreshIntervalMs,
                    TimeUnit.MILLISECONDS
            );
        } else {
            logger.info("Already active, no-op");
        }
    }
  • ServerListUpdater.UpdateAction源码如下:
 protected final ServerListUpdater.UpdateAction updateAction = new ServerListUpdater.UpdateAction() {
        @Override
        public void doUpdate() {
            updateListOfServers();
        }
    };
  • ServerList的具体实现类serverListImpl进行服务实例更新:
 @VisibleForTesting
    public void updateListOfServers() {
        List<T> servers = new ArrayList<T>();
        if (serverListImpl != null) {
           //获取最新服务实例
            servers = serverListImpl.getUpdatedListOfServers();
            LOGGER.debug("List of Servers for {} obtained from Discovery client: {}",
                    getIdentifier(), servers);

            if (filter != null) {
                servers = filter.getFilteredListOfServers(servers);
                LOGGER.debug("Filtered List of Servers for {} obtained from Discovery client: {}",
                        getIdentifier(), servers);
            }
        }
        updateAllServerList(servers);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值