配置中心的设计-nacos vs apollo
简介
前面我们分析了携程的 apollo(见 详解apollo的设计与使用),现在再来看看阿里的 nacos。
和 apollo 一样,nacos 也是一款配置中心,同样可以实现配置的集中管理、分环境管理、即时生效等等。不过,nacos 还具备了服务发现的功能。
分析 apollo 时,我们通过四个问题展开:
- 为什么使用配置中心
- 如何设计一个配置中心
- apollo 是如何设计的
- 如何使用 apollo
当然,我们也可以用同样的套路来分析 nacos,不过,第 1、2 个问题是一样的,没必要再讲一遍,而第 4 个问题嘛,我看官网的文档已经足够详细。所以,这篇博客将重点分析 nacos 和 apollo 在设计上的差异。
以下分析基于 apollo 1.8.0 和 nacos 2.1.0。
安全性的差异
这里说的安全性,不是指控制台读配置中心,而是客户端读配置中心。
之前我说过,如果所有环境都共用一个配置中心,会存在安全问题。因为开发人员能拿到测试环境的配置,按理也能拿到生产环境的配置。

为了解决这个问题,一般有两个方案:
- 不同环境使用不同的配置中心。apollo 用的就是这一种,当客户端需要获取生产配置时,运维需要在项目的启动参数中指定生产环境的配置中心。这种方案要想可靠,生产环境的 config server 地址绝对不能泄露。可怕的是,我曾经就遇到过直接把 config server 注册到公用 eureka 上面的。

- 不同环境使用同一的配置中心,但要做好环境隔离。nacos 则采用这一种,隔离的方案就是命名空间 + 鉴权。和 apollo 不同,客户端去读 nacos 是需要账号密码的,当客户端需要获取生产配置时,运维需要在项目的启动参数中指定生产环境的 namespace 以及对应的账号密码。

上面说到了 namespace。apollo 和 nacos 都有这个概念,不过,在 apollo 里,namespace 可以看成是一个具体的配置文件,而 nacos 里,namespace 表示具体的环境。它们的数据模型如下图。使用 apollo 是通过连接不同的 config server 来区分环境,而 nacos 则通过指定 namespace 来区分。

综上,我们知道,要想确保安全,使用 apollo 时不能泄露 config server 生产环境的地址,使用 nacos 时不能泄露对应生产环境 namespace 的账号密码。如果要说哪种方案更安全,我会更倾向于 nacos,因为相比账号密码,服务器地址会更容易泄露。// zzs001
系统复杂度的差异
在讲 apollo 的设计时,我吐槽过,apollo 的架构太重了。
首先,它把配置中心拆成了 config service、admin service、portal,这一点我倒是可以接受。
我不能接受的是,apollo 为了实现客户端到 config service 的负载均衡而引入了过多的组件。如图,增加了 SLB、meta server、eureka 等组件,这个我真的觉得没必要,直接使用 SLB 来做负载均衡就行。但官方说之所以这么设计是为了避免客户端和 config service 之间的长连接给 SLB 增加过多的负担,这么说的话,,也不无道理。
不过,有一点比较好的就是,apollo 把 config service、eureka 和 meta server 打包在一起部署。

我们来看看 nacos,首先,它没有将配置中心拆成很多个服务,其次,它的负载均衡方案也比较简单,一个 SLB 就可以搞定。要知道 nacos 同样也维护着与客户端的长连接。

那么,这两种架构哪种更好呢?我会更倾向于使用 nacos,至少中小型系统我会这么选择,因为它更简单。不过,apollo 考虑到长连接对 SLB 的负担而增加了那么多组件,按理是经过了深思熟虑,所以,我很想知道,在大型系统中使用 nacos,是否有遇到过 SLB 瓶颈的案例,希望有大佬指点。
以上基本讲完了 nacos 的结构和使用。如有错误,欢迎指正。
最后,感谢阅读。
参考资料
本文为原创文章,转载请附上原文出处链接:https://www.cnblogs.com/ZhangZiSheng001/p/16344519.html
配置中心的设计-nacos vs apollo的更多相关文章
- K8S(12)配置中心实战-多环境交付apollo三组件
k8s配置中心实战-多环境交付apollo三组件 目录 k8s配置中心实战-多环境交付apollo三组件 1.环境准备工作 1.1 zk环境拆分 1.2 namespace分环境 1.3 数据库拆分 ...
- K8S(11)配置中心实战-单环境交付apollo三组件
k8s配置中心实战-交付apollo三组件 目录 k8s配置中心实战-交付apollo三组件 1 apollo简单说明 1.1 apollo最简架构图: 1.2 apollo组件部署关系 2 为app ...
- SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(上)
不断踩坑并解决问题是每个程序员进阶到资深的必要经历并以此获得满足感,而不断阅读开源项目源码和总结思想是每个架构师成长最佳途径.本篇拉开SpringCloud Alibaba最新版本实战和原理序幕,以工 ...
- 在kubernetes集群里集成Apollo配置中心(6)之实战使用apollo分环境管理dubbo服务
生产实践 1.迭代新需求/修复BUG(编码--->提git) 2.测试环境发版,测试(应用通过编译打包发布至test命名空间) 3.测试通过,上线(应用镜像直接发布至prod命名空间) 系统架构 ...
- kubernetes实战-配置中心(二)交付apollo配置中心到k8s
apollo官网:官方地址 apollo架构图: apollo需要使用数据库,这里使用mysql,注意版本需要在5.6以上: 本次环境mysql部署在10.4.7.11上,使用mariadb:10.1 ...
- SpringBoot使用Nacos配置中心
本文介绍SpringBoot如何使用阿里巴巴Nacos做配置中心. 1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云 ...
- 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路
说明: 1.Spring Boot项目默认使用logback进行日志管理 2.logback在启动时默认会自动检查是否有logback.xml文件,如果有时会有限加载这个文件. 3.那么如果是用配置中 ...
- 配置中心-Apollo
配置中心-Apollo 2019/10/01 Chenxin 配置服务主要有 携程Apollo.百度Disconf.阿里ACM,目前以Apollo用户量最大.适用场景,多用于微服务,与K8S结合好. ...
- Apollo配置中心的实战
31.携程 Apollo 配置中心介绍~1.mp4 32.Apollo核心概念~1.mp4 32.Apollo核心概念~1.mp4 每个应用需要有一个唯一的AppID 要在指定的机器上的server. ...
随机推荐
- java中内部类中还有内部类请给实例!
2.当内部类中还有一个内部类,下面给出了一个实例.[新手可忽略不影响继续学习](以下多出代码, 用蓝色标记)例2.2:class ShellMark_to_win { int shell_x = ...
- java中hashCode和equals什么关系,hashCode到底怎么用的
Object类的hashCode的用法:(新手一定要忽略本节,否则会很惨) 马 克-to-win:hashCode方法主要是Sun编写的一些数据结构比如Hashtable的hash算法中用到.因为ha ...
- FastAPI(六十六)实战开发《在线课程学习系统》接口开发--用户注册接口开发
在前面我们分析了接口的设计,那么我们现在做接口的开发. 我们先去设计下pydantic用户参数的校验 from pydantic import BaseModel from typing import ...
- mysql-cluster-gpl-7.5.10-linux-glibc2.12-x86_64.tar.gz (有必要解释一下)
大部分软件我们接触的时候会发现,起的名称有点怪异,所以我觉得有必要解释一下. 比如: mysql-cluster-gpl-7.5.10-linux-glibc2.12-x86_64.tar.gz 名称 ...
- centos下 Docker-修改磁盘存储目录(实操)
预备知识: Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金 ...
- FastDFS分布式的文件系统从小白入门到企业实践打怪之路系列笔记 【运维实践】
描述: FastDFS 是阿里的余庆大佬用 C 语言编写的一款开源的分布式文件系统(个人项目),它对文件进行管理.功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,适合中小文件(4KB ...
- NodeJS学习日报day4——模块化
// console.log(module); // 执行顺序不同,结果也不同 // module.exports = { // name : 'Cra2iTeT', // hi() { // con ...
- Java学习day28
为什么要只用Lambda表达式:1.可以避免匿名内部类定义过多.2.可以让代码变简洁.3.去掉无意义代码,保留核心逻辑 函数式接口(Functional Interface)定义:1.任何接口,如果只 ...
- php第一次实验个人博客网站的设计编写①
先上效果图: 网页代码:index.html <!DOCTYPE html> <html lang="en"> <head> <m ...
- 甲骨文严查Java授权,换openJDK要避坑
背景 外媒The Register报道,甲骨文稽查企业用户,近期开始将把过去看管较松散的Java授权加入. 甲骨文针对标准版Java(Java SE)有2种商业授权.2019年4月甲骨文宣布Java ...