本篇文章给大家分享的是有关spring cloud的ConsulServer怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

10年积累的成都网站设计、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有高淳免费网站建设让你可以放心的选择与我们合作。
序
本文主要研究一下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 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 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的状态
ConsulServerList
spring-cloud-consul-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/discovery/ConsulServerList.java
public class ConsulServerList extends AbstractServerList{ 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 getInitialListOfServers() { return getServers(); } @Override public List getUpdatedListOfServers() { return getServers(); } private List getServers() { if (this.client == null) { return Collections.emptyList(); } String tag = getTag(); // null is ok Response > 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
transformResponse(List healthServices) { List 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列表
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 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
doc
ConsulServer
以上就是spring cloud的ConsulServer怎么用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。
分享题目:springcloud的ConsulServer怎么用
本文URL:http://www.jxjierui.cn/article/ihijee.html


咨询
建站咨询
