Open jnan806 opened 2 years ago
方案二:
模式:"SDK
引用proto文件
模式"
利用git
的git submodules
功能,在SDK中引入opensergo/opensergo-proto
项目,这样就可以直接引用proto
文件。
优点:
1). 集成比较简单,只需要在git
中添加submodules
即可
2). SDK
的目录结构比较清晰
缺点:
1). 需要在SDK
中时常更新proto子模块
,并且SDk
中每次更新完proto子模块
就需要重新生成 相关 gRpc
代码
2). git submodules
只能指定子模块的branch
不能指定tag
(这一点问题比较大)
方案三: (来自OpenSergo双周会
社区同学的提议)
模式:“SDK
引用proto文件
模式”
使用开源社区 https://github.com/bufbuild 的 https://github.com/bufbuild/buf 项目
关于 bufbild
我简单概括下大致功能与步骤:
主要是用于方便快速生成proto文件
不同语言的stub存根
bufbuild
软件
2). 编写proto文件
,并且发布到 bufbuild
的BSR
(类似NPM,Maven)bufbuild
软件
2). 编写bufbuild
执行所需的yml
配置文件
3). 执行bufbuild
相关命令,编译生成stub存根
优点(基于本社区考虑):
1). 拥有BSR
机制(类似NPM,Maven),能够处理proto文件
中对第三方proto
的依赖问题 (方案一
和方案二
均没有很好地解决第三方proto
依赖问题)
缺点(基于本社区考虑):
1). 对于本社区各个SDk的贡献者
而言,需要额外了解并且更够使用bufbuild
我的改进思路:
结合方案一,实现 “SDK
引用stub存根
模式”
思路:主要利用bufbuild
的依赖管理以及stub代码
生成功能。
具体实现:通过github 的 workflow
将proto
对应的stub
生成并输出到方案一
中提及的各语言stub模块
,而后将stub模块
发布到远程仓库中。
对于没有远程仓库的语言的SDK,则采用方案三
的“SDK
引用proto文件
模式”
也可以考虑做一个用于初始化opensergo application的CLi工具,比如:
opensergo init
或
opensergo new app1
这个初始化项目的过程中,下载proto文件到本地,存根还是在本地通过protoc生成
对于SDK而言,及时同步proto版本还是很有必要的,而且还可以根据需要对其进行扩展,保持SDK的适度可扩展性。
初步集成 buf/build
demo版本(集成buf.build,并且proto与stub分离版本), 相关项目如下:
proto文件
管理项目: jnan806/opensergo-proto 的 buf.build 分支proto
仓库:https://buf.build/opensergo (建议chrome浏览器,部分浏览器显示有bug)stub code
生成发布平台: jnan806/opensergo-grpc-stubstub code
应用项目:
opensergo-grpc-stub
中的opensergo-grpc-java
本地安装mvn install
detail refer to https://github.com/opensergo/opensergo-proto/issues/5
现在 OpenSergo 正在快速推进中, 越来越多的 proto 文件会加入到项目中。 因此需要考虑如何去组织 opensergo/opensergo-proto 项目,使能在异构语言
SDK
以及不同功能模块的中能便捷的引入 proto 文件进行开发。关于
SDK
如何引用proto
,我总结为两种模式:SDK
引用proto文件
,自己根据proto文件
生成stub存根
SDK
引用stub存根
,这些stub存根
已经提前生成好并且发布到依赖库中针对这个问题,有多种解决方案。
方案一:
模式:"
SDK
引用stub存根
模式"如图所示,
*.proto
文件移动至/grpc
目录下,作为grpc协议
的公用内容stub
(存根)模块,opensergo-java-sdk
的 基于grpc 协议
的 stub模块opensergo-go-sdk
的 基于grpc 协议
的 stub模块.github/workflows
目录下编写脚本,在提交或者某个时刻触发部署,各语言根据*.proto
文件生成对应的stub
代码,然后各自打成stub
依赖包,发布到中央仓库中opensergo-go
组织作为go仓库
,发布go
相关组件)sdk或模块
依赖对应的stub
进行开发对应的 sdk
进行开发如果新增其他通讯协议,可以按照这个结构继续扩展,以
xds
为例或者单独抽出独立的协议模块,以
xds
为例