NestJS 集成graphql grpc 分布式实践

图片描述

前言:

为了学习nestjs graphql grpc 微服务方面的知识,具体grpc和graphql的语法再以后在作详细分析git

1 建立项目

npm i -g @nestjs/cli
nest new project-name

2 添加graphql

建立graphql-config.service.ts文件,用于graphql的配置及编写过滤器的逻辑github

@Injectable()
export class GraphQLConfigService implements GqlOptionsFactory {
  constructor() {}

  createGqlOptions(): GqlModuleOptions {
    return {
      typePaths: [join(process.cwd(), "./graphqls/*.graphql")],  //  配置的graphql文件地址
      installSubscriptionHandlers: true,
      definitions: {
        path: join(process.cwd(), "src/graphql.schema.ts"),  // 解析以后的文件地址
        outputAs: "class"
      },
      context: async ({ req }) => { // 过滤器
        let user = Jwt.verifyToken(req.headers.authorization);
        // 业务逻辑
        return { user };
      }
    };
  }
}

添加进app.module.ts里npm

@Module({
  imports: [
    GraphQLModule.forRootAsync({
      imports: [ApplicationModule],
      useClass: GraphQLConfigService
    }),
  ],
})
export class ApplicationModule {}

建立文件xxx.resolvers.tsbootstrap

@Query('getUser')
  async getUser() {
    return {};
  }

3 添加grpc

首先,建立一个子项目xxxapi

子项目
建立grpc.options.ts文件,用于init链接的配置app

export const grpcClientOptions: ClientOptions = {
  transport: Transport.GRPC,
  options: {
    url: “localhost:50051”,  // 服务地址
    package: “xxx”,
    protoPath: join(__dirname, './xxx.proto'),
  },
};

建立接口, 注意这里的首字母会被自动装为大写async

@GrpcMethod("UserService")
  async addUser(data: User): Promise<any> {
    return data
  }

在main.ts引入微服务

import { grpcClientOptions } from './grpc.options';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.connectMicroservice(grpcClientOptions);
  await app.startAllMicroservicesAsync();
}
bootstrap();

其余微服务或是apigateway调用是建立一个学习

const grpcClientOptions: ClientOptions = {
  transport: Transport.GRPC,
  options: {
    url: grpcServe.user.url,
    package: grpcServe.user.package,
    protoPath: join(__dirname, '../../common/proto/user.proto'),
  },
};

@Injectable()
export class ClentServe {
  constructor() {}
  @Client(grpcClientOptions) public readonly client: ClientGrpc;
}

demo地址url

相关文章
相关标签/搜索