分布式系列教程(13) -分布式协调工具Zookeeper(实现分布式配置中心)

简介: 分布式系列教程(13) -分布式协调工具Zookeeper(实现分布式配置中心)

代码已提交至Github,有兴趣的同学可以下载来看看(git版本号:3f3d5e73d533c5ac9f92e0d21192e50149e39cb9):https://github.com/ylw-github/SpringBoot-Zookeeper-Demo

1.分布式配置中心

什么是分布式配置中心?

  • 项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做到自动更新配置文件信息,解决以上问题。

常用分布式配置中心框架有哪些呢?

  • disconf(推荐),可支持KV存储以及配置文件形式存储,使用和开发更为简便。并且本身也是基于zookpeer的分布式配置中心开发,方便部署使用,并且支持实时更新通知操作,但是部署相对复杂。
  • Diamond(daɪəmənd) 基本可以放弃,一般做KV的存储配置项,做配置文件不是很好的选择。
  • Spring Cloud Config 因为依赖git,使用局限性较大,需要在各个环境中安装git,并且不支持KV存储,功能方面略差于disconf。

分布式配置中心实现原理对比:

注册中心 配置存储 时效性 数据模型 维护性 优点 缺点
disconf zookpeer 实时推送 支持传统的配置文件模式,亦支持KV结构数据 提供界面操作 基于分布式的Zookeeper来实时推送稳定性、实效性、易用性上均优于其他 源码较多,阅读和使用起来相对较复杂
zookpeer zookpeer 实时推送 支持传统的配置文件模式,亦支持KV结构数 命令操作 实时推送稳定性、实效性 开发量大
diamond mysql 每隔15s拉一次全量数据 只支持KV结构的数据 提供界面操 简单、可靠、易用 数据模型不支持文件,使用不方便
Spring Cloud Config git 人工批量刷新 文件模式 git操作 简单、可靠、易用 需要依赖GIT,并且更新GIT

2.基于Zookeeper实现分布式配置中心

1.添加maven依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
            <exclusion>
                <artifactId>log4j</artifactId>
                <groupId>log4j</groupId>
            </exclusion>
            <exclusion>
                <artifactId>slf4j-log4j12</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

2.application.yml

server:
  port: 8080
  #port: 8081
  #port: 8082
user:
  key: ylw

3.ConfigUtils

package com.ylw.zookeeper.center;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConfigUtils {
    @Value("${user.key}")
    private String userKey;
    public String getUserKey() {
        return userKey;
    }
    public void setUserKey(String userKey) {
        this.userKey = userKey;
    }
}

4.MyApplicationRunner(项目启动创建zk节点):

package com.ylw.zookeeper.center;
import org.I0Itec.zkclient.IZkDataListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class MyApplicationRunner extends BaseZookeeper implements ApplicationRunner {
    @Autowired
    private ConfigUtils configUtils;
    // 启动后执行方法
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("项目启动成功...");
        String userValue = configUtils.getUserKey();
        String userKey = "/userKey";
        try {
            // 创建节点信息
            zkClient.createEphemeral(userKey, userValue);
        } catch (Exception e) {
            e.printStackTrace();
        }
        zkClient.subscribeDataChanges(userKey, new IZkDataListener() {
            public void handleDataDeleted(String dataPath) throws Exception {
            }
            // 当值发生变化的时候
            public void handleDataChange(String dataPath, Object data) throws Exception {
                System.out.println("dataPath:" + dataPath + ",data:" + data);
                final String strData = (String) data;
                configUtils.setUserKey(strData);
            }
        });
    }
}

5.UpdateInfoService(修改Zookeeper节点信息):

package com.ylw.zookeeper.center;
import org.springframework.stereotype.Service;
@Service
public class UpdateInfoService extends BaseZookeeper {
    public String updateInfo(String key, String value) {
        try {
            zkClient.writeData("/" + key, value);
            return "success";
        } catch (Exception e) {
            return "fail";
        }
    }
}

6.IndexController(获取配置文件信息):

package com.ylw.zookeeper.center;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
    @Autowired
    private ConfigUtils configUtils;
    @Autowired
    private UpdateInfoService updateInfoService;
    @RequestMapping("/getInfo")
    public String getInfo() {
        return configUtils.getUserKey();
    }
    @RequestMapping("/updateInfo")
    public String updateInfo(String key, String value) {
        String updateInfo = updateInfoService.updateInfo(key, value);
        return updateInfo;
    }
}

未完待续。。。

目录
相关文章
|
4月前
|
机器学习/深度学习 监控 算法
分布式光伏储能系统的优化配置方法(Matlab代码实现)
分布式光伏储能系统的优化配置方法(Matlab代码实现)
219 1
|
3月前
|
编解码 运维 算法
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
204 12
|
3月前
|
消息中间件 分布式计算 资源调度
《聊聊分布式》ZooKeeper与ZAB协议:分布式协调的核心引擎
ZooKeeper是一个开源的分布式协调服务,基于ZAB协议实现数据一致性,提供分布式锁、配置管理、领导者选举等核心功能,具有高可用、强一致和简单易用的特点,广泛应用于Kafka、Hadoop等大型分布式系统中。
|
9月前
|
安全 网络安全 数据库
YashanDB分布式节点间SSL连接配置
本文介绍YashanDB分布式节点间SSL连接配置方法,确保通信安全。需统一为整个集群配置SSL,使用相同根证书签名的服务器证书,否则可能导致连接失败或数据库无法启动。文章详细说明了使用OpenSSL生成根证书、服务器私钥、证书及DH文件的步骤,并指导如何将证书分发至各节点。最后,通过配置数据库参数(如`din_ssl_enable`)并重启集群完成设置。注意,证书过期需重新生成以保障安全性。
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
610 160
|
11月前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
消息中间件 负载均衡 Java
如何设计一个分布式配置中心?
这篇文章介绍了分布式配置中心的概念、实现原理及其在实际应用中的重要性。首先通过一个面试场景引出配置中心的设计问题,接着详细解释了为什么需要分布式配置中心,尤其是在分布式系统中统一管理配置文件的必要性。文章重点分析了Apollo这一开源配置管理中心的工作原理,包括其基础模型、架构模块以及配置发布后实时生效的设计。此外,还介绍了客户端与服务端之间的交互机制,如长轮询(Http Long Polling)和定时拉取配置的fallback机制。最后,结合实际工作经验,分享了配置中心在解决多台服务器配置同步问题上的优势,帮助读者更好地理解其应用场景和价值。
632 18
|
存储 运维 NoSQL
分布式读写锁的奥义:上古世代 ZooKeeper 的进击
本文作者将介绍女娲对社区 ZooKeeper 在分布式读写锁实践细节上的思考,希望帮助大家理解分布式读写锁背后的原理。
343 11