热搜:前端 nest neovim nvim

[一期 -结束] 这可能是你看过最全的 「Nest」

lxf2023-10-26 19:00:02

前置说明

本文是 为了完善 和修复原来的一些坑而来的,Nest这个系列,会一直更新下去不会让各位掘友失望,也不会烂尾;这期我们来完善一下项目结构,让这个东西更贴近生产标准,还有就是 回答一下 评论区的一些问题

Github 地址 branch=higth

本次仓库更新一览

  • 聚合一些业务无关的通用模块
  • 替换掉原来的redis (之前的redis 是一个不时尚的写法)
  • 加入 zk 简化启动和代码中写死的配置
  • 回答 issues 和 掘友的一些问题

聚合 一些通用的模块

我们把一些 通用的模块,与业务无关的模块给聚合起来 到core中,方便以后的复用逻辑

[一期 -结束] 这可能是你看过最全的 「Nest」


@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上的配置,我这里用了一个软件来管理它

[一期 -结束] 这可能是你看过最全的 「Nest」

// 设计一个全局的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 ,但是这样不够优雅,于是进化成啦