gradle不⽀持多级⼦模块_Gradle⼦项⽬划分与微服务的代码
结构
last modified by coder4
, 2019/08/30 18:34:26
Gradle⼦项⽬划分与微服务的代码结构
Gradle简介
如前序章节微服务技术栈概览所述,本书选⽤Java作为开发语⾔、Gradle作为构建⼯具。
springboot结构与Maven相⽐,Gradle具有如下优势:
灵活性:Gradle内置了脚本⽀持,可以实现更强⼤、更灵活的构建功能。
⾼性能:Gradle⽀持并⾏编译、多级缓存,最⾼可节省90%的编译时间
易于维护:与xml相⽐,Gradle的依赖描述语⾔更简洁,更易于维护。
⽆缝兼容:Gradle⽆缝兼容Maven,已有的系统也可以轻松地迁移过来。
微服务架构下Gradle的⼦项⽬划分
在微服务的⾃动发现与负载均衡⼀章中,我们已经构建了⼀个微服务项⽬"lmsia-abc",让我们来看⼀下它的⽬录结构。为了清晰起见,只展⽰⼀层⽬录结构:
.
├── adle
├── gradle
│ └── wrapper
├── gradlew
├── gradlew.bat
├── lmsia-abc-client
│ ├── build
│ ├── adle
│ ├── out
│ └── src
├── lmsia-abc-common
│ ├── build
│ ├── adle
│ ├── out
│ └── src
├── lmsia-abc.iml
├── lmsia-abc-job
│ ├── build
│ ├── adle
│ ├── out
│ └── src
├── lmsia-abc-server
│ ├── build
│ ├── adle
│ ├── out
│ └── src
├── adle
└── tool
├── compileThrift.sh
└── shutdown.sh
我们来逐⼀进⾏讲解:
主项⽬级别Gradle配置⽂件: adle和adle,定义了⼦项⽬,以及⼦项⽬共⽤的依赖、仓库等,我们会在稍后展开讲解。
gradle最⼩化构建⼯具: gradle构建⼯具初始化后,会在项⽬中⽣成gradle、gradlew、gradlew.bat,这些是最⼩化的构建⼯具,⽅便项⽬移植后的构建。
lmsia-abc-common: 如前⽂所属,我们的项⽬采⽤Thrift RPC。我们将Thrift的dsl⽂件、⾃动⽣成的Java(客户端桩)代码放置在common⼦项⽬中。这样,如果有其他微服务需要依赖相关数据结构,只需要依赖'lmsia-abc-common'即可。
lmsia-abc-client: 在引⽤common包后,可以⾃⾏构造Thrift客户端,从⽽完成RPC调⽤。然⽽,这⼀过程较为繁琐。试想有⼀个提供⽤户信息的微服务,因为较为基础,有20个微服务依赖它,那么就需要20次书写重复的代码。"重复代码乃万恶之源",为了解决Thrift客户端重复⽣成的问题,我们创建了client⼦项⽬,负责⽣成Thrift客户端,并添加⾃动配置(如果没有接触过Spring Boot,可能会不理解⾃动配置,没有关系,我们很快就会作出解释)。
lmsia-abc-server: 微服务的核⼼,即提供"服务"。我们将Thrift、RPC服务的逻辑代码封装在server⼦项⽬中。
lmsia-abc-job: 在微服务业务的升级、演进过程中,可能会需要对数据作出修正。这些代码可能只需要执⾏⼀次,因此不需要放⼊server⼦项⽬提供服务,我们将他们放⼊job⼦项⽬中。
tool: ⼀些提升微服务开发的效率⼯具,我们将在开发效率脚本⼀节中进⾏介绍。
由于篇幅所限,我们不会对Thrift进⾏⼊门介绍,如果你⽆法理解上述Thrift的DSL、⾃动代码⽣成等内容,可以参考官⽅教程。
我们来看⼀下根路径下的adle
buildscript {
ext {
springBootVersion = '1.5.6.RELEASE'
}
repositories {
maven { url 'maven.aliyun/nexus/content/groups/public' }
maven { url 'jitpack.io' }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
sourceCompatibility = 1.8
targetCompatibility = 1.8
group = 'der4.lmsia'
version = '0.0.1'
repositories {
maven { url 'maven.aliyun/nexus/content/groups/public' }
maven { url 'jitpack.io' }
mavenLocal()
}
}
repositories {
maven { url 'maven.aliyun/nexus/content/groups/public' }
maven { url 'jitpack.io' }
}
我们来顺序解释上述⽂件:
buildscript: 定义了gradle⾃⾝所需要使⽤的资源,包含Spring Boot插件和maven的仓库地址。
subprojects: 定义了⼦项⽬(common, client, job, server)所需要使⽤的共⽤部分,Java、IDEA、Spring Boot插件、Javac版本、项⽬的group, version,以及仓库,这⾥的仓库是给⼦项⽬使⽤的,看似与buildscript的定义重复,但确实是必要的。
repositories: 定义主项需要的仓库地址,与上⾯类似,这⾥也是必须的,并不是冗余定义。
在adle中,定义了各个⼦项⽬的路径:
include 'lmsia-abc-common'
include 'lmsia-abc-client'
include 'lmsia-abc-job'
include 'lmsia-abc-server'
下⾯,我们来看⼀下⼦项⽬中的gradle⽂件,以'adle'为例:
dependencies {
compile project(':lmsia-abc-common')
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'com.github.liheyuan:lmsia-thrift-server:0.0.1'
compile 'com.github.liheyuan:lmsia-commons-http:0.0.1'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
由于我们将⼦项⽬共⽤的部分抽取到根⽬录的adle中,所以上述⼦项⽬的gradle⽂件就⼗分简单了。
上述⽂件表明:server⼦项⽬依赖common⼦项⽬,同时依赖了'spring-boot-starter-web'、'lmsia-thrift-server'、'lmsia-commons-http'两个项⽬,测试依赖'spring-boot-starter-test'。细⼼的读者可能已经发现,'spring-boot-starter-web'和'spring-boot-starter-test'并没有定义版本号。这就是我们在根⽂件中定义的'Spring Boot插件'所完成的⼯作之⼀。
common⼦项⽬的代码结构
我们来看⼀下common⼦项⽬的结构:
├── adle
└── src
└── main
├── java
│ └── com
│ └── coder4
│ └── lmsia
│ └── abc
│ ├── constant
│ │ └── LmsiaAbcConstant.java
│ └── thrift
│ └── LmsiaAbcThrift.java
└── thrift
└── lmsiaAbc.thrift
我们解释⼀下⽬录结构:
除了adle外,代码被放置在src/main/java下,这是gradle推荐的默认路径。
thrift的DSL⽂件放置在'src/main/thrift'下
编译好的Thrift桩⽂件在'src/main/java`下
client⼦项⽬的代码结构
接下来,我们看⼀下client⼦项⽬的⽬录结构:
├── adle
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── coder4
│ │ └── lmsia
│ │ └── abc
│ │ └── client
│ │ ├── configuration
│ │ │ └── LmsiaAbcClientConfiguration.java
│ │ ├── LmsiaAbcEasyClientBuilder.java
│ │ └── LmsiaK8ServiceClientBuilder.java
│ └── resources
│ └── META-INF
│ └── spring.factories
└── test
└── java
└── com
└── coder4
└── lmsia
└── abc
└── client
├── LmsiaAbcEasyClientTest.java
└── LmsiaAbcK8ServiceClientTest.java
⾃动配置: 代码包的LmsiaAbcClientConfiguration和资源包的spring.factories,⼀起实现了⾃动配置。当别的项⽬通过maven引⽤这个client包时,配置会⾃动⽣效,⽣成可注⼊的客户端实例。
Builder: ⽅便⼿动或⾃动配置的调⽤,⽤于⽣成客户端实例。
测试: 'src/test'⾥⾯内置了两个测试。
server⼦项⽬的代码结构
看⼀下server⼦项⽬的⽬录结构:
.
├── adle
└── src
├── main
│ ├── java
│ │ └── com
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论