1. 什么是配置中心
1.1 什么是配置
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。
配置主要有以下几个特点:
配置是独立于程序的只读变量
- 配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置
配置伴随应用的整个生命周期
- 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。
- 比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
配置可以有多种加载方式
- 常见的有程序内部 hard code,配置文件,环境变量,启动参数,基于数据库等
配置需要治理
- 同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理
1.2 什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
配置中心的服务流程如下:
1、用户在配置中心更新配置信息。
2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。
总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。
在系统架构中,配置中心是整个微服务基础架构体系中的一个组件,如下图,它的功能看上去并不起眼,无非就是配置的管理和存取,但它是整个微服务架构中不可或缺的一环。
总结一下,在传统巨型单体应用纷纷转向细粒度微服务架构的历史进程中,配置中心是微服务化不可缺少的一个系
统组件,在这种背景下中心化的配置服务即配置中心应运而生,一个合格的配置中心需要满足如下特性:
- 配置项容易读取和修改
- 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
- 支持对配置的修改的检视以把控风险
- 可以查看配置修改的历史记录
- 不同部署环境下应用配置的隔离性
2 Nacos 简介
2.1 主流配置中心对比
目前市面上用的比较多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf等。由于Disconf不再维护,下面主要对比一下Spring Cloud Config、Apollo和Nacos。
对比项目 | Spring Cloud Config | Apollo | Nacos |
配置实时推送 | 支持(Spring Cloud Bus) |
支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) |
版本管理 | 支持(Git) | 支持 | 支持 |
配置回滚 | 支持(Git) | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 不支持 |
权限管理 | 支持(依赖Git) | 支持 | 不支持 |
多集群 | 支持 | 支持 | 支持 |
多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 只支持Java | 主流语言,提供了Open API |
主流语言,提供了Open API |
配置格式校验 | 不支持 | 支持 | 支持 |
单机读(QPS) | 7(限流所致) | 9000 | 15000 |
单击写(QPS) | 5(限流所致) | 1100 | 1800 |
3节点读 (QPS) |
21(限流所致) | 27000 | 45000 |
3节点写 (QPS) |
5(限流所致) | 3300 | 5600 |
从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Config依赖Git场景不适合开放的大规模自动化运维API。功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud
Config不带运维管理界面,需要自行开发。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。
综合来看,Nacos的特点和优势还是比较明显的,下面我们一起进入Nacos的世界。
2.2 Nacos简介
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。
官方介绍是这样的:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
Nacos 是构建以“服务”为中心的现代应用架构的服务基础设施。
官网地址:https://nacos.io
2.3 Nacos特性
Nacos主要提供以下四大功能:
1. 服务发现与服务健康检查
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
2. 动态配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。
3. 动态DNS服务
Nacos提供基于DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
4. 服务和元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。这里动态配置管理的特性说明了Naocs的配置管理能力。
3 Nacos快速入门
3.1 安装Nacos Server
3.1.1 预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
2. 64 bit JDK 1.8+;
3. Maven 3.2.x+;
3.1.2 下载源码或者安装包
你可以通过源码和发行包两种方式来获取 Nacos。
从 Github 上下载源码方式
git clone https://github.com/alibaba/nacos.git cd nacos/ mvn ‐Prelease‐nacos clean install ‐U ls ‐al distribution/target/ // change the $version to your actual path cd distribution/target/nacos‐server‐$version/nacos/bin
下载编译后压缩包方式
您可以从 最新稳定版本 下载 nacos-server-$version.zip 包,本教程使用nacos-server-1.1.3版本。
下载地址:https://github.com/alibaba/nacos/releases
下载后解压
[root@iZ1la3d1xbmukrZ ~]# unzip nacos-server-1.1.3.zip Archive: nacos-server-1.1.3.zip creating: nacos/ creating: nacos/target/ creating: nacos/conf/ creating: nacos/bin/ inflating: nacos/LICENSE inflating: nacos/bin/startup.sh inflating: nacos/NOTICE inflating: nacos/conf/application.properties inflating: nacos/target/nacos-server.jar inflating: nacos/conf/schema.sql inflating: nacos/bin/startup.cmd inflating: nacos/conf/nacos-mysql.sql inflating: nacos/bin/shutdown.sh inflating: nacos/conf/application.properties.example inflating: nacos/bin/shutdown.cmd inflating: nacos/conf/nacos-logback.xml inflating: nacos/conf/cluster.conf.example
3.1.3 启动服务器
nacos的默认端口是8848,需要保证8848默认端口没有被其他进程占用。
进入安装程序的bin目录:
使用默认用户名:nacos,默认密码:nacos 登录即可打开主页面。
[root@iZ1la3d1xbmukrZ ~]# cd nacos [root@iZ1la3d1xbmukrZ nacos]# ll total 36 drwxr-xr-x 2 root root 4096 Aug 6 2019 bin drwxr-xr-x 2 root root 4096 Aug 1 2019 conf -rw-r--r-- 1 root root 17336 May 13 2019 LICENSE -rw-r--r-- 1 root root 1305 May 13 2019 NOTICE drwxr-xr-x 2 root root 4096 Aug 6 2019 target [root@iZ1la3d1xbmukrZ nacos]# cd bin [root@iZ1la3d1xbmukrZ bin]# ll total 20 -rwxr-xr-x 1 root root 954 May 13 2019 shutdown.cmd -rwxr-xr-x 1 root root 884 May 13 2019 shutdown.sh -rwxr-xr-x 1 root root 2716 Jun 12 2019 startup.cmd -rwxr-xr-x 1 root root 4801 Jul 30 2019 startup.sh [root@iZ1la3d1xbmukrZ bin]# sh startup.sh -m standalone /home/zookeeper/jdk1.8.0_131/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Djava.ext.dirs=/home/zookeeper/jdk1.8.0_131/jre/lib/ext:/home/zookeeper/jdk1.8.0_131/lib/ext:/root/nacos/plugins/cmdb:/root/nacos/plugins/mysql -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dnacos.home=/root/nacos -Dloader.path=/root/nacos/plugins/health -jar /root/nacos/target/nacos-server.jar --spring.config.location=classpath:/,classpath:/config/,file:./,file:./config/,file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 nacos is starting with standalone nacos is starting,you can check the /root/nacos/logs/start.out [root@iZ1la3d1xbmukrZ bin]# curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" true[root@iZ1la3d1xbmukrZ bin]# curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" [root@iZ1la3d1xbmukrZ bin]#
3.1.5.关闭服务器
[root@iZ1la3d1xbmukrZ bin]# sh shutdown.sh The nacosServer(11700) is running... Send shutdown request to nacosServer(11700) OK
3.1.6. 外部mysql数据库支持
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步骤:
1. 安装数据库,版本要求:5.6.5+ ,mysql 8 以下
2. 初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos-mysql.sq
3. 修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
3.3.2 nacos客户端获取配置
/** * @author WGR * @create 2020/4/23 -- 23:01 */ public class NacosTest { public static void main(String[] args) throws NacosException, InterruptedException { String serverAddr = "47.151.254.149:8848"; String dataId = "nacos-simple-demo.yaml"; String group = "DEFAULT_GROUP"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); System.out.println(content); configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { System.out.println("recieve:" + configInfo); } @Override public Executor getExecutor() { return null; } }); boolean isPublishOk = configService.publishConfig(dataId, group, "content"); System.out.println(isPublishOk); Thread.sleep(3000); content = configService.getConfig(dataId, group, 5000); System.out.println(content); boolean isRemoveOk = configService.removeConfig(dataId, group); System.out.println(isRemoveOk); Thread.sleep(3000); content = configService.getConfig(dataId, group, 5000); System.out.println(content); Thread.sleep(300000); } }