springboot 注册服务注册中心(zk)的两种方式详解

Spring Boot 中注册服务到 Zookeeper 的两种方式详解

前言

服务注册和发现是分布式系统的关键问题之一,Spring Cloud 中采用 Eureka 作为服务注册和发现的组件,但是在 Zookeeper 这种经过时间验证并且稳定可靠的中间件也有许多人选择在使用中心化服务注册时采用它。Spring Boot 通过 spring-cloud-starter-zookeeper-discovery 流行的项目中已经支持到了这个问题。

本篇文章则针对 Spring Boot 项目如何将服务注册到 Zookeeper 作出详细讲解,介绍两种服务注册方式。

方式一:使用 Spring Cloud 去注册服务到 Zookeeper

使用 Spring Cloud 方式需要引用以下的依赖:

<!-- 服务注册到 Zookeeper -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

引入该依赖,spring-boot 项目即开启了注册服务到 Zookeeper 的功能。

application.properties 文件中配置 Zookeeper 的地址:

spring.cloud.zookeeper.connect-string=127.0.0.1:2181

在工程启动类上添加 @EnableDiscoveryClient 注解:

@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在配置完成之后,注册到 Zookeeper 的流程就已经自动启动了。但是,这种方式需要使用 Spring Cloud,如果你的项目中没有使用 Spring Cloud,那么可以采用第二种方式来实现 Zookeeper 的服务注册。

方式二:使用 Curator Framework 去注册服务到 Zookeeper

Curator Framework 是 Zookeeper 官方提供的一个客户端库,提供了一系列丰富实用的 API,可以简化 Zookeeper 的操作。所以我们也可以用 Curator 去完成我们的服务注册。

首先,引入依赖:

<!-- Zookeeper 客户端 -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.12.0</version>
</dependency>

然后加入配置项:

# Zookeeper 地址
zookeeper.host=localhost
zookeeper.port=2181
zookeeper.rootPath=/demo

这样在启动工程后,将会把本服务对外提供的一个完整路径地址,存储到 Zookeeper 上。

这里贴出一个 Curator 服务注册租约示例:

@Service
public class ZookeeperServiceImpl implements ZookeeperService {
    private final CuratorFramework client;

    @Value("${zookeeper.host}")
    private String host;
    @Value("${zookeeper.port}")
    private String port;
    @Value("${zookeeper.rootPath}")
    private String rootPath;

    public ZookeeperServiceImpl() {
        RetryPolicy retryPolicy = new RetryNTimes(5, 5000);
        this.client = CuratorFrameworkFactory.newClient(host + ":" + port, retryPolicy);
        this.client.start();
    }

    @Override
    public void register(String serviceName, InetAddress serviceAddress, int servicePort) throws Exception {
        // 格式化服务根路径
        String path = "/" + rootPath + "/" + serviceName + "/" + serviceAddress.getHostAddress() + "_" + servicePort;

        // 创建服务临时节点并写入数据
        client.create()
            .creatingParentsIfNeeded()
            .withMode(CreateMode.EPHEMERAL)
            .forPath(path, String.format("%s:%d", serviceAddress.getHostAddress(), servicePort).getBytes(Charset.forName("UTF-8")));
    }

    @Override
    public void remove(String serviceName, InetAddress serviceAddress, int servicePort) throws Exception {
        // 格式化服务根路径
        String path = "/" + rootPath + "/" + serviceName + "/" + serviceAddress.getHostAddress() + "_" + servicePort;

        // 删除服务节点
        client.delete().guaranteed().forPath(path);
    }

    @Override
    public List<String> listService(String serviceName) throws Exception {
        if (client.checkExists().forPath("/" + rootPath + "/" + serviceName) == null) {
            throw new Exception(serviceName + " 服务不存在");
        }

        return client.getChildren().forPath("/" + rootPath + "/" + serviceName);
    }
}

总结

