gRPCity: 一个 Node.js 的 gRPC 微服务库
in Tutorial with 8 comments
gRPCity: 一个 Node.js 的 gRPC 微服务库
in Tutorial with 8 comments

写在最前面:好久没更新文章了,这里给大家推荐一个我写的 Node.js 库,叫 gRPCity。如果有关注我的 GitHub 的朋友,应该能看得出来,最近我一直在做完善这个库的事,算是花了比较多的心机在里面。现在这个库算是迭代得比较成熟了,可以放心地告知给大家,可以大胆地使用这个库用于生产了。同时也希望大家能给这个项目一个 star。

gRPCity

源码地址:https://github.com/chakhsu/grpcity
文档地址:https://grpcity.js.org/zh

什么是 gRPCity?

gRPCity 是一个运行在 Node.js 的 gRPC 微服务库。其结合了 proto-loadergrpc-js,简化了很多难以理解的技术概念和步骤,提供了容易理解和简洁的 API 去完成加载 proto 文件,同时也提供了完整和强大的客户端和服务端支持。当然,也有非常多高级的功能满足大多数开发场景。

它主要是解决了三个问题,怎么加载 proto 文件、客户端怎么更好地发起调用、服务端怎么更好的提供支持。在gRPCity里,都给出了不错的答案,同时,在面对更复杂的业务场景下,gRPCity 也是有不错的支持。

名字来源于: gRPC + City = gRPCity,寄托了作者希望这个库能支撑了业务城市的建设,以技术底座的视角,让大家聚焦业务,更好地支撑交付。

运行流程

gRPCity 内在数据流通设计是非常清晰的,如下所示:

.proto -> this._packagePrefix -> this._types:
grpcity-loader.svg

init clients -> get client -> client proxy -> rpc method call -> do:
grpcity-client.svg

init server -> instance -> call proxy:
grpcity-server.svg

使用示例

安装

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

特性

我认为比较亮点的是客户端的中间件支持和服务端的 Reflection 支持。都可以在项目文档进行翻阅。

在这里,再次推荐一次 gRPCity 给大家,也欢迎大家多多访问文档:https://grpcity.js.org/zh

License

Released under the MIT License.

Responses
  1. himozzie

    大佬牛啊

    syntax = "proto3"; package helloworld; service Greeter { rpc SayGreet(Message) returns (Message) {} } message Message { string message = 1; }

    这样的proto文件在开发阶段会不会影响效率呢?适合小型团队吗

    Reply
    1. @himozzie

      这只是个演示的 proto,对于项目来说,会有个正式点的 proto 管理目录,一样也是可以用的,适合小型团队。

      Reply
  2. 流程图用什么画的呢,看着很好看

    Reply
    1. @happen

      Excalidraw 这个。

      Reply
  3. 好久没来了,大佬真是高产还高质量啊,实在是太佩服了

    Reply
  4. 和和

    但是我还是 star了 因为用了你主题

    Reply
  5. 和和

    说实话 ,我还是不知道这个是干嘛用的 用在什么地方 原谅我的弱智行为

    Reply
    1. @和和

      主要是微服务这块,基于 gRPC 进行服务间的通信,性能比 json 快很多。

      Reply