zookeeper作为一个分布式文件系统,可用于注册中心,配置中心(很少),分布式锁,命名服务等场景。同时已经集成到springcloud项目中----spring cloud zookeeper;接下来通过读spring cloud zookeeper的源码来了解它的服务注册原理
1、application.yml配置文件配置
server:
port: 9000
spring:
application:
name: lh-zookeeper-registry
cloud:
zookeeper:
connect-string: localhost:2181
discovery:
register: true
enabled: true
root: lh-registry
instance-host: 172.20.249.247
spring cloud zookeeper discovery属性全部都来自于ZookeeperDiscoveryProperties类
1.1、ZookeeperDiscoveryProperties
@ConfigurationProperties("spring.cloud.zookeeper.discovery")
public class ZookeeperDiscoveryProperties {
public static final String DEFAULT_URI_SPEC = "{scheme}://{address}:{port}";
private HostInfo hostInfo;
private boolean enabled = true;
private String root = "/services";
private String uriSpec = "{scheme}://{address}:{port}";
private String instanceId;
private String instanceHost;
private String instanceIpAddress;
private boolean preferIpAddress = false;
private Integer instancePort;
private Integer instanceSslPort;
private boolean register = true;
private Map<String, String> metadata = new HashMap();
private String initialStatus = "UP";
private int order = 0;
}
该类中就包括了服务的一些基本信息以及后面创建zk节点的默认根节点("/services")
2、ZookeeperAutoServiceRegistrationAutoConfiguration
zookeeper服务自动注册自动配置类
@Bean
public ZookeeperAutoServiceRegistration zookeeperAutoServiceRegistration(ZookeeperServiceRegistry registry, ZookeeperRegistration registration, ZookeeperDiscoveryProperties properties) {
return new ZookeeperAutoServiceRegistration(registry, registration, properties);
}
@Bean
@ConditionalOnMissingBean({ZookeeperRegistration.class})
public ServiceInstanceRegistration serviceInstanceRegistration(ApplicationContext context, ZookeeperDiscoveryProperties properties) {
String appName = context.getEnvironment().getProperty("spring.application.name", "application");
String host = properties.getInstanceHost();
if (!StringUtils.hasText(host)) {
throw new IllegalStateException("insta