DDD落地:京东的微服务生产项目,DDD如何落地?

尼恩说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:

谈谈你的DDD落地经验?

谈谈你对DDD的理解?

如何保证RPC代码不会腐烂,升级能力强?

微服务如何拆分?

微服务爆炸,如何解决?

你们的项目,DDD是怎么落地实操的?

所以,这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V137版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取

除了本文,尼恩输出了一个 《从0到1,带大家精通DDD》系列,帮助大家彻底掌握DDD,链接地址是:

《阿里DDD大佬:从0到1,带大家精通DDD》

《阿里大佬:DDD 落地两大步骤,以及Repository核心模式》

《阿里大佬:DDD 领域层,该如何设计?》

《极兔面试:微服务爆炸,如何解决?Uber 是怎么解决2200个微服务爆炸的?》

《阿里大佬:DDD中Interface层、Application层的设计规范》

《字节面试:请说一下DDD的流程,用电商系统为场景》

《DDD如何落地:去哪儿的DDD架构实操之路》

《DDD落地:从腾讯视频DDD重构之路,看DDD极大价值》

《DDD落地:从美团抽奖平台,看DDD在大厂如何落地?》

《美团面试:微服务如何拆分?原则是什么?》

《DDD神药:去哪儿结合DDD,实现架构大调优》

《DDD落地:从网易新闻APP重构,看DDD的巨大价值》

《DDD落地:从阿里单据系统,看DDD在大厂如何落地?》

《DDD落地:有赞的生产项目,DDD如何落地?》

《DDD落地:从携程订单系统重构,看DDD的巨大价值》

大家可以先看前面的文章,再来看本篇,效果更佳。

另外,尼恩会结合一个工业级的DDD实操项目,在第34章视频《DDD的学习圣经》中,给大家彻底介绍一下DDD的实操、COLA 框架、DDD的面试题。

DDD现在非常火爆,是有其巨大生产价值,经济价值的, 绝不仅仅是一套概念那么简单。

DDD的绝大价值,具体请参见以下视频:

从腾讯视频DDD重构案例,看看DDD极大价值

文章目录

    • 尼恩说在前面
    • 一、前言
    • 二、首先,我们需要思考一下: 什么是微服务架构?
      • a. 白马是马
      • b. 服务治理
      • c. 十二要素
    • 三、其次,我们的问题焦点:微服务架构的难点是什么?
      • 第一个难点, 微服务的服务治理和流量治理
      • 第二个难点, 微服务拆分的架构思想
    • 四、最后,来点干货: 采灵通系统–微服务架构落地实践
      • 1. 业务场景解析
      • 2. 技术架构解析
        • 1)业务前端层
        • 2)网关层
        • 3)业务服务层
        • 4)技术底座层
      • 3. 最终服务落地
    • 五、总结
    • 说在最后
    • 尼恩技术圣经系列PDF

一、前言

作者:京东物流 赵勇萍

现在对于一个后端开发工程师来说,微服务,DDD都是挂在嘴边的东西,感觉大家接触到多,也了解的多。然而,个人对微服务架构的理解却如同我小时候读《三国演义》,随着年龄和经验的增长,感受也各不相同。微服务对于开发人员而言,如同千面镜,每个人看到的风景都独具特色。基于此,我想结合自己的业务实践,分享一下在微服务架构实践过程中的心路历程。

二、首先,我们需要思考一下: 什么是微服务架构?

在笔者看来,微服务架构并没有一个准确的定义,但他会有很多特征,通过描述他的特征用来把控它是什么。

a. 白马是马

这是一个哲学命题,表明个别和一般的关系。我认为,任何的技术和架构都不是凭空出现的,一定是发展而来,而微服务架构的前身就是SOA,面向服务的编程。SOA是一种架构设计模式和思想,微服务架构继承了这一思想。在我看来,微服务就像是那匹白马,它将复杂系统从业务视角划分为独立的模块,每个模块都具有提供服务的能力。基于这些能力,我们构建了一个复杂的系统架构,并在此基础上演化了去中心化和分布式思想。

b. 服务治理

以上说的是思想层级,在战术层面,微服务架构的核心诉求和能力在于服务治理,包括服务寻址、流量管理、可观测性等。

c. 十二要素

Heroku创始人Adam Wiggins 提出的微服务十二要素,下面,我贴出我对微服务十二要素的解读:

注意:请点击图像以查看清晰的视图!

这十二要素可以说是微服务架构的方法论,有了思想,方法论和战术维度,我觉得就可以完整的描绘出一个微服务架构的全景图。然后,我将我理解的微服务架构总结成一句话:

