下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 18 | DTO和DMO为什么要互转?
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Spring Boot与Kubernetes云原生微服务实践

共94讲 · 约900分钟
4742
免费
01 | 课程介绍
免费
02 | 背景说明
免费
03 | 课程目标和主要内容
免费
04 | 课程案例需求
免费
05 | 课程补充说明
免费
06 | 为何采用微服务架构?
免费
07 | 架构设计和技术栈选型
08 | 数据和接口模型设计:账户...
09 | 数据和接口模型设计:业务...
10 | Dubbo、Spring Cloud和Ku...
11 | Dubbo、Spring Cloud和Ku...
12 | Dubbo、Spring Cloud和Ku...
13 | 技术中台到底讲什么?
14 | Staffjoy项目结构组织
15 | 谷歌为何采用单体仓库(Mo...
16 | 微服务接口参数校验为何重...
17 | 如何实现统一异常处理?
18 | DTO和DMO为什么要互转?
19 | 如何实现基于Feign的强类...
20 | 为什么框架层就要考虑分环...
21 | 异步处理为何要复制线程上...
22 | 为你的接口添加Swagger文...
23 | 主流微服务框架概览
24 | 网关和BFF是如何演化出来...
25 | 网关和BFF是如何演化出来...
26 | 网关和反向代理是什么关系...
27 | 网关需要分集群部署吗?
28 | 如何设计一个最简网关?
29 | Faraday网关代码解析(上...
30 | Faraday网关代码解析(下...
31 | 生产级网关需要考虑哪些环...
32 | 主流开源网关概览
33 | 安全认证架构演进:单块阶...
34 | 安全认证架构演进:单块阶...
35 | 安全认证架构演进:微服务...
36 | 基于JWT令牌的安全认证架...
37 | JWT的原理是什么?
38 | JWT有哪两种主要流程?
39 | Staffjoy安全认证架构和S...
40 | 用户认证代码剖析
41 | 服务调用鉴权代码剖析
42 | 如何设计用户角色鉴权?
43 | Spring Boot微服务测试该...
44 | 什么是契约驱动测试?
45 | 什么是测试金字塔?
46 | 单元测试案例分析
47 | 集成测试案例分析
48 | 组件测试案例分析
49 | Mock vs Spy
50 | 何谓生产就绪(Production...
51 | Spring Boot如何实现分环...
52 | Apollo vs SpringCloudC...
53 | CAT vs Zipkin vs Sk...
54 | CAT vs Zipkin vs Sk...
55 | 结构化日志和业务审计日志
56 | 集中异常监控和Sentry
57 | EFK & Prometheus &...
58 | 本地开发部署架构和软件需...
59 | 手工服务部署和测试(上)
60 | 手工服务部署和测试(中)
61 | 手工服务部署和测试(下)
62 | SkyWalking调用链监控实...
63 | Docker和Docker Compose...
64 | 容器镜像构建Dockerfile解...
65 | Docker Compose服务部署...
66 | 将Staffjoy部署到本地Doc...
67 | 将Staffjoy部署到本地Doc...
68 | 到底什么是云原生架构?
69 | Kubernetes背景和架构
70 | Kubernetes有哪些基本概念...
71 | Kubernetes有哪些基本概念...
72 | 理解Kubernetes节点网络和...
73 | 深入理解Service和Service...
74 | NodePort vs LoadBalanc...
75 | 本地测试Kubernetes部署文...
76 | 本地测试Kubernetes环境搭...
77 | 将Staffjoy部署到本地Kub...
78 | 将Staffjoy部署到本地Kub...
79 | 生产环境Kubernetes部署文...
80 | 阿里云Kubernetes环境创建
81 | 将Staffjoy部署到阿里云K...
82 | Kubernetes应用动态配置实...
83 | Kubernetes应用金丝雀发布...
84 | 阿里云资源释放
85 | 课程复盘
86 | 项目扩展和应用
87 | Account服务
88 | Company服务
89 | Mail、SMS和Bot服务
90 | Faraday服务
91 | WhoAmI服务
92 | WWW服务
93 | 前端应用
94 | 结束语

精选留言(13)

  • 2019-08-15
    老师,我们用得dozer来进行拷贝的,不知道性能和modelmapper哪个更好?

    作者回复: 网上有对5种mapping框架的性能比对,可以参考一下:https://www.baeldung.com/java-performance-mapping-frameworks

    1
    1
  • 2019-07-24
    波波老师有一个点比较纠结,基于rest的微服务下,服务的controller本身就是一个 service的角色了而不是传统的mvc的交互逻辑了,那是不是DTO到controller就可以了,内部子service全部用DO会更方便。

    作者回复: 这些代码组织方式都是逻辑性的,形成规范保持一致就好,没必要纠结拘泥于形式。

    1
  • 2019-07-18
    request/response这是很标准的做法,在经典的soa中叫文档消息模式。其实定义一个通用的响应结果类加泛型也可以支持feign,序列化和反序列化也是没问题的。另外service层是直接复用控制器中的request/response对象,不需要再多定义一套dto吧?其实不建议“偷懒”通过这种反射工具做映射,有时候某层的模型字段变更了(虽然db只让加字段不让改字段),编译器和ide不直接感知可能会有风险...

    作者回复: 谢谢你的反馈!
    1. 经过和学员交流,Response<T>方式也可以实现基于feign的强类型客户端,后面会再开发一个项目,采用这种方式,供大家参考。
    2. 直接复用DMO也可以做到,而且可以减少转换,但是有些复杂场景,将DTO/DMO分开定义,也有好处,课程中也有提到,这样两边比较清晰,可以根据需要灵活裁剪或添加字段,可以减少依赖和判断逻辑。
    3. 映射工具的确也是有利有弊的,使用时要了解其弊端,并针对性防范(比如单测)。

    1
    1
  • 2019-07-18
    老师你好, dto 和 vo 有用法上的推荐吗 ?

    作者回复: DTO数据传输对象,VO值对象,它们的用途大致类似,主要用于在进程间传递数据,不同程序员习惯称谓不同而已,没有必要太纠结,根据你的习惯选择并且保持一致性即可。

    1
  • 2019-07-17
    我们目前应用服务层入参和返回值采用DTO,领域服务层一般采用实体对象、值对象或简单参数,两层之间的数据传递采用对象映射,也是采用Model Mapper ,然后通过多层基类继承和泛型分别实现通用的增删改查方法和通用业务状态管理,以及代码自动生成技术,现在做到只要数据模型定义完成,一键生成各层代码,然后根据应用服务层产生的DTO类,根据业务需求定义各个DTO的类属性(各个业务入参和返回值数据)一个模块的通用业务功能就实现了。引用阿里前端委员会的四大技术方向定义“在前端的体系中,习惯把 To B 看成是中后台,它的特质是布局、表单、可视化图表等都是高度标准化的,在这样的体系中,如何用低代码或者无代码体系来完成重塑是关键,其中包含了大量的组件、元件、模块。”我们基本实现了“低代码或者无代码体系来完成重塑”。
    展开

    作者回复: 不错,已经做到自动化和精细化阶段,值得借鉴。

    1
  • 2019-08-28
    杨老师,我们现在微服务改造想把项目中的velocity改掉(用于发短信/邮件的模板引擎,由于最新的Spring boot对Velocity支持不太好),目前可供选择的是freemarker和Thymeleaf ,您认为用这两个用哪个会相对好一点。

    作者回复: freemarker和thymeleaf这些模版引擎都差不多,邮件模版的话,可能freemarker更合适一些,个人看法。

  • 2019-08-15
    老师我们没有定义DTO,接口全部返回的是Map<String,Object>对象,传参也是。这样就不用在客户端和服务端共享数据模型了。这种方式可取吗

    作者回复: 这也是一种做法,相当于弱类型接口,有点类似javascipt弱类型语言做法,也可以,就是客户/服务器端自己要解析麻烦一点。

  • 2019-08-03
    我们是用了自己写的一个util, 支持对象T和List<T>, Map<T> 三种数据模式的copy

    作者回复: cool,有机会可以开源分享下你们的这个工具。

  • 2019-07-26
    请问有人用过orika嘛?
    modelmapper 和 orika建议选择哪个好?

    作者回复: 从github上看,orika和modelmapper的历史时间差不多,都是2011 ~ 2019, orika有780星,modelmapper有1192星,两个差不多。

    参考:
    https://github.com/orika-mapper/orika/graphs/contributors
    https://github.com/modelmapper/modelmapper/graphs/contributors
    https://github.com/modelmapper/modelmapper/graphs/contributors

  • 2019-07-20
    老师求教 DAO 和DMO 和DTO 有啥区别呀

    作者回复: DAO = 数据访问对象,封装数据库操作的对象
    DMO = 数据模型对象,也称实体对象或领域对象,封装数据存储字段,主要用于持久化领域数据。
    DTO = 数据传输对象,也有称VO值对象,封装数据传输字段,主要用于在进程间传递数据。

    1
  • 2019-07-18
    org.mapstruct.Mapper这个包吗?用来映射DTO和DMO

    作者回复: 对,项目用了mapstruct(https://github.com/mapstruct/mapstruct),做DTO和DMO之间的映射。

  • 2019-07-17
    modelmapper支持copy包含复杂对象的dto吗?

    作者回复: 支持,具体用法可以参考官方文档http://modelmapper.org/

  • 2019-07-16
    波波老师,请教两个问题。1⃣️为什么dto package下既有request结尾的类,也有response结尾的类,还有dto和list结尾的类,看起来有点不那么优雅,这方面大厂有什么规范吗?2⃣️我们在使用feign的时候都是返回一个统一带泛型resonse,好像没有序列化问题,像波波老师的做法,response对象会不会无比的多。

    作者回复: 1. 对,每个服务操作严格有一对Request/Response消息对应,这个是grpc/protobuf的规范做法,可以参考https://github.com/Staffjoy/v2/tree/master/protobuf。之前大厂ebay的trading api(https://developer.ebay.com/devzone/xml/docs/reference/ebay/index.html),也是采用这种接口风格。这是一种类rpc编程风格,我的staffjoy项目中的微服务虽然是RESTful的,但是沿用了这种类似谷歌grpc的编程风格,目的是实现类似rpc的强类型接口,request/response是会多一点,但是只要规范,不是大问题。

    2. 具体要看你怎么实现的,能否贴一个带范型response示例和客户端feign接口示例?