配置中心相信大家都有听过,zookeeper、apollo等等都是配置中心的代表,但大部分都是JAVA系为主的,笔者主要开发语言使用的是Golang当然也有类似于ETCD这样的组件,但是并不方便管理也无法可视化,在无意之间发现了阿里爸爸开源了nacos这个服务发现+配置中心组件,也经过了一段时间的时候在这里分享给大家
附上:
喵了个咪的博客:w-blog.cn
Nacos官方Git地址:https://github.com/alibaba/nacos
Nacos官方文档地址:https://nacos.io/zh-cn/docs/
Go语言SDK地址:https://github.com/sunmi-OS/gocore/tree/master/nacos
> PS:当前官方最新版本为 V1.1.3,阿里云有提供配置中心服务ACM使用方式和Nacos相同,使用阿里云的前提下免运维是个不错的选择
一、Nacos介绍
Nacos是阿里云中间件团队开源的一个项目,基于阿里云内部提供的ACM配置管理服务进行独立,截止到现在github已经有8K以上的star了,虽然成熟度还不能和携程开源的apollo相提并论,比较也是在阿里云上提供服务的组件稳定性还是值得相信的,当然要使用介绍Nacos必须要介绍介绍配置中心这样一个思想了。
配置中心是个老生常谈的话题,从有软件编程开始配置管理都是工程中重要的一步,当然对与一个单体应用只需要单个配置文件或环境变量的方式来管理配置就好了所以不再本文的讨论范围内,配置中心主要解决服务化或微服务化下的配置管理中的如下问题:
- 有效的密码管理,开发不碰触密码配置,运维人员和架构团队统一管理避免泄露;
- 多项目下的配置绝对统一性,不会出现配置写错导致的BUG
- 对于配置的编辑、存储、分发、变更管理、历史版本管理、变更审计有完善的能力
- 配置分组和灰度发布
有好处当然也有坏处,相对于使用配置文件我们还需要解决如下问题:
- 配置中心异常情况下服务怎么保障可用(SDK提供Cache功能当中心服务不可用会使用上一次加载的缓存配置)
- 配置变更后的程序生效逻辑(SDK提供配置变动订阅逻辑可以订阅配置变动编写处理逻辑)
- 开发过程中的配置文件调试(需要框架进行设计)
- 对于部分语言来说(PHP)配置中心性能的问题(Nacos的吞吐量8C16G 15K并发)
> 对比下来还是可以总结出配置中心利大于弊的结论
二、Nacos部署
Nacos不止支持二进制部署也支持支持Docker和K8S部署,因为Nacos是有状态服务存储的数据需要依赖于Mysql而且集群的方式需要指定slave的IP所以使用K8S并不是很好的选择(K8S使用StatefulSet来运行有状态服务),笔者这里用Docker-Composer的方式来运行Nacos
Nacos官方Docker部署方式Git地址:https://github.com/nacos-group/nacos-docker
git clone https://github.com/nacos-group/nacos-docker.git
单机部署(内存模式):
docker-compose -f example/standalone-derby.yaml up
单机部署(Mysql模式):
docker-compose -f example/standalone-mysql.yaml up
集群部署:
docker-compose -f example/cluster-hostname.yaml up
访问:http://localhost:8848/nacos/ 就可以看到登录界面了
> PS:默认用户名和密码都是 nacos
阿里云ACM服务
当然自己部署Nacos还会面临很多挑战,比如:
- 集群搭建
- 稳定性
- Mysql数据库维护
- 配置安全保护(Nacos没有密码一说,但是ACM需要使用阿里云的密钥可以提高安全程度)
> PS:秉着能用服务就不自己搭建的原则笔者最终使用的是阿里云的ACM服务(当前ACM服务免费)
> PS:需要注意阿里云ACM和Nacos在SDK中的链接方式有不同
三、基础使用
Nacos有几个基础概念,我们只有先了解清楚之后才能更好的结合到业务场景:
- namespace 命名空间
- Group 配置分组
- DataID 具体的配置名称
一般我们使用namespace来区分不同的项目或环境,Group区分配置的差异系比如A业务获取的配置和B团队的有一些细微的差别可以通过Group来区分,最后使用DataId来区分具体的配置项
增加一个namespace
新增一个配置
支持很多种配置格式,也可以使用自定义的格式甚至直接存放代码都行
也有对应的JAVA系的示例代码
四、SDK和OpenApi使用配置
Nacos支持一下语言的SDK:
- Java
- go
- cpp
- python
- nodejs
> 大家可以在官方文档中查看具体的使用方式
上面已经配置好的配置我们可以使用OpenApi来访问它
curl "http://172.16.0.13:8848/nacos/v1/cs/configs?dataId=test_config&group=DEFAULT_GROUP&tenant=b58ea912-e564-4958-b21f-3098ad15daf9"
{
"name":"sunmi"
}
特别注意tenant就是需要输入namespace的名称,但是不是原名是如下的名称
差不多基本的使用就到这里了,Nacos的开源版本还能姐姐服务发现相关的问题这些就留给大家探索了,在配置方面已经能够解决大部分问题了,下期笔者会基于Go语言给出配置中心最佳实践,大家记得关注我哦。