前置说明
本文是 为了完善 和修复原来的一些坑而来的,Nest这个系列,会一直更新下去不会让各位掘友失望,也不会烂尾;这期我们来完善一下项目结构,让这个东西更贴近生产标准,还有就是 回答一下 评论区的一些问题
本文是 为了完善 和修复原来的一些坑而来的,Nest这个系列,会一直更新下去不会让各位掘友失望,也不会烂尾;这期我们来完善一下项目结构,让这个东西更贴近生产标准,还有就是 回答一下 评论区的一些问题
Github 地址 branch=higth
本次仓库更新一览
- 聚合一些业务无关的通用模块
- 替换掉原来的redis (之前的redis 是一个不时尚的写法)
- 加入 zk 简化启动和代码中写死的配置
- 回答 issues 和 掘友的一些问题
聚合 一些通用的模块
我们把一些 通用的模块,与业务无关的模块给聚合起来 到core中,方便以后的复用逻辑
@Module({
imports: [
CoreModule,
//下面的应该仅包含业务模块 不包含 通用模块,通用模块聚合 在core中
UserModule,
TagModule,
ArticleModule,
],
providers: [
{
provide: APP_GUARD,
useClass: MyAuthGuard,
},
],
})
export class AppModule {}
突然之间,整个项目都变得简单了起来
ZK
zk是什么,它是一个分布式的管理工具 Zookeeper: 是一个分布式的、开源的程序协调服务,是 hadoop 项目下的一个子项目。他提供的主要功 能包括:配置管理、名字服务、分布式锁、集群管理。我们这暂时用到了它 来做我们的config 配置中心,后续我们的服务发现 名字服务等,都将由它来处理,请关注后续的内容
关于ZK的实现,请看代码具体的例子,整个核心就是Nest的 动态模块 的动态注入! 相关的文章,我前文有分享,请自己查看, 下面放一些核心代码, NEST中非常重要的东西之一 就是 动态模块 DynamicModule!
管理zk上的配置,我这里用了一个软件来管理它
// 设计一个全局的modle 然后别的地方再饮用 里面的service 的时候就不需要在自己的module 去导入了
// 官方文档有写
// 由于 node-zk 是异步 所以我也使用 异步 模块来实现
@Global()
@Module({
providers: [
ZKService,
{
provide: ZOOKEEPER_CLIENT,
useFactory: async (optionsProvider: ConfigService) => {
const zookeeperClient = await getZKClient({
url: optionsProvider.get(EnumInterInitConfigKey.zkHost),
});
return zookeeperClient;
},
inject: [ConfigService],
},
],
exports: [ZKService],
})
//.....
const getClient = async (options: any) => {
const {url, ...opt} = options;
const client = zookeeper.createClient(url, opt);
client.once('connected', () => {
Logger.log('zk connected success...');
});
client.on('state', (state: string) => {
const sessionId = client.getSessionId().toString('hex');
});
client.connect();
return client;
};
// 这样写的话,用的时候直接丢就好啦
@Global()
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
expandVariables: true,
load: [configuration],
}),
FaqModule,
ZKModule.forRootAsync(),
],
exports: [FaqModule],
})
export class CoreModule {}
// 只需要在用的地方 直接用ZkServic 就ok ,但是这样不够优雅,于是进化成啦