惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Scott Helme
Scott Helme
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
S
Securelist
Help Net Security
Help Net Security
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
D
Docker
Simon Willison's Weblog
Simon Willison's Weblog
Microsoft Azure Blog
Microsoft Azure Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
I
Intezer
Spread Privacy
Spread Privacy
WordPress大学
WordPress大学
C
Cisco Blogs
有赞技术团队
有赞技术团队
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
S
Schneier on Security
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes
Y
Y Combinator Blog
S
SegmentFault 最新的问题
G
GRAHAM CLULEY
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LINUX DO - 热门话题
K
Kaspersky official blog
P
Proofpoint News Feed
P
Palo Alto Networks Blog
Cyberwarzone
Cyberwarzone
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
GbyAI
GbyAI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
NISL@THU
NISL@THU
L
LangChain Blog
B
Blog
aimingoo的专栏
aimingoo的专栏
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cisco Talos Blog
Cisco Talos Blog
雷峰网
雷峰网
The Cloudflare Blog
宝玉的分享
宝玉的分享
SecWiki News
SecWiki News
L
Lohrmann on Cybersecurity
C
Cyber Attacks, Cyber Crime and Cyber Security

祈雨的笔记

安全多方计算MPC spark原理解析 kueue执行源码分析 spark on k8s执行源码分析 spark-operator源码解析 系统压测遇到的缓存击穿问题 我的世界PC与安卓联机 蚂蚁金服流量投放平台的AIG改造 G1大对象致Old区占用率高 日志打印导致接口响应率下跌分析 Groovy加载类导致OOM分析 ERROR日志打印导致CPU满载 记OceanBase死锁超时 应用发版期间服务响应超时 Ark Serverless初探 系统优化复盘一二三 The user specified as a definer does not exist Kong网关初探 API网关选型调研 CPU火焰图常用工具 root操作Nginx导致用户组错误 基于Proxifier使用代理 FastJSON字段智能匹配踩坑 Nacos初探 记一次Nginx服务器CPU满荷载故障 基于券系统分库分表的思考 limit不参与SQL成本计算致索引失效 Linux常用性能监控命令 golang低版本http2偶现400 hostname in certificate didn't match 常见对称加密原理以及应用 tcp_tw_recycle引起的TCP握手失败 记一次mysql执行DDL导致锁表 mysql磁盘占用查看 mysql对text字段update致磁盘增长 elasticsearch报错index read-only TIME_WAIT与Http的Keep-Alive 记一次TIME_WAIT导致连接数报警 记一次生产事故OOM问题排查 redis分布式锁RedissonLock的实现细节 webservice复杂加密签名(2)java调用 webservice复杂加密签名(1)SoapUI mysql延时关联 利用中间人拦截实现APP内H5窜改 MySQL表字符集不同导致关联查询索引失效 通过SSH隧道远程办公 数据落盘方案 BeanDefinitionRegistryPostProcessor扩展 mysql空间索引 HTTPS攻击 spring循环依赖过程解析 elasticsearch性能优化 mysql IS NULL 使用索引 mysql字符集utf8mb4失效踩坑 常用加密算法 xml与javaBean转换 初探InnoDB MVCC源码实现 mysql索引原理 redis之list源码分析 redis之key过期源码分析 redis之string源码分析 redis之hash源码分析 线程池之ThreadPoolExecutor mysql数据页结构 Using temporary与Using filesort mysql回表致索引失效 springboot(28)HTTP连接池 定时任务之ScheduledThreadPoolExecutor elasticsearch常用script聚合 elasticsearch实现like查询 elasticsearch实现乐观锁 elasticsearch准实时原理 springboot(27)自定义缓存读写机制CachingConfigurerSupport optimizer tracing arthas常用命令 HTTP和HTTPS详解 redis集群选举机制 kafka消息重试 一点压力测试的经验 kafka架构概念 explain分析sql语句字段的解释 JVM问题分析处理手册 logstash过滤器(2)date logstash过滤器(3)dissect logstash编码器(1)json logstash编码器(2)multiline logstash表达式 logstash输入(1)通用选项 logstash输入(3)file logstash过滤器(1)通用选项 logstash输入(2)stdin logstash安装 记一次前端vConsole导致JSON序列化错误排查 解决多个异步操作嵌套问题 fastjson反序列化失败autoType is not support RTMP串流服务 POI自动调整列宽错误 Nginx+Lua实现动态黑名单 使用curl命令模拟POST和GET请求 ResponseEntity下载文件
配置中心选型调研
祈雨的笔记 · 2021-02-13 · via 祈雨的笔记

背景

为了方便应用程序配置文件的管理,决定使用市面上流行的配置中心作为实现方案,由于配置中心的备选方案很多,我们需要结合目前项目的实际情况来进行技术选型

目前市面上流行的配置中心

  1. Disconf
  2. Spring-cloud-config
  3. Ctrip apollo
  4. Disconf
  5. Nacos
  6. ConfigMap

