背景 最近打算实践一下Spring Cloud微服务,完整做一个系统。此次打算全部服务采用Gradle构建,微服务之间通信协议采用Protobuf,因此在系统架构上有2种方案
微服务自己定义message,需要对外提供api的进行单独打包并发布
所有message定义在独立的项目中打包并发布,所有微服务引用该jar包
实现 经过一番考虑后选择了第2种,使用这种方案在每个微服务中可以不需要单独定义对外发布模块,比较省事。 首先使用IDEA新建1个Gradle项目,然后编辑build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 plugins { id 'java-library' id "com.google.protobuf" version "0.8.18" id 'maven-publish' } apply plugin: 'java' apply plugin: 'com.google.protobuf' group 'com.zshnb.mall' version '0.0.1-SNAPSHOT' repositories { mavenCentral() } compileJava { sourceCompatibility(JavaVersion.VERSION_11.toString()) targetCompatibility(JavaVersion.VERSION_11.toString()) } dependencies { implementation 'com.google.protobuf:protobuf-java:3.19.3' implementation 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' } sourceSets { main { proto { } } } protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.0.0' } } publishing { publications { mavenJava(MavenPublication) { from components.java } } repositories { maven { def releasesRepoUrl = 'http://localhost:8000/repository/maven-releases/' def snapshotsRepoUrl = 'http://localhost:8000/repository/maven-snapshots/' url = version.endsWith('SNAPSHOT' ) ? snapshotsRepoUrl : releasesRepoUrl name 'nexus' url url allowInsecureProtocol true credentials { username 'admin' password 'admin' } } } } test { useJUnitPlatform() }
通过以上设置,运行./gradle clean build publish
后会自动把proto编译为class文件,构建成jar包后发布到自己的nexus私服中。经过此次项目搭建,发现还是官方文档靠谱 网上的文档要么版本太旧,要么有错误。
最后,附上此次搭建过程中参考文档
gradle maven publish plugin
gradle protobuf plugin
windows安装nexus