SpringCloud Ribbon(五)之服務例項列表ServerList
阿新 • • 發佈:2021-02-16
技術標籤: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;
}
}