【原創】Spring-Cloud架構入門(二)微服務基本包結構--轉載請註明出處

注:相關代碼可以查看以下git項目:

框架包:https://gitee.com/zhouzhongzhi/framework-base.git

客戶端:https://gitee.com/zhouzhongzhi/customer-service.git

生產端:https://gitee.com/zhouzhongzhi/service-demo.git

註冊中心:https://gitee.com/zhouzhongzhi/eureka.git

配置服務:https://gitee.com/zhouzhongzhi/config-server.git

配置文件:https://gitee.com/zhouzhongzhi/properties.git

一、基本的依賴架構:

1.在上方的基本依賴結構中,最基礎的依賴包爲spring-boot包,該包是Spring-boot所提供的基礎依賴jar包,定位是一個類似於java中Object的一個包,所有的包都需要繼承於這個包來進行。

2.framework-parent包是內部基礎依賴框架包,這個包繼承於spring-boot包,該包內部包含了framework-boot於framework-ms兩個jar包,這兩個jar包分別用於不同的場景,boot包用於構建出的單獨的boot項目進行使用,而ms包則是用於構建微服務項目進行使用。在ms包中引用了boot包的內容,同時,在這個包中新增了微服務的FeignClient,Config,Eureka等SpringCloud相關的引用以及基本的配置。

3.service與customer,分別是實際的微服務的客戶端與服務端的包,這兩個包的結構一致,均是由基本的parent以及繼承於parent的三個model包(bean,client,server),三個model包均繼承於各自的parent包。client包爲提供給調用方使用的jar包,裏面只有FeignClient的接口信息。bean包屬於用於進行交互的對象規範包,內部只有Enum和Bean。同時,Client包會引用bean包。server包爲具體的實現代碼,該包會引用Bean包,但是一般不建議引入Client包。

二、爲什麼要抽離 framework 基礎包

抽離framework包,有點類似於建立基礎工具包,一般在外包公司的項目中比較常見,擁有基礎工具包,或者搭建基本的項目快速構建模板以後,可以用於快速的創建出一個新的項目來,用於進行新服務的開發。在微服務架構中,抽離基礎服務包的用途與這個目標類似,但是並不完全相同。

1.有了基礎服務包以後,在構建新的項目時,不再需要再編寫大量的配置代碼。

例如配置mybatis的信息,例如配置一些日誌打印,灰度,權限控制,消息隊列,redis等等。也不用再在服務中添加過多的通用性jar包的pom依賴。同時這個基礎jar包,還具有基本的工具包的功能,可以爲全局提供所需要的工具類,如加解密,http,等等。

2.由於底層的框架代碼只有一套,就避免了希望添加一個新功能在所有服務,就需要將所有的包都需要逐一去添加這個功能。

在進行底層架構升級時,每一次對代碼進行升級,都需要將其發佈到nexus私服中,並升級版本號,這樣,例如服務A引用的爲框架1.0版本,那麼我們需要進行框架內部優化時,在優化完成後,可以將框架重新打包爲1.1版本,所有服務只需要進行版本號提升即可。同時,如果只有服務A希望先升級到1.0版本進行測試,那麼,只將這一個服務先升級繼承包版本即可,其他服務包可以等到框架層面穩定後進行升級。

三、將服務分爲bean,client,server三個包

1.服務的parent包繼承framework-parent包,並引用基本的jar包

1.分成三個包,不同的需求,引用不同的jar包

將服務的一個包分爲三個包,可以對代碼進行分離,將代碼本身分爲bean管理包,FeignClient調用包,與server包,client與server包都需要用到mvc的javaBean,因此引用bean包即可。調用方需要使用client進行接口定義與注入,則引用client包即可。將包拆分爲三個,也就可以因需求制宜,減少不必要的class數量,並且減少一些潛在的bug。

2.server是server,client是client

server包中,是我們的實際業務代碼,而client包中,是我們的服務方,提供的對外的接口規範。因此,client包中,不需要直接與server包中的內容產生任何的關聯。也許有人會使server中的controller類,去實現對應的client接口,實際上是沒有太大必要的。因爲controller類的返回值,一般是不需要直接返回一個BaseResult這種響應結構對象的,直接返回bean對象即可,但是client接口的返回值需要返回這個對象。並且,client中的接口是提供給調用方,使用cglib這類工具進行標準化實現的規範接口。將這些接口強制性的進行實現,本身不具有太大的意義了。

四、framework-ms包優化

1.將繼承+引用,改爲只進行繼承

我們在進行創建新服務時,需要繼承於framework-parent包,然後引用framework-ms包,如果覺得這種方式引用過多,我們可以嘗試對其進行優化,添加一個framework-ms-parent包,這個包繼承於framewrok-parent包,引用framework-ms包,這樣,在服務進行使用時,就可以只需要繼承framework-ms-parent包即可,可以同時起到繼承parent的同時,引用ms包的作用。

2.將ms包拆分爲多個包

在實際的使用中,我們的所有微服務,都是需要去引入ms包來獲取我們的配置與依賴信息的。因此,如果ms包中引用的東西過多,就會導致一些輕量級的服務變得臃腫。例如:zuul的網關服務是需要引入我們的灰度配置,日誌配置的,但是zuul服務不需要數據庫,redis,MQ等。因此,我們需要將redis,MQ,數據庫這類的配置以及包引入單獨的分開,例如,創建一個framework-data(數據庫包),framework-cache(redis緩存包),在需要使用這些組件時,直接引用這些包即可。引用後,就可以直接使用。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章