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

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 使用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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
22天前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
132 0
|
3天前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
|
21天前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
40 3
|
1月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
3月前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
463 2
|
3月前
|
监控 Dubbo 前端开发
快速入门分布式系统与Dubbo+zookeeper Demo
快速入门分布式系统与Dubbo+zookeeper Demo
459 0
|
3月前
|
监控 NoSQL Java
Zookeeper分布式锁
Zookeeper分布式锁
521 1
|
29天前
|
监控 NoSQL Java
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
|
1月前
|
算法 前端开发