Egg.js 是什么?

Egg.js (下面简称 Egg)是阿里开源的企业级的 Node.js Web 框架,在 Github 上已经超过 1 万个 Star,是目前国内 Node.js 社区最主流的框架。

Egg.js 的设计哲学

  • 约定优于配置:Egg 约定了统一的加载机制、生命周期以及扩展方式,这样可以最大程度降低开发人员的学习成本,开发人员不再是「钉子」,可以流动起来

  • 插件机制:Egg 本身是非常轻量的,它的能力更多依赖于其插件生态(目前 Egg 官方 group 下已经有超过 100 个插件)

  • 框架的框架:提供基于 Egg 定制上层框架的能力。每个公司可以根据其实际情况将 Egg 和一系列插件组合起来定制出符合其业务的框架,这也是我们取名为 Egg 的重要原因

Egg.js 对于 Dubbo 的支持

简单来说,用户只需要开启 egg-dubbo-rpc 这个插件,就可以实现 Dubbo 服务的发布和调用。 再详细一点,其中和 Dubbo 有关的模块有下面这些:

  • egg-rpc - 所有 RPC 插件的「父类」,提供了 consumer、provider、registry、test 等模块的抽象。我们希望通过这种抽象,使得在 Egg 生态中各种 RPC 的体验是一致,或者换句话说对于使用者来说甚至感知不到 RPC 的存在

  • egg-dubbo-rpc - 对 egg-rpc 做的 dubbo 定制化,包括协议、内置 dubbo zk registry 实现等

  • egg-rpc-generator - 这是一个配套的 RPC 工具,它的作用是根据不同的接口描述文件(pb、jar 包)生成 metadata 并进而生成调用的 proxy 代码,通过这个工具我们可以让使用者可以像调用本地方法一样调用 RPC

  • jar2proxy - dubbo 默认的序列化方式是 hessian,它是一种 java 友好的方式(因为接口定义就是一个 jar 包)但是对于多语言来说就比较棘手。jar2proxy 的作用就是从 jar 包导出接口的元数据,然后生成调用代码。(它已经被集成到 egg-rpc-generator 内部,这样用户只需要知道一个工具即可)

  • dubbo-remoting - 这个是我们对 dubbo 协议的实现,它被默认集成到 egg-dubbo-rpc 插件内部。关于协议这块也是可插拔的,我们采用了标准的 stream 接口,便于大家进行扩展

Egg.js + Dubbo - 图1
模块关系图

如何贡献 Dubbo 社区

因为 Egg 本身是开放的,我们希望支持所有主流的 RPC,当然也包含 Dubbo。所以上面列出来的几个模块,只有 dubbo-remoting 和 egg-dubbo-rpc 是和 dubbo 强绑定的,其余的都是对所有 RPC 通用的。

关于是否要将其中一些模块移到 dubbo group 下,我也想征求大家的意见。而我这边的期望是:Dubbo 社区能够接纳我们作为 Dubbo Node.js 的官方实现之一,另外一个是 dubbo2.js,它也很好,但是我们目前在定位上面还是有些差别,我们也很期待和 dubbo2.js 的作者进一步的沟通、合作,共同促进 Dubbo Node.js 生态的发展。