抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

最近在做node.js相关的服务端开发,由于线上的日志级别是ERROR,有时候debug不是特别方便,比如需要看一些sql的输出,如果一直开启日志的输出,量又比较大,而且会有一些无关紧要的日志输出,影响查看,又苦于没有日志中心可以分析(穷,买不起,XD)。

于是就想着能不能搞个开关,想开的时候开,想关的时候关,就想起了配置中心这玩意儿,对比了一下已有的配置中心,做得比较好的有ApolloNacosApollo开源比较早,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
yarn add nacos

服务发现

新建一个文件nacos.js,先来写服务发现部分:

1
2
3
4
5
const nacosServer = {
host: 'xxx.xxx.xxx.xxx', // nacos服务器IP地址
port: 8848, // nacos服务器端口,默认8848
namespace: 'xxxxxxxxxxx',
}

namespace需要在nacos后台获取或者新建

Snipaste_2022-07-01_19-56-16.png

注意,代码中的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', // 当前服务所在IP
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', // dataId,需要预先在nacos中配置好
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,
});

// listen data changed
for (const key in _config) {
const conf = _config[key];
configClient.subscribe({dataId:conf.dataId,group:conf.group}, conf.listener);
}
}

在nacos中心配置dataId

Snipaste_2022-07-01_20-22-19.png

最后,运行上面两个函数以及导出我们的配置

1
2
3
4
5
6
7
8
(async () => {
await serviceDiscover();
await configSubscribe();
})()

module.exports = {
cfg
}

运行结果:

Snipaste_2022-07-01_20-17-52.png

修改一下配置试试:

Snipaste_2022-07-01_20-19-48.png

完美!

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

评论