SpringCloud Ribbon(五)之服务实例列表ServerList

一、服务实例列表ServerList

服务实例列表(ServerList)为负载均衡器(Loadbalancer)提供服务的可用实例列表。

负载均衡器(Loadbalancer)通过服务实例列表(ServerList)从注册中心(register)或者配置文件(yaml或properties)上读取全部服务实例(server),然后以服务实例过滤器(ServerListFilter)的过滤方式进行筛选留下满足条件的服务实例,进而借助负载均衡策略(IRule)选择出一个合适的服务实例。

 

二、ServerList实现类

SpringCloud Ribbon(五)之服务实例列表ServerList

NacosServerList   nacos服务发现提供的ServerList

ConfigurationBasedServerList   从配置文件读取静态的服务实例定义

StaticServerList  静态ServerList创建包含不变的服务实例(server)

 

三、具体代码实现

(1)NacosServerList   

public class NacosServerList extends AbstractServerList<NacosServer> {

	private NacosDiscoveryProperties discoveryProperties;

	private String serviceId;

	public NacosServerList(NacosDiscoveryProperties discoveryProperties) {
		this.discoveryProperties = discoveryProperties;
	}

	@Override
	public List<NacosServer> getInitialListOfServers() {
		return getServers();
	}

	@Override
	public List<NacosServer> getUpdatedListOfServers() {
		return getServers();
	}

	private List<NacosServer> getServers() {
		try {
			List<Instance> instances = discoveryProperties.namingServiceInstance()
					.selectInstances(serviceId, true);
			return instancesToServerList(instances);
		}
		catch (Exception e) {
			throw new IllegalStateException(
					"Can not get service instances from nacos, serviceId=" + serviceId,
					e);
		}
	}

	private List<NacosServer> instancesToServerList(List<Instance> instances) {
		List<NacosServer> result = new ArrayList<>();
		if (null == instances) {
			return result;
		}
		for (Instance instance : instances) {
			result.add(new NacosServer(instance));
		}

		return result;
	}

	public String getServiceId() {
		return serviceId;
	}

	@Override
	public void initWithNiwsConfig(IClientConfig iClientConfig) {
		this.serviceId = iClientConfig.getClientName();
	}
}

(2)ConfigurationBasedServerList 

public class ConfigurationBasedServerList extends AbstractServerList<Server>  {

	private IClientConfig clientConfig;
		
	@Override
	public List<Server> getInitialListOfServers() {
	    return getUpdatedListOfServers();
	}

	@Override
	public List<Server> getUpdatedListOfServers() {
        String listOfServers = clientConfig.get(CommonClientConfigKey.ListOfServers);
        return derive(listOfServers);
	}

	@Override
	public 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;
	}
}

(3)StaticServerList 

public class StaticServerList<T extends Server> implements ServerList<T> {

	private final List<T> servers;

	public StaticServerList(T... servers) {
		this.servers = Arrays.asList(servers);
	}

	@Override
	public List<T> getInitialListOfServers() {
		return servers;
	}

	@Override
	public List<T> getUpdatedListOfServers() {
		return servers;
	}

}

 

上一篇:Spring Cloud 入门(二)Zuul 服务网关、Ribbon 负载均衡、Feign 声明式接口调用


下一篇:Spring Cloud Sleuth 分布式请求链路跟踪