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. 2015年热门的国产开源软件TOP 50

    2015年热门的国产开源软件TOP 50 开源中国在 2015 年得到了快速的发展,单开源软件收藏量就接近 40000 款,其中不乏优质的国产开源项目.本文从软件的收藏.下载.访问等多角度挑选出了 2 ...

  2. POJ 3159 Candies、

    题意:n个小孩,m个比较(给你两个孩子代号a,b.然后c意味着a比b最多只能少c个糖果),问1和n之间差距最大的糖果数量. 思路:这是一个差分约束思路 不懂得:传送门, 转化一下就是一个SPFA求最短 ...

  3. TortoiseSVN各种状态

    黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...

  4. TCP/IP模型的层次结构

  5. POJ 1182食物链、

    应用挑战程序设计那本书上的话: 对于每只动物i创建3个元素i—A,i—B,i—C,并用3xN个元素建立并查集.这个并查集维护如下信息: (1)i—x表示“i属于种类x” (2)并查集里的每一个组表示组 ...

  6. 5-1rquests模拟登陆知乎之httpcode

    1,状态码: 400错误:请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里 2,requests库:python常用的库,有空仔细阅读一下官方文档

  7. 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  8. H3C RIP路由表的维护

  9. Educational Codeforces Round 54 (Rated for Div. 2) D Edge Deletion (SPFA + bfs)

    题目大意:给定你一个包含n个点m条边的无向图,现在最多在图中保留k条边,问怎么删除多的边,使得图中良好的节点数最多,求出保留在图中的边的数量和编号. 良好的节点定义为:删除某条边后该点到点1的最短距离 ...

  10. Linux 内核VLB 总线

    另一个对 ISA 的扩展是 VESA Local Bus(VLB) 接口总线, 它扩展了 ISA 连接器, 通过 添加第 3 个知道长度的槽位. 一个设备可只插入这个额外的连接器(不用插入 2 个关联 ...