iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot2中怎么利用Zookeeper组件管理架构中服务协调
  • 637
分享到

SpringBoot2中怎么利用Zookeeper组件管理架构中服务协调

2023-06-02 12:06:41 637人浏览 独家记忆
摘要

SpringBoot2中怎么利用ZooKeeper组件管理架构中服务协调,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Zookeeper基础简介1、概念简介Zookeepe

SpringBoot2中怎么利用ZooKeeper组件管理架构中服务协调,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、Zookeeper基础简介

1、概念简介

Zookeeper是一个Apache开源分布式的应用,为系统架构提供协调服务。从设计模式角度来审视:该组件是一个基于观察者模式设计的框架,负责存储和管理数据,接受观察者的注册,一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

2、基本理论

ZooKeeper记录数据的结构与linux文件系统相似,整体可以看作一棵树,每个节点称Znode。每个Znode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。

SpringBoot2中怎么利用Zookeeper组件管理架构中服务协调

  • 节点类型

短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自动删除。
持久(persistent):客户端和服务器端断开连接后,创建的节点持久化保存。

  • 集群服务

在Zookeeper集群服务是由一个领导者(leader),多个跟随者(follower)组成的集群。领导者负责进行投票的发起和决议,更新集群服务状态。跟随者用于接收客户请求并向客户端返回结果,在选举Leader过程中参与投票。集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。

  • 数据一致性

每个server保存一份相同的数据拷贝,客户端无论请求到被集群中哪个server处理,得到的数据都是一致的。

3、应用场景

  • 经典应用:dubbo框架的服务注册和发现;

  • 分布式消息同步和协调机制;

  • 服务器节点动态上下线;

  • 统一配置管理、负载均衡、集群管理;

二、安全管理操作

1、操作权限

ZooKeeper的节点有5种操作权限:CREATE(增)、READ(查)、WRITE(改)、DELETE(删)、ADMIN(管理)等相关权限,这5种权限集合可以简写为crwda,每个单词的首字符拼接而成。

2、认证方式:

  • world

默认方式,开放的权限,意解为全世界都能随意访问。

  • auth

已经授权且认证通过的用户才可以访问。

  • digest

用户名:密码方式认证,实际业务开发中最常用的方式。

  • IP白名单

授权指定的Ip地址,和指定的权限点,控制访问。

3、Digest授权流程

  • 添加认证用户

addauth digest 用户名:密码

  • 设置权限

setAcl /path auth:用户名:密码:权限

  • 查看Acl设置

getAcl /path

  • 完整操作流程

-- 添加授权用户[zk: localhost:2181] addauth digest smile:123456-- 创建节点[zk: localhost:2181] create /cicada cicada-- 节点授权[zk: localhost:2181] setAcl /cicada auth:smile:123456:cdrwa-- 查看授权[zk: localhost:2181] getAcl /cicada

三、整合 springBoot2 框架

1、核心依赖

Curator是Apache开源的一个Zookeeper客户端连接和操作的组件,Curator框架在Zookeeper原生api接口上进行二次包装。提供ZooKeeper各种应用场景:比如:分布式服务、集群领导选举、共享计数器、缓存机制、分布式队列等API封装。

<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><dependency>    <groupId>org.apache.curator</groupId>    <artifactId>curator-client</artifactId>    <version>2.12.0</version></dependency>

2、Zookeeper参数

zoo:  keeper:    #开启标志    enabled: true    #服务器地址    server: 127.0.0.1:2181    #命名空间,被称为ZNode    namespace: cicada    #权限控制,加密    digest: smile:123456    #会话超时时间    sessionTimeoutMs: 3000    #连接超时时间    connectionTimeoutMs: 60000     #最大重试次数    maxRetries: 2    #初始休眠时间    baseSleepTimeMs: 1000

3、服务初始化配置

