zookeeper作配置中心(存储支付信息)
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作配置中心(存储支付信息)的更多相关文章
- Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...
- Zookeeper作为配置中心使用说明
为了保证数据高可用,那么我们采用Zookeeper作为配置中心来保存数据.SpringCloud对Zookeeper的集成官方也有说明:spring_cloud_zookeeper 这里通过实践的方式 ...
- 为什么推荐Zookeeper作注册中心
Zookeeper的数据模型很简单,有一系列被称为ZNode的数据节点组成,与传统的磁盘文件系统不同的是,zk将全量数据存储在内存中,可谓是高性能,而且支持集群,可谓高可用,另外支持事件监听.这些特点 ...
- ZooKeeper实现配置中心的实例(原生API实现)(转)
说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...
- 基于Apache Zookeeper手写实现动态配置中心(纯代码实践)
相信大家都知道,每个项目中会有一些配置信息放在一个独立的properties文件中,比如application.properties.这个文件中会放一些常量的配置,比如数据库连接信息.线程池大小.限流 ...
- Spring Cloud(十四)Config 配置中心与客户端的使用与详细
前言 在上一篇 文章 中我们直接用了本应在本文中配置的Config Server,对Config也有了一个基本的认识,即 Spring Cloud Config 是一种用来动态获取Git.SVN.本地 ...
- SrpingCloud 之SrpingCloud config分布式配置中心
Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...
- .Net配置中心-Zookeper版
简介 zookeeper的基本概念和作用这里不做介绍,现在很多的公司都在使用它,说起它的作用,可能最先想到的是配置中心,可以将配置项作为一个node存储在zookeeper中,其他应用可以“关注 ...
- spring-cloud-config-server分布式配置中心
spring cloud config是一个基于http协议的远程配置实现方式.通过统一的配置管理服务器进行配置管理,客户端通过https协议主动的拉取服务的的配置信息,完成配置获取. spring ...
随机推荐
- 可运行的js代码
canrun <html> <head> <title>测试博客园HTML源码运行程序</title> <meta http-equiv=&quo ...
- oracle避免在索引列上使用计算
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SE ...
- 推荐几个web前端比较实用的网站
第一次写博客,说实在的有点紧张和兴奋,哈哈哈哈,本人工作了有两年的时间,平时也有做笔记的习惯,但是都做得乱七八糟的,所以就想通过写博客来记录.好了,废话不多说了,先来几个觉得在工作中使用到的,还不错的 ...
- 正则表达式中的"\."表示什么意思
\ 这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配.例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符.
- java操作数组的工具类-Arrays
static int binarySearch(type[] a, type key) 使用二分搜索法来搜索key元素在数组中的索引:若a数组不包括key,返回负数.(该方法必须已按升序排列后调用). ...
- vue样式加scoped后不能覆盖组件的原有样式解决方法
<style scoped> </style> 为了vue页面样式模块化,不对全局造成污染,建议每个页面的style标签加上scoped,表示他的样式只属于当前的页面,父组件的 ...
- Spring Boot Thymeleaf 使用详解
在上篇文章Spring Boot (二):Web 综合开发中简单介绍了一下 Thymeleaf,这篇文章将更加全面详细的介绍 Thymeleaf 的使用.Thymeleaf 是新一代的模板引擎,在 S ...
- java UDP传输
①:只要是网络传输,必须有socket . ②:数据一定要封装到数据包中,数据包中包括目的地址.端口.数据等信息. 直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对 ...
- H3C DHCP中继工作原理
- Nginx的三种应用场景介绍
配置虚拟主机 就是在一台服务器启动多个网站. 如何区分不同的网站: 1.域名不同 2.端口不同 1.1. 通过端口区分不同虚拟机 Nginx的配置文件: /usr/local/nginx/conf/n ...