微服务架构是一种去中心化的分布式服务架构,具备服务寻址、故障容错、流量调度、控制访问和可观测性的服务治理能力,从而实现服务的隔离性、可移植性、可扩展性和稳定性。

三、其次,我们的问题焦点:微服务架构的难点是什么?

笔者认为,微服务的两个核心点正事他的难点:

第一个难点, 微服务的服务治理和流量治理

对于这个难点,现阶段已经有了很好的解决,因为服务治理和流量治理具有去业务场景化的特点,许多先行者通过努力和开源框架的贡献,使我们能够直接应用并实现良好兼容。以下是一个典型的微服务治理架构图:

注意:请点击图像以查看清晰的视图!

第二个难点, 微服务拆分的架构思想

如何基于领域驱动设计(DDD)方法论将服务分解落地。这里涉及许多核心能力,如子域划分、限界上下文定义、实体、聚合根抽象、基于领域事件的事件驱动设计,以及工厂模式、策略等设计模式的应用。

这第二个难点是很难做到直接的迁移,因为面对的业务场景各异。前人经验只能以思想为指导,但具体的实施将考验每位架构师的经验和理解。如同画家对同一景色的诠释各异,有的成为梵高,有的成为毕加索。对我而言,现阶段可能只是一个初学素描的爱好者。然而,我仍愿意分享我在采灵通项目中对微服务落地的经验,供大家参考。

四、最后,来点干货: 采灵通系统–微服务架构落地实践

笔者负责的采灵通业务是一个相对复杂的系统,带领20人的开发团队历时5个月,从零开始设计、开发并上线。该系统涵盖了ToB全供应链数字化相关的全场景业务。下面将从业务场景分析、技术架构解析和服务落地几个方面解读该系统的实践过程。

1. 业务场景解析

理解DDD的前提是先要理解业务场景,笔者的业务场景是采灵通SAAS系统,在此简单做一个业务介绍:

采灵通是一个标准的提供B商城触达的,同时解决企业数字化采购供应链的SAAS平台,核心能力包括多供应商协同,订单管理,商品管理,客户管理,及B商城的搭建和管理,具体如下图所示:

注意:请点击图像以查看清晰的视图!

2. 技术架构解析

基于以上业务场景,我们构建出我们的技术架构方案,如下图所示:

注意:请点击图像以查看清晰的视图!

在技术架构上,整体分为四层,自上而下为: 业务前端层, 网关层, 业务服务层,技术底座层。

1)业务前端层

前端根于业务场景,有多个触达端,最主要的端有供应商管理端,伙伴管理端,PC商城端,H5商城端, 页面装修系统。前端封装有统一的组件库,保证了整个系统的前端交互风格一致性。

2)网关层

入口网关为nginx反向代理,主要功能是对不同域名的SSL解析和路径映射,部分前端静态资源的直接映射。入口网关下为业务网关,包括COP网关和通用业务域网关。

通用业务域网关:主要功能是将前端有状态的HTTP请求(header:jwt信息加密和域名信息过滤),进行鉴权,过滤,路由。同时解析为明文上下文Map,存于header中,可供业务层服务使用。其中针对不同域名的路由信息是采用了nacos的配置中心进行统一管理,并下发至gateway,实现一个动态的域名路由管理。

COP网关:负责系统对外开放平台的API接口鉴权和路由代理。

3)业务服务层

该层又有细分,分为COP服务,业务平台服务,数据平台服务。

a. COP:主要封装对外开发接口统一认证服务。通过COP,SAAS系统可以实现与第三方供应链接口平台和伙伴客户ERP系统、政采平台、OMS系统等对接。

b. 业务平台:分为核心的领域服务层和聚合/适配器服务层。

领域服务层:基于DDD领域驱动设计思想,对现有业务进行抽象,按照不同子域划分不同的服务。每个领域服务内有针对该子域的聚合根抽象封装。聚合服务:针对不同业务场景,对领域服务调用进行一层聚合,使其更好地为前端提供接口服务。

应用聚合层:针对业务场景进行封装和聚合。

适配器服务层:针对不具有领域概念的但又有一定意义的服务进行封装,如基于CQRS设计理念的查询服务;以及后台异步任务服务,如数据导入导出、数据同步等。

以上这几层可以看成是对六边形架构的一个很好的分解和落地。

c. 数据平台层:针对SAAS系统的产生核心数据,例如订单,商品,基于CQRS理念,将数据进行整合和同步,实现多场景下单数据复杂查询和BI数据分析。

4)技术底座层

该层细分的话,可以分为TPAAS服务和BPAAS服务两部分。

TPAAS服务:包括k8s、容器化编排、Istio流量管理、日志采集和查看、链路追踪监控、中间件(数据存储、MQ)、CI/CD等。

