Skip to Content
🎉 gRPCity 3.0 is released. Read more →
文档介绍

gRPCity

build-statusnpmlicense

gRPCity 是开箱即用的 Node.js gRPC 框架。它把 @grpc/grpc-js@grpc/proto-loader 封装在一套小而克制的 API 之下,让你用十几行代码就能起一个带类型的 gRPC 服务或客户端,把剩下的时间留给业务逻辑。

它能做什么

gRPCity 回答了 Node.js gRPC 项目都会遇到的三个问题:

  • 怎么把 .proto 文件加载一次,在整个进程里复用?
  • 怎么写一个 promise 友好、支持流式、读起来顺手的客户端?
  • 怎么写一个就是普通类、并且在你期望的位置有中间件的服务端?

框架把样板代码压扁,但并不藏起来。Loader、client、server 是三个共享状态的小接口,一次 loader.init() 就能驱动其他全部能力。

为什么会有它

gRPCity 来自我们在生产环境跑 Node.js 微服务的经验。流量增长之后,每多一层路由、每一处临时 helper 都会变成成本。我们想要一个库一次性、统一地把无聊的部分——promisify、中间件、反射、TLS、metadata——做对,让服务作者把精力放在业务逻辑上。

第一行代码写于 2019 年 10 月 28 日。Kamuel  贡献了最初的 proto load 与 client proxy。Chakhsu  持续推进,加入了 multi proto load、完整的 client proxy、server call proxy 和完整的 stream 支持。该库目前在生产环境支撑着上百个服务。

设计一览

内部数据流刻意做得很短:

.protothis._packagePrefixthis._typesgRPCity loader

init clientsget clientclient proxyrpc method calldogRPCity client

init serverinstancecall proxygRPCity server

特性

  • API:基于 HTTP/2 的 gRPC,schema 用 Protobuf 定义。
  • Protobuf:只支持动态加载,无需 codegen 步骤。
  • Client:一次配置随处调用,支持 multi-server。
  • Server:三行启动,单进程支持多服务。
  • Credentials:客户端和服务端均完整支持 TLS。
  • 无路由:RPC 路径与方法天生绑定。
  • Middleware:客户端和服务端都支持 Koa 风格的 (ctx, next)
  • Metadata:提供标准的发送与读取元数据的辅助函数。
  • Reflection:内置 gRPC Server Reflection。
  • ErrorGrpcClientError 携带 code / details / metadata,便于精确 catch
  • Promise 与 callback:默认异步 API,回调版本保留。
  • AbortSignal:任意 RPC 调用都可以传入 AbortSignal 进行取消。
  • Config@grpc/proto-loader@grpc/grpc-js 的所有 channel option 原样透传。
  • Validation:loader、client、server 选项均在运行时通过 zod  校验。
  • TypeScript:纯 TS 实现,类型齐全。

……还有更多等你发现。

License

Released under the MIT License.

Last updated on