微服務之間如何共享DTO?

1. 概述

近些年來毒坛,微服務變得越來越流行望伦。微服務基本特征是模塊化、獨立煎殷、易于擴展的屯伞。它們之間需要協(xié)同工作并交換數(shù)據(jù)。為了實現(xiàn)這一點豪直,我們創(chuàng)建了名為 DTO 的共享數(shù)據(jù)傳輸對象劣摇。在本文中,我們將介紹在微服務之間共享DTO的方法弓乙。

2. 將域對象發(fā)布為DTO

使用微服務管理表示應用程序域的模型末融。域模型的關注點與 DTO 不同,我們將它們與DAO層中的數(shù)據(jù)模型分開暇韧。
這樣做的主要原因是我們不想通過服務向客戶暴露我們領域的復雜性勾习。

恰恰相反,我們通過 REST API 暴露 DTO 為客戶端提供服務懈玻。當DTO在這些服務之間傳遞時巧婶,我們將它們轉換為域對象。

dto

上面的 面向服務架構 示意性地顯示了DTO到域對象的組件和流程。

3. 微服務間共享DTO

以客戶訂購產(chǎn)品的過程為例艺栈。此過程基于 Customer-Order 模型英岭,從服務體系結構的角度來看看這個過程。
假設客戶服務將請求數(shù)據(jù)發(fā)送到訂單服務:

"order": {
    "customerId": 1,
    "itemId": "A152"
}

CustomerOrder 服務使用 contracts (契約) 進行通信眼滤。contract(或者是服務請求)以JSON格式顯示巴席。作為 Java 模型,OrderDTO 類表示客戶服務和訂單服務之間的契約:

public class OrderDTO {
    private int customerId;
    private String itemId;

    // constructor, getters, setters
}

3.1. 使用客戶端模塊共享DTO

微服務需要來自其他服務的某些信息來處理任何請求诅需。假設有第三個微服務接收訂單付款請求漾唉。與訂單服務不同,此服務需要不同的客戶信息:

public class CustomerDTO {
    private String firstName;
    private String lastName;
    private String cardNumber;

    // constructor, getters, setters
}

如果我們還添加了送貨服務堰塌,客戶信息將具有:

public class CustomerDTO {
    private String firstName;
    private String lastName;
    private String homeAddress;
    private String contactNumber;

    // constructor, getters, setters
}

因此赵刑,將 CustomerDTO 類放在共享模塊中起不到預期的作用。為了解決這個問題场刑,我們采用了一種不同的方法般此。

在每個微服務模塊中,創(chuàng)建一個客戶端模塊(依賴包)牵现,并在其旁邊創(chuàng)建一個服務端模塊:

order-service
|__ order-client
|__ order-server

order-client 模塊包含一個與客戶服務共享的DTO铐懊。因此,order-client模塊具有以下結構:

order-service
└──order-client
     OrderClient.java
     OrderClientImpl.java
     OrderDTO.java

OrderClient 是一個接口瞎疼,它定義了處理訂單請求的order方法:

public interface OrderClient {
    OrderResponse order(OrderDTO orderDTO);
}

為了實現(xiàn) order 方法科乎,我們使用 RestTemplate 對象向 order 服務發(fā)送POST請求:

String serviceUrl = "http://localhost:8002/order-service";
OrderResponse orderResponse = restTemplate.postForObject(serviceUrl + "/create", 
  request, OrderResponse.class);

此外,order-client模塊已經(jīng)可以使用了贼急。它現(xiàn)在成為 customer-service 模塊的依賴庫:

[INFO] --- maven-dependency-plugin:3.1.2:list (default-cli) @ customer-service ---
[INFO] The following files have been resolved:
[INFO]    com.baeldung.orderservice:order-client:jar:1.0-SNAPSHOT:compile

當然茅茂,如果 order-server 模塊沒有向 order-client 暴露 /create 服務端點,那也是不行滴太抓!

