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中Thread类的使用和它的属性

    一、Thread类的使用 在Java中,多线程的实现主要通过Thread类来完成。通过继承Thread类并重写run()方法来实现多线程的功能。 具体步骤如下: 1.定义Thread类的子类,并重写其run()方法 2.在run()方法中编写并发执行的代码。 3.调用Thread类中的start()方法,就可以启动线程。 举个例子,如下所示: public …

    Java 2023年5月19日
    00
  • 详解如何通过Java实现压缩PDF文档

    我会详细讲解如何通过Java实现压缩PDF文档的完整攻略。 1. 背景介绍 PDF文件是常见的文档格式,在传输和存储时,通常需要进行压缩。使用Java程序实现PDF文件的压缩功能,在某些场景下是必不可少的。下面,将详细介绍如何使用Java实现对PDF文档的压缩。 2. 实现过程 2.1 准备工作 在开始实现压缩PDF文档功能之前,需要准备以下工具和环境: J…

    Java 2023年5月31日
    00
  • java集合类源码分析之Set详解

    让我来详细讲解一下“Java集合类源码分析之Set详解”的完整攻略。 目录 Set概述 Java Set实现方式 Set常用方法及实现原理 TreeSet示例 HashSet示例 1. Set概述 Set是Java中的一个集合接口,用于存储不允许重复元素的集合。Set接口实现了Collection接口,所以Set集合也继承了Collection集合中的一些方…

    Java 2023年5月20日
    00
  • 浅谈jsp EL表达式取值过程、page和pagecontext的区别

    下面我将详细讲解“浅谈jsp EL表达式取值过程、page和pagecontext的区别”的完整攻略,希望能对你有所帮助。 什么是EL表达式 EL表达式(Expression Language)是一个用于在JSP中获取数据的表达式语言,主要用于在JSP页面中引用和显示Java Bean中的属性值、参数、方法调用等。它的语法类似于JavaScript和PHP等…

    Java 2023年6月15日
    00
  • java的Hibernate框架报错“NonUniqueObjectException”的原因和解决方法

    当使用Hibernate框架时,可能会遇到“NonUniqueObjectException”错误。这个错误通常是由于以下原因之一引起的: 多个实体对象具有相同的标识符:如果您的多个实体对象具有相同的标识符,则可能会出现此错误。在这种情况下,需要检查您的实体对象并确保它们具有唯一的标识符。 会话中存在多个实体对象:如果您的会话中存在多个实体对象,则可能会出现…

    Java 2023年5月4日
    00
  • Java中Arraylist动态扩容方法详解

    下面是“Java中ArrayList动态扩容方法详解”的完整攻略: 1. ArrayList简介 在Java中,ArrayList是非常常用的一种数据结构。它是一个基于数组实现的动态大小的集合类,能够保存任意类型的元素,而且数组的大小可以动态增长或缩小。 2. 动态扩容的原理 ArrayList的大小在创建的时候是固定的,但是当添加元素的个数超过了Array…

    Java 2023年5月26日
    00
  • 浅谈序列化之protobuf与avro对比(Java)

    下面是浅谈序列化之protobuf与avro对比(Java)完整攻略: Introduction 在Java中,序列化是将对象转换为字节流方便存储和传输的过程。protobuf和avro是两种常用的序列化工具,它们都在大小、速度和兼容性等方面提供了很好的解决方案。在这篇文章中,我们将对它们进行简单的比较和对比,希望能够帮助读者选择适合自己项目的序列化工具。 …

    Java 2023年5月20日
    00
  • 使用Java实现系统托盘功能的介绍(附源码以及截图)

    使用Java实现系统托盘功能的介绍(附源码以及截图) 什么是系统托盘功能 系统托盘功能是指将图标置于系统托盘中,以提供快速访问与系统交互的功能,Windows系统右下角的区域就是系统托盘。Java在Swing开发中提供了 TrayIcon 和 SystemTray 两个类来实现该功能。 实现原理 使用 Java 中的 TrayIcon 和 SystemTra…

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