关于spring:微服务之间如何共享DTO

56次阅读

共计 2197 个字符,预计需要花费 6 分钟才能阅读完成。

1. 概述

近些年来,微服务变得越来越风行。微服务基本特征是模块化、独立、易于扩大的。它们之间须要协同工作并替换数据。为了实现这一点,咱们创立了名为 DTO 的共享数据传输对象。在本文中,咱们将介绍在微服务之间共享 DTO 的办法。

2. 将域对象公布为 DTO

应用微服务治理示意应用程序域的模型。域模型的关注点与 DTO 不同,咱们将它们与 DAO 层中的数据模型离开。
这样做的次要起因是咱们不想通过服务向客户裸露咱们畛域的复杂性。

恰恰相反,咱们通过 REST API 裸露 DTO 为客户端提供服务。当 DTO 在这些服务之间传递时,咱们将它们转换为域对象。

下面的 面向服务架构 示意性地显示了 DTO 到域对象的组件和流程。

3. 微服务间共享 DTO

以客户订购产品的过程为例。此过程基于 Customer-Order 模型,从服务体系结构的角度来看看这个过程。
假如客户服务将申请数据发送到订单服务:

"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 类放在共享模块中起不到预期的作用。为了解决这个问题,咱们采纳了一种不同的办法。

在每个微服务模块中,创立一个客户端模块(依赖包),并在其旁边创立一个服务端模块:

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 中的属性在客户端模块中更新。因而,违反契约仅限于应用雷同客户端模块的服务。

4. 论断

本文解释了一种在微服务之间共享 DTO 对象的办法。充其量,咱们通过签订非凡契约作为微服务客户端模块(库)的一部分来实现这一点。通过这种形式,咱们将服务客户端与蕴含 API 资源的服务端局部离开。这样做的益处是:

  • 服务之间没有冗余
  • 违反契约仅限于应用同一客户端的服务

如果你感觉文章还不错,记得关注公众号:锅外的大佬
锅外的大佬博客

正文完
 0