Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proposal: auto-generate the code and documentation based on the proto files #763

Closed
20 of 29 tasks
seeflood opened this issue Aug 15, 2022 · 2 comments · Fixed by #774 or #779
Closed
20 of 29 tasks

proposal: auto-generate the code and documentation based on the proto files #763

seeflood opened this issue Aug 15, 2022 · 2 comments · Fixed by #774 or #779

Comments

@seeflood
Copy link
Member

seeflood commented Aug 15, 2022

当前的瓶颈、痛点
API 需求多了、组件需求多了后,人不够,需求支持的慢

举例:

  • OSS API
    feat: implement oss interface #556
    5.11 提,7月25合并,不断完善周边建设中,java sdk 没空写
  • Notify API
    目前只写了几个 proto,没时间开发
  • KMS API
    用户新需求

分析

需求响应时间= API 设计讨论时间  
		+ [	API 数 * API 方法数 (比如 OSS API 有 20+个方法) * (API 开发人时 + 写集成测试用例 + 手动联调时间)
				 + 组件数 * (组件开发人时 + 写组件测试用例 + 手动测试时间)
			] / 人数
		+ PR Review 时间

分析上述公式,我们就能意识到,现在的设计不 scale:
我们希望支持更多 API(API 数↑)、支持并集 API (API 方法数↑)、集成不同云服务(组件数↑),但是人没有变多。
以 notify API 为例:有 4个 API, 每个 API 有2个方法,每个 API 要对接 3个服务(阿里云/ aws/私有云服务)。

所以,本提案的设计目标是研发提效,即使需求变多、人没变多时,依然能快速响应需求

High level design
实现一套工具链,减少工作量。
开发者写完 proto 文件后,敲一个 make proto命令,就能自动生成除了组件外的代码、文档,让开发者只需要花时间写组件

  1. 实现一个代码生成器,自动根据 proto 或 open api spec 生成代码,包括:

SDK 相关代码:

  • 多语言 sdk
    • go
    • java
    • js
  • sdk examples
    • go
    • java
  • 测试用例

API 插件相关代码:

  • layotto api 插件代码
  • 把 API 插件注册进 main
  • 字段转换器,把grpc 的 struct 转换成 component 依赖的 struct
  • 支持 grpc stream 相关代码

组件相关代码:

  • component interface
  • 自动根据 component interface 生成相关胶水层代码
    • registry.go
    • factory.go
    • types.go, 包含 component config 等
  • ApplicationContext 新增组件
  • 根据 examples 生成 mock component

layotto runtime 相关代码:

  • pkg/runtime/config.go
  • pkg/runtime/options.go
  • pkg/runtime/runtime.go
  • pkg/runtime/context_generated.go
  1. 实现一个文档生成器,自动根据 proto 或 open api spec 生成文档,包括:
  • 接口文档
  • 把生成的接口文档添加进文档站点的侧边栏
  • 双语 quickstart 文档
  • 把 quickstart 文档加进 CI 自动化测试
  • 把生成的 quickstart 文档添加进文档站点的侧边栏(包括中文和英文侧边栏)
  1. 自动生成的东西不需要 review。优化掉上述公式中的“PR Review 时间”

  2. 写组件时,不用写测试
    每类 API 公用同一份测试用例,每次写组件不需要写测试

  3. 写组件时,自动联调
    自动化可移植性测试,每次写组件不用手动联调,让 CI 自动联调

详细设计
SDK:

  • 放弃把 gRPC API 再包一层sdk,让用户直接用 proto 编译生成的客户端来调 Layotto
  • 如果用户嫌 gRPC 版本冲突,就生成 http 调用的代码
  • sdk 仓库维护一个脚本,自动下载、编译 proto 文件

文档:

  • 生成接口文档
  • 根据模板,生成 quickstart 文档

// TODO

@seeflood
Copy link
Member Author

seeflood commented Aug 31, 2022

进展:

todo:

  • corner case处理:单个 proto 文件有多个 service 时
    a. 拆成两个 proto
    b. 禁止 proto 这么搞,要求全塞到一个 service 里
    选择 b

  • 走一遍流程,测试

  • 代码生成器支持一次传多个 proto 文件

  • 代码生成器集成进 layotto make 脚本

  • 在 make 脚本里自动 install protoc 插件

  • 写个文档介绍 proto 编写规范、代码生成器用法

@seeflood seeflood linked a pull request Sep 7, 2022 that will close this issue
@seeflood seeflood reopened this Sep 7, 2022
@seeflood
Copy link
Member Author

seeflood commented Sep 7, 2022

Now the code generator has been merged.
Future works are recorded at:
https://github.com/seeflood/protoc-gen-p6/issues

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant