本篇文章为大家展示了如何理解ZookeeperDiscoveryAutoConfiguration,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

成都创新互联一直秉承“诚信做人,踏实做事”的原则,不欺瞒客户,是我们最起码的底线! 以服务为基础,以质量求生存,以技术求发展,成交一个客户多一个朋友!为您提供网站设计、做网站、成都网页设计、小程序制作、成都网站开发、成都网站制作、成都软件开发、app软件定制开发是成都本地专业的网站建设和网站设计公司,等你一起来见证!
主要研究一下ZookeeperDiscoveryAutoConfiguration
spring-cloud-zookeeper-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryAutoConfiguration.java
@Configuration
@ConditionalOnBean(ZookeeperDiscoveryClientConfiguration.Marker.class)
@ConditionalOnZookeeperDiscoveryEnabled
@AutoConfigureBefore({ CommonsClientAutoConfiguration.class,
NoopDiscoveryClientAutoConfiguration.class })
@AutoConfigureAfter({ ZookeeperDiscoveryClientConfiguration.class })
public class ZookeeperDiscoveryAutoConfiguration {
@Autowired(required = false)
private ZookeeperDependencies zookeeperDependencies;
@Autowired
private CuratorFramework curator;
@Bean
@ConditionalOnMissingBean
public ZookeeperDiscoveryProperties zookeeperDiscoveryProperties(
InetUtils inetUtils) {
return new ZookeeperDiscoveryProperties(inetUtils);
}
@Bean
@ConditionalOnMissingBean
// currently means auto-registration is false. That will change when
// ZookeeperServiceDiscovery is gone
public ZookeeperDiscoveryClient zookeeperDiscoveryClient(
ServiceDiscovery serviceDiscovery,
ZookeeperDiscoveryProperties zookeeperDiscoveryProperties) {
return new ZookeeperDiscoveryClient(serviceDiscovery, this.zookeeperDependencies,
zookeeperDiscoveryProperties);
}
@Bean
public ZookeeperServiceWatch zookeeperServiceWatch(
ZookeeperDiscoveryProperties zookeeperDiscoveryProperties) {
return new ZookeeperServiceWatch(this.curator, zookeeperDiscoveryProperties);
}
@Configuration
@ConditionalOnEnabledHealthIndicator("zookeeper")
@ConditionalOnClass(Endpoint.class)
protected static class ZookeeperDiscoveryHealthConfig {
@Autowired(required = false)
private ZookeeperDependencies zookeeperDependencies;
@Bean
@ConditionalOnMissingBean
public ZookeeperDiscoveryHealthIndicator zookeeperDiscoveryHealthIndicator(
CuratorFramework curatorFramework,
ServiceDiscovery serviceDiscovery,
ZookeeperDiscoveryProperties properties) {
return new ZookeeperDiscoveryHealthIndicator(curatorFramework,
serviceDiscovery, this.zookeeperDependencies, properties);
}
}
} ZookeeperDiscoveryAutoConfiguration注册了ZookeeperDiscoveryProperties、ZookeeperDiscoveryClient、ZookeeperServiceWatch、ZookeeperDiscoveryHealthIndicator
spring-cloud-zookeeper-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryProperties.java
@ConfigurationProperties("spring.cloud.zookeeper.discovery")
public class ZookeeperDiscoveryProperties {
/**
* Default URI spec.
*/
public static final String DEFAULT_URI_SPEC = "{scheme}://{address}:{port}";
private InetUtils.HostInfo hostInfo;
private boolean enabled = true;
/**
* Root Zookeeper folder in which all instances are registered.
*/
private String root = "/services";
/**
* The URI specification to resolve during service registration in Zookeeper.
*/
private String uriSpec = DEFAULT_URI_SPEC;
/** Id used to register with zookeeper. Defaults to a random UUID. */
private String instanceId;
/**
* Predefined host with which a service can register itself in Zookeeper. Corresponds
* to the {code address} from the URI spec.
*/
private String instanceHost;
/**
* IP address to use when accessing service (must also set preferIpAddress to use).
*/
private String instanceIpAddress;
/**
* Use ip address rather than hostname during registration.
*/
private boolean preferIpAddress = false;
/** Port to register the service under (defaults to listening port). */
private Integer instancePort;
/** Ssl port of the registered service. */
private Integer instanceSslPort;
/**
* Register as a service in zookeeper.
*/
private boolean register = true;
/**
* Gets the metadata name/value pairs associated with this instance. This information
* is sent to zookeeper and can be used by other instances.
*/
private Map metadata = new HashMap<>();
/**
* The initial status of this instance (defaults to
* {@link StatusConstants#STATUS_UP}).
*/
private String initialStatus = StatusConstants.STATUS_UP;
/**
* Order of the discovery client used by `CompositeDiscoveryClient` for sorting
* available clients.
*/
private int order = 0;
//......
} ZookeeperDiscoveryProperties定义了enabled、root、uriSpec、instanceId、instanceHost、instanceIpAddress、preferIpAddress、instancePort、instanceSslPort、register、metadata、initialStatus、order属性
spring-cloud-zookeeper-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java
public class ZookeeperDiscoveryClient implements DiscoveryClient {
private static final Log log = LogFactory.getLog(ZookeeperDiscoveryClient.class);
private final ZookeeperDependencies zookeeperDependencies;
private final ServiceDiscovery serviceDiscovery;
private final ZookeeperDiscoveryProperties zookeeperDiscoveryProperties;
public ZookeeperDiscoveryClient(ServiceDiscovery serviceDiscovery,
ZookeeperDependencies zookeeperDependencies,
ZookeeperDiscoveryProperties zookeeperDiscoveryProperties) {
this.serviceDiscovery = serviceDiscovery;
this.zookeeperDependencies = zookeeperDependencies;
this.zookeeperDiscoveryProperties = zookeeperDiscoveryProperties;
}
@Override
public String description() {
return "Spring Cloud Zookeeper Discovery Client";
}
private static org.springframework.cloud.client.ServiceInstance createServiceInstance(
String serviceId, ServiceInstance serviceInstance) {
return new ZookeeperServiceInstance(serviceId, serviceInstance);
}
@Override
public List getInstances(
final String serviceId) {
try {
if (getServiceDiscovery() == null) {
return Collections.EMPTY_LIST;
}
String serviceIdToQuery = getServiceIdToQuery(serviceId);
Collection> zkInstances = getServiceDiscovery()
.queryForInstances(serviceIdToQuery);
List instances = new ArrayList<>();
for (ServiceInstance instance : zkInstances) {
instances.add(createServiceInstance(serviceIdToQuery, instance));
}
return instances;
}
catch (KeeperException.NoNodeException e) {
if (log.isDebugEnabled()) {
log.debug(
"Error getting instances from zookeeper. Possibly, no service has registered.",
e);
}
// this means that nothing has registered as a service yes
return Collections.emptyList();
}
catch (Exception exception) {
rethrowRuntimeException(exception);
}
return new ArrayList<>();
}
private ServiceDiscovery getServiceDiscovery() {
return this.serviceDiscovery;
}
private String getServiceIdToQuery(String serviceId) {
if (this.zookeeperDependencies != null
&& this.zookeeperDependencies.hasDependencies()) {
String pathForAlias = this.zookeeperDependencies.getPathForAlias(serviceId);
return pathForAlias.isEmpty() ? serviceId : pathForAlias;
}
return serviceId;
}
@Override
public List getServices() {
List services = null;
if (getServiceDiscovery() == null) {
log.warn(
"Service Discovery is not yet ready - returning empty list of services");
return Collections.emptyList();
}
try {
Collection names = getServiceDiscovery().queryForNames();
if (names == null) {
return Collections.emptyList();
}
services = new ArrayList<>(names);
}
catch (KeeperException.NoNodeException e) {
if (log.isDebugEnabled()) {
log.debug(
"Error getting services from zookeeper. Possibly, no service has registered.",
e);
}
// this means that nothing has registered as a service yes
return Collections.emptyList();
}
catch (Exception e) {
rethrowRuntimeException(e);
}
return services;
}
@Override
public int getOrder() {
return this.zookeeperDiscoveryProperties.getOrder();
}
} ZookeeperDiscoveryClient实现了org.springframework.cloud.client.discovery.DiscoveryClient接口,其getInstances使用curator的ServiceDiscovery.queryForInstances获取服务实例信息,然后转换为org.springframework.cloud.client.ServiceInstance类型;getServices则是使用curator的ServiceDiscovery.queryForNames获取服务名信息
spring-cloud-zookeeper-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceWatch.java
public class ZookeeperServiceWatch implements ApplicationListener>, TreeCacheListener, ApplicationEventPublisherAware { private final CuratorFramework curator; private final ZookeeperDiscoveryProperties properties; private final AtomicLong cacheChange = new AtomicLong(0); private ApplicationEventPublisher publisher; private TreeCache cache; public ZookeeperServiceWatch(CuratorFramework curator, ZookeeperDiscoveryProperties properties) { this.curator = curator; this.properties = properties; } @Override public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { this.publisher = publisher; } public TreeCache getCache() { return this.cache; } @Override public void onApplicationEvent(InstanceRegisteredEvent> event) { this.cache = TreeCache.newBuilder(this.curator, this.properties.getRoot()) .build(); this.cache.getListenable().addListener(this); try { this.cache.start(); } catch (Exception e) { ReflectionUtils.rethrowRuntimeException(e); } } @PreDestroy public void stop() throws Exception { if (this.cache != null) { this.cache.close(); } } @Override public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception { if (event.getType().equals(TreeCacheEvent.Type.NODE_ADDED) || event.getType().equals(TreeCacheEvent.Type.NODE_REMOVED) || event.getType().equals(TreeCacheEvent.Type.NODE_UPDATED)) { long newCacheChange = this.cacheChange.incrementAndGet(); this.publisher.publishEvent(new HeartbeatEvent(this, newCacheChange)); } } }
ZookeeperServiceWatch实现了ApplicationListener、TreeCacheListener、ApplicationEventPublisherAware接口;其childEvent方法在event类型是NODE_ADDED、NODE_REMOVED、NODE_UPDATED类型时会发布HeartbeatEvent事件
spring-cloud-zookeeper-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryHealthIndicator.java
public class ZookeeperDiscoveryHealthIndicator implements DiscoveryHealthIndicator {
private static final Log log = LogFactory
.getLog(ZookeeperDiscoveryHealthIndicator.class);
private CuratorFramework curatorFramework;
private ServiceDiscovery serviceDiscovery;
private final ZookeeperDependencies zookeeperDependencies;
private final ZookeeperDiscoveryProperties zookeeperDiscoveryProperties;
public ZookeeperDiscoveryHealthIndicator(CuratorFramework curatorFramework,
ServiceDiscovery serviceDiscovery,
ZookeeperDependencies zookeeperDependencies,
ZookeeperDiscoveryProperties zookeeperDiscoveryProperties) {
this.curatorFramework = curatorFramework;
this.serviceDiscovery = serviceDiscovery;
this.zookeeperDependencies = zookeeperDependencies;
this.zookeeperDiscoveryProperties = zookeeperDiscoveryProperties;
}
@Override
public String getName() {
return "zookeeper";
}
@Override
public Health health() {
Health.Builder builder = Health.unknown();
try {
Iterable> allInstances = new ZookeeperServiceInstances(
this.curatorFramework, this.serviceDiscovery,
this.zookeeperDependencies, this.zookeeperDiscoveryProperties);
builder.up().withDetail("services", allInstances);
}
catch (Exception e) {
log.error("Error", e);
builder.down(e);
}
return builder.build();
}
} ZookeeperDiscoveryHealthIndicator实现了DiscoveryHealthIndicator接口,其health方法创建ZookeeperServiceInstances
spring-cloud-zookeeper-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceInstances.java
public class ZookeeperServiceInstances implements Iterable> { private static final Log log = LogFactory.getLog(ZookeeperServiceInstances.class); private ServiceDiscovery serviceDiscovery; private final ZookeeperDependencies zookeeperDependencies; private final ZookeeperDiscoveryProperties zookeeperDiscoveryProperties; private final List > allInstances; private final CuratorFramework curator; public ZookeeperServiceInstances(CuratorFramework curator, ServiceDiscovery serviceDiscovery, ZookeeperDependencies zookeeperDependencies, ZookeeperDiscoveryProperties zookeeperDiscoveryProperties) { this.curator = curator; this.serviceDiscovery = serviceDiscovery; this.zookeeperDependencies = zookeeperDependencies; this.zookeeperDiscoveryProperties = zookeeperDiscoveryProperties; this.allInstances = getZookeeperInstances(); } private List > getZookeeperInstances() { ArrayList > allInstances = new ArrayList<>(); try { Collection namesToQuery = getNamesToQuery(); if (log.isDebugEnabled()) { log.debug("Querying the following names [" + namesToQuery + "]"); } for (String name : namesToQuery) { allInstances.addAll(nestedInstances(allInstances, name)); } return allInstances; } catch (Exception e) { log.debug("Exception occurred while trying to build the list of instances", e); return allInstances; } } //...... }
ZookeeperServiceInstances的构造器会调用getZookeeperInstances拉取ServiceInstance
ZookeeperDiscoveryAutoConfiguration注册了ZookeeperDiscoveryProperties、ZookeeperDiscoveryClient、ZookeeperServiceWatch、ZookeeperDiscoveryHealthIndicator
上述内容就是如何理解ZookeeperDiscoveryAutoConfiguration,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。