微服務(wù)架構(gòu)中優(yōu)雅的實體類共享方法
在微服務(wù)架構(gòu)中,跨服務(wù)共享數(shù)據(jù)實體是一個常見問題。例如,”城市服務(wù)” (appcity) 管理城市信息 (city 實體),”國家服務(wù)” (appcountry) 管理國家信息 (country 實體),而國家服務(wù)需要查詢城市信息。直接在服務(wù)間共享實體類,會導(dǎo)致高耦合性。
以下代碼展示了國家服務(wù)調(diào)用城市服務(wù)的示例,其中 CityService 接口使用 FeignClient:
package org.foo.bar.country.service; @FeignClient(略) public interface CityService { CommonResponse<city> getCityInCountry(City condition); }
最佳實踐:創(chuàng)建共享模塊
最佳方案是創(chuàng)建一個獨立的共享模塊,將 city 實體類打包成 JAR 包。 appcity 和 appcountry 服務(wù)都依賴該 JAR 包,從而實現(xiàn)實體類共享,保證版本一致性和代碼復(fù)用性。 該共享模塊應(yīng)僅包含跨服務(wù)通信所需的實體類,避免與特定服務(wù)強耦合的業(yè)務(wù)邏輯。
避免循環(huán)依賴和提升獨立性
為了避免循環(huán)依賴,共享模塊的設(shè)計需要仔細規(guī)劃。 為了提升服務(wù)獨立性和可維護性,應(yīng)盡量減少共享實體類的數(shù)量。 建議優(yōu)先使用 DTO (數(shù)據(jù)傳輸對象) 進行數(shù)據(jù)交互,并使用 Converter 進行實體類和 DTO 之間的轉(zhuǎn)換,從而降低服務(wù)間的耦合度。 這種方式更靈活,也更容易進行版本管理和演進。