BPAAS服务:包含基础jar包(如低代码框架、安全组件)和基础服务(如工作流服务、任务调度服务、分布式ID生成器服务等)。

3. 最终服务落地

注意:请点击图像以查看清晰的视图!

采灵通系统总计服务65个,按照服务分类分层的概念,结合DDD的六边形架构思想,可以分为:

前端服务,BFF服务,组合服务,适配器服务,领域服务,基础服务,网关服务。

其中这些服务有一些设计规约:

1. 领域服务不可依赖组合/聚合服务、适配器服务和BFF服务。

2. 组合/聚合服务和适配器服务不可依赖BFF服务

3. 领域服务进行天然分库处理。

五、总结

笔者通过采灵通业务场景的落地实践,最大的感触是在前期子域拆分时候的纠结,在此,给大家讲个例子:

比如商品模块,前期会考虑到底是拆成一个商品子域呢,还是拆成两个子域:伙伴商品子域和供应商商品子域。如果是一个商品子域,业务实现上会简单一些,但未来业务场景拓展会受限。如果拆成两个子域,前期系统设计会增加复杂度,包括商品池的同步问题,数据一致性问题,等等。但后期来说,会更适配业务场景,所以最终笔者的选择是跟产品经理充分沟通过业务需求后,选择了拆成两个子域。

所以,作为一个业务架构师,第一要务是要有充分理解业务的能力,所以如何跟产品经理紧密配合,其实是一个业务架构师的核心能力。其次才是技术维度的能力,包括对六边形架构的把控,对多种设计模式的应用,对系统高并发和高可用性的应对经验等。后面所说的这些能力,对于一个技术宅来说是很好提升的,但对于前面的这个能力,可能就因人而异了。

说在最后

DDD架构如何落地,是是非常常见的面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,并且在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

当然,关于DDD,尼恩即将给大家发布一波视频 《第34章:DDD的学习圣经》, 帮助大家彻底穿透DDD。

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/220011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web漏洞分析-SQL注入XXE注入(中下)

随着互联网的不断普及和Web应用的广泛应用,网络安全问题愈发引起广泛关注。在网络安全领域中,SQL注入和XXE注入是两个备受关注的话题,也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞,带您探寻背后的原…

【UE】在场景中或控件蓝图上显示移动的文字

目录 效果 步骤 一、制作含有文字的图片 二、在场景中显示移动的文字 三、在控件蓝图上显示 效果 步骤 一、制作含有文字的图片 打开PS,新建一个宽度为600,高度为50的文档 添加一段文字 保存 二、在场景中显示移动的文字 1. 打开UE编辑器&#x…

Avalonia框架下面使用Prism框架实现MVVM模式

前言 默认情况下,使用Avalonia模板创建的Avalonia项目自带了Mvvm框架,其实用着也蛮好用的,但是前期在WPF开发中习惯了使用Prism框架,所以今天我们就来研究一下如何在Avalonia项目里面引入Prism框架来提高开发效率。 创建Avaloni…

JS加密/解密之HOOK实战

之前的章节有介绍过Javascript的Hook相关的基础知识,相信大部分人也知道了什么是Hook,今天我们来讲一下Hook实战,实际的运用。 0x1.事上练 // 程序员们基本都喜欢简单精辟 直入主题 不喜欢咬文嚼字 我们先直接上代码 var _log console.log…

OpenCvSharp从入门到实践-(05)通道

目录 1、拆分通道 1.1、实例1-拆分一副BGR图像的通道 1.2、实例2-拆分一副HSV图像的通道 2、合并通道 2.1 实例3-合并通道的顺序不同,图像的显示效果也不通 实例4-合格H通道图像、S通道图像、V通道图像 3、综合运用拆分通道和合并通道 2.2、实例5-只把H通道…

一文介绍接口测试中的请求和响应

在测试工作中,我们经常要对web应用或者app进行接口测试,接口测试过程中最重要的就是掌握一个接口中的请求和响应。本文主要是为大家介绍一下接口中的请求和响应到底是什么,在前后端交互中主要起什么作用。 一:介绍一下HTTP 我们…

一文带你了解Java中synchronized原理

🌈🌈🌈今天给大家分享的是Java中 synchronized 的基本原理 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流&#xff…

2023 年 O 基础学习 SwiftUI

关于 SwiftUI SwiftUI 于2019年6月3日在苹果的全球开发者大会(WWDC)上首次亮相。在这次活动中,苹果正式宣布了 SwiftUI,并将其列为 iOS 13 和 macOS Catalina 的一部分。 SwiftUI 是一种用于构建用户界面的 UI 框架。SwiftUI 的设…

