点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

1. 概述

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

2. 将域对象发布为DTO

使用微服务管理表示应用程序域的模型。域模型的关注点与 DTO 不同,我们将它们与DAO层中的数据模型分开。这样做的主要原因是我们不想通过服务向客户暴露我们领域的复杂性。

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

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

3. 微服务间共享DTO

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

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

Customer 和 Order 服务使用 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-clientOrderClient.javaOrderClientImpl.javaOrderDTO.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资源的服务端部分分开。这样做的好处是:

  • 服务之间没有冗余

  • 违反契约仅限于使用同一客户端的服务

热门内容:
  • @Autowire和@Resource注解使用的正确姿势,别再用错的了!!

  • 再见了,收费的 Navicat!

  • 数据库链接池终于搞对了,这次直接从100ms优化到3ms!

  • 给IDEA换个酷炫的主题,这个有点哇塞啊!

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

如何跨微服务共享DTO相关推荐

  1. .NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...

    32 | 集成事件:解决跨微服务的最终一致性 首先看一下集成事件的工作原理 它的目的时为了实现系统的集成,它主要是用于系统里面多个微服务之间相互传递事件 集成事件的实现方式有两种,一种是图上显示的发布 ...

  2. 如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...

    目录 设计重点 流程图 伪代码 2.1. PublishEvent 2.2. SubscribeEvent 2.3. Publisher 2.4. Subscriber 微服务 强一致性 3.1 Pu ...

  3. java event sourcing_使用Spring Cloud和Reactor在微服务中实现EventSourcing -解道Jdon

    使用Spring Cloud和Reactor在微服务中实现Event Sourcing 当在微服务架构中构建应用时,状态管理成为分布式系统的问题,相比于传统monolithic应用,将状态管理通过事务 ...

  4. 微服务应用-基于Spring Cloud和Reactor构建网上商店微服务(下)

    前言 上篇主要是讲解理论知识和项目架构要点,这篇将集中在微服务中使用spring Boot.Spring Cloud和Project Reactor实现事件溯源的原始主题.文章中也会介绍项目实现一些技 ...

  5. 微服务架构的核心要点和实现原理

    https://blog.csdn.net/qiansg123/article/details/80131044 微服务架构中职能团队的划分 传统单体架构将系统分成具有不同职责的层次,对应的项目管理也 ...

  6. 基于实战开发垂直搜索引擎_基于DDD的微服务设计和开发实战

    作者:欧创新.邓頔.文艺 你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务 ...

  7. ddd 访问权限_基于DDD的微服务设计和开发实战

    作者:欧创新.邓頔.文艺 你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务 ...

  8. 微服务架构的核心要点和实现原理解析

    摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的项目中起到积极的作用. 微服务架构中职能团队的划分 传统单体架构将系统分成具 ...

  9. 微服务架构中职能团队的划分

    传统单体架构将系统分成具有不同职责的层次,对应的项目管理也倾向于将大的团队分成不同的职能团队,主要包括:用户交互UI团队.后台业务逻辑处理团队与数据存取ORM团队.DBA团队等.每个团队只对自己分层的 ...

最新文章

  1. 百万年薪挖了个P8程序员,难道是“水货”?
  2. 在 asp.net core \ vs2015 update2 情况况下创建 asp.net core web application 的问题
  3. CSP认证202012-2 期末预测之最佳阈值[C++题解]:遍历、前缀和
  4. u盘正常接入后计算机无法看到,u盘在我的电脑显示不出来怎么办-处理u盘在我的电脑无法显示的方案 - 河东软件园...
  5. Kibana 创建索引 POST 403 (forbidden) on create index
  6. 很好用的ISO制作软件
  7. idead断点调试_IDEA---断点调试Debug
  8. 前端学习(2956):项目中组件的本地注册
  9. InfluxDB学习之InfluxDB数据保留策略(Retention Policies)
  10. mysql 跳表 b 树_简单谈谈Mysql索引与redis跳表
  11. 接口的屏蔽和限流很难么?Redis全搞定!
  12. mega2560电脑识别不到端口后_Qt音视频开发41-人脸识别嵌入式
  13. java三个技术平台_Java的3个平台有什么区别
  14. macbook使用共享屏幕实现VNC远程控制
  15. java控制台五子棋工程_java控制台实现五子棋小游戏
  16. 微信公众号获取定位地图(有经纬度)
  17. 本地blast详细用法
  18. 移植WebRTC中的VAD
  19. 卸载idea步骤(快速彻底)
  20. Batch Normalization(BN)超详细解析

热门文章

  1. 解决Ubuntu系统下git clone下载速度较慢的问题(亲测有效)
  2. oracle数据库增加新字段
  3. JAVA实现长连接(含心跳检测)Demo
  4. Shell基础命令之echo
  5. 文件解析库doctotext源码分析
  6. 【转】触屏手机电话拨打链接
  7. 一个中国人看了爽的笑话
  8. XWiki 4.3 正式版发布
  9. [转载 js] YUI解决mouseout事件冒泡的办法
  10. 用ASP.NET建立一个在线RSS新闻聚合器(3)