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源创计划”,欢迎正在阅读的你也加入,一块儿分享。