您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關spring cloud的ConsulServer怎么用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
本文主要研究一下spring cloud的ConsulServer
spring-cloud-consul-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/discovery/ConsulServer.java
public class ConsulServer extends Server { private final MetaInfo metaInfo; private final HealthService service; private final Map<String, String> metadata; public ConsulServer(final HealthService healthService) { super(findHost(healthService), healthService.getService().getPort()); this.service = healthService; this.metadata = ConsulServerUtils.getMetadata(this.service); this.metaInfo = new MetaInfo() { @Override public String getAppName() { return ConsulServer.this.service.getService().getService(); } @Override public String getServerGroup() { return getMetadata().get("group"); } @Override public String getServiceIdForDiscovery() { return null; } @Override public String getInstanceId() { return ConsulServer.this.service.getService().getId(); } }; setAlive(isPassingChecks()); } @Override public MetaInfo getMetaInfo() { return this.metaInfo; } public HealthService getHealthService() { return this.service; } public Map<String, String> getMetadata() { return this.metadata; } public boolean isPassingChecks() { for (Check check : this.service.getChecks()) { if (check.getStatus() != Check.CheckStatus.PASSING) { return false; } } return true; } }
ConsulServer繼承了com.netflix.loadbalancer.Server;其構造器會調用isPassingChecks方法來setAlive,它通過HealthService來獲取checks的狀態
spring-cloud-consul-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/discovery/ConsulServerList.java
public class ConsulServerList extends AbstractServerList<ConsulServer> { private final ConsulClient client; private final ConsulDiscoveryProperties properties; private String serviceId; public ConsulServerList(ConsulClient client, ConsulDiscoveryProperties properties) { this.client = client; this.properties = properties; } protected ConsulClient getClient() { return this.client; } protected ConsulDiscoveryProperties getProperties() { return this.properties; } protected String getServiceId() { return this.serviceId; } @Override public void initWithNiwsConfig(IClientConfig clientConfig) { this.serviceId = clientConfig.getClientName(); } @Override public List<ConsulServer> getInitialListOfServers() { return getServers(); } @Override public List<ConsulServer> getUpdatedListOfServers() { return getServers(); } private List<ConsulServer> getServers() { if (this.client == null) { return Collections.emptyList(); } String tag = getTag(); // null is ok Response<List<HealthService>> response = this.client.getHealthServices( this.serviceId, tag, this.properties.isQueryPassing(), createQueryParamsForClientRequest(), this.properties.getAclToken()); if (response.getValue() == null || response.getValue().isEmpty()) { return Collections.emptyList(); } return transformResponse(response.getValue()); } /** * Transforms the response from Consul in to a list of usable {@link ConsulServer}s. * @param healthServices the initial list of servers from Consul. Guaranteed to be * non-empty list * @return ConsulServer instances * @see ConsulServer#ConsulServer(HealthService) */ protected List<ConsulServer> transformResponse(List<HealthService> healthServices) { List<ConsulServer> servers = new ArrayList<>(); for (HealthService service : healthServices) { ConsulServer server = new ConsulServer(service); if (server.getMetadata() .containsKey(this.properties.getDefaultZoneMetadataName())) { server.setZone(server.getMetadata() .get(this.properties.getDefaultZoneMetadataName())); } servers.add(server); } return servers; } /** * This method will create the {@link QueryParams} to use when retrieving the services * from Consul. By default {@link QueryParams#DEFAULT} is used. In case a datacenter * is specified for the current serviceId {@link QueryParams#datacenter} is set. * @return an instance of {@link QueryParams} */ protected QueryParams createQueryParamsForClientRequest() { String datacenter = getDatacenter(); if (datacenter != null) { return new QueryParams(datacenter); } return QueryParams.DEFAULT; } protected String getTag() { return this.properties.getQueryTagForService(this.serviceId); } protected String getDatacenter() { return this.properties.getDatacenters().get(this.serviceId); } @Override public String toString() { final StringBuilder sb = new StringBuilder("ConsulServerList{"); sb.append("serviceId='").append(this.serviceId).append('\''); sb.append(", tag=").append(getTag()); sb.append('}'); return sb.toString(); } }
ConsulServerList繼承了com.netflix.loadbalancer.AbstractServerList;其getInitialListOfServers及getUpdatedListOfServers方法都會調用getServers方法;它通過ConsulClient.getHealthServices來獲取指定serviceId的HealthService列表,然后通過transformResponse方法包裝為ConsulServer列表
spring-cloud-consul-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/discovery/ConsulRibbonClientConfiguration.java
@Configuration public class ConsulRibbonClientConfiguration { protected static final String VALUE_NOT_SET = "__not__set__"; protected static final String DEFAULT_NAMESPACE = "ribbon"; @Autowired private ConsulClient client; @Value("${ribbon.client.name}") private String serviceId = "client"; public ConsulRibbonClientConfiguration() { } public ConsulRibbonClientConfiguration(String serviceId) { this.serviceId = serviceId; } @Bean @ConditionalOnMissingBean public ServerList<?> ribbonServerList(IClientConfig config, ConsulDiscoveryProperties properties) { ConsulServerList serverList = new ConsulServerList(this.client, properties); serverList.initWithNiwsConfig(config); return serverList; } @Bean @ConditionalOnMissingBean public ServerListFilter<Server> ribbonServerListFilter() { return new HealthServiceServerListFilter(); } @Bean @ConditionalOnMissingBean public IPing ribbonPing() { return new ConsulPing(); } @Bean @ConditionalOnMissingBean public ConsulServerIntrospector serverIntrospector() { return new ConsulServerIntrospector(); } @PostConstruct public void preprocess() { setProp(this.serviceId, DeploymentContextBasedVipAddresses.key(), this.serviceId); setProp(this.serviceId, EnableZoneAffinity.key(), "true"); } protected void setProp(String serviceId, String suffix, String value) { // how to set the namespace properly? String key = getKey(serviceId, suffix); DynamicStringProperty property = getProperty(key); if (property.get().equals(VALUE_NOT_SET)) { ConfigurationManager.getConfigInstance().setProperty(key, value); } } protected DynamicStringProperty getProperty(String key) { return DynamicPropertyFactory.getInstance().getStringProperty(key, VALUE_NOT_SET); } protected String getKey(String serviceId, String suffix) { return serviceId + "." + DEFAULT_NAMESPACE + "." + suffix; } }
ConsulRibbonClientConfiguration注入了ribbonServerList,其創建的是ConsulServerList
ConsulServer繼承了com.netflix.loadbalancer.Server;其構造器會調用isPassingChecks方法來setAlive,它通過HealthService來獲取checks的狀態
ConsulServerList繼承了com.netflix.loadbalancer.AbstractServerList;其getInitialListOfServers及getUpdatedListOfServers方法都會調用getServers方法;它通過ConsulClient.getHealthServices來獲取指定serviceId的HealthService列表,然后通過transformResponse方法包裝為ConsulServer列表
ConsulRibbonClientConfiguration注入了ribbonServerList,其創建的是ConsulServerList
ConsulServer
以上就是spring cloud的ConsulServer怎么用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。