近些年来,微服务变得愈来愈流行。微服务基本特征是模块化、独立、易于扩展的。它们之间须要协同工做并交换数据。为了实现这一点,咱们建立了名为 DTO
的共享数据传输对象。在本文中,咱们将介绍在微服务之间共享DTO的方法。javascript
使用微服务管理表示应用程序域的模型。域模型的关注点与 DTO 不一样,咱们将它们与DAO层中的数据模型分开。
这样作的主要缘由是咱们不想经过服务向客户暴露咱们领域的复杂性。java
偏偏相反,咱们经过 REST API 暴露 DTO 为客户端提供服务。当DTO在这些服务之间传递时,咱们将它们转换为域对象。shell
上面的 面向服务架构
示意性地显示了DTO到域对象的组件和流程。架构
以客户订购产品的过程为例。此过程基于 Customer-Order 模型,从服务体系结构的角度来看看这个过程。
假设客户服务将请求数据发送到订单服务:app
"order": { "customerId": 1, "itemId": "A152" }
Customer
和 Order
服务使用 contracts (契约)
进行通讯。contract(或者是服务请求)以JSON格式显示。做为 Java
模型,OrderDTO
类表示客户服务和订单服务之间的契约:maven
public class OrderDTO { private int customerId; private String itemId; // constructor, getters, setters }
微服务须要来自其余服务的某些信息来处理任何请求。假设有第三个微服务接收订单付款请求。与订单服务不一样,此服务须要不一样的客户信息:模块化
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
类放在共享模块中起不到预期的做用。为了解决这个问题,咱们采用了一种不一样的方法。post
在每一个微服务模块中,建立一个客户端模块(依赖包),并在其旁边建立一个服务端模块:3d
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); }
为了实现 order 方法,咱们使用 RestTemplate 对象向 order 服务发送POST请求:
String serviceUrl = "http://localhost:8002/order-service"; OrderResponse orderResponse = restTemplate.postForObject(serviceUrl + "/create", request, OrderResponse.class);
此外,order-client模块已经可使用了。它如今成为 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客户端发送订单请求。经过使用客户端模块,微服务以更加独立的方式相互通讯。DTO中的属性在客户端模块中更新。所以,违背契约仅限于使用相同客户端模块的服务。
本文解释了一种在微服务之间共享DTO对象的方法。充其量,咱们经过签定特殊契约做为微服务客户端模块(库)的一部分来实现这一点。经过这种方式,咱们将服务客户端与包含API资源的服务端部分分开。这样作的好处是: