本篇文章給大家分享的是有關(guān)spring cloud的ConsulServer怎么用,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有高淳免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
本文主要研究一下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;其構(gòu)造器會(huì)調(diào)用isPassingChecks方法來(lái)setAlive,它通過(guò)HealthService來(lái)獲取checks的狀態(tài)
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方法都會(huì)調(diào)用getServers方法;它通過(guò)ConsulClient.getHealthServices來(lái)獲取指定serviceId的HealthService列表,然后通過(guò)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,其創(chuàng)建的是ConsulServerList
ConsulServer繼承了com.netflix.loadbalancer.Server;其構(gòu)造器會(huì)調(diào)用isPassingChecks方法來(lái)setAlive,它通過(guò)HealthService來(lái)獲取checks的狀態(tài)
ConsulServerList繼承了com.netflix.loadbalancer.AbstractServerList;其getInitialListOfServers及getUpdatedListOfServers方法都會(huì)調(diào)用getServers方法;它通過(guò)ConsulClient.getHealthServices來(lái)獲取指定serviceId的HealthService列表,然后通過(guò)transformResponse方法包裝為ConsulServer列表
ConsulRibbonClientConfiguration注入了ribbonServerList,其創(chuàng)建的是ConsulServerList
ConsulServer
以上就是spring cloud的ConsulServer怎么用,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站欄目:springcloud的ConsulServer怎么用
標(biāo)題鏈接:http://muchs.cn/article44/ihijee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、服務(wù)器托管、云服務(wù)器、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)