首页 > 其他分享 >【架构与设计】常见微服务分层架构的区别和落地实践

【架构与设计】常见微服务分层架构的区别和落地实践

时间:2024-10-22 15:20:48浏览次数:1  
标签:服务 结尾 定义 领域 分层 架构 落地

作者:京东科技 康志兴

前言

从强调内外隔离的六边形架构,逐渐发展衍生出的层层递进、注重领域模型的洋葱架构,再到和DDD完美契合的整洁架构。架构风格的不断演进,其实就是为了适应软件需求越来越复杂的特点。

可以看到,越现代的架构风格越倾向于清晰的职责定位,且让领域模型成为架构的核心。

基于这些架构风格,在软件架构设计过程中又有非常多的架构分层模型。

传统三层架构

传统服务通常使用三层架构:

门面层:作为服务暴露的入口,处理所有的外部请求。部分情况下,门面层甚至不需要单独定义对象而是直接使用服务层的实体定义。 •服务层:作为核心业务层,包含所有业务逻辑。并对基础层能力进行简单组合提供一定的能力复用。通常服务层会进行实体定义来防止下层对象体直接暴露给外部服务,导致底层任何变化都有可能直接传递到外部,非常不稳定。 •基础层:用来存放dao和外部rpc服务的封装,二者可以拆分为不同的module,也可合二为一,以不同package进行隔离。

三层架构特点就是简单,适用于一些无复杂业务场景的小型应用,或者“数据不可变”作为基础原则的DOP(面向数据编程)服务。

但是当业务场景稍微复杂一些、调用层级较多时,可复用性、可维护性就都非常差了,很多代码都耦合在一起,牵一发动全身。

 


 

 

DDD架构

DDD架构可以看做是整洁架构的一种实现,分层职责如下:

适配层:用来做外部不同端请求的适配器,隔离不同端的协议差异,包装不同端不同样式的响应体。 •应用层:用例、任务入口、消息队列监听均在这一层,可以理解为业务流程的入口,通过聚合根的构造执行相应的命令操作。 •领域服务层:包含核心的领域服务定义,并定义了gateway来做一层依赖倒置,使基础设施层仅做实现。 •基础设施层包含一切基础能力:数据库、ES、远程调用封装等等。

 


 

优点

核心稳定:领域模型在依赖链上是顶层角色,不依赖任何其他模块,所以极其稳定。其他任何业务域、存储、边缘能力的变化都不会对领域模型造成影响。 •敏捷:适合不同团队一起开发和维护而不会产生冲突。 •可拆分:当有届上下文随着演进逐渐膨胀时,很容易拆分成微服务。 •可扩展:添加新的功能非常简单,从而使得开发人员能够更快的部署和调整。 •可演进:良好的可测试性带来非常低的重构成本,不会随着不断迭代导致项目成为难以修改的“大泥球”。

如此多的优点自然带来明确的缺点

专业性要求较高:需要对业务、架构原则理解深刻的人员进行设计和维护,不恰当的领域模型将使后续迭代极为痛苦。 •开发成本高:复杂的架构设计,更多的架构分层,自然带来代码行数的指数级增长。尤其是项目前期的开发任务变得异常繁重。 •不再适合简单的业务场景:实现一个简单的CRUD显得过于复杂。 •改变决策困难:尝试使用整洁架构需要和团队的管理层和其他成员达成一致,这往往需要非常强大的说服力。如果在架构演进过程中想切换回其他架构模式也十分困难,几乎是整个项目级别的重构工作。

简单的微服务分层架构

基于六边形架构规范的接口适配原则和防腐理念,同时借鉴了CQRS模式的优点,我们定义了一个简单的微服务分层架构

骨架Maven坐标:

<groupId>com.jdt.open</groupId>
<artifactId>simple-microservices-layered-architecture-archetype</artifactId>
<version>1.4.0</version>

分层定义:

门面层:作为程序的入口,通过包隔离来存放JSF服务、Rest服务、定时任务和MQ消费,其中对外提供服务的接口定义存放在单独的api包中。该层的请求定义命名以Request结尾,响应体命名以Response结尾。 •领域服务层:每一个领域服务存放在单独的module中,并通过单独的api包对外暴露能力。该层的命令请求定义命名以Command结尾,查询请求定义命名以Query结尾,响应体命名以Dto结尾。 •基础设施层:存放数据库、ES、远程调用服务的封装。该层的持久化数据定义命名以Po结尾。远程命令服务入参命名以RpcCommand结尾,远程查询服务入参命名以RpcQuery结尾,响应体命名以RpcDto结尾。

 

 

最佳实践

