[SpringCloud-Zookeeper] 通过Zookeeper的API注册微服务到Zookeeper -- 第一篇 初探

一.注册到ZK

    springboot工程通过引入zk的依赖,通过注解注册到zk,这个网上资料很多,就不多啰嗦了,这里主要给出,通过api注册到zk,什么场景会用到呢?比如环境中有一些springboot工程,也有非springboot工程,那么对于springboot工程直接通过注解注册,通过Feign调用其他微服务,非springboot工程通过api注解,其他服务通过服务名称调用即可;

二.springboot工程注册

    sprinboot工程主需要引入相关依赖,通过注解即可,这里一笔带过:

    
        org.springframework.cloud
        spring-cloud-starter-zookeeper-discovery
        1.1.3.RELEASE
    
    
    注解:@EnableDiscoveryClient
    

三.普通Java工程

1.这里我以springboot工程为例,但是不引入第二步中的依赖来实现注册和服务调用

    pom依赖
    
			org.apache.zookeeper
			zookeeper
			3.4.11
			pom
		

		
		
			com.101tec
			zkclient
			0.10
	

2.环境简介:

    这里我先注册两个服务到ZK,一个zkClient,一个provider,这俩个都是标准的springboot工程,集成第二步中的组件注册,zkClient会在接口中调用provider和后面要通过api注册的微服务zkServices,并且有个接口会返回所有的实例,简单代码如下:
    //使用Feign调用微服务
    @RequestMapping("/")
        public String test() {
	        //调用provider服务
            String str1 = providerClientI.callProviderTwo();
            //调用zkServices服务
            String str2 = zkClientI.callProviderOne();
            return str1 + "-------" + str;
    }
    
    //获取所有zk的微服务实例
    @GetMapping("/allServices")
    public List> allServiceUrl() {
        List list = discoveryClient.getServices();
        List> serviceInstance = new ArrayList<>();
        if (list != null && list.size() > 0) {
            for (String serviceId : list) {
                serviceInstance.add(discoveryClient.getInstances(serviceId));
            }
        }
        return serviceInstance;
    }
    

3.ZK查看:

    进入到zk的目录下,使用命令./zkCli.sh -server 192.168.xx.xx:2181接入zookeeper,然后使用ls / 查看所有的节点,然后使用ls /services查看services下的节点,注册的服务默认在services节点下,此时可以看到provider,和zkClient,查看provider和zkClient下面发现下面有一个节点,貌似是以UUID命名的,然后使用get命令查看下面的节点内的数据内容,如下:

[SpringCloud-Zookeeper] 通过Zookeeper的API注册微服务到Zookeeper -- 第一篇 初探_第1张图片

然后我们大概明白了,原来一个微服务实例注册到zk,就是在节点里面放了这些数据,下面开始我们通过API注册的工作

4.API注册:

    我先来一段很简单的代码,全部是写死的,后面测试我们的方法可行之后,我们再对代码进行优雅的改造,该封装的封装,该写成配置的就配置化,先验证后完善,这里的regeister方法是核心方法,里面通过Zookeeper类的create方法向服务器创建节点并把数据写入节点,实际上写入的就是服务的注册信息,写入之后,其他的节点才能发现本节点,继而才能调用它;
@Override
    public void register(String serviceName, String serviceAddress) {
        String registryPath = REGISTRY_PATH;
        try {
            zk.create("/services/zkServices", null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            String  uuid = "95b4f91c-96b9-4aa6-ab61-935a7f8be599";
            String data = "{\"name\":\"zkService\",\"id\":\"95b4f91c-96b9-4aa6-ab61-935a7f8be599\",\"address\":\"192.168.6.164\",\"port\":9505,\"sslPort\":null,\"payload\":{\"@class\":\"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance\",\"id\":\"zkService:9505\",\"name\":\"zkService\",\"metadata\":{\"instance_status\":\"UP\"}},\"registrationTimeUTC\":1534763883884,\"serviceType\":\"DYNAMIC\",\"uriSpec\":{\"parts\":[{\"value\":\"scheme\",\"variable\":true},{\"value\":\"://\",\"variable\":false},{\"value\":\"address\",\"variable\":true},{\"value\":\":\",\"variable\":false},{\"value\":\"port\",\"variable\":true}]}}";
            zk.create("/services/zkServices/" + uuid, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        } catch (Exception e) {
            logger.error("create node failure", e);
        }
    }
    这段代码简单粗暴,就是直接create创建/services/zkServices节点,然后再create往里面放入数据,数据就是从provider服务里面拷贝过来的,就是个json,我把相关的地址,服务名称啥的改了下,然后启动工程,之后检查zk,果然创建了节点,get命令查看数据也和创建的一致,然后在访问zkClient服务的上面的两个接口,都成功了,一个正确的返回了zkServices和provider的响应字符串,另一个接口正确显示出了三个服务的信息,包括zkClient,provider,zkServices,这说明通过api注册一个服务成功了;

四.普通Java工程

    验证方法正确之后,我们对代码进行一下简单的封装,相关参数配置化。下一篇博客我给出封装后的代码和相关参数含义的简单解释。

你可能感兴趣的:(微服务)