@PostMapping("/create")
public OrderResponse createOrder(@RequestBody OrderDTO request)

由于這個服務端點空闲,Customer Service 可以通過其order客戶端發(fā)送訂單請求。通過使用客戶端模塊走敌,微服務以更加獨立的方式相互通信碴倾。DTO中的屬性在客戶端模塊中更新。因此掉丽,違背契約僅限于使用相同客戶端模塊的服務跌榔。

4. 結論

本文解釋了一種在微服務之間共享DTO對象的方法。充其量机打,我們通過簽訂特殊契約作為微服務客戶端模塊(庫)的一部分來實現(xiàn)這一點矫户。通過這種方式片迅,我們將服務客戶端與包含API資源的服務端部分分開残邀。這樣做的好處是:

  • 服務之間沒有冗余
  • 違反契約僅限于使用同一客戶端的服務
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芥挣,更是在濱河造成了極大的恐慌驱闷,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件空免,死亡現(xiàn)場離奇詭異空另,居然都是意外死亡,警方通過查閱死者的電腦和手機蹋砚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诈泼,你說我怎么就攤上這事撒桨。” “怎么了墨坚?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵秧饮,是天一觀的道長。 經(jīng)常有香客問我泽篮,道長盗尸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任帽撑,我火速辦了婚禮泼各,結果婚禮上,老公的妹妹穿的比我還像新娘油狂。我一直安慰自己历恐,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布专筷。 她就那樣靜靜地躺著弱贼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磷蛹。 梳的紋絲不亂的頭發(fā)上吮旅,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音味咳,去河邊找鬼庇勃。 笑死,一個胖子當著我的面吹牛槽驶,可吹牛的內容都是我干的责嚷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼掂铐,長吁一口氣:“原來是場噩夢啊……” “哼罕拂!你這毒婦竟也來了揍异?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤爆班,失蹤者是張志新(化名)和其女友劉穎衷掷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柿菩,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡戚嗅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枢舶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懦胞。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凉泄,靈堂內的尸體忽然破棺而出医瘫,到底是詐尸還是另有隱情,我是刑警寧澤旧困,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布醇份,位于F島的核電站,受9級特大地震影響吼具,放射性物質發(fā)生泄漏僚纷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一拗盒、第九天 我趴在偏房一處隱蔽的房頂上張望怖竭。 院中可真熱鬧,春花似錦陡蝇、人聲如沸痊臭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽广匙。三九已至,卻和暖如春恼策,著一層夾襖步出監(jiān)牢的瞬間鸦致,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工涣楷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留分唾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓狮斗,卻偏偏與公主長得像绽乔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碳褒,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容

  • 本文是基于“微服務架構設計模式”這本書的總結和提煉折砸,將其中的關鍵知識點結合個人的開發(fā)實踐進行結合提煉捍壤,并對部分話題...
    彥幀閱讀 4,209評論 1 2
  • 摘要:本文中,我們將進一步理解微服務架構的核心要點和實現(xiàn)原理鞍爱,為讀者的實踐提供微服務的設計模式,以期讓微服務在讀者...
    Java架構師Carl閱讀 5,760評論 0 20
  • 久違的晴天专酗,家長會睹逃。 家長大會開好到教室時,離放學已經(jīng)沒多少時間了祷肯。班主任說已經(jīng)安排了三個家長分享經(jīng)驗沉填。 放學鈴聲...
    飄雪兒5閱讀 7,513評論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友佑笋。感恩相遇翼闹!感恩不離不棄。 中午開了第一次的黨會蒋纬,身份的轉變要...
    迷月閃星情閱讀 10,559評論 0 11
  • 可愛進取猎荠,孤獨成精。努力飛翔蜀备,天堂翱翔关摇。戰(zhàn)爭美好,孤獨進取碾阁。膽大飛翔输虱,成就輝煌。努力進取脂凶,遙望宪睹,和諧家園〔锨眨可愛游走...
    趙原野閱讀 2,723評論 1 1