如前序章节微服务技术栈概览所述,本书选用Java作为开发语言、Gradle作为构建工具。
与Maven相比,Gradle具有如下优势:
在微服务的自动发现与负载均衡一章中,我们已经构建了一个微服务项目"lmsia-abc",让我们来看一下它的目录结构。为了清晰起见,只展示一层目录结构:
.
├── build.gradle
├── gradle
│ └── wrapper
├── gradlew
├── gradlew.bat
├── lmsia-abc-client
│ ├── build
│ ├── build.gradle
│ ├── out
│ └── src
├── lmsia-abc-common
│ ├── build
│ ├── build.gradle
│ ├── out
│ └── src
├── lmsia-abc.iml
├── lmsia-abc-job
│ ├── build
│ ├── build.gradle
│ ├── out
│ └── src
├── lmsia-abc-server
│ ├── build
│ ├── build.gradle
│ ├── out
│ └── src
├── settings.gradle
└── tool
├── compileThrift.sh
└── shutdown.sh
我们来逐一进行讲解:
由于篇幅所限,我们不会对Thrift进行入门介绍,如果你无法理解上述Thrift的DSL、自动代码生成等内容,可以参考官方教程。
我们来看一下根路径下的build.gradle
buildscript {
ext {
springBootVersion = '1.5.6.RELEASE'
}
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url 'https://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 = 'com.coder4.lmsia'
version = '0.0.1'
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url 'https://jitpack.io' }
mavenLocal()
}
}
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url 'https://jitpack.io' }
}
我们来顺序解释上述文件:
在settings.gradle中,定义了各个子项目的路径:
include 'lmsia-abc-common'
include 'lmsia-abc-client'
include 'lmsia-abc-job'
include 'lmsia-abc-server'
下面,我们来看一下子项目中的gradle文件,以'lmsia-abc-server/build.gradle'为例:
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'
}
由于我们将子项目共用的部分抽取到根目录的build.gradle中,所以上述子项目的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子项目的结构:
├── build.gradle
└── src
└── main
├── java
│ └── com
│ └── coder4
│ └── lmsia
│ └── abc
│ ├── constant
│ │ └── LmsiaAbcConstant.java
│ └── thrift
│ └── LmsiaAbcThrift.java
└── thrift
└── lmsiaAbc.thrift
我们解释一下目录结构:
接下来,我们看一下client子项目的目录结构:
├── build.gradle
└── 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
看一下server子项目的目录结构:
.
├── build.gradle
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── coder4
│ │ └── lmsia
│ │ └── abc
│ │ └── server
│ │ ├── configuration
│ │ │ └── ThriftProcessorConfiguration.java
│ │ ├── LmsiaAbcApplication.java
│ │ ├── rest
│ │ │ ├── controller
│ │ │ │ └── AbcController.java
│ │ │ ├── logic
│ │ │ │ ├── impl
│ │ │ │ │ └── AbcLogicImpl.java
│ │ │ │ └── intf
│ │ │ │ └── AbcLogic.java
│ │ │ └── wrapper
│ │ ├── service
│ │ │ ├── impl
│ │ │ │ └── HelloServiceImpl.java
│ │ │ └── intf
│ │ │ └── HelloService.java
│ │ └── thrift
│ │ └── ThriftServerHandler.java
│ └── resources
│ ├── application.yaml
│ └── logback-spring.xml
└── test
└── java
└── com.coder4.lmsia.abc
└── server
└── LmsiaAbcTest.java
解释一下文件:
上述分层看起来有些复杂,但会让各个层次的职责划分的更为清楚,如果你的项目中有更好的方案,也可以采用已有分层结构。
最后,我们看一下job子项目的目录结构:
├── build.gradle
└── src
└── main
├── java
│ └── com
│ └── coder4
│ └── lmsia
│ └── abc
│ └── job
│ ├── LmsiaAbcJob.java
│ └── LmsiaAbcJobStarter.java
└── resources
├── application.yaml
└── logback-spring.xml
简单解释下:
至此,我们已经对lmsia这个示例项目的Gradle、子项目划分、子项目结构做了较为详尽的讲解。
需要说明的是:由于篇幅先后关系的问题,server子项目我们并未包含数据库、事件处理的相关文件和目录结构,我们会在后续章节视进度逐渐添加。
[^1]:数据来源自官方性能评测Gradle vs Maven: Performance Comparison