ribbon源码之获取服务列表

ServerListUpdater

  动态更新ServerListUpdater的执行策略。核心方法是start,updateAction参数是更新的具体方法。

    void start(UpdateAction updateAction);

PollingServerListUpdater

  是ServerListUpdater的一个实现类,内部使用ScheduledThreadPoolExecutor来执行更新ServerList操作。

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

            scheduledFuture = getRefreshExecutor().scheduleWithFixedDelay(
                    wrapperRunnable,
                    initialDelayMs,
                    refreshIntervalMs,
                    TimeUnit.MILLISECONDS
            );
        } else {
            logger.info("Already active, no-op");
        }
    }

ServerList

  获取serverlist的接口。getInitialListOfServers获取初始的servers;getUpdatedListOfServers获取更新的servers。

public List<T> getInitialListOfServers();
public List<T> getUpdatedListOfServers();   

ConfigurationBasedServerList

  ServerList的一个实现类,从配置文件中获取server list。

    @Override
    public List<Server> getInitialListOfServers() {
        return getUpdatedListOfServers();
    }
    @Override
    public List<Server> getUpdatedListOfServers() {
        String listOfServers = clientConfig.get(CommonClientConfigKey.ListOfServers);
        return derive(listOfServers);
    }
    protected List<Server> derive(String value) {
        List<Server> list = Lists.newArrayList();
        if (!Strings.isNullOrEmpty(value)) {
            for (String s: value.split(",")) {
                list.add(new Server(s.trim()));
            }
        }
        return list;
    }

ServerListFilter

  定义对获取的server list进行过滤。

public List<T> getFilteredListOfServers(List<T> servers);

ZoneAffinityServerListFilter

  ServerListFilter的一个实现类。

时间: 2024-10-10 08:36:56

ribbon源码之获取服务列表的相关文章

第二篇:SOUI源码的获取及编译

源代码的获取 SOUI的源码采用SVN管理. SVN:http://code.taobao.org/svn/soui2 这里主要包含两个目录:trunk 及 third-part. trunk目录保存SOUI项目的全部代码,third-part保存soui系统使用到的不方便放到trunk的第三方库,目前只有一个WKE(一个精简的webkit)的源代码. 一般情况下只获取trunk的代码就行. SOUI的编译 SOUI项目采用QT的qmake管理项目文件.qmake已经从QT中分离出来,不需要你的

[源码]随机获取虾米音乐song_id API文件

[源码]随机获取虾米音乐song_id API文件 January 11, 2015 注意:此API请放置于国内主机使用,如香港.北京等等,否则会提示:虾米音乐在您所处的国家或地区暂时无法使用 <?php $url = file_get_contents('http://www.xiami.com/search/song/page/'.rand(1,636).'?key=%E5%8A%A8%E6%BC%AB&is_pub=y'); preg_match_all("/\?sid=(\

linux 内核源码分析 - 获取数组的大小

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 测试程序: #include<stdio.h> #include<stdlib.h> struct dev { int a; char b; float c; }; struct dev devs[]= { { 1,'a',7.0, }, { 1,'a',7.0, }, { 1,'a',7.0, }, }; int main() { printf("int is %d \

[源码]一键获取windows系统登陆密码vc6版源码

[源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些奇葩环境...1点几M可能要分几十次传过去 总是在关键的时候,发现自己以前弄过的东西突然不见了然后百度好不容易找到了一份..还是发到博客来 收藏需要修改输出TXT的或免杀啥的...上自己博客找源码 #include <windows.h>#include <stdio.h> // //

用C++的源码一键获取密码,超完整的hack教学!

早期SMB协议在网络上传输明文口令.后来出现"LAN Manager Challenge/Response"验证机制,简称LM,它是如此简单以至很容易被破解.微软提出了WindowsNT挑战/响应验证机制,称之为NTLM.现在已经有了更新的NTLMv2以及Kerberos验证体系.Windows加密过的密码口令,我们称之为hash(中文:哈希),Windows的系统密码hash默认情况下一般由两部分组成:第一部分是LM-hash,第二部分是NTLM-hash.用C++的源码一键获取密码

Spring Cloud Ribbon 源码分析---负载均衡算法

上一篇分析了Ribbon如何发送出去一个自带负载均衡效果的HTTP请求,本节就重点分析各个算法都是如何实现. 负载均衡整体是从IRule进去的: public interface IRule{ /* * choose one alive server from lb.allServers or * lb.upServers according to key * * @return choosen Server object. NULL is returned if none * server i

【一起学源码-微服务】Ribbon 源码四:进一步探究Ribbon的IRule和IPing

前言 前情回顾 上一讲深入的讲解了Ribbon的初始化过程及Ribbon与Eureka的整合代码,与Eureka整合的类就是DiscoveryEnableNIWSServerList,同时在DynamicServerListLoadBalancer中会调用PollingServerListUpdater 进行定时更新Eureka注册表信息到BaseLoadBalancer中,默认30s调度一次. 本讲目录 我们知道Ribbon主要是由3个组件组成的: ILoadBalancer IRule IP

Spring Cloud Ribbon源码分析---负载均衡实现

上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还记得前面配置 RestTemplate: @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } 在消费端使用Spring 提供的 RestTemplate 来发出请求,而Ribbon 在 Rest

ribbon源码之负载均衡算法

IRule 负载均衡器用来选择服务器的规则. public interface IRule{ public Server choose(Object key); public void setLoadBalancer(ILoadBalancer lb); public ILoadBalancer getLoadBalancer(); } 通过BaseLoadBalancer的setRule或构造函数来为BaseLoadBalancer添加IRule public void setRule(IRu