1. 概述
近年來,微服務變得很是流行。微服務的基本特徵之一是它們是模塊化的、獨立的、易於伸縮的。微服務須要一塊兒工做並交換數據。爲了實現這一點,咱們建立一個稱爲dto的共享數據傳輸對象。java
在本文中,咱們將介紹在微服務之間共享dto的方法。web
2. 將域對象暴露爲DTO
表示應用程序域的模型使用微服務進行管理。領域模型是不一樣的關注點,咱們將它們與DAO層中的數據模型分離開來。api
這樣作的主要緣由是,咱們不想經過服務向客戶端公開領域的複雜性。相反,咱們經過REST api在服務於應用程序客戶機的服務之間公開dto。當dto在這些服務之間傳遞時,咱們將它們轉換爲域對象。服務器
上面的面向服務的體系結構示意圖地顯示了從DTO到域對象的組件和流程。微信
3.微服務之間的DTO共享
以客戶訂購產品的過程爲例。這個過程基於客戶訂單模型。讓咱們從服務架構的角度來看這個過程。架構
假設客戶服務向訂單服務發送請求數據爲:app
"order": {
"customerId": 1,
"itemId": "A152"
}
客戶和訂單服務使用契約相互通訊。契約(另外一種服務請求)以JSON格式顯示。做爲一個Java模型,OrderDTO類表示客戶服務和訂單服務之間的契約:maven
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類放在共享模塊中再也不知足預期的目的。爲了解決這個問題,咱們採用一種不一樣的方法。
在每一個微服務模塊中,讓咱們建立一個客戶端模塊(庫),在它旁邊建立一個服務器模塊:
order-service
|__ order-client
|__ order-server
訂單客戶端模塊包含一個與客戶服務共享的DTO。所以,訂單客戶端模塊的結構以下:
order-service
└──order-client
OrderClient.java
OrderClientImpl.java
OrderDTO.java
OrderClient是一個定義處理訂單請求的訂單方法的接口:
public interface OrderClient {
OrderResponse order(OrderDTO orderDTO);
}
爲了實現order方法,咱們使用RestTemplate對象向order服務發送一個POST請求:
String serviceUrl = "http://localhost:8002/order-service";
OrderResponse orderResponse = restTemplate.postForObject(serviceUrl + "/create",
request, OrderResponse.class);
此外,訂單客戶端模塊已經能夠使用了。如今它變成了客戶服務模塊的依賴庫:
[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模塊向訂單客戶端公開「/create」服務端點,這就沒有任何意義:
@PostMapping("/create")
public OrderResponse createOrder(@RequestBody OrderDTO request)
因爲有了這個服務端點,客戶服務能夠經過其訂單客戶端發送訂單請求。經過使用客戶端模塊,微服務以一種更隔離的方式彼此通訊。DTO中的屬性在客戶機模塊中更新。所以,合同的破壞僅限於使用相同客戶端模塊的服務。
4. 結論
在本文中,咱們解釋了在微服務之間共享DTO對象的方法。最好的狀況是,咱們經過制定特殊的契約做爲microservice客戶端模塊(庫)的一部分來實現這一點。經過這種方式,咱們將服務客戶端與包含API資源的服務器部分分離開來。所以,有一些好處:
-
服務之間的DTO代碼中沒有冗餘 -
合同的破壞僅限於使用相同客戶端庫的服務
本文分享自微信公衆號 - Java碼農(jarcoder)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。