Java工程搭建最佳方案之Maven


前言

從頭開始一個項目。第一步是划分系統模塊。

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創建工程時記得修改以下幾個點。

  • 新建工程時注意模塊名轉為包名時,加一個點號分隔。

 

UTOOLS1581847583152.png

 

  • 創建完后,需要修改pom文件的parent坐標等。

建立帶有子模塊的模塊

類似mall-goods,其也是一個pom工程,其下有多個子模塊。創建時需要注意以下問題。

  • 模塊名加上短橫線

 

UTOOLS1581848171291.png

 

  • 使用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>
復制代碼

搭建項目骨架

理論指導依據:

 

UTOOLS1582426999897.png

 

各層的命名:

 

UTOOLS1582426816862.png

 

首先搭建mall-goods-api

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

UTOOLS1582428554306.png

 

接着搭建mall-admin openapi

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

 

UTOOLS1582431393011.png

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM