Nestjs整合nacos作为配置中心

1,883 阅读3分钟

序言

最近老板参与到我们项目中来,一看大家都是把配置文件写在版本控制里,当时就疯了,一定要把文件从版本控制里拆分开,当时我提出可以把文件放在服务器的某个固定文件,部署的时候用docker挂载,老板认为这样还要上服务器修改文件,提出部署的时候一定要全自动化,一劳永逸,没办法,只能开动我的小脑筋了。

nacos作为配置中心早在2018年就开源供大家使用了,不过我在查资料的过程中发现大多数情况下都是在Java环境下配合SpringbootSpringCloud来使用,nestjs相关的使用文档并不很多,找来找去只找到一篇,所以有了写这篇文章的想法,算是在前人的基础上加上一些自己的理解,让大家更方便使用吧。

下载nacos

在使用之前,依照惯例,先下载对应的服务。

由于是要上线使用的,为了避免奇奇怪怪的问题,这里决定使用docker部署。

这里参考的是这篇文章,如果大家不喜欢的话,也可以找其他的参考,这个不重要。

安装过程非常简单,结束之后使用初始密码进入管理页面

image.png

点击创建配置,创建完成后可以看到下面多了一行配置文件,里面有两个关键参数:Data IdGroup,这两个参数如何使用后面会提到。

引入nacos

第一步还是下载依赖包

npm install nacos

创建一个管理类

import { NacosConfigClient } from "nacos";

export class NacosManager {
    private client: NacosConfigClient;
    private NAMESPACE = process.env.NODE_ENV ? process.env.NODE_ENV : 'dev';
    private SERVER_ADDR = `${process.env.NACOS_HOST}:${process.env.NACOS_PORT}`;
    constructor() {
        // if (this.SERVER_ADDR) {
        this.getClient();
        // }
    }

    private async getClient() {
        this.client = new NacosConfigClient({
            // serverAddr: this.SERVER_ADDR,
            // namespace: this.NAMESPACE,
            serverAddr: `你的nacos ip端口`,
            namespace: `详见下文`,
            requestTimeout: 6000
        });
    }

    async getAllConfig() {
        const config = await this.client.getConfig("上文中提到的dataId", "上文中提到的group");
        return JSON.parse(config);
    }
}

上面提到一个namespace,进入nacos的管理页面,选择命名空间,里面命名空间的名字填写在这个字段

image.png

或者更直观的,配置管理的这个位置也可以看到

image.png

封装一个setupConfig方法

import { ConfigModule } from '@nestjs/config';
import { NacosConfig } from './config.interface';
import { NacosManager } from './nacos.manager';

// 封装 setupConfig 方法,configModule 的配置将在此处完成
export const setupConfig = () => {
    return ConfigModule.forRoot({
        load: [async () => setupNacosConfig()],
        isGlobal: true,
        cache: true
    })
};

export const setupNacosConfig = async (): Promise<NacosConfig> => {
    const configManager = new NacosManager()
    const nacosConfigs: NacosConfig = await configManager.getAllConfig();
    console.log(nacosConfigs, "配置内容");
    return nacosConfigs;
}

其中NacosConfig这个类是你自己定义的配置文件的结构类,和nacos的配置信息一一对应,这里就不做示范了。

将定义好的setupConfig方法放进AppModule

image.png

然后就可以在service里使用了

@Injectable()
export class TestService {
  constructor(private configService: ConfigService) {}

  get test(): boolean {
    return this.configService.get('test');
  }
}

但是这里有个小小的疑问,我在获取nacos配置的时候好像没进行账号登录之类的操作,也没有写入用户名密码,nacos是怎么判断是否允许获取配置信息的呢?