1.命令服务必须访问领域服务层,允许简单查询直接调用基础设施层。 2.参数校验、请求出入参日志、审计日志记录、TraceID预埋、异常处理等非核心业务能力均由公共组件(参考: Open-Lab组件包 )完成,减少项目内部的边缘能力代码。 3.由于在门面层进行统一的异常处理,非必要时无需在项目中进行大面积的try-catch,让代码更清爽。 4.实际开发过程中,门面层、领域服务层和基础设施层均有各自的实体定义,跨层调用的对象体转换使用MapStruct组件来减少手写映射代码的工作量。 5.数据层使用Fluent-Mybatis,最大好处是减少后期迭代中,数据对象增减字段时修改Mapper的成本。

优点

1. 开发效率

简单的业务开发过程中,相比较书写核心业务逻辑,更多的工作量几乎都是来自处理跨层调用时对象转换和Mapper定义,通过MapStruct和Fluent-Mybatis等组件的使用(也许再加上GitHub Copilot

标签:服务,结尾,定义,领域,分层,架构,落地
From: https://www.cnblogs.com/Jcloud/p/18492968

相关文章

  • Linux使用nc(netcat)命令检测网络端口是否畅通以及Linux查看CPU架构命令arch及CentOS
    一、Linux使用nc(netcat)命令检测网络端口是否畅通    nc命令netcat的简写,netcat即是网络猫的意思,在linux系统中nc命令实际执行命令是ncat。nc命令是一个功能强大的网络工具。平常主要用于实现TCP/UDP端口的侦听和收发,nc可作为server以TCP或UDP方式侦听指定端口,也可作为cl......
  • 架构和运行机制
    本篇主要介绍Streamlit的核心架构和运行机制,目的是希望朋友们能先从整体上宏观的了解Streamlit,利用它提供的机制开发性能更高效的应用。1.架构Streamlit比较特殊,它对使用者来说是BS架构应用,而随开发者来说其实更像一个CS架构的应用。为什么说Streamlit更像CS架构呢?因为后端......
  • Docker架构
    什么是Docker?Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础设施分离,从而更快速地交付软件。通过Docker,您可以像管理应用程序一样管理基础设施。利用Docker在代码发布、测试和部署方面的方法,您可以大大缩短从编写代码到在生产......
  • 对提供微信聊天背景图网站的架构与技术推测
    说明:该网站主要提供各种超高清的微信聊天背景图片,包括蓝天白云、沙漠、海洋、落日海岸等自然景观图片,同时还有一些如原神相关的图片分类。网站还提供每日超高清4K微信背景图推荐等内容。website: www.ccwallpaper.com网站架构方面-**分层架构**-**表现层**:负责展示图......
  • x86_64架构下交叉编译aarch64架构所使用的qt库
    本文基于qt版本5.12.8在x86_64位上交叉移植出aarch64架构使用的库一、编译环境x86_64uisrc@ubuntu:~$archx86_64uisrc@ubuntu:~$^Cuisrc@ubuntu:~$二、QT版本5.12.8下载解压wgethttp://download.qt.io/archive/qt/5.12/5.12.8/single/qt-everywhere-src-5.12.8......
  • 一文搞懂SaaS应用架构:应用服务、应用结构、应用交互设计
    大家好,我是汤师爷~今天系统性地聊聊SaaS应用架构设计。应用架构概述我们已经完成了SaaS系统的定位分析,明确了系统的目标和核心能力。这为接下来的应用架构设计奠定了基础。应用架构就像整个SaaS系统的骨架,决定了系统的整体结构和各个组件之间的关系。接下来,我们会深入探讨应用......
  • 探索ArkWeb的奥秘:架构了解与生命周期管理
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。ArkWeb(方舟Web)是华为鸿蒙Harmon......
  • 软件架构风格之MVC架构
    一、前言在序章中已经介绍了MVC架构,MVC即模型-视图-控制器模式,该架构的核心组件是模型(Model)、视图(View)、控制器(Controller),各个部件之间职责明确,以实现搞内聚低耦合的系统。Model层的作用和职责①表示应用程序的数据结构和业务逻辑;②包含用于访问、更改和保存数据的方法;③负责......
  • 【STC15】面向对象的.h/.c程序架构
    .h文件#ifndef__MAIN_H_#define__MAIN_H_/*Includes------------------------------------------------------------------*/#include<STC15.h>/*externvariables-----------------------------------------------------------*//*externfunctionprot......
  • 基于Lambda架构的大数据处理详解
    1.软件项目简介及工作职责在我参与的大数据开发项目中,主要是构建一个实时与离线数据处理并行的系统,以满足业务对高效数据处理和及时响应的要求。该系统旨在收集并处理来自多个数据源的实时和批量数据,主要处理流程分为实时流处理和批量离线处理。在项目中,我的主要工作职责......