1. 程式人生 > 其它 >SpringCloud Ribbon(五)之服務例項列表ServerList

SpringCloud Ribbon(五)之服務例項列表ServerList

技術標籤:Spring Cloud

一、服務例項列表ServerList

服務例項列表(ServerList)為負載均衡器(Loadbalancer)提供服務的可用例項列表。

負載均衡器(Loadbalancer)通過服務例項列表(ServerList)從註冊中心(register)或者配置檔案(yaml或properties)上讀取全部服務例項(server),然後以服務例項過濾器(ServerListFilter)的過濾方式進行篩選留下滿足條件的服務例項,進而藉助負載均衡策略(IRule)選擇出一個合適的服務例項。

二、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;
	}

}