@Configurationpublic class ZookeeperConfig {    private static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperConfig.class) ;    @Resource    private ZookeeperParam zookeeperParam ;    private static CuratorFramework client = null ;        @PostConstruct    public void init (){        //重试策略,初试时间1秒,重试10次        RetryPolicy policy = new ExponentialBackoffRetry(                zookeeperParam.getBaseSleepTimeMs(),                zookeeperParam.getMaxRetries());        //通过工厂创建Curator        client = CuratorFrameworkFactory.builder()                .connectString(zookeeperParam.getServer())                .authorization("digest",zookeeperParam.getDigest().getBytes())                .connectionTimeoutMs(zookeeperParam.getConnectionTimeoutMs())                .sessionTimeoutMs(zookeeperParam.getSessionTimeoutMs())                .retryPolicy(policy).build();        //开启连接        client.start();        LOGGER.info("zookeeper 初始化完成...");    }    public static CuratorFramework getClient (){        return client ;    }    public static void closeClient (){        if (client != null){            client.close();        }    }}

4、封装系列接口

public interface ZookeeperService {        boolean isExistNode (final String path) ;        void createNode (CreateMode mode,String path ) ;        void setNodeData (String path, String nodeData) ;        void createNodeAndData (CreateMode mode, String path , String nodeData) ;        String getNodeData (String path) ;        List<String> getNodeChild (String path) ;        void deleteNode (String path,Boolean recursive) ;        InterProcessReadWriteLock getReadWriteLock (String path) ;}

5、接口实现

@Servicepublic class ZookeeperServiceImpl implements ZookeeperService {    private static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperServiceImpl.class);    @Override    public boolean isExistNode(String path) {        CuratorFramework client = ZookeeperConfig.getClient();        client.sync() ;        try {            Stat stat = client.checkExists().forPath(path);            return client.checkExists().forPath(path) != null;        } catch (Exception e) {            LOGGER.error("isExistNode error...", e);            e.printStackTrace();        }        return false;    }    @Override    public void createNode(CreateMode mode, String path) {        CuratorFramework client = ZookeeperConfig.getClient() ;        try {            // 递归创建所需父节点            client.create().creatingParentsIfNeeded().withMode(mode).forPath(path);        } catch (Exception e) {            LOGGER.error("createNode error...", e);            e.printStackTrace();        }    }    @Override    public void setNodeData(String path, String nodeData) {        CuratorFramework client = ZookeeperConfig.getClient() ;        try {            // 设置节点数据            client.setData().forPath(path, nodeData.getBytes("UTF-8"));        } catch (Exception e) {            LOGGER.error("setNodeData error...", e);            e.printStackTrace();        }    }    @Override    public void createNodeAndData(CreateMode mode, String path, String nodeData) {        CuratorFramework client = ZookeeperConfig.getClient() ;        try {            // 创建节点,关联数据            client.create().creatingParentsIfNeeded().withMode(mode)                  .forPath(path,nodeData.getBytes("UTF-8"));        } catch (Exception e) {            LOGGER.error("createNode error...", e);            e.printStackTrace();        }    }    @Override    public String getNodeData(String path) {        CuratorFramework client = ZookeeperConfig.getClient() ;        try {            // 数据读取和转换            byte[] dataByte = client.getData().forPath(path) ;            String data = new String(dataByte,"UTF-8") ;            if (StringUtils.isNotEmpty(data)){                return data ;            }        }catch (Exception e) {            LOGGER.error("getNodeData error...", e);            e.printStackTrace();        }        return null;    }    @Override    public List<String> getNodeChild(String path) {        CuratorFramework client = ZookeeperConfig.getClient() ;        List<String> nodeChildDataList = new ArrayList<>();        try {            // 节点下数据集            nodeChildDataList = client.getChildren().forPath(path);        } catch (Exception e) {            LOGGER.error("getNodeChild error...", e);            e.printStackTrace();        }        return nodeChildDataList;    }    @Override    public void deleteNode(String path, Boolean recursive) {        CuratorFramework client = ZookeeperConfig.getClient() ;        try {            if(recursive) {                // 递归删除节点                client.delete().guaranteed().deletinGChildrenIfNeeded().forPath(path);            } else {                // 删除单个节点                client.delete().guaranteed().forPath(path);            }        } catch (Exception e) {            LOGGER.error("deleteNode error...", e);            e.printStackTrace();        }    }    @Override    public InterProcessReadWriteLock getReadWriteLock(String path) {        CuratorFramework client = ZookeeperConfig.getClient() ;        // 写锁互斥、读写互斥        InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, path);        return readWriteLock ;    }}

6、基于swagger2接口

@Api("Zookeeper接口管理")@RestControllerpublic class ZookeeperApi {    @Resource    private ZookeeperService zookeeperService ;    @ApiOperation(value="查询节点数据")    @GetMapping("/getNodeData")    public String getNodeData (String path) {        return zookeeperService.getNodeData(path) ;    }    @ApiOperation(value="判断节点是否存在")    @GetMapping("/isExistNode")    public boolean isExistNode (final String path){        return zookeeperService.isExistNode(path) ;    }    @ApiOperation(value="创建节点")    @GetMapping("/createNode")    public String createNode (CreateMode mode, String path ){        zookeeperService.createNode(mode,path) ;        return "success" ;    }    @ApiOperation(value="设置节点数据")    @GetMapping("/setNodeData")    public String setNodeData (String path, String nodeData) {        zookeeperService.setNodeData(path,nodeData) ;        return "success" ;    }    @ApiOperation(value="创建并设置节点数据")    @GetMapping("/createNodeAndData")    public String createNodeAndData (CreateMode mode, String path , String nodeData){        zookeeperService.createNodeAndData(mode,path,nodeData) ;        return "success" ;    }    @ApiOperation(value="递归获取节点数据")    @GetMapping("/getNodeChild")    public List<String> getNodeChild (String path) {        return zookeeperService.getNodeChild(path) ;    }    @ApiOperation(value="是否递归删除节点")    @GetMapping("/deleteNode")    public String deleteNode (String path,Boolean recursive) {        zookeeperService.deleteNode(path,recursive) ;        return "success" ;    }}

看完上述内容,你们掌握SpringBoot2中怎么利用Zookeeper组件管理架构中服务协调的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: SpringBoot2中怎么利用Zookeeper组件管理架构中服务协调

本文链接: https://www.lsjlt.com/news/229973.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot2中怎么利用Zookeeper组件管理架构中服务协调
    SpringBoot2中怎么利用Zookeeper组件管理架构中服务协调,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Zookeeper基础简介1、概念简介Zookeepe...
    99+
    2023-06-02
  • SpringBoot2中怎么利用Swagger2构建接口管理界面
    本篇文章为大家展示了SpringBoot2中怎么利用Swagger2构建接口管理界面,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、Swagger2简介1、Swagger2优点整合到Spring ...
    99+
    2023-06-02
  • SpringBoot2中怎么利用Dubbo框架实现RPC服务远程调用
    SpringBoot2中怎么利用Dubbo框架实现RPC服务远程调用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Dubbo框架简介1、框架依赖图例说明:1...
    99+
    2023-06-02
  • SpringBoot2中怎么利用FastDFS 中间件实现文件分布式管理
    本篇文章给大家分享的是有关SpringBoot2中怎么利用FastDFS 中间件实现文件分布式管理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、FastDFS作用FastD...
    99+
    2023-06-02
  • SpringBoot2 中怎么利用Redis数据库实现缓存管理
    SpringBoot2 中怎么利用Redis数据库实现缓存管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Redis简介Spring Boot中除了对常用...
    99+
    2023-06-02
  • Icinga中怎么管理主机组和服务组
    在Icinga中管理主机组和服务组可以通过Web界面或配置文件进行操作。 通过Web界面管理主机组和服务组: 登录Icinga...
    99+
    2024-04-09
    Icinga
  • Vue.js中怎么利用递归组件构建树形菜单
    本篇文章给大家分享的是有关Vue.js中怎么利用递归组件构建树形菜单,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Vue.js中一个递归组件...
    99+
    2024-04-02
  • PHP在微服务架构中怎么应用
    今天小编给大家分享一下PHP在微服务架构中怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、基于PHP的微服务架构构...
    99+
    2023-07-05
  • 使用 C++ 堆分配器管理服务器架构中的内存
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • Ubuntu中怎么利用TCP协议获取服务器时间
    这期内容当中小编将会给大家带来有关Ubuntu中怎么利用TCP协议获取服务器时间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码如下:#include "unp.h"int main...
    99+
    2023-06-13
  • Redis在微服务架构中怎么发挥作用
    在微服务架构中,Redis可以发挥多种作用,其中包括: 缓存数据:Redis作为内存数据库,可以高效地存储和访问数据。在微服务架...
    99+
    2024-05-07
    Redis
  • Python中怎么利用 FastAPI构建一个Web服务
    Python中怎么利用 FastAPI构建一个Web服务,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。起步我们将使用 Fedora 作为基础镜像来搭建开发环境,...
    99+
    2023-06-16
  • 架设云服务器怎么用手机打开文件管理
    如果您使用的是云服务器,通常只需要连接到网络并登录您的云服务器账户即可进行文件的管理。以下是一个简单的步骤,您可以通过该步骤开始管理云服务器中的文件。 首先,在您的云服务器上安装必要的应用程序和数据库。这可能包括Google Drive...
    99+
    2023-10-27
    用手 文件管理 服务器
  • 怎么在SpringBoot中利用Feign调用其他服务接口
    本篇文章给大家分享的是有关怎么在SpringBoot中利用Feign调用其他服务接口,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入依赖<!-- https:...
    99+
    2023-06-14
  • 远程桌面集中管理服务器软件,远程桌面集中管理服务器软件是什么,怎么使用?
     远程桌面集中管理服务器是软件微软公司为了方便网络管理员管理维护服务器而推出的一项服务。从windows 2000 server版本开始引入,网络管理员使用  远程桌面集中管理服务器连接到网络任意一台开启了远程桌面控制功...
    99+
    2023-06-04
  • 架设云服务器怎么用手机打开文件夹管理
    首先,在使用云服务器时,需要将数据上传到云服务器的一个或多个文件夹中。这就需要我们下载相应的客户端软件,例如:Google Drive、Dropbox等等。下载安装完成后,打开相应的客户端软件,即可开始使用。 其次,在访问云服务器中的文件...
    99+
    2023-10-28
    用手 文件夹 服务器
  • Node.js中怎么利用中间件实现服务端缓存
    Node.js中怎么利用中间件实现服务端缓存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。关于服务端缓存缓存已经被广泛应用,来提高页面性能。一...
    99+
    2024-04-02
  • 架设云服务器怎么用手机打开文件管理功能
    一、注册账号 首先,我们需要注册一个云服务器账号。用户可以在手机APP中搜索“云服务器”或者“阿里云”等关键词,找到相应的服务提供商进行注册。在注册账号时,需要填写用户名、密码、邮箱等信息。 二、创建账号 创建一个云服务器账号需要填写相应...
    99+
    2023-10-27
    用手 文件管理 功能
  • 架设云服务器怎么用手机打开文件管理权限
    在云服务器上部署应用程序的文件系统需要对其文件和文件夹拥有一定的访问控制权限。如果您在使用应用程序时不知道文件和文件夹的权限,那么就无法访问它们。以下是一些使用手机访问文件管理权限的方法: 使用云服务器的访问控制列表(ACL): 在云服...
    99+
    2023-10-27
    用手 管理权限 服务器
  • Android中怎么利用OkHttp上传文件到服务器
    Android中怎么利用OkHttp上传文件到服务器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、编写服务器端在上一讲服务器下新建UploadFileServlet,代...
    99+
    2023-05-31
    okhttp android 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作