使用Spring Boot和Zookeeper实现服务协调

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 使用Spring Boot和Zookeeper实现服务协调

使用Spring Boot和Zookeeper实现服务协调

今天我们来探讨如何使用Spring Boot和Zookeeper实现服务协调。Zookeeper是一个分布式协调服务,主要用于分布式应用中的命名服务、配置管理、分布式锁和组服务。通过与Spring Boot集成,我们可以实现更强大的服务协调和管理功能。

一、什么是Zookeeper

Zookeeper是一个开源的分布式协调服务,提供了简洁的接口用于实现分布式系统中的协调工作。它主要解决分布式系统中的一致性问题,提供了数据存储和节点监听功能。

二、项目初始化

首先,创建一个Spring Boot项目,并添加必要的依赖。在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.6.2</version>
</dependency>

三、配置Zookeeper

application.properties中配置Zookeeper连接信息:

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

四、服务注册和发现

使用Zookeeper实现服务注册和发现,创建一个简单的服务并注册到Zookeeper。

ServiceRegistration.java

package cn.juwatech.service;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class ServiceRegistration {
   

    @Value("${spring.application.name}")
    private String serviceName;

    @Value("${server.port}")
    private int port;

    @Value("${spring.cloud.zookeeper.connect-string}")
    private String connectString;

    private ZooKeeper zooKeeper;

    @PostConstruct
    public void registerService() throws Exception {
   
        zooKeeper = new ZooKeeper(connectString, 2000, event -> {
   });

        String path = "/" + serviceName;
        Stat stat = zooKeeper.exists(path, false);
        if (stat == null) {
   
            zooKeeper.create(path, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }

        String instancePath = path + "/" + serviceName + "-" + port;
        zooKeeper.create(instancePath, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    }
}

五、服务发现

创建一个服务发现类,从Zookeeper中获取可用的服务实例。

ServiceDiscovery.java

package cn.juwatech.service;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.CountDownLatch;

@Service
public class ServiceDiscovery {
   

    @Value("${spring.cloud.zookeeper.connect-string}")
    private String connectString;

    private ZooKeeper zooKeeper;

    public ServiceDiscovery() throws Exception {
   
        CountDownLatch connectedSignal = new CountDownLatch(1);
        zooKeeper = new ZooKeeper(connectString, 2000, new Watcher() {
   
            public void process(WatchedEvent we) {
   
                if (we.getState() == Watcher.Event.KeeperState.SyncConnected) {
   
                    connectedSignal.countDown();
                }
            }
        });
        connectedSignal.await();
    }

    public List<String> getServiceInstances(String serviceName) throws Exception {
   
        String path = "/" + serviceName;
        return zooKeeper.getChildren(path, false);
    }
}

六、控制器

创建一个控制器来演示服务注册和发现功能。

ServiceController.java

package cn.juwatech.controller;

import cn.juwatech.service.ServiceDiscovery;
import cn.juwatech.service.ServiceRegistration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ServiceController {
   

    @Autowired
    private ServiceRegistration serviceRegistration;

    @Autowired
    private ServiceDiscovery serviceDiscovery;

    @GetMapping("/register")
    public String registerService() throws Exception {
   
        serviceRegistration.registerService();
        return "Service registered!";
    }

    @GetMapping("/discover")
    public List<String> discoverServices() throws Exception {
   
        return serviceDiscovery.getServiceInstances("my-service");
    }
}

七、启动Zookeeper

确保Zookeeper服务正在运行。可以使用以下命令启动Zookeeper:

bin/zkServer.sh start

八、测试服务注册和发现

启动Spring Boot应用程序,并使用以下命令测试服务注册和发现功能:

  1. 注册服务:

     curl http://localhost:8080/register
    
  2. 发现服务:

     curl http://localhost:8080/discover
    

总结

本文详细介绍了如何使用Spring Boot和Zookeeper实现服务协调,包括项目初始化、配置Zookeeper、服务注册和发现的实现。通过Zookeeper的分布式协调能力,我们可以轻松实现分布式系统中的服务管理和协调功能。

相关文章
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
9539 60
|
2月前
|
Prometheus 监控 Cloud Native
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务实现步骤
|
6月前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
5189 7
|
7月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
396 7
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
223 0
|
11月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
330 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
11月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
781 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
11月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
203 1
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
177 1