Servlet基础知识

Servlet是Java提供的一门动态的web资源开发技术 Servlet是JavaEE规范之一&#xff0c;其实就是一个接口&#xff0c;将来我们需要定义Servlet类实现Servlet接口&#xff0c;并由web服务器运行Servelt Servlet快速入门 创建web项目&#xff0c;导入Servlet依赖坐标 <depe…

百度Apollo新版本Beta技术沙龙参会体验

在自动驾驶领域&#xff0c;百度的Apollo一直是业界开源的标杆。其持续升级和创新的开源项目为整个自动驾驶行业树立了典范&#xff0c;不仅推动了技术的发展&#xff0c;也为广大的社区开发者们提供了学习和参考的范本。最近百度发布了Apollo新的Beta版本&#xff0c; 新版本B…

【PID学习笔记 6 】控制系统的性能指标之二

写在前面 上文介绍了控制系统的稳态与动态、过渡过程、阶跃响应以及阶跃信号作用下过渡过程的四种形式。本文紧接上文&#xff0c;首先总结过渡过程的分类&#xff0c;然后介绍控制系统的性能评价&#xff0c;最后重点介绍控制系统性能指标中的单项指标。 一、过渡过程的分类…

四.多表查询

多表查询 1.一个案例引发的多表连接1.1案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3案例分析与问题解决 2.多表查询分类讲解分类1&#xff1a;等值连接vs非等值连接分类2&#xff1a;自连接vs非自连接分类3&#xff1a;内连接vs外连接 3.SQL99语法实现多表…

读书笔记-《数据结构与算法》-摘要2[冒泡排序]

冒泡排序 核心&#xff1a;冒泡&#xff0c;持续比较相邻元素&#xff0c;大的挪到后面&#xff0c;因此大的会逐步往后挪&#xff0c;故称之为冒泡。 public class BubbleSort {public static void main(String[] args) {int unsortedArray[] new int[]{6, 5, 3, 1, 8, 7, 2…

旋转设备状态监测与预测性维护:提高设备可靠性的关键

在工业领域的各个行业中&#xff0c;旋转设备都扮演着重要的角色。为了确保设备的可靠运行和预防潜在的故障&#xff0c;旋转设备状态监测及预测性维护变得至关重要。本文将介绍一些常见的旋转设备状态监测方法&#xff0c;并探讨如何利用这些方法来实施预测性维护&#xff0c;…

Java的第二十一章:网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可以编写出高质量的网络通信程序。 …

周周爱学习之快速排序

快速排序&#xff0c;顾名思义&#xff0c;快速排序是一种速度非常快的一种排序算法 平均时间复杂度为O(),最坏时间复杂度为O()数据量较大时&#xff0c;优势非常明显属于不稳定排序 1.算法描述 每一轮排序选择一个基准点&#xff08;pivot&#xff09;进行分区 让小于基准点…

supervisord + nginx + Daphne + django4.0 最新asgi服务器部署实验

由于需要用到channel&#xff0c;最近在研究通过asgi部署django。 先吐槽一下官方文档&#xff0c;这个地方讲的非常简单。然后中文互联网环境能找到的都是3.0试用的说明&#xff0c;这玩意是不是真的没人用啊&#xff1f;还是说Django已经脱离时代了。。。 简单研究了一下&am…

洗地机好用吗?口碑好的洗地机有哪些?

自从洗地机开始引入市场以来&#xff0c;它一直受到人们的关注。它在解放家庭清洁劳动力和提供快速方便的清洁方面表现出色&#xff0c;超越了多年来传统的拖把清洁方式。越来越多的人选择使用洗地机来完成家庭清洁任务。如果你也对洗地机产生了浓厚的兴趣&#xff0c;并想购买…

【MATLAB源码-第93期】基于matlab的白鲸优化算法(BWO)和鲸鱼优化算法(WOA)机器人栅格路径规划对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 白鲸优化算法&#xff08;BWO&#xff09; 白鲸优化算法是受到白鲸捕食和迁徙行为启发的一种算法。其主要特点和步骤包括&#xff1a; 1. 搜索食物&#xff08;全局搜索&#xff09;&#xff1a;算法模仿白鲸寻找食物的行为。…

【模型报错记录】‘PromptForGeneration‘ object has no attribute ‘can_generate‘

通过这个连接中的方法解决&#xff1a; “PromptForGeneration”对象没有属性“can_generate” 期刊 #277 thunlp/OpenPrompt GitHub的 问题描述&#xff1a;在使用model.generate() 的时候报错&#xff1a;PromptForGeneration object has no attribute can_generate 解决方法…
最新文章