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. 深入java面向对象一:==和equals详解

    本文从多篇博客笔记融合而来,系转载,非原创,参考: 1.  http://www.cnblogs.com/e241138/archive/2012/09/16/2687981.html 2.  htt ...

  2. @JsonIgnore @JsonIdentityInfo 处理Hibernate 循环引用的问题

    enterprise和user一对一的关系: @Entity @Table(name = "enterprise") public class Enterprise extends ...

  3. index() 方法返回指定元素相对于其他指定元素的 index 位置。

  4. jstack简介

    jstack:Java进程中线程的堆栈信息跟踪工具 功能简介 jstack常用来打印Java进程/core文件/远程调试端口的Java线程堆栈跟踪信息,包含当前虚拟机中所有线程正在执行的方法堆栈信息的 ...

  5. 基于 Laravel-Admin 在十分钟内搭建起功能齐全的后台模板

    http://laravelacademy.org/post/6468.html 1.简介 为 Laravel 提供后台模板的项目越来越多,学院君已陆续为大家介绍过Laravel Angular Ad ...

  6. Spring激活profile的方式

    Spring中激活profile的方法:设置spring.profiles.active和spring.profiles.default这两个属性 设置激活profile属性的地方(优先级由高到底) ...

  7. 微信小程序之在线试题(1)

    最近在做一套公司的市场化培训项目,涉及到手机端在线答题的设计,首先摒弃app的模式,那就只剩下微信公众号和小程序,而公众号是可以关联小程序,所以我们只需要做好一套小程序. 因为篇幅问题,下面只讲解在线 ...

  8. linux进程互斥等待

    我们已经见到当一个进程调用 wake_up 在等待队列上, 所有的在这个队列上等待的进程 被置为可运行的. 在许多情况下, 这是正确的做法. 但是, 在别的情况下, 可能提前知道 只有一个被唤醒的进程 ...

  9. Linux数据对齐

    编写可移植代码而值得考虑的最后一个问题是如何存取不对齐的数据 -- 例如, 如何读取 一个存储于一个不是 4 字节倍数的地址的 4 字节值. i386 用户常常存取不对齐数据项, 但是不是所有的体系允 ...

  10. vue-learning:32 - component - 异步组件和工厂函数

    异步组件 只有在这个组件需要使用的时候才从服务器加载这一个组件模块,用于渲染,并且会把结果缓存起来供未来复用. 实现方法: 组件定义的时候,以一个工厂函数的形式传入,在需要组件的执行这个函数,然后将组 ...