目前系统的现状

  • 编程语言:Java、Golang;以 Golang 为主,Java 为辅,大部分应用已经从Java切换成了 Golang ,但由于历史原因,部分项目组和少量的项目使用的是 Java 语言
  • 人员结构:大部分同事做业务开发,对中间件的了解不是太多
  • 系统部署:由于公司涉及到跨国业务,后续有可能考虑异地多活的涉及

基于上述考虑,配置中心需要具备:

  • 易用性:使用起来比较简单,对于业务开发的同事,学习起来比较容易,能够快速上手
  • 高可用:配置中心应避免单点故障,即使配置中心宕机,对于存量的配置信息也需要能够正常访问
  • 多语言:至少支持两种语言(Java + Golang),若有SDK更佳
  • 系统改造小:业务系统侵入性低,用较小的代价完成配置中心的集成
  • 多数据中心
  • 易维护:配置中心的运维成本越低越好,尽量减少运维人员的参与
  • 支持UI:通过界面,可以完成配置文件的上传、修改、删除

在满足以上条件的基础上,从功能的丰富程度来讲,若具备如下功能有限考虑:

  • 鉴权:基于安全性考虑,配置文件,需要通过鉴权的方式获取
  • 审计:对于配置文件的修改,可以追历史溯修改记录
  • 灰度
  • 性能

初步筛选

功能点 spring-cloud-config ctrip apollo nacos configMap disconf
易用性 第三方UI界面简单,易上手 UI界面复杂,中文文档充分,有一定的学习成本 UI界面简单,中文文档充分,易上手 UI界面过于简单原始,业务开发同事需要一定的k8s知识,否则需要运维配合操作
高可用 基于eureka实现集群模式 基于eureka实现集群模式 基于raft算法内部选举,不需要额外的中间件即可支持集群模式
配置生效 默认不支持配置热更新,需要集成其他组件才能实现热更新功能 秒级别热更新生效 秒级别热更新生效 秒级别热更新生效
多语言 只支持java 官方SDK: java、.net;第三方SDK: Go、PHP;支持HTTP API调用 官方SDK: java、Go、Python等;支持HTTP API调用 SDK: Java(不支持配置更改监听);可以编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
改造成本 配合spring框架,几乎无代码改动,仅修改配置文件即可 集成SDK后代码侵入低 集成SDK后代码侵入低 强依赖k8s,且SDK缺乏,需要编写代码自实现相关功能
多数据中心 支持 支持 支持
多环境 以项目为颗粒度单位,每个项目下多个环境 以环境为颗粒度单位,每个环境下多个项目
易维护 除了注册中心应用本身,还需要额外维护Git和eureka 除了注册中心应用本身,还需要额外维护eureka 除了注册中心应用本身,不需要额外维护中间件 kubernetes子集,维护成本低
UI支持 官方不支持UI可集成第三方UI实现 官方自带UI 官方自带UI 不支持
鉴权 以项目为颗粒度对UI登录用户/客户端调用鉴权,不支持只读/读写颗粒度权限控制 以环境为颗粒度对UI登录用户/客户端调用鉴权,支持只读/读写颗粒度的权限控制
审计 支持审计日志,可以清晰查看每次操作时变更的配置条目和变更前后对比 支持审计日志,仅记录了变更前的原记录,未展示变更的配置条目以及变更前后对比
灰度 对指定IP集灰度发布 对指定IP集灰度发布
性能 官方称比spring-cloud-config快 官方压测3节点8核16G:写TPS 4214/读QPS 23013,https://nacos.io/zh-cn/docs/nacos-config-benchmark.html
备注 官方已停止维护,4年未更新

进一步筛选

spring-cloud-config只支持java生态,而disconf已经官方停止维护,超过4年没有更新,故两者不考虑。

configMap强依赖k8s,必须应用先迁移到ks8容器后才能使用,另外UI支持过于简单,需要的功能例如权限控制、审计记录等几乎都没有。configMap的SDK也支持不佳,如果客户端需要获取配置,目前有如下使用四种方式来使用 ConfigMap 配置 Pod 中的容器:

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷里面添加一个文件,让应用来读取
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

这几种方案不仅需要额外的代码来实现逻辑,前3种方案不能实现配置更改监听,而第4种方案的代码改造量较大。再加上configMap对鉴权、审计、灰度发布等功能并未支持,所以configMap也不考虑使用。

apollo与nacos两者对于要求的功能都基本实现,apollo的UI界面复杂,有一定的学习成本,但对于审计功能实现比nacos更好,虽然官方未提供Golang版本的SDK,但有不少第三方SDK可以使用,而且本身也提供了HTTP协议的API。nacos的UI界面相当简单,即使不看文档也能轻松上手,且nacos本身不仅支持配置中心,也支持注册中心,但对于审计功能实现不如apollo,仅记录了变更前的原记录,未展示变更的配置条目以及变更前后对比,不能直观地查看每次记录的变更内容。

结论

如果仅仅只考虑使用配置中心,apollo虽然操作有些复杂,但功能更加完善。如果不仅使用配置中心,还需要使用注册中心,建议使用nacos,虽然功能实现略差于apollo,但日常需要的功能均大差不差,且使用简单易于上手,搭建环境也不需要额外的中间件依赖。