今天就跟大家聊聊有关如何理解Ribbon中的ServerList,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
成都创新互联公司长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为绥化企业提供专业的网站制作、成都网站建设,绥化网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
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 StaticServerListimplements 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 AbstractServerListimplements 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有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。