gRPCity
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 支持。该库目前在生产环境支撑着上百个服务。
设计一览
内部数据流刻意做得很短:
.proto → this._packagePrefix → this._types:
init clients → get client → client proxy → rpc method call → do:
init server → instance → call proxy:
特性
- API:基于 HTTP/2 的 gRPC,schema 用 Protobuf 定义。
- Protobuf:只支持动态加载,无需 codegen 步骤。
- Client:一次配置随处调用,支持 multi-server。
- Server:三行启动,单进程支持多服务。
- Credentials:客户端和服务端均完整支持 TLS。
- 无路由:RPC 路径与方法天生绑定。
- Middleware:客户端和服务端都支持 Koa 风格的
(ctx, next)。 - Metadata:提供标准的发送与读取元数据的辅助函数。
- Reflection:内置 gRPC Server Reflection。
- Error:
GrpcClientError携带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.