前言
最近在做node.js相关的服务端开发,由于线上的日志级别是ERROR,有时候debug不是特别方便,比如需要看一些sql的输出,如果一直开启日志的输出,量又比较大,而且会有一些无关紧要的日志输出,影响查看,又苦于没有日志中心可以分析(穷,买不起,XD)。
于是就想着能不能搞个开关,想开的时候开,想关的时候关,就想起了配置中心这玩意儿,对比了一下已有的配置中心,做得比较好的有Apollo、Nacos,Apollo开源比较早,Nacos稍晚一些,简单对比了UI,感觉还是Nacos的符合我的审美,而且Apollo的node SDK已经很久没有维护了,放弃。
选定了就开始搞
Nacos部署
学习一门新的技能或者新的框架首先要做的就是阅读官方文档👉Nacos。简单来说就是nacos是一个管理、配置、发现微服务的平台,支持对微服务进行健康监测、动态配置。
nacos的部署分为单机部署和集群部署,由于没有那么多服务器本次就只能单机部署
单机部署可以下载源代码构建部署也可以用docker部署,为了方便,这里选了docker部署。
下载
docker部署文件是社区做的,需要clone对应的库
1 2
| git clone https://github.com/nacos-group/nacos-docker.git cd nacos-docker
|
部署
这里用的是docker compose,compose脚本在example文件夹下:

数据库可选mysql5.7和mysql8.0,这里选的mysql8.0,直接docker compose
1
| docker-compose -f example/standalone-mysql-8.yaml up
|
喝杯茶等待镜像拉取,容器跑起来。容器跑起来后,本以为可以开始用了,没想到服务器直接卡死了:(。
原来nacos推荐配置是2C4G60GB,现在用的服务器是1C2G,这个小鸡自然是承受不了了,直接换了一台配置好点的就好了。
开始使用
部署好后访问http://127.0.0.1:8848/nacos/就可以进入后台登录页面

初始登录账号密码都是nacos,登录后记得改密码。
集成
Nacos服务器部署好之后就可以开始集成到node应用里了,先安装对应的sdk
1 2 3
| npm i nacos --save
yarn add nacos
|
服务发现
新建一个文件nacos.js,先来写服务发现部分:
1 2 3 4 5
| const nacosServer = { host: 'xxx.xxx.xxx.xxx', port: 8848, namespace: 'xxxxxxxxxxx', }
|
namespace需要在nacos后台获取或者新建

注意,代码中的namespace是图中的命名空间ID,不是命名空间名称,不然连接不上,我这里就犯了这个错误,搞了好久才发现
封装成函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| const NacosNamingClient = require('nacos').NacosNamingClient; const log4js = require('log4js'); const logger = log4js.getLogger('info'); logger.level = 'debug';
const service = { name:'xxx', ip:'xxx.xxx.xxx.xxx', port:1234, }
async function serviceDiscover() { const client = new NacosNamingClient({ logger, serverList: `${nacosServer.host}:${nacosServer.port}`, namespace: nacosServer.namespace, }); await client.ready();
try { await client.registerInstance(service.name, { ip: service.ip, port: service.port, }); } catch (e) { console.log('注册服务失败', e); }
client.subscribe(service.name, hosts => { console.log('[服务订阅] ', hosts); }); }
|
上面的log可以使用console,但是会有频繁的日志输出,也可能是我没有找到怎么关,所以这里使用了log4js作为日志库,可以重定向到日志文件
配置监听
上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| const NacosConfigClient = require('nacos').NacosConfigClient;
let cfg = { foo: '', bar:'' }
const _config = { logon: { dataId: 'foo', group: 'DEFAULT_GROUP', listener: function (content) { console.log('[NACOS] 配置修改: ' + content, 'type: ' + typeof content); cfg.foo = content; } }, para: { dataId: 'bar', group: 'DEFAULT_GROUP', listener: function (content) { console.log('[NACOS] 配置修改: ' + content, 'type: ' + typeof content); cfg.bar = content; } } }
async function configSubscribe() { configClient = new NacosConfigClient({ serverAddr: `${nacosServer.host}:${nacosServer.port}`, namespace: nacosServer.namespace, });
for (const key in _config) { const conf = _config[key]; configClient.subscribe({dataId:conf.dataId,group:conf.group}, conf.listener); } }
|
在nacos中心配置dataId

最后,运行上面两个函数以及导出我们的配置
1 2 3 4 5 6 7 8
| (async () => { await serviceDiscover(); await configSubscribe(); })()
module.exports = { cfg }
|
运行结果:

修改一下配置试试:

完美!
后面就可以愉快的使用了:)