Groa.js - Koa 式的 gRPC 開發框架!
发布于 7 年前 作者 cfsghost 7234 次浏览 来自 分享

groa.png

Groa.js - Koa 式的 gRPC 开发框架

分享一个小弟自己新开发的 Koa 式 gRPC 开发框架!Groa 是一个仿 Koa API 架构的开源框架,支援 Middleware、async/await 等机制。让有 Koa 经验的 Node.js 开发者可以无痛开发 gRPC 的应用,建構自己的 gRPC server,无需再使用官方相当原始难用的 gRPC SDK。

项目才刚开始,源码在 Github 上,麻烦各位多多支持和意见反馈。如果觉得有兴趣,務必加入项目一起开发维护。:-)

项目地址:https://github.com/GroaJS/groa

gRPC 是什么?优点为何?

gRPC 是一个由 Google 推出的高效的开源网路传输架构,基於 HTTP/2 协议,可以实现双向串流和 RPC(Remote Procedure Call),也就是在同一个连线之下,可进行多次的远端调用,并同时可以支援资料串流推送的机制。相较於过去基於 HTTP/1.1 的 Restful API 设计,使用 gRPC 可以不需要每次调用一个远端 API,便重新连线一次,以及若使用到推送、串流等机制,无需再引入 WebSocket 或其他 Socket 解决方案。一些知名企业如 Netflix、Cisco 等公司,也都开始引入了 gRPC 作为网路传输的解决方案之一。

此外,由于 gRPC 建构於 Google Protocol Buffer 开源专案之上,可以将 JSON 等结构性信息,序列化为可串流的二进位格式,使得资料传输的效率提高,信息包处理效率提高,无论是对 Server 还是 Client 都可以得到效能上的提升。对于行动装置应用来说,使用 gRPC 替换 Restful API,会更为省电、节省频宽,也能直接支援即时串流技术,无需使用 polling、long-polling 或搭配其他 socket 类型解决方案。

现在越来越多世界级的企业和项目,开始引入高效的 gRPC 作为实现系统间交互沟通的信息传输方式,开始以 gRPC 作为提供系统间 API 的形式,试图提高系统架构稳定性及效能。

有多少语言或系统支援 gRPC?

目前官方和非官方统计,有超过 11 种主流语言支援 gRPC 或拥有 SDK、Library 可使用,如:C++、C#、Java、Objective-C、Swift、Python 和 Node.js 等,几乎大多数主流系统环境都可以轻易引入 gRPC。

13 回复

		// Getting iterator
		let middlewares = this.middleware[Symbol.iterator]();

曾经@fundon 菜神也曾这样用,在koa源码里,不过最终还是废弃了。其实一个koa-compose就够了,抛弃基础web功能略微显得不够明智,建议直接把koa嵌入进来

除了rpc服务定义外,还有配套设施,配置中心,服务发现,服务治理,网关集成等,也需要给出更好的方案,最好是开箱即用,加油,你已经迈出了第一步

@i5ting 感谢回复与支持!我也相当同意引入 koa 的现成设计,在这个实验项目的想法确定可行之后。:-)

目前正在想办法,试图支持 gRPC 中的 google.api.http 扩展(目前只有 golang 的 SDK 有支持这项设计),来自动生成每个方法对应到 HTTP/1.1 上的 Restful API,而这部分我是希望能直接引入 koa 的。不过这部分目前遭遇困难,由于官方 gRPC SDK 目前没有纯 JavaScript 的实作,其 HTTP/2 支持则是以原生模块的方式存在,所以若想做到 grpc 与 koa 共享 socket 仍需要有一些瓶颈要突破,或是得自己重新实作一个纯 JS 版本的 grpc 模块。

但这工程目前有些耗大,需要一些时间。

想法很好啊!

自己写游戏服务器也弄了一个框架,使用的是 koa 的 compose. 看了一下你的代码,有地方写的不错,功能上有个问题:不支持多个 service。

@cfsghost 看错了,

let services = this.services = Object.assign(this.services, proto.services);

这是支持的

另外我建议这种框架使用 typescript 进行开发,这样别人用的时候,很好用。

顶楼上, 建议基于Typescript开发。

稳定/高可用才是关键, Typescript才稳

不错,支持下

特意进来赞一下。 作者是台湾人?

@cfsghost 写个 protobuf 文件到 koa router 的转换器,就可以了。耍嘴皮子是这么耍的。 另外。grpc 的 npm 包有 protobuf 文件解析器实现。

@rekey 现在 JavaScript 圈内所有的 protobuf 文件解析器实现,基本都是采用 protobufjs。此外,koa 目前使用的是 HTTP/1,而 grpc 需要 HTTP/2,要让他们共存,依照 Node.js v8 自带的 HTTP2 状态(目前还处于实验阶段 API),还需要时间,也要重新帮 grpc 实现一个 pure javascript 版本。(因为目前 koa 可以透过一些方法,使用 Node.js v8 自带的 HTTP2)

如果是指 Restful API 的自动产生可以用 koa-router,的确现在的解决方案多是这样做的。不过其中的限制是,因为 HTTP/1 和 HTTP/2 的共存问题尚未解决,目前只能把 gRPC server 和 Restful API server 分开成独立的 port 来做,讓其各自不相干。:-)

回到顶部