千家信息网

如何理解Ribbon中的ServerList

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天就跟大家聊聊有关如何理解Ribbon中的ServerList,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ServerList是存数服务实
千家信息网最后更新 2026年11月02日如何理解Ribbon中的ServerList

今天就跟大家聊聊有关如何理解Ribbon中的ServerList,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

ServerList是存数服务实例的对象。

  • ServerList

public interface ServerList {    public List getInitialListOfServers();        /**     * Return updated list of servers. This is called say every 30 secs     * (configurable) by the Loadbalancer's Ping cycle     *      */    public List getUpdatedListOfServers();   }
  • StaticServerList

通过静态配置来维护服务列表。

public class StaticServerList implements ServerList {   private final List servers;   public StaticServerList(T... servers) {      this.servers = Arrays.asList(servers);   }   @Override   public List getInitialListOfServers() {      return servers;   }   @Override   public List getUpdatedListOfServers() {      return servers;   }}
  • AbstractServerList

ServerList拦截器,被LoadBalancer使用。

public abstract class AbstractServerList implements ServerList, IClientConfigAware {              /**     * Get a ServerListFilter instance. It uses {@link ClientFactory#instantiateInstanceWithClientConfig(String, IClientConfig)}     * which in turn uses reflection to initialize the filter instance.      * The filter class name is determined by the value of {@link CommonClientConfigKey#NIWSServerListFilterClassName}     * in the {@link IClientConfig}. The default implementation is {@link ZoneAffinityServerListFilter}.     */    public AbstractServerListFilter getFilterImpl(IClientConfig niwsClientConfig) throws ClientException{        try {            String niwsServerListFilterClassName = niwsClientConfig                    .getProperty(                            CommonClientConfigKey.NIWSServerListFilterClassName,                            ZoneAffinityServerListFilter.class.getName())                    .toString();            AbstractServerListFilter abstractNIWSServerListFilter =                     (AbstractServerListFilter) ClientFactory.instantiateInstanceWithClientConfig(niwsServerListFilterClassName, niwsClientConfig);            return abstractNIWSServerListFilter;        } catch (Throwable e) {            throw new ClientException(                    ClientException.ErrorType.CONFIGURATION,                    "Unable to get an instance of CommonClientConfigKey.NIWSServerListFilterClassName. Configured class:"                            + niwsClientConfig                                    .getProperty(CommonClientConfigKey.NIWSServerListFilterClassName), e);        }    }}
  • ConfigurationBasedServerList

通过配置文件参数listOfservers,来实现ServerList.多个用逗号分隔。

public class ConfigurationBasedServerList extends AbstractServerList  {   private IClientConfig clientConfig;         @Override   public List getInitialListOfServers() {       return getUpdatedListOfServers();   }   @Override   public List getUpdatedListOfServers() {        String listOfServers = clientConfig.get(CommonClientConfigKey.ListOfServers);        return derive(listOfServers);   }   @Override   public void initWithNiwsConfig(IClientConfig clientConfig) {       this.clientConfig = clientConfig;   }      protected List derive(String value) {       List list = Lists.newArrayList();      if (!Strings.isNullOrEmpty(value)) {         for (String s: value.split(",")) {            list.add(new Server(s.trim()));         }      }        return list;   }}
  • DiscoveryEnabledNIWSServerList

通过Eureka的服务发现,实现的ServerList.

public class DiscoveryEnabledNIWSServerList extends AbstractServerList{    @Override    public List getInitialListOfServers(){        return obtainServersViaDiscovery();    }        @Override    public List getUpdatedListOfServers(){        return obtainServersViaDiscovery();    }        private List obtainServersViaDiscovery() {        List serverList = new ArrayList();            if (eurekaClientProvider == null || eurekaClientProvider.get() == null) {            logger.warn("EurekaClient has not been initialized yet, returning an empty list");            return new ArrayList();        }            EurekaClient eurekaClient = eurekaClientProvider.get();        if (vipAddresses!=null){            for (String vipAddress : vipAddresses.split(",")) {                // if targetRegion is null, it will be interpreted as the same region of client                List listOfInstanceInfo = eurekaClient.getInstancesByVipAddress(vipAddress, isSecure, targetRegion);                for (InstanceInfo ii : listOfInstanceInfo) {                    if (ii.getStatus().equals(InstanceStatus.UP)) {                            if(shouldUseOverridePort){                            if(logger.isDebugEnabled()){                                logger.debug("Overriding port on client name: " + clientName + " to " + overridePort);                            }                                // copy is necessary since the InstanceInfo builder just uses the original reference,                            // and we don't want to corrupt the global eureka copy of the object which may be                            // used by other clients in our system                            InstanceInfo copy = new InstanceInfo(ii);                                if(isSecure){                                ii = new InstanceInfo.Builder(copy).setSecurePort(overridePort).build();                            }else{                                ii = new InstanceInfo.Builder(copy).setPort(overridePort).build();                            }                        }                            DiscoveryEnabledServer des = new DiscoveryEnabledServer(ii, isSecure, shouldUseIpAddr);                        des.setZone(DiscoveryClient.getZone(ii));                        serverList.add(des);                    }                }                if (serverList.size()>0 && prioritizeVipAddressBasedServers){                    break; // if the current vipAddress has servers, we dont use subsequent vipAddress based servers                }            }        }        return serverList;    }}

看完上述内容,你们对如何理解Ribbon中的ServerList有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

内容 服务 配置 参数 多个 实例 对象 文件 更多 知识 篇文章 维护服务 行业 资讯 资讯频道 逗号 静态 频道 拦截器 进一 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 互联网科技有限公司经营范围 厦门中拓互联网络科技有限公司 互联网和科技创新 互联网科技垄断 美国互联网科技巨头监管 没上市的科技互联网公司 远信互联网科技 远拓互联网科技 卓越科技互联网 招聘 中国的互联网科技企业的崛起 互联网时代科技改变生活 千方科技属于互联网企业吗 晓花互联网科技有限公司网址 互联网媒体平台算高科技产业 电子科技大学互联网创业大赛 深圳市罗太互联网科技有限公司 世界互联网领先科技成果获奖 国大互联网教育科技有限公司薪资 亚光科技低轨卫星互联网 互联网科技 广州紫鲸互联网科技有限公司 云之行互联网科技 中国互联网科技发展 菲比寻常互联网科技 火传媒上海互联网科技 佰商互联网科技有限公司 华服互联网科技官网 互联网和黑科技的看法 昭通互联网科技选哪家
0