多项目场景下如何统一管理Avro Schema?
Avro Schema跨项目统一管理可行方案
你最初设想的直接从公共依赖的Schema生成可用类的思路完全可行,也是业界使用Avro时的标准实践,以下是两种落地性最高的方案:
方案1:公共依赖预编译Avro类(最常用)
- 单独创建一个公共依赖模块,所有
.avsc文件统一存放在该模块的src/main/resources/schemas目录下,不需要在该模块中手动编写任何Avro对应的Java文件 - 在公共模块的构建配置中添加Avro官方编译插件,构建阶段自动读取
schemas目录下的Schema文件生成Java类,再和编译后的.class文件一起打入Jar包 - 所有需要使用这些Schema的业务项目,直接引入该公共Jar作为依赖即可调用对应的Avro类,无需在本地维护任何
.avsc文件,也不需要做额外的生成配置
Maven插件配置示例(公共模块)
<plugin> <groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>${avro.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>schema</goal> </goals> <configuration> <sourceDirectory>${project.basedir}/src/main/resources/schemas</sourceDirectory> <outputDirectory>${project.build.directory}/generated-sources/avro</outputDirectory> <!-- 可自定义生成配置,比如是否生成Builder、是否使用特定命名策略等 --> <createBuilder>true</createBuilder> </configuration> </execution> </executions> </plugin>
方案2:公共依赖仅托管Schema文件,业务端本地生成类
如果不同业务项目需要自定义Avro类的生成规则,可以选择该方案:
- 公共模块只存放
.avsc文件,打包时将整个schemas目录打进Jar包的资源路径下 - 业务项目引入公共依赖后,配置构建插件先从依赖Jar中提取所有
.avsc文件到本地构建缓存目录,再调用Avro插件生成本地需要的Java类,全程不需要在业务项目代码库中提交任何Schema文件
配套规范建议
- 所有Schema的更新只在公共模块提交,发版后其他业务项目仅需要升级公共依赖的版本即可完成Schema同步,彻底避免多副本维护的不一致问题
- 建议给Schema添加语义化版本号管理,不同版本的Schema可以在公共模块中共存,避免升级依赖时强制影响未做适配的业务逻辑
- 如果有跨语言使用同一份Schema的需求,可以把公共Schema托管为独立的代码仓库,不同语言的项目都通过构建脚本拉取对应版本的Schema文件使用
内容的提问来源于stack exchange,提问作者Omegaspard
相关产品推荐
相关产品推荐