以上便是 Spring Boot 注册服务到 Zookeeper 的两种方式:使用 Spring Cloud、使用 Curator Framework,根据不同的场景可以选择不同的方式。这样做能够使你的分布式应用程序更加健壮,更加容易进行管理,需要的同学可以尝试运用在自己的项目中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 注册服务注册中心(zk)的两种方式详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java中两个byte数组实现合并的示例

    实现两个byte数组合并的示例,可以通过以下步骤实现: 定义两个byte数组并初始化 首先定义两个byte数组并分别进行初始化,示例如下: byte[] array1 = {1, 2, 3}; byte[] array2 = {4, 5, 6}; 创建新的byte数组 为合并后的数组分配空间,新数组的长度应该为两个源数组的长度之和。通过下面的代码创建新数组:…

    Java 2023年5月26日
    00
  • Spring Boot异步线程间数据传递的四种方式

    下面让我来详细解释一下Spring Boot异步线程间数据传递的四种方式。 1. 使用CompletableFuture CompletableFuture是Java8中推出的异步编程API,可以很好的处理异步任务,同时也提供了一些方法来实现线程间的数据传递。 使用CompletableFuture来传递数据,主要有以下两个方法: CompletableFu…

    Java 2023年5月26日
    00
  • finalize()方法的执行时机是什么?

    finalize()是Java中Object类的一个方法,用于在对象被垃圾回收之前执行特定的代码,比如关闭文件或释放资源等操作。当垃圾回收器准备回收某个对象时,它会忽略该对象的finalize()方法是否被重写,而是将其放入一个叫作“fianlization queue”的队列中,等待一个名为“Finalizer”的线程来执行它。 以下是finalize()…

    Java 2023年5月10日
    00
  • 如何使用JavaMail发送邮件

    使用JavaMail发送邮件需要以下步骤: 步骤一:添加JavaMail依赖 在项目中添加JavaMail的依赖包,例如使用Maven可以添加以下依赖: <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artif…

    Java 2023年6月15日
    00
  • Java和C++通过new创建的对象有何区别?

    Java和C++都支持通过关键字 “new” 创建对象,但是它们创建的对象在内存中的存储方式以及允许进行的操作不同。具体细节请参考以下内容: Java中new创建对象的特点 在Java中,当使用new关键字创建一个对象时,会进行以下操作: 在堆内存中为该对象分配连续的内存空间。 返回一个指向该对象的引用,这个引用就是Java对象的句柄。 Java中创建的对象…

    Java 2023年5月26日
    00
  • Java流程控制语句最全汇总(下篇)

    下面是Java流程控制语句最全汇总(下篇)的详细攻略: 1. continue语句 continue语句用于结束本次循环并跳过剩余循环体内的语句,进入下一次循环。其语法格式为: continue; 示例说明: for(int i=0; i<5; i++){ if(i==2){ continue; } System.out.println(i); } 运…

    Java 2023年5月23日
    00
  • WIN7系统JavaEE(java)环境配置教程(一)

    WIN7系统JavaEE(java)环境配置教程(一) 本教程将演示如何在WIN7系统上配置JavaEE(java)开发环境,包括JDK、Eclipse和Tomcat的安装与配置。 第一步:JDK的安装 下载JDK安装包,网址:Oracle官方网站 双击运行安装包,按照提示安装JDK。 配置环境变量,将JDK的bin目录加入系统环境变量中。如下: 属性 -&…

    Java 2023年5月23日
    00
  • SpringCloud Open feign 使用okhttp 优化详解

    下面我将为你详细讲解“SpringCloud Open feign 使用okhttp 优化详解”的完整攻略。 什么是Spring Cloud Open Feign Spring Cloud Open Feign 是一个让编写 Java HTTP 客户端变得更加容易的工具。简单来说,Feign 可以帮助我们减少样板式的代码,例如参数验证、请求构建、错误处理等等…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部