Skip to content
New issue

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

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

Already on GitHub? # to your account

[RFC] About how to import *.proto files in different SDK of openSergo | 关于如何在 SDK 项目中比较方便地引用 proto #3

Open
jnan806 opened this issue Sep 8, 2022 · 5 comments
Labels
kind/discussion For further discussion kind/enhancement Category issues or prs related to enhancement.

Comments

@jnan806
Copy link

jnan806 commented Sep 8, 2022

现在 OpenSergo 正在快速推进中, 越来越多的 proto 文件会加入到项目中。
因此需要考虑如何去组织 opensergo/opensergo-proto 项目,使能在异构语言 SDK 以及不同功能模块的中能便捷的引入 proto 文件进行开发。

关于 SDK如何引用proto,我总结为两种模式:

  • SDK引用proto文件,自己根据proto文件生成stub存根
  • SDK引用stub存根,这些stub存根已经提前生成好并且发布到依赖库中

针对这个问题,有多种解决方案。

方案一:

模式:"SDK引用stub存根模式"

image

如图所示,

  • *.proto文件移动至 /grpc目录下,作为grpc协议的公用内容
  • 添加各语言的stub(存根)模块,
    - grpc-java : 提供给opensergo-java-sdk 的 基于 grpc 协议的 stub模块
    - grpc-golang : 提供给opensergo-go-sdk 的 基于 grpc 协议的 stub模块
    - grpc-[其他语言]
  • .github/workflows目录下编写脚本,在提交或者某个时刻触发部署,各语言根据 *.proto文件生成对应的stub代码,然后各自打成 stub依赖包,发布到中央仓库中
    - java 打成 jar 包,发布到 maven 仓库
    - golang 打成 mod 组件,发布到 github (建议单独创建opensergo-go组织作为go仓库,发布go相关组件)
  • 各语言sdk或模块依赖对应的 stub进行开发
  • 各生态组件依赖对应的 sdk进行开发

如果新增其他通讯协议,可以按照这个结构继续扩展,以xds为例

opensergo-proto
    | -- gpc
    | -- grpc-java
    | -- grpc-golang
    | -- grpc-[其他语言]
    | -- xds
    | -- xds-java
    | -- xds-golang
    | -- xds-[其他语言]

或者单独抽出独立的协议模块,以xds为例

opensergo-proto  (建议改成 opensergo-protocol-grpc)
    | -- grpc
    | -- grpc-java
    | -- grpc-golang
    | -- grpc-[其他语言]
opensergo-protocol-xds
    | -- xds
    | -- xds-java
    | -- xds-golang
    | -- xds-[其他语言]
@jnan806
Copy link
Author

jnan806 commented Sep 15, 2022

方案二:

模式:"SDK引用proto文件模式"

利用gitgit submodules功能,在SDK中引入opensergo/opensergo-proto项目,这样就可以直接引用proto文件。

优点:
1). 集成比较简单,只需要在git中添加submodules即可
2). SDK的目录结构比较清晰

缺点:
1). 需要在SDK中时常更新proto子模块,并且SDk中每次更新完proto子模块就需要重新生成 相关 gRpc代码
2). git submodules只能指定子模块的branch不能指定tag (这一点问题比较大)

@jnan806
Copy link
Author

jnan806 commented Sep 15, 2022

方案三: (来自OpenSergo双周会社区同学的提议)

模式:“SDK引用proto文件模式”

使用开源社区 https://github.com/bufbuildhttps://github.com/bufbuild/buf 项目

关于 bufbild我简单概括下大致功能与步骤:

主要是用于方便快速生成proto文件不同语言的stub存根

  • 本项目:
    1). 安装bufbuild软件
    2). 编写proto文件,并且发布到 bufbuildBSR(类似NPM,Maven)
  • SDk开发环境:
    1). 安装bufbuild软件
    2). 编写bufbuild执行所需的yml配置文件
    3). 执行bufbuild相关命令,编译生成stub存根

优点(基于本社区考虑):
1). 拥有BSR机制(类似NPM,Maven),能够处理proto文件中对第三方proto的依赖问题 (方案一方案二均没有很好地解决第三方proto依赖问题)

缺点(基于本社区考虑):
1). 对于本社区各个SDk的贡献者而言,需要额外了解并且更够使用bufbuild


我的改进思路:
结合方案一,实现 “SDK引用stub存根模式”

思路:主要利用bufbuild的依赖管理以及stub代码生成功能。

具体实现:通过github 的 workflowproto对应的stub生成并输出到方案一中提及的各语言stub模块,而后将stub模块发布到远程仓库中。
对于没有远程仓库的语言的SDK,则采用方案三的“SDK引用proto文件模式”

@iamharvey
Copy link

iamharvey commented Sep 16, 2022

也可以考虑做一个用于初始化opensergo application的CLi工具,比如:

opensergo init 

opensergo new app1

这个初始化项目的过程中,下载proto文件到本地,存根还是在本地通过protoc生成

对于SDK而言,及时同步proto版本还是很有必要的,而且还可以根据需要对其进行扩展,保持SDK的适度可扩展性。

@jnan806
Copy link
Author

jnan806 commented Sep 19, 2022

初步集成 buf/builddemo版本(集成buf.build,并且proto与stub分离版本), 相关项目如下:

@jnan806
Copy link
Author

jnan806 commented Sep 26, 2022

detail refer to #5

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
kind/discussion For further discussion kind/enhancement Category issues or prs related to enhancement.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants