zookeeper作配置中心(存储敏感信息)

前提:最近在项目中需要用到支付接口,支付宝或者微信支付,根据官方文档,需要配置一些诸如notify-url或者app-private-key等信息,这些信息比较敏感,且是协同开发,为了避免发生一些不安全的事情,于是决定将这些信息存放在zookeeper中,这是主要原因,另一个原因是一旦配置需要改变,直接在zookeeper中改变即可,不需要重启后端服务,这里涉及到了zookeeper的NIO以及长连接等相关的底层网络编程,这里不再赘述。

1、首先在服务器端安装zookeeper,默认端口是2181,安装教程不讲解

2、在本机(Window 10)安装ZKUI(ZK可视化客户端),方便管理zookeeper

3、安装zookeeper的java客户端(curator)

4、读取配置信息并设置监听器


@Configuration
class PaymentConfig { @Value("\${custom-config.zookeeper.url}")
lateinit var zkUrl: String @Value("\${custom-config.zookeeper.zfb-nodename}")
lateinit var zfbNodeName: String @Value("\${custom-config.zookeeper.wx-nodename}")
lateinit var wxNodeName: String val remoteProperties: Properties = Properties() companion object {
/**
* zookeeper节点映射在本地的键值
*/
private const val ALI_APP_ID = "/pay-server-config/pay.alipay/app-id"
private const val ALI_APP_PRIVATE_KEY = "/pay-server-config/pay.alipay/app-private-key"
private const val ALI_NOTIFY_URL = "/pay-server-config/pay.alipay/notify-url"
private const val ALI_PUBLIC_KEY = "/pay-server-config/pay.alipay/public-key" private const val WX_NOTIFY_URL = "/pay-server-config/pay.wxpay/notify-url"
private const val WX_APP_ID = "/pay-server-config/pay.wxpay/app-id"
private const val WX_APP_PRIVATE_KEY = "/pay-server-config/pay.wxpay/app-private-key"
private const val WX_MCH_ID = "/pay-server-config/pay.wxpay/mch-id"
} @PostConstruct
fun init(){
setPaymentConfigFromZk(remoteProperties)
} fun setPaymentConfigFromZk(remoteProperties: Properties){
val zkClient: CuratorFramework = CuratorFrameworkFactory.newClient(zkUrl, RetryOneTime(1000))
zkClient.start()
try {
val zfbConfigNames = zkClient.children.forPath("/$zfbNodeName")
val wxConfigNames = zkClient.children.forPath("/$wxNodeName")
for (configName in zfbConfigNames) {
val value = String(zkClient.data.forPath("/$zfbNodeName/$configName"))
remoteProperties["/$zfbNodeName/$configName"] = value
}
for (configName in wxConfigNames) {
val value = String(zkClient.data.forPath("/$wxNodeName/$configName"))
remoteProperties["/$wxNodeName/$configName"] = value
}
setListener(zkClient, zfbNodeName, remoteProperties)
setListener(zkClient, wxNodeName, remoteProperties)
} catch (e: Exception) {
e.printStackTrace()
}
} fun setListener(zkClient: CuratorFramework, uri: String, remoteProperties: Properties){
val treeCache = TreeCache(zkClient, "/$uri")
treeCache.start()
treeCache.listenable.addListener(TreeCacheListener(
fun(client: CuratorFramework, event: TreeCacheEvent) {
when (event.type) {
TreeCacheEvent.Type.NODE_UPDATED -> {
val value = String(event.data.data)
remoteProperties[event.data.path] = value
println("Payment URL has changed, the changed is ${String(event.data.data)}")
println("Payment URL has changed, the path is ${event.data.path}")
}
else -> {
print("Now, get the config from zookeeper ${event.data}")
}
}
}
)
)
}
}

以上代码大意为:在初始化的时候读取zookeeper中的值,并赋值到本地的Properties,key为zookeeper节点的全路径,值为叶子节点的Value,之后使用TreeCache监听客户端的变化,当某个叶子节点的值发生改变后,改变原有的properties,替换为新值。

zookeeper作配置中心(存储支付信息)的更多相关文章

  1. Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心

    一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...

  2. Zookeeper作为配置中心使用说明

    为了保证数据高可用,那么我们采用Zookeeper作为配置中心来保存数据.SpringCloud对Zookeeper的集成官方也有说明:spring_cloud_zookeeper 这里通过实践的方式 ...

  3. 为什么推荐Zookeeper作注册中心

    Zookeeper的数据模型很简单,有一系列被称为ZNode的数据节点组成,与传统的磁盘文件系统不同的是,zk将全量数据存储在内存中,可谓是高性能,而且支持集群,可谓高可用,另外支持事件监听.这些特点 ...

  4. ZooKeeper实现配置中心的实例(原生API实现)(转)

    说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...

  5. 基于Apache Zookeeper手写实现动态配置中心(纯代码实践)

    相信大家都知道,每个项目中会有一些配置信息放在一个独立的properties文件中,比如application.properties.这个文件中会放一些常量的配置,比如数据库连接信息.线程池大小.限流 ...

  6. Spring Cloud(十四)Config 配置中心与客户端的使用与详细

    前言 在上一篇 文章 中我们直接用了本应在本文中配置的Config Server,对Config也有了一个基本的认识,即 Spring Cloud Config 是一种用来动态获取Git.SVN.本地 ...

  7. SrpingCloud 之SrpingCloud config分布式配置中心

    Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...

  8. .Net配置中心-Zookeper版

    简介    zookeeper的基本概念和作用这里不做介绍,现在很多的公司都在使用它,说起它的作用,可能最先想到的是配置中心,可以将配置项作为一个node存储在zookeeper中,其他应用可以“关注 ...

  9. spring-cloud-config-server分布式配置中心

    spring cloud config是一个基于http协议的远程配置实现方式.通过统一的配置管理服务器进行配置管理,客户端通过https协议主动的拉取服务的的配置信息,完成配置获取. spring ...

随机推荐

  1. [kuangbin带你飞]专题九 连通图E POJ 3177 Redundant Paths

    这个题最开始我想的是,直接缩点求双连通分量,连接这些双联通分量不就行了吗? 但是其实是不对的,双连通内部双联通,我们如果任意的连接一条边在这些双联通分量之间,他们之间有没有桥其实并不知道. 我应该是求 ...

  2. IDEA sql自动补全/sql自动提示/sql列名提示

    一.启用idea的database插件 File->Settings->Plugins 搜索Database Tools and SQL 选择Enable 启用或者勾选 二.新建Datab ...

  3. python基础十四之匿名函数

    匿名函数 处理简单问题的简化函数,关键字lambda. # 格式:函数名 = lambda 参数:返回值 anonymity = lambda s: s ** 0.5 print(anonymity( ...

  4. H3C IEEE EUI-64格式

  5. PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理

    相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析  PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理 介绍 mysqli是PHP程序与mysql数据库进行数据交互的桥梁, ...

  6. Apache ServiceMix介绍

    Apache ServiceMix介绍 Apache ServiceMix 是一个广泛使用的开源ESB,适合SOA项目的集成,它提供类似商业ESB产品一样的功能呢,它的核心是基于开放标准和规范. Se ...

  7. 给js加版本号解决浏览器缓存问题

    我们知道打开网页时浏览器会加载需要的资源,比如图片.音频.js文件.css文件等.并且会把这些资源作为缓存保存下来,再次打开网页时缓存好的资源就不需要再次加载了.但是,这样有一个问题,就是当程序猿更新 ...

  8. C# 对 byte 数组进行模式搜索

    本文告诉大家几个方法从 byte 数组找到对应的相同序列的数组 最简单的方法是进行数值判断,但是代码最少是使用Linq ,效率比较高是使用 Boyer-Moore 算法,下面就告诉大家几个算法的代码 ...

  9. JavaSE基础---异常

    异常 Throwable----具备可拋性:就是该体系中的类和对象都可以被关键字throw或throws所操作. |---Error ---错误,一般不编写针对性处理方式 |---Exception- ...

  10. 北京信息科技大学第十一届程序设计竞赛E-- kotori和素因子(深搜)

    链接:https://ac.nowcoder.com/acm/contest/940/E 题目描述 kotori拿到了一些正整数.她决定从每个正整数取出一个素因子.但是,kotori有强迫症,她不允许 ...