springcloud的ConsulServer怎么用

本篇文章給大家分享的是有關(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

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)

ConsulServerList

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列表

ConsulRibbonClientConfiguration

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

小結(jié)

  • 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

doc

  • 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)

綿陽(yáng)服務(wù)器托管