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

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 使用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的分布式协调能力,我们可以轻松实现分布式系统中的服务管理和协调功能。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4月前
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
|
2月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
96 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
151 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
52 1
|
3月前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
61 1
|
2月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
52 0
|
4月前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
351 3
|
5月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
126 3
|
4月前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
4月前
|
Java Spring
【Azure 服务总线】Spring Cloud 的应用 使用Service Bus 引起 org.springframework.beans.BeanInstantiationException 异常,无法启动
【Azure 服务总线】Spring Cloud 的应用 使用Service Bus 引起 org.springframework.beans.BeanInstantiationException 异常,无法启动