背景
在业务系统中,多语言混合的工程架构是常态,服务之间使用 IDL (Interactive Data Language) 实现进行多语言的目标代码生成、数据的通讯是当前的主流方式。
在近些年的开发实践中,主要接触 Protobuf 和 Flatbuffers,Protobuf 使用更为广泛,这里以 Protobuf 为例,讲述下协议管理与跨语言目标代码生成的实践经验。
目标代码生成
C++ 代码
对于 C++ 代码,由于需要编译 Protobuf 源码,通常顺带编译二进制工具,故写了一个 Protobuf Generator 的工具类,来实现在应用协议库时进行即时编译的方式来生成 C++ 代码,并在编译程序时添加目标代码一起编译。
Kung Fu Panda Protocols 协议库 提供了完整的示例。
Protobuf Generator (C++) ,就不粘贴代码了,这里是使用的示例。
generate_protobuf_message(
SRCS
PB_SRCS
HEADERS
PB_HEADERS
OUTPUT
${PROJECT_BINARY_DIR}/gen/protobuf/cpp
IMPORT
${PROJECT_SOURCE_DIR}/
FILES
${PB_SOURCE_FILES})Go 语言代码
由于在 Golang 项目中通常会使用 gRPC,故需要使用 protoc-gen-go 和 protoc-gen-go-grpc 两个插件,这需要依赖 Go 环境。同样是在 CMake 工具文件中定义 generate_protobuf_message_go,用于生成 Go 目标语言代码。同时支持指定两个代码生成插件的安装,以及支持指定插件版本,以应对不同的 Go 版本。
为了更方便地生成 Go 代码,定义 Makefile。
gen-go:
@rm -rf "$(GEN_PATH)"
@cmake --preset=release -DGEN_GO=ON
@cp -r $(GEN_PATH)/* go/运行 make gen-go即可。
这个流程让实习生集成到了 Gitlab 的 CI/CD Pipline 中,合并协议即会触发目标代码生成,并打新的 tag。