欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Ribbon之ServerList

发布时间:2025/3/19 编程问答 28 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Ribbon之ServerList 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

  • ServerList

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

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

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

ServerList拦截器,被LoadBalancer使用。

public abstract class AbstractServerList<T extends Server> implements ServerList<T>, 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<T> getFilterImpl(IClientConfig niwsClientConfig) throws ClientException{try {String niwsServerListFilterClassName = niwsClientConfig.getProperty(CommonClientConfigKey.NIWSServerListFilterClassName,ZoneAffinityServerListFilter.class.getName()).toString();AbstractServerListFilter<T> abstractNIWSServerListFilter = (AbstractServerListFilter<T>) 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<Server>  {private IClientConfig clientConfig;@Overridepublic List<Server> getInitialListOfServers() {return getUpdatedListOfServers();}@Overridepublic List<Server> getUpdatedListOfServers() {String listOfServers = clientConfig.get(CommonClientConfigKey.ListOfServers);return derive(listOfServers);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {this.clientConfig = clientConfig;}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;} }
  • DiscoveryEnabledNIWSServerList

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

public class DiscoveryEnabledNIWSServerList extends AbstractServerList<DiscoveryEnabledServer>{@Overridepublic List<DiscoveryEnabledServer> getInitialListOfServers(){return obtainServersViaDiscovery();}@Overridepublic List<DiscoveryEnabledServer> getUpdatedListOfServers(){return obtainServersViaDiscovery();}private List<DiscoveryEnabledServer> obtainServersViaDiscovery() {List<DiscoveryEnabledServer> serverList = new ArrayList<DiscoveryEnabledServer>();if (eurekaClientProvider == null || eurekaClientProvider.get() == null) {logger.warn("EurekaClient has not been initialized yet, returning an empty list");return new ArrayList<DiscoveryEnabledServer>();}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 clientList<InstanceInfo> 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 systemInstanceInfo 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;}}



















转载于:https://blog.51cto.com/881206524/2145823

总结

以上是生活随笔为你收集整理的Ribbon之ServerList的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。