序言
最近老板参与到我们项目中来,一看大家都是把配置文件写在版本控制里,当时就疯了,一定要把文件从版本控制里拆分开,当时我提出可以把文件放在服务器的某个固定文件,部署的时候用docker挂载,老板认为这样还要上服务器修改文件,提出部署的时候一定要全自动化,一劳永逸,没办法,只能开动我的小脑筋了。
nacos作为配置中心早在2018年就开源供大家使用了,不过我在查资料的过程中发现大多数情况下都是在Java环境下配合Springboot和SpringCloud来使用,nestjs相关的使用文档并不很多,找来找去只找到一篇,所以有了写这篇文章的想法,算是在前人的基础上加上一些自己的理解,让大家更方便使用吧。
下载nacos
在使用之前,依照惯例,先下载对应的服务。
由于是要上线使用的,为了避免奇奇怪怪的问题,这里决定使用docker部署。
这里参考的是这篇文章,如果大家不喜欢的话,也可以找其他的参考,这个不重要。
安装过程非常简单,结束之后使用初始密码进入管理页面
点击创建配置,创建完成后可以看到下面多了一行配置文件,里面有两个关键参数:Data Id和Group,这两个参数如何使用后面会提到。
引入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的管理页面,选择命名空间,里面命名空间的名字填写在这个字段
或者更直观的,配置管理的这个位置也可以看到
封装一个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
然后就可以在service里使用了
@Injectable()
export class TestService {
constructor(private configService: ConfigService) {}
get test(): boolean {
return this.configService.get('test');
}
}
但是这里有个小小的疑问,我在获取nacos配置的时候好像没进行账号登录之类的操作,也没有写入用户名密码,nacos是怎么判断是否允许获取配置信息的呢?