前言
從頭開始一個項目。第一步是划分系統模塊。
Maven是Java世界中最流行的項目管理工具。它提供繼承和聚合功能,因此可以將項目划分為多個模塊。它非常符合微服務的思想,是實現微服務工程的良好工具。從頭開始一個項目。第一步是划分系統模塊。
Maven是Java世界中最流行的項目管理工具。它提供繼承和聚合功能,因此可以將項目划分為多個模塊。它非常符合微服務的思想,是實現微服務工程的良好工具。
微服務和Maven聚合模塊的區別
Microservice是一個可以獨立部署的項目,Maven的聚合功能可以將多個模塊(項目)聚合到一個大項目中進行管理,而這個大項目本質上仍然是一個獨立的項目。但是,在maven聚合之后,只需單擊一次,就可以在所有項目中執行相同的操作。例如,當在父項目中執行MVN clean命令時,Maven將在它下面找到子項目,以便逐個執行clean操作。
電商微服務系統
目前,大多數系統都有PC管理接口和移動接口(門戶模塊),即后台管理系統和前台商場系統。還有各種商品模塊、訂單模塊和用戶模塊。
- 后端管理模塊(openapi)
- 門戶模塊(openapi)
- 訂單模塊
- 商品模塊
具體怎么設計項目結構,還需要看不同的需求。
項目結構
單體應用
在單個應用程序中首先要考慮的是代碼重用,這在具有前台和后台的系統中更為常見。例如,需要使用商品列表的前端和后端接口。
借鑒GitHub最后一個開源項目,單一的項目結構更加合理。
microservice的一些組件如下,但不能說它是一個真正的microservice系統,因為訂單等業務模塊是不拆分的。
微服務架構
我曾經在一家社會電子商務初創公司工作,公司的項目設計理念非常先進,微服務非常細致。然而,開發人員編寫代碼非常復雜,因為每個微服務都有一個新的項目需要維護。這會導致一個問題。如果開發人員的功能涉及多個模塊,他需要同時打開多個idea窗口來編寫代碼。同時,當OpenAPI使用feign調用內部微服務接口(如order模塊)時,需要將另一個interface@requestmapping復制到OpenAPI。
如下圖所示,每個微服務都可以作為一個模塊存在。外部OpenAPI不需要包含子項目,而內部microservice API需要分為兩個子模塊:API和provider。向使用者提供API接口jar包。
通過實踐,API子模塊可以定義接口和@requestmapping,提供者模塊的控制器可以實現提供服務的接口。在使用者導入API子模塊之后,feign接口繼承API接口並可以被調用。
項目搭建
我們就以簡單的自建zmall工程為例說明idea搭建工程的步驟。github地址為:
結構為:
- zmall(聚合父工程,pom工程,管理依賴版本)
- mall-common(各模塊通用的工具類)
- mall-admin(openapi后台管理端接口)
- mall-portal(openapi移動端頁面接口)
- mall-goods(商品模塊,微服務,內網調用不對外)
- mall-goods-api(商品模塊微服務的接口定義,可打包成jar提供給消費端)
- mall-goods-provider(商品模塊業務實現)
- mall-order(訂單模塊模塊,微服務,內網調用不對外)
- mall-order-api(訂單模塊微服務的接口定義,可打包成jar提供給消費端)
- mall-order-provider(訂單模塊業務實現)
建立pom父工程
建立一個Maven項目,Maven坐標一般的定義為:
- groupId:到項目級別,一般能明確公司和項目即可。如io.github.zebinh.zmall。以spring為例則為org.springframework
- artifactId:到項目下的模塊,一般使用短橫線風格模塊功能,如基礎架構通用部分可以 用base-framework,業務部分可以加項目名,如mall-admin。以spring為例則為spring-core,spring-context等
建立完成后,POM的主要配置如下。作為統一項目管理。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- POM父工程主要統一管理子模塊的依賴版本問題,體現Maven的繼承和聚合功能 --> <!-- 項目坐標 --> <groupId>io.github.zebinh.mall</groupId> <artifactId>zmall</artifactId> <version>1.0-SNAPSHOT</version> <!-- spring-boot-starter-parent統一管理版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <!-- 統一管理屬性和版本,這里的配置在啟動時起作用,類似mvn -D參數傳遞--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <skipTests>true</skipTests> <swagger2.version>2.7.0</swagger2.version> </properties> <!-- 依賴管理 --> <dependencyManagement> <dependencies> <!-- SwaggerUI API文檔生成工具 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger2.version}</version> </dependency> </dependencies> </dependencyManagement> </project> 復制代碼
建立子模塊
以zmall-admin為例,建立一個spring boot工程,作為zmall的子模塊。idea創建工程時記得修改以下幾個點。
- 新建工程時注意模塊名轉為包名時,加一個點號分隔。

- 創建完后,需要修改pom文件的parent坐標等。
建立帶有子模塊的模塊
類似mall-goods,其也是一個pom工程,其下有多個子模塊。創建時需要注意以下問題。
- 模塊名加上短橫線

- 使用spring initializer建子模塊mall-goods-provider時,需要加長到子模塊目錄
- 以上都需要修改pom文件
當然,pom文件中也可以使用repositories配置倉庫
maven倉庫查找順序:maven允許在pom文件和settings.xml文件中配置倉庫的位置,其會根據maven倉庫的id的字典序號來搜索倉庫。因此如你只是臨時使用阿里雲倉庫代替中央倉庫,在pom.xml中配置id為a開頭的阿里雲倉庫,這樣就能排在前邊解析了。
Maven倉庫和私服設置
Maven的用戶配置文件.m2目錄下的settings.xml一般配置如下幾項:
- localRepository:統一Maven本地倉庫
- servers:配置私服用戶名和密碼
- repositories, pluginRepositories:私服或遠程倉庫配置,一般可以包含在profiles中做多配置,使用activeProfiles激活指定配置
- profiles:配置多個,激活指定的一個
- distributionManagement:使用mvn deploy時會部署到指定的私服,但是一般開發中不會指定。而是使用git下載代碼mvn install安裝到本地倉庫。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- maven本地倉庫位置 -->
<localRepository>/develop/mavenRepository</localRepository>
<!-- 私服用戶密碼,穩定版和快照版分開 -->
<servers>
<server>
<id>nexus-releases</id>
<username>zebinh</username>
<password>abcdefg</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>zebinh</username>
<password>abcdefg</password>
</server>
</servers>
<!-- 使用!非,除了私服外,都使用阿里雲倉庫加速 -->
<mirrors>
<mirror>
<id>mirror</id>
<mirrorOf>!nexus-releases,!nexus-snapshots</mirrorOf>
<name>mirror</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<!-- 多配置 -->
<profiles>
<profile
<id>nexus</id>
<repositories>
<repository>
<id>nexus-releases</id>
<url>https://repo.aliyun.com/repository/1234-release/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>https://repo.aliyun.com/repository/1234-snapshot/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-releases</id>
<url>https://repo.aliyun.com/repository/1234-release/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-snapshots</id>
<url>https://repo.aliyun.com/repository/1234-snapshot/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- 激活指定的配置 -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
復制代碼
搭建項目骨架
理論指導依據:

各層的命名:

首先搭建mall-goods-api
Mal admin和Mal portal是openapi,因此它們下面的包需要由模塊命名,如goods.controller和order.controller。然而,商場商品API是一種商品的微服務,不需要划分模塊。
API是接口層,用於管理和門戶調用。輸出VO對象。因此需要定義URL路徑和VO對象,mal商品提供者模塊實現API接口。具體如下:

接着搭建mall-admin openapi
上面搭好了goods微服務,mall-admin則可以引入mall-goods-api來調用goods模塊了。如下圖:

至此,maven工程搭建結束。代碼github地址:github.com/zebinh/zmal…