3 回答

TA貢獻1735條經驗 獲得超5個贊
從技術角度來看,您的問題可以通過API Gateway 解決。
簡而言之,您應該定義一個新的微服務,例如gateway service
,將由您的 API 客戶端調用。該gateway service
會又:
調用
Service1
以Entity1
與id
for相處Entity2
調用
Service2
以Entity2
根據步驟 1 中的 id 獲取。聚合兩個響應(在你的情況下,設置
Entity2
里面的值Entity1
)。將聚合響應返回給客戶端。
設計時要記住兩件事:
您的 API 客戶端不應該知道他的數據是由兩個服務獲取的。
在網關中聚合客戶端響應通常更清晰,因為它允許在您的微服務之間進行更高級別的解耦。例如,您可以按如下方式對實體進行建模(并刪除
Service1
和之間的數據模型依賴項Service2
,允許兩個服務獨立發展)。
請參閱以下代碼段:
// In Service1
EntityA {
Long bId;
}
// In Service2
EntityB{
}
// In Gateway
Response {
EntityA a;
EntityB b;
}
天氣Entity1應參考的決定Entity2不取決于您的數據如何分發,而是取決于您的業務需求。如果您有一個單體應用程序,并且在這種情況下Entity1引用Entity2是有意義的,那么在微服務環境中這樣做仍然有意義。

TA貢獻1775條經驗 獲得超8個贊
我遇到了這種模式,我認為它對您的情況很有用。
該模式稱為CQRS(Command Query Responsibility Segregation,一口)
該模式假設您有一個適當的事件溯源系統,自從您使用微服務以來,您已經有了很大的變化。
當任何EntityA從服務1改變時,服務1發布一個事件。這同樣適用于服務2,當任何EntityB Si變更也將發布事件。
然后我們有服務3訂用來自的事件服務1和服務2聚集在其本地數據庫中的數據并將其存儲?,F在,所有你需要做的就是呼叫服務3,從獲得agregated數據服務1和服務2。
當然,這種模式有其缺點,如最終一致性,但在某些情況下,它實際上可能是最合適的。
這個想法主要來自這里:https : //microservices.io/patterns/data/cqrs.html。我還會從這里至少閱讀“何時使用此模式”部分:https : //docs.microsoft.com/en-us/azure/architecture/patterns/cqrs

TA貢獻1793條經驗 獲得超6個贊
我想到的兩個解決方案既簡單又復雜。
重復數據
在 MS 之間,通常有一個高度可用的發布-訂閱或消息隊列集群系統。當EntityB
被保存在Service2
你的事件發送到隊列或發布-訂閱系統。Service1
可以訂閱該特定事件并將有關信息存儲EntityB
在其自己的數據庫中。
組域邏輯
也許,域Service1
和之間的相關性太大了Service2
。在這種情況下,您可能希望將您的服務分組為單個服務。
添加回答
舉報