千家信息网

怎么通过Zookeeper的API注册微服务到Zookeeper

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,怎么通过Zookeeper的API注册微服务到Zookeeper ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一.注册到ZK   
千家信息网最后更新 2024年11月14日怎么通过Zookeeper的API注册微服务到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命令查看下面的节点内的数据内容,如下:

然后我们大概明白了,原来一个微服务实例注册到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/">

    这段代码简单粗暴,就是直接create创建/services/zkServices节点,然后再create往里面放入数据,数据就是从provider服务里面拷贝过来的,就是个json,我把相关的地址,服务名称啥的改了下,然后启动工程,之后检查zk,果然创建了节点,get命令查看数据也和创建的一致,然后在访问zkClient服务的上面的两个接口,都成功了,一个正确的返回了zkServices和provider的响应字符串,另一个接口正确显示出了三个服务的信息,包括zkClient,provider,zkServices,这说明通过api注册一个服务成功了;

    四.普通Java工程

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

    关于怎么通过Zookeeper的API注册微服务到Zookeeper 问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

    0