本文主要是以實戰方式來介紹微服務下多團隊多服務多功能模塊下的項目工程結構設計,但願讀者經過參考此文章的設計方案後能夠本身設計一套知足本身企業的可擴展靈活性較高的項目工程層次結構。前端
讀者在閱讀此文以前應該具有哪些前提知識呢?筆者簡要的列了一下以下內容:vue
讀者在閱讀此文以後會有哪些收穫呢?筆者但願讀者能有以下收穫:java
本文以項目demo來演示工程設計,這樣會便於讀者理解,這裏假設定出以下項目場景:android
爪哇留聲機公司(如下簡稱爪哇公司)是一家專門爲第三方企業作業務系統的,對於不一樣第三方企業的規模大小,爪哇公司在開發部署系統的時候可能會有所變化,其中爪哇公司的業務系統包含的以下三個功能:nginx
背景一:第三方企業A是一家規模很是大的企業,用戶也很龐大,並且也不差錢,那麼爪哇公司在給A企業作產品時可能爲了性能擴展等須要,會將現有產品化系統微服務化成三個服務(訂單服務、支付服務、物流服務)分別部署來知足A企業需求,其中訂單服務後續可能會因國內外訂單量太大而進一步拆分紅國內訂單服務和國外訂單服務。git
背景二:第三方企業B是一家規模小的企業,用戶量並不大,那麼爪哇公司在給B企業作產品時只部署一個服務(此服務同時包含訂單、支付、物流三項功能)便可知足B企業需求,大大減小企業運維等成本。web
針對以上場景設計出一套 Gradle 工程結構在一樣的代碼庫狀況下來知足其需求,減小研發屢次開發成本。spring
項目-服務-功能-模塊,如:javalsj-order-foreign-api、javalsj-order-foreign-impl。後端
項目.服務.功能.模塊.領域,如:javalsj.order.foreign.api、javalsj.order.foreign.api.vo、javalsj.order.foreign.api.dto等。api
javalsj
整個爪哇項目根目錄。
javalsj-frontend
爪哇前端根目錄。
javalsj-frontend-vue
爪哇vue前端項目工程。
javalsj-backend
爪哇後端根目錄。
javalsj-commom
後端服務公用模塊目錄。
javalsj-common-base
後端服務無容器概念公用模塊工程,如:工具常量類、響應實體等。
javalsj-common-web
後端servlet容器公用模塊工程,依賴javalsj-common-base,如:每一個servlet服務須要的跨域過濾器配置、web異常攔截器等。
javalsj-common-webflux
後端webflux容器公用模塊工程,依賴javalsj-common-base,如:每一個webflux服務(網關)須要的webflux異常攔截器等。
javalsj-gateway
後端網關服務目錄。
javalsj-gateway-app
後端網關應用工程。
javalsj-auth
後端受權認證服務目錄。
javalsj-auth-app
後端受權認證獨立啓動工程,分佈式部署。
javalsj-auth-app-microservice
後端受權認證微服務啓動工程,微服務部署。
javalsj-auth-api
api工程,後端支付服務api接口工程,外部工程調用時注入統一依賴api工程。
javalsj-auth-impl
impl工程,後端支付服務api的接口實現工程,依賴javalsj-auth-api工程實現controller的具體邏輯。注:api和impl組合能夠用來構建單體服務架構下的程序。
javalsj-auth-client
client工程,後端支付服務提供給外部微服務調用的客戶端工程,依賴javalsj-auth-api工程實現 Feign Client 服務調用客戶端,其餘微服務工程依賴該client工程實現微服務調用。
javalsj-order
後端訂單服務目錄。
javalsj-order-foreign-api
api工程,後端國外訂單服務api接口工程,外部工程調用時注入統一依賴api工程。
javalsj-order-foreign-impl
impl工程,後端國外訂單服務api的接口實現工程,依賴javalsj-order-foreign-api工程實現controller的具體邏輯。注:api和impl組合能夠用來構建單體服務架構下的程序。
javalsj-order-foreign-client
client工程,後端國外訂單服務提供給外部微服務調用的客戶端工程,依賴javalsj-order-foreign-api工程實現 Feign Client 服務調用客戶端,其餘微服務工程依賴該client工程實現微服務調用。
javalsj-order-foregin-app-microservice
app-microservice工程,後端國外訂單服務的微服務啓動工程,依賴javalsj-order-foreign-impl,若須要調用其餘微服務,則依賴其餘微服務的client工程代碼。
javalsj-order-foregin-app
app工程,後端國外訂單服務的獨立啓動工程,可用於分佈式調用。
javalsj-order-internal-api
api工程,後端國內訂單服務api接口工程,外部工程調用時注入統一依賴api工程。
javalsj-order-internal-impl
impl工程,後端國內訂單服務api的接口實現工程,依賴javalsj-order-internal-api工程實現controller的具體邏輯。注:api和impl組合能夠用來構建單體服務架構下的程序。
javalsj-order-internal-client
client工程,後端國內訂單服務提供給外部微服務調用的客戶端工程,依賴javalsj-order-internal-api工程實現 Feign Client 服務調用客戶端,其餘微服務工程依賴該client工程實現微服務調用。
javalsj-order-internal-app-microservice
app工程,後端國內訂單服務的啓動工程,依賴javalsj-order-internal-impl,若須要調用其餘微服務,則依賴其餘微服務的client工程代碼。
javalsj-order-internal-app
app工程,後端國內訂單服務的獨立啓動工程,可用於分佈式部署。
javalsj-pay
後端支付服務目錄。
javalsj-pay-api
api工程,後端支付服務api接口工程,外部工程調用時注入統一依賴api工程,包結構:javalsj.pay.api、javalsj.pay.api.vo、javalsj.pay.api.dto。
javalsj-pay-impl
impl工程,後端支付服務api的接口實現工程,依賴javalsj-pay-api工程實現controller的具體邏輯。注:api和impl組合能夠用來構建單體服務架構下的程序,包結構:javalsj.pay.impl.controller、javalsj.pay.impl.do、javalsj.pay.impl.service、javalsj.pay.impl.service.impl、javalsj.pay.impl.dao、javalsj.pay.impl.dao.impl。
javalsj-pay-client
client工程,後端支付服務提供給外部微服務調用的客戶端工程,依賴javalsj-pay-api工程實現 Feign Client 服務調用客戶端,其餘微服務工程依賴該client工程實現微服務調用,工程包結構:javalsj.pay.client、javalsj.pay.client.fallbackfactory。
javalsj-pay-app-microservice
app-microservice工程,後端支付服務的啓動工程,依賴javalsj-pay-impl,若須要調用其餘微服務,則依賴其餘微服務的client工程代碼。
javalsj-order-pay-app
app工程,後端支付服務的獨立啓動工程,可用於分佈式部署。
javalsj-logistics
後端物流服務目錄。
javalsj-logistics-api
api工程,後端物流服務api接口工程,外部工程調用時注入統一依賴api工程。
javalsj-logistics-impl
impl工程,後端物流服務api的接口實現工程,依賴javalsj-logistics-api工程實現controller的具體邏輯。注:api和impl組合能夠用來構建單體服務架構下的程序。
javalsj-logistics-client
client工程,後端物流服務提供給外部微服務調用的客戶端工程,依賴javalsj-logistics-api工程實現 Feign Client 服務調用客戶端,其餘微服務工程依賴該client工程實現微服務調用。
javalsj-logistics-app-microservice
app-microservice工程,後端物流服務的啓動工程,依賴javalsj-logistics-impl,若須要調用其餘微服務,則依賴其餘微服務的client工程代碼。
javalsj-logistics-app
app工程,後端物流服務的獨立啓動工程,可用於分佈式部署。
javalsj-app
後端構建單體啓動服務工程。
爲了便於理解設計,如今進行工程結構層次設計說明,經過上面的一段描述,讀者能夠看到每一個服務工程都被拆分紅了app、app-microservice、api、impl、client 5個 project,讀者能夠試先按文字描述來預想如下幾個問題:
1. 拆分的這幾個工程分別是負責幹什麼的?
app
獨立服務部署應用啓動工程。經過 app 的 build.gradle 來構建當前獨立服務須要的工程依賴,依賴主要爲 api、impl 工程。若該服務須要調用其餘服務則依賴再加其餘服務的client工程。經過 app 的 application.yml 配置文件設置 Feign Client 設置 name 、url 直連屬性。
app-microservice
微服務部署啓動工程。經過 app-microservice 的 build.gradle 來構建當前獨立服務須要的工程依賴,依賴主要爲 api、impl 工程。若該服務須要調用其餘服務則依賴再加其餘服務的client工程。經過 app 的 application.yml 配置文件設置 Feign Client 只設置 name 屬性。
api
服務 api 接口工程,工程模塊互相依賴時統一依賴其餘服務模塊的api接口工程,而後再經過構建依賴 impl 或者 client 工程,利用 Spring IOC 自動注入機制來決定該接口最終是調用服務內部的 controller,仍是調用其餘服務的client客戶端。
impl
服務 api 的接口實現工程,依賴api工程。該工程只用於服務內部構建,不容許其餘服務作依賴,工程內容主要是包含 controller、service、dao等業務邏輯模塊。
client
服務提供給外部服務調用的 client 客戶端工程,依賴 api 工程。該工程只用於其餘服務構建依賴,不容許服務內部作依賴,工程內容主要是包含 Feign Client 的通訊模塊,單獨拎出來是爲了減小其餘服務調用該服務時都寫一份client的冗餘操做。
2. 爲何要這樣拆分,這樣拆分的好處在哪裏呢?
讀者能夠經過上面工程結構發現,這樣拆分工程的是會增長大量的工程數量,對工程規範性要求也變得較高這是其中的一個缺點。可是在多團隊工程規模較大的狀況下,這種作法又帶來了很大的優勢和靈活性,具體以下:
工程隨意組合來適應項目需求
在實際工做中,拆分微服務的業務邊界實際上是一個比較費勁的工做量,並且隨着項目的不斷擴大,自己拆分的邊界已經不知足性能需求了,此時可能會作出以下兩種場景改造。 1.對已拆分的服務再作二次拆分。 場景:一開始只是把訂單業務拆分紅獨立的服務,可是後續發現訂單業務服務扛不住了此時可能就須要再拆分紅國內和國外訂單兩個服務)。 2.對已拆分的服務作合併。 場景:一開始拆分了國內和國外訂單兩個服務,可是後續發現訂單業務量不大,此時爲了下降運維成本可能就會把這兩個服務合併成一個訂單業務)。以上兩個場景都可經過該工程方案解決。
接口工程多實現能夠橫向擴展
現有api接口工程提供 impl 和 client 兩種實現,其中 client 爲 feign client 組件實現,若是後需有 Dubbo 或者 Webservice 等實現,也能夠 擴展添加client-webservice或者client-dubbo工程,具體使用哪一個工程,只須要在app啓動工程作依賴便可。
3. 怎樣去使用這5個工程進行組配來知足單體、分佈式、微服務的工程構建呢?
讀者能夠參考下列不一樣服務進行 Gradle 組合構建來理解組配方案。
單體服務模式
啓動工程:javalsj-app
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-auth-api、javalsj-auth-impl、javalsj-order-foreign-api、javalsj-order-foreign-impl、javalsj-order-internal-api、javalsj-order-internal-impl、javalsj-pay-api、javalsj-pay-impl、javalsj-logistics-api、javalsj-logistics-impl
分佈式服務模式
受權認證服務
啓動工程:javalsj-auth-app
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-auth-api、javalsj-auth-impl
訂單服務
啓動工程:javalsj-order-app
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-order-foreign-api、javalsj-order-foreign-impl、javalsj-order-internal-api、javalsj-order-internal-impl、javalsj-pay-api、javalsj-pay-client
支付服務
啓動工程:javalsj-pay-app
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-pay-api、javalsj-pay-impl、javalsj-logistics-api、javalsj-logistics-client
物流服務
啓動工程:javalsj-logistics-app
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-logistics-api、javalsj-logistics-impl
備註:分佈式構建app依賴時是不須要依賴服務註冊發現和配置中心組件。
微服務模式
受權認證微服務
啓動工程:javalsj-auth-app-microservice
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-auth-api、javalsj-auth-impl
國內訂單微服務
啓動工程:javalsj-order-internal-app-microservice
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-order-internal-api、javalsj-order-internal-impl、javalsj-pay-api、javalsj-pay-client
國外訂單微服務
啓動工程:javalsj-order-foreign-app-microservice
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-order-foreign-api、javalsj-order-foreign-impl、javalsj-pay-api、javalsj-pay-client
支付微服務
啓動工程:javalsj-pay-app-microservice
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-pay-api、javalsj-pay-impl、javalsj-logistics-api、javalsj-logistics-client
物流微服務
啓動工程:javalsj-logistics-app-microservice
Gradle 依賴:javalsj-common-base、javalsj-common-web、javalsj-logistics-api、javalsj-logistics-impl
備註:微服務構建app依賴時是須要依賴服務註冊發現和配置中心組件。
附加信息
上面分佈式和微服務的依賴工程同樣,又是如何作到劃分的呢?這是利用了 Feign Client 的組件特性。咱們知道 @Feign Client 有兩個屬性: name 和 url,其中name屬性是必要的,url 屬性非必須,在處理時有下列特性。若 url 屬性存在,feign會直連url地址調用,此時不會走服務發現,至關於分佈式調用,生產時能夠把url配置集羣的nginx節點地址來達到分佈式的負載均衡策略。 若 url 屬性是空的時候,feign會按name從服務發現找對應服務名的服務集羣,並按負載均衡策略選擇其中的一個節點進行調用。二者在工程級別上只是在 app 和 app-microservice 的 application.yml 作配置url參數及是否依賴服務註冊與發現等組件的區別。
針對上述工程結構層次來設計Git倉庫,現列出的解決方案有兩種,分別是整個項目只使用一個Git倉庫和每一個團隊服務擁有各自的Git倉庫,那麼二者有什麼區別呢?簡單列出以下區別供參考:
倉庫數
一個Git倉庫,1個。 多個Git倉庫,N個。
依賴版本管理
一個Git倉庫,則 Gradle 版本控制也是統一的,不用研發人員特別關注。 多個Git倉庫,則 Gradle 版本控制須要研發人員特別關注,爲了版本一致,實際使用時會把依賴包版本放在統一的一個公共目錄下使用,每一個Git倉庫在作依賴時統一引用公共版本模塊來達到一致性。
使用靈活性
一個Git倉庫,則直接Clone倉庫到本地便可,不用關注工程之間依賴的層次文件目錄位置放的對不對。 多個Git倉庫,則須要Clone多個倉庫到本地,且多個倉庫之間有引用的話,還須要特別注意倉庫目錄位置是否放的對不對,若不對的話在build時就會報未找到依賴包的錯誤。
團隊靈活性
一個Git倉庫,每次都會拉取整個服務代碼,若多團隊的狀況下則拉取的代碼庫可能會比較大,即時當前團隊可能不會關注的其餘團隊代碼也會被拉取下來,在提交代碼須要Merge的機率也會大大提升。 多個Git倉庫,每一個團隊只拉取本身團隊的代碼,拉取的代碼相對較小,便於整個多團隊的Git權限管理等。
友情提示:針對以上區別,筆者在這裏推薦第二種每一個團隊服務擁有各自的 Git 倉庫的方式,這也是咱們實際生產中使用的方式,其實二者差別不是太大,只用作好倉庫的管理和規範化便可。筆者爲了方便簡化的說明工程代碼內部的核心內容,此處採起整個項目使用一個 Git 倉庫,但願不會影響讀者的思路。
javalsj-app
是整個單體服務的app服務目錄。
javalsj-common
是整個多團隊多服務公用的依賴工程,好比全部微服務都公用的包工具,當前其存放的包主要有如下:
javalsj-gradle
是整個多團隊多服務公用的Gradle構建依賴目錄。其下存放 Gradle 統一版本控制 version.gradle 文件、發佈程序到maven倉庫的 push2maven.gradle 文件,方便對整個項目的依賴版本作控制。
javalsj-order
是訂單業務團隊工程存放的目錄。
javalsj-pay
是支付業務團隊工程存放的目錄。
javalsj-logistics
是物流業務團隊工程存放的目錄。
從 Gradle 官網 https://gradle.org/ 下載新版 Gradle 版本並解壓,並設置環境變量,安裝後在D:/SoftFile/gradle-5.6.2路徑下新建文件夾 userhome,用於存放 Gradle 下載的依賴文件,如圖。
經過 Git Clone 實例項目(地址:https://gitee.com/wangjihong/...),並切換分支爲develop, 如圖。
如圖所示,咱們本次實例主要業務是讓用戶訪問獲取訂單 rest api 請求來獲取對應的訂單、支付、物流信息。訂單模塊提供訂單的id、code信息,支付模塊提供payId、payCode信息,物流模塊提供logisticsId、logisticsCode信息。
如圖所示,單體服務因爲只集成了個模塊impl工程,因此訂單內部注入到PayApi和LogisticsApi的實現類即爲PayController和LogisticsController,調用時也是代碼類自己方法的調用,不依賴於Feign組件。
IDEA導入單體啓動 app 工程: W:/Workspace/git_workspace/javalsj/javalsj_backend/javalsj-app,而後啓動單體服務如圖:
使用Postman工具模擬訪問單體服務訂單的rest接口地址:http://localhost:8001/api/order/v1/internal ,結果以下:
由上可見,單體服務集成訂單、支付、物流模塊後均正常訪問。
在單體啓動工程 javalsj-app 咱們能夠看到由於單體不涉及服務之間的調用因此 build.gradle 構建腳本只依賴了各模塊的 impl 工程:
Gradle 構建腳本
buildscript { ext { springBootGradlePluginVersion = '2.2.0.RELEASE' dependencyManagementPluginVersion = '1.0.8.RELEASE' junitPlatformGradlePluginVersion = '1.2.0' buildGradleVersion = '3.1.0' } repositories { mavenLocal() maven { url "http://maven.aliyun.com/nexus/content/groups/public" } mavenCentral() maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } } dependencies { classpath "org.junit.platform:junit-platform-gradle-plugin:${junitPlatformGradlePluginVersion}" classpath "io.spring.gradle:dependency-management-plugin:${dependencyManagementPluginVersion}" classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootGradlePluginVersion}" classpath "com.android.tools.build:gradle:${buildGradleVersion}" } } apply plugin: 'java' apply plugin: 'idea' apply plugin: 'eclipse' apply plugin: 'java-library' apply plugin: 'io.spring.dependency-management' apply plugin: 'org.junit.platform.gradle.plugin' apply from: "../javalsj-gradle/push2maven.gradle" apply from: "../javalsj-gradle/version.gradle" dependencies { // 訂單模塊庫 implementation commonLib.javalsj_common_web implementation orderLib.javalsj_order_foreign_impl implementation orderLib.javalsj_order_internal_impl // 支付模塊庫 implementation payLib.javalsj_pay_impl // 物流模塊庫 implementation logisticsLib.javalsj_logistics_impl }
application.yml 配置沒什麼特別的
server: port: 8001 servlet: context-path: / session: timeout: 10800
如圖所示,分佈式服務因爲集成了模塊impl工程和支付物流的client工程,因此訂單內部注入到PayApi和LogisticsApi的實現類即爲Pay Feign Client 和Logistics Feign Client ,加上啓動配置文件中設置了 Feign Client 的url屬性,因此調用時是採用的直連url的方式,達到分佈式調用的效果。
如圖。
在分佈式訂單啓動工程 javalsj-order-app 咱們能夠看到由於單體涉及服務之間的調用因此 build.gradle 構建腳本依賴了自身模塊的 impl 工程以及支付、物流模塊的 client 工程。client工程供訂單服務使用Feign Client 對支付、物流服務接口 url 進行調用,:
分佈式與單體區別以下,因爲支付、物流服務沒什麼特殊,因此只拿訂單服務的腳本和配置看下。
Gradle 構建腳本區別
app啓動工程增長其餘模塊的client工程依賴。
buildscript { ext { springBootGradlePluginVersion = '2.2.0.RELEASE' dependencyManagementPluginVersion = '1.0.8.RELEASE' junitPlatformGradlePluginVersion = '1.2.0' buildGradleVersion = '3.1.0' } repositories { mavenLocal() maven { url "http://maven.aliyun.com/nexus/content/groups/public" } mavenCentral() maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } } dependencies { classpath "org.junit.platform:junit-platform-gradle-plugin:${junitPlatformGradlePluginVersion}" classpath "io.spring.gradle:dependency-management-plugin:${dependencyManagementPluginVersion}" classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootGradlePluginVersion}" classpath "com.android.tools.build:gradle:${buildGradleVersion}" } } apply plugin: 'java' apply plugin: 'idea' apply plugin: 'eclipse' apply plugin: 'java-library' apply plugin: 'io.spring.dependency-management' apply plugin: 'org.junit.platform.gradle.plugin' apply from: "../../javalsj-gradle/push2maven.gradle" apply from: "../../javalsj-gradle/version.gradle" dependencies { implementation orderLib.javalsj_order_foreign_impl implementation orderLib.javalsj_order_internal_impl // 支付接口客戶端 implementation payLib.javalsj_pay_client // 物流接口客戶端 implementation logisticsLib.javalsj_logistics_client }
application.yml 配置區別
增長了@ Feign Client 的url屬性值配置(上文也提到了分佈式部署方式利用了 Feign Client url 屬性值若存在,則 Feign 會直連url 進行地址調用,此時不會走服務發現,至關於分佈式調用的組件特性。):
custom: service: name: order-service service-name: pay: pay-service logistics: logistics-service service-url: // 增長支付URL直連地址 pay: http://localhost:9003 // 增長物流URL直連地址 logistics: http://localhost:9004 management: endpoints: web: exposure: include: '*' server: port: 9002 servlet: context-path: / session: timeout: 10800 feign: httpclient: enabled: false okhttp: enabled: true
微服務狀況下,咱們首先須要搭建服務註冊與發現,此處使用 Nacos 開源組件,下載安裝啓動過程如圖。
如圖所示,微服務因爲集成了模塊impl工程和支付物流的client工程,因此訂單內部注入到PayApi和LogisticsApi的實現類即爲Pay Feign Client 和Logistics Feign Client ,啓動類加了服務發現註解@EnableDiscoveryClient,啓動配置文件中沒有設置 Feign Client 的url屬性,只設置了name屬性,因此調用時會走 Nacos 服務發現找到對應name的服務進行負載均衡調用,達到微服務調用的效果。
如圖。
在微服務啓動工程 javalsj-order-app 咱們能夠看到由於單體涉及服務之間的調用因此 build.gradle 構建腳本依賴了自身模塊的 impl 工程以及支付、物流模塊的 client 工程。client工程供訂單服務使用Feign Client 對支付、物流服務接口 url 進行調用,:
微服務與分佈式的區別以下:
Gradle 構建腳本:
app-microservice啓動工程增長了 Nacos 服務註冊與發現依賴。
buildscript { ext { springBootGradlePluginVersion = '2.2.0.RELEASE' dependencyManagementPluginVersion = '1.0.8.RELEASE' junitPlatformGradlePluginVersion = '1.2.0' buildGradleVersion = '3.1.0' } repositories { mavenLocal() maven { url "http://maven.aliyun.com/nexus/content/groups/public" } mavenCentral() maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } } dependencies { classpath "org.junit.platform:junit-platform-gradle-plugin:${junitPlatformGradlePluginVersion}" classpath "io.spring.gradle:dependency-management-plugin:${dependencyManagementPluginVersion}" classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootGradlePluginVersion}" classpath "com.android.tools.build:gradle:${buildGradleVersion}" } } apply plugin: 'java' apply plugin: 'idea' apply plugin: 'eclipse' apply plugin: 'java-library' apply plugin: 'io.spring.dependency-management' apply plugin: 'org.junit.platform.gradle.plugin' apply from: "../../javalsj-gradle/push2maven.gradle" apply from: "../../javalsj-gradle/version.gradle" dependencies { implementation orderLib.javalsj_order_internal_impl implementation payLib.javalsj_pay_client implementation logisticsLib.javalsj_logistics_client // 服務註冊與發現 implementation pluginLib.spring_cloud_starter_alibaba_nacos_discovery }
application.yml 配置區別
去掉了@ Feign Client 的url屬性值配置(上文也提到了微服務部署方式利用了 Feign Client url 屬性值若不存在,則 Feign 會經過name屬性進行服務發現負載均衡到目標服務,此時會調用微服務模式的組件特性。):
custom: service: name: order-internal-service service-name: pay: pay-service logistics: logistics-service spring: application: name: ${custom.service.name} cloud: nacos: discovery: server-addr: 127.0.0.1:8848 management: endpoints: web: exposure: include: '*' server: port: 9002 servlet: context-path: / session: timeout: 10800 feign: httpclient: enabled: false okhttp: enabled: true
啓動Application類區別
增長了服務發現註解@EnableDiscoveryClient。
package com.javalsj.order.internal.app.microservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.Enable Feign Client s; // 增長服務發現註解 @EnableDiscoveryClient @SpringBootApplication public class JavalsjOrderInternalAppMicroserviceApplication { public static void main(String[] args) { SpringApplication.run(JavalsjOrderInternalAppMicroserviceApplication.class, args); } }
本文主要介紹了同一套代碼庫工程結構設計以及在適配單體服務、分佈式、微服務各類模式下的工程設計思路,筆者爲了讓讀者脫離純理論來便於理解文章,經過寫的一個Demo工程實例來演示各服務模式下的配置區別,讀者能夠經過實例代碼自行本地運行測試以便更易理解。(PS:若有設計疑問,能夠在文章的評論區發表,筆者看到後會及時回覆,互相學習,謝謝)。
彩蛋: