写在最前面:好久没更新文章了,这里给大家推荐一个我写的 Node.js 库,叫 gRPCity
。如果有关注我的 GitHub 的朋友,应该能看得出来,最近我一直在做完善这个库的事,算是花了比较多的心机在里面。现在这个库算是迭代得比较成熟了,可以放心地告知给大家,可以大胆地使用这个库用于生产了。同时也希望大家能给这个项目一个 star。
gRPCity
源码地址:https://github.com/chakhsu/grpcity
文档地址:https://grpcity.js.org/zh
什么是 gRPCity
?
gRPCity
是一个运行在 Node.js 的 gRPC 微服务库。其结合了 proto-loader
和 grpc-js
,简化了很多难以理解的技术概念和步骤,提供了容易理解和简洁的 API 去完成加载 proto 文件,同时也提供了完整和强大的客户端和服务端支持。当然,也有非常多高级的功能满足大多数开发场景。
它主要是解决了三个问题,怎么加载 proto 文件、客户端怎么更好地发起调用、服务端怎么更好的提供支持。在gRPCity
里,都给出了不错的答案,同时,在面对更复杂的业务场景下,gRPCity
也是有不错的支持。
名字来源于: gRPC + City = gRPCity,寄托了作者希望这个库能支撑了业务城市的建设,以技术底座的视角,让大家聚焦业务,更好地支撑交付。
运行流程
gRPCity
内在数据流通设计是非常清晰的,如下所示:
.proto
-> this._packagePrefix
-> this._types
:
init clients
-> get client
-> client proxy
-> rpc method call
-> do
:
init server
-> instance
-> call proxy
:
使用示例
安装
npm i grpcity
Proto
首先,创建greeter.proto
文件,编写下面的内容到其中:
syntax = "proto3";
package helloworld;
service Greeter {
rpc SayGreet(Message) returns (Message) {}
}
message Message {
string message = 1;
}
Loader
然后,创建loader.js
, 编写下面的代码到其中:
import { ProtoLoader } from 'grpcity'
import path from 'node:path'
export default new ProtoLoader({
location: path.join(__dirname, './'),
files: ['greeter.proto']
})
Server
其次,创建server.js
, 编写下面的代码到其中:
import loader from './loader.js'
class Greeter {
async sayGreet(ctx) {
const { message } = ctx.request
return {
message: `hello ${message || 'world'}`
}
}
}
const start = async (addr) => {
await loader.init()
const server = await loader.initServer()
server.add('helloworld.Greeter', new Greeter())
await server.listen(addr)
console.log('gRPC Server is started: ', addr)
}
start('127.0.0.1:9099')
Client
最后,创建client.js
, 编写下面的代码到其中:
import loader from './loader.js'
const start = async (addr) => {
await loader.init()
const clients = await loader.initClients({
services: {
'helloworld.Greeter': addr
}
})
const client = clients.get('helloworld.Greeter')
const result = await client.sayGreet({ message: 'greeter' })
console.log('sayGreet', result.response)
}
start('127.0.0.1:9099')
完成编程工作之后,就可以在终端里执行下面命令进行启动~
node ./server.js
node ./client.js
更多的用法,可以查看项目文档:https://grpcity.js.org/zh
特性
- API: 通信协议以 gRPC 为基础,通过 Protobuf 进行定义;
- Protobuf: 只支持动态 pb 加载,简化了 pb 文件的加载流程;
- Client: 一次配置,随时随处调用,支持 multi-server 的调用;
- Server: 简化了初始化流程,三步完成启动,支持 multi-server 的启动;
- Credentials: 客户端和服务端完整地支持了证书加载,提供了通信加密的能力;
- No-Route: 无路由,rpc 与 method 天生绑定;
- Middleware: 客户端和服务端都支持中间件机制;
- Metadata: 规范化了元信息的传递和获取;
- Reflection: 服务端内置 gRPC reflection API;
- Error: 提供了专有 Error 对象,保证异常捕捉后可以针对性处理;
- Promise: rpc 方法内部支持了 promisify,同时也保留了 callbackify ;
- Config: 与官方配置对齐,支持 pb load 配置和 gRPC channel 配置;
- Typescript: 纯 TS 实现,类型齐全。
我认为比较亮点的是客户端的中间件支持和服务端的 Reflection 支持。都可以在项目文档进行翻阅。
在这里,再次推荐一次 gRPCity
给大家,也欢迎大家多多访问文档:https://grpcity.js.org/zh
License
Released under the MIT License.
本文由 Chakhsu Lau 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
陈嘘壅:文章真不错https://www.sljrkg.com/article/69416.html
大佬牛啊
syntax = "proto3"; package helloworld; service Greeter { rpc SayGreet(Message) returns (Message) {} } message Message { string message = 1; }这样的proto文件在开发阶段会不会影响效率呢?适合小型团队吗
这只是个演示的 proto,对于项目来说,会有个正式点的 proto 管理目录,一样也是可以用的,适合小型团队。
流程图用什么画的呢,看着很好看
Excalidraw 这个。
好久没来了,大佬真是高产还高质量啊,实在是太佩服了
但是我还是 star了 因为用了你主题
说实话 ,我还是不知道这个是干嘛用的 用在什么地方 原谅我的弱智行为
主要是微服务这块,基于 gRPC 进行服务间的通信,性能比 json 快很多。