千家信息网

如何理解Ribbon中的ServerList

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,今天就跟大家聊聊有关如何理解Ribbon中的ServerList,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ServerList是存数服务实
千家信息网最后更新 2025年01月31日如何理解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有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0