架构分层模型适配.pptx

上传人(卖家):无敌的果实 文档编号:2526897 上传时间:2022-04-29 格式:PPTX 页数:39 大小:5.65MB
下载 相关 举报
架构分层模型适配.pptx_第1页
第1页 / 共39页
架构分层模型适配.pptx_第2页
第2页 / 共39页
架构分层模型适配.pptx_第3页
第3页 / 共39页
架构分层模型适配.pptx_第4页
第4页 / 共39页
架构分层模型适配.pptx_第5页
第5页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、架构分层模型适配 有效防架构腐化实践CONTENTS01DDD分层参考架构0203严纪律 防腐化 分层模型适配分层模型适配实例DDD分层参考架构DDD分层参考架构前端应前端应给户提供界,关注户交互和体验API服务为前端应提供 服务,关注事务和分布式等技术性问题API后台服务业务领域领域模型和领域逻辑,关注业务概念。基础设施访问外界系统(调外界系统)的技术相关实现。分层依据: 系和技术点DDD分层参考架构 - 前端应前端应前端应DDD重点关注后台业务服务,不解决前端交互问题UX关注的层系: 终端户诉求: 良好的户体验技术点: 机交互设计和实现API服务业务领域基础设施DDD分层参考架构为前端和第

2、三应提供API服务,关注服务编排,事务和分布式等前端应系: 应开发员诉求: 灵活易使的API技术点: 性能,事务,分布式,安全等功能性需求作内容:API服务技术员关注的层接收外部请求并响应: 如HTTP请求, 消息处理事务管理认证业务领域缓存志基础设施异常处理配置Session模型:View ObjectResource Model腐化案例: 量业务逻辑堆积DDD分层参考架构前端应领域模型和领域逻辑,关注业务概念。系: 业务领域专家,业务领导诉求: 表现业务概念和实现业务价值要点: 业务建模和复杂性管理API服务作内容:业务领域基础设施建业务模型,并体现在代码上管理模型复杂度,适度拆分模块实现

3、业务逻辑业务员关注的层模型:应服务 跨Bond Context DTO领域服务 跨聚合腐化案例:聚合 实体 仓库 事件亏空量技术术语业务员完全看不懂DDD分层参考架构前端应访问外界系统(调外界系统)的技术相关实现。系: 外界系统诉求: 稳定调外部系统技术点: 使和适配外部系统模型,隔离和快速诊断错误API服务作内容:业务领域 学习和使外部系统,如数据库,邮件系统适配外部系统模型,如SQL映射到模型对象基础设施技术员关注的层模型内容:PO第三Protobuffer第三SDK腐化案例:业务逻辑和外部调逻辑混合如个法即处理业务逻辑调SQLDDD分层参考架构 Java技术视UX关注的层前端应Web,S

4、pring Boot, Kafka, Redis, JTA,两阶段提交,SSO,服务注册技术员关注的层业务员关注的层API服务尽量少依赖技术框架,让业务员也看得懂代码业务领域ORM, SQL DB, NoSql,服务发现基础设施技术员关注的层参考架构对微软 DDD NLayered .NET 4.0 Architecture前后端分离,完全剥离曾现层Controller概念下移到Application层为了简便,合并Web Service和Application层https:/ Layer,Domain和Repositories基础设施层对应Gateways,HTTP Client和ORMht

5、tps:/ Architecture前端应API服务业务领域基础设施https:/ Architecture前端应class diagrams, and state diagramsPackage diagramAPI服务业务领域基础设施use casesactivity diagramdeployment diagramhttps:/en.wikipedia.org/wiki/4%2B1_architectural_view_modelDDD分层架构对Enterprise architecture framework前端应API服务业务领域基础设施如何有效防架构腐化分层模型适配架构腐化是系统

6、开发过程中常头疼的事情。使DDD分层架构参考实践,可以在系统初始设计的时候领域明确出来。但问题是开发过程中不知不觉层次模糊,架构师有没有实践能有效阻架构腐化?如何从盘散沙到百万雄师百万雄师的铸造秘密 踢正步 叠被知合每个常就能做到在常最细微处抵抗懒散腐化 坚持塑造纪律DDD分层架构 不同模型适配(名词)前端应API服务资源模型: 应想要把查询获取所有信息,个操作做完业务业务模型: 精确表达个业务概念,分治管理复杂度存储模型: 性能最优化业务领域基础设施DDD分层架构 不同模型适配(动词)前端应API服务HTTP法: POST GET PUT DELETE业务操作: 注册 注销 登录 退出 修改

7、 撤销存储动作: INSERT UPDATE DELETE业务领域基础设施DDD分层架构治理不同层级的模型坚决隔离,前端应严格对翻译映射,不准复资源模型: 应想要把查询获取所有信息,个操作做完业务HTTP法: POST GET PUT DELETEAPI服务业务模型: 精确表达个业务概念,分治管理复杂度业务操作: 注册 注销 登录 退出 修改 撤销业务领域存储模型: 性能最优化基础设施存储动作: INSERT UPDATE DELETEDDD分层架构治理动词翻译映射前端应HTTP法: POST GET PUT DELETEAPI服务create retrieve update delete业务

8、领域业务操作: 注册 注销 登录 退出 修改 撤销 查看 查询 验证码 激活savefind基础设施存储动作: INSERT UPDATE DELETEDDD分层架构治理名词翻译映射前端应资源模型: 户想要把查询获取所有信息,个操作做完业务HTTP字符本JsonAPI服务个户请求个视图对象视图对象业务领域多个固定的业务概念表达业务规则业务模型: 分解的业务概念SQL: 冗余字段设计, 主外键关联基础设施NoSQL: 冗余字段设计,Schema宽列存储模型: 性能最优化DDD分层架构治理名词翻译映射Http Restfull APIRPC前端应HTTP字符本JsonBinaryProtobuff

9、er ObjectView ObjectAPI服务Data Transfer ObjectDomain Object (Entity, Value Object)Data Transfer Object业务领域Persist Object / Protobuffer Object /View Object基础设施JsonHTTP字符本DBRPCHttp Restfull API分层模型适配实例户账户注册和激活架构治理中的踢正步案例-户注册和激活处理注册信息填写注册信息HTTP POST 注册信息保存注册信息发送注册激活码验证激活码填写激活码HTTP POST 激活码保存激活信息案例-户注册 -

10、1POST/usersmobile: “13520181212”,password: 29WLV742前端应对字段映射翻译到业务模型createUser(registerInfo)class RegisterInfo(mobile: String,password: OptionString)API服务register(account, parterId)class Account(uid:OptionUUID, mobile: String,password: OptionPassword,activated:Boolean=False)业务领域class Password(password

11、Plain: String)def passwordHash() = encode(password)def passwordExpiration() =save(account)基础设施CREATE TABLE account (从业务业务模型翻译出存储模型uid varchar(32) NOT NULL,login_id varchar(128) DEFAULT NULL,password_hash varchar(128) DEFAULT NULL,name varchar(100) DEFAULT NULL,activated bit(1) DEFAULT NULL DEFAUT 0,

12、created_timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTpassword_expiration timestamp DEFAULT NULL,PRIMARY KEY (uid);案例-户注册 -2前端应register(account, parterId)verify(account)save(account)notifyVerificationToken()API服务class VerificationToken(account: AccountexpireToken: String,expiryTime:Date,业务领域ver

13、ifyType: String)基础设施save(verificationToken)从业务业务模型翻译出存储模型CREATE TABLE verification_token (verification_id bigint(20) unsigned NOT NULL AUTOaccount_uid varchar(32) NOT NULL,token varchar(128) NOT NULL,通过短信发送注册激活码expiry_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,verify_type varchar(32) NOT NULL

14、,PRIMARY KEY (verification_id),CONSTRAINT account_uid_fk FOREIGN KEY (account_uid) REFERENCES accou);案例-户注册 - 动名词个数总结前端应API服务动词名词应服务领域模型基础设施113132业务领域基础设施案例-户激活PUT /users/activateuid: “d219-xww0-13af-b021”,token: “23u3$z4o6799前端应对字段映射翻译到业务模型updateActivate(activateInfo)class ActivateInfo(uid: String,

15、token: String)API服务activate(VerificationToken)class VerificationToken(account: AccountexpireToken: String,expiryTime:Date,业务领域verifyType: String)save(account)基础设施从业务业务模型翻译出存储模型UPDATE account SET activated =account.activateddelete(verificationToken)案例-户激活 - 动名词个数总结前端应API服务动词名词应服务领域模型基础设施112122业务领域基础设

16、施原则即使不同层的模型字段完全样,也要求各创建。架构师职责提炼概念管理复杂性坚持原则 但不增加作量public class User public class SystemUser private String firstName;private String lastName;private String phone;private String first;private String last;private String address;private String city;private String state;private String zip;private String

17、phone;private String addressLine1;private String addressLine2;private String city;private String state;private String zip;/ getters and setters/ ./ getters and setters/ .import mons.beanutils.BeanUtils;UserBean newObject = new UserBean();BeanUtils.copyProperties(newObject, oldObject);坚持原则看似作量多 其实降低了

18、复杂度(纠结)systemUser.setFirstName(user.getFirst();systemUser.setLastName(user.getLast();systemUser.setPhone(user.getPhone();如果从概念上User模型就是只有个addresssystemUser.setAddressLine1(user.getAddress();systemUser.setAddressLine2(user.getAddress();保持User模型的纯洁降低了复杂度systemUser.setCity(user.getCity();systemUser.set

19、State(user.getState();systemUser.setZipcode(user.getZip();守护原则-CI检查 分层架构单元测试import com.tngtech.archunit.junit.AnalyzeClasses;import com.tngtech.archunit.junit.ArchTest;import com.tngtech.archunit.lang.ArchRule;import static com.tngtech.archunit.library.Architectures.layeredArchitecture;AnalyzeClasse

20、s(packages = com.tngtech.archunit.example)public class LayeredArchitectureTest ArchTeststatic final ArchRule layer_dependencies_are_respected = layeredArchitecture().layer(“Applications).definedBy(com.tngtech.archunit.example.applications.).layer(“Domain).definedBy(com.tngtech.archunit.example.domai

21、n.).layer(Infrastructure).definedBy(com.tngtech.archunit.example.infrastructure.whereLayer(Applications).mayNotBeAccessedByAnyLayer().whereLayer(Services).mayOnlyBeAccessedByLayers(Applications).whereLayer(“Infrastructure).mayOnlyBeAccessedByLayers(Services);https:/www.archunit.org/守护原则-CI检查 分层模型单元测

22、试import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;AnalyzeClasses(packages = com.tngtech.archunit.example)public class DaoRulesTest ArchTeststatic final ArchRule DAOs_must_reside_in_a_dao_package =cla

23、sses().that().haveNameMatching(.*Dao).should().resideInAPackage(.dao.).as(DAOs should reside in a package .dao.);ArchTeststatic final ArchRule entities_must_reside_in_a_model_package =classes().that().resideInsideOfPackage(“.domains.model.).should().resideInAPackage(.model.).as(“Domain models should

24、 reside in package .model.);ArchTeststatic final ArchRule only_DAOs_may_use_the_EntityManager =noClasses().that().resideOutsideOfPackage(.dao.).should().accessClassesThat().areAssignableTo(EntityManager.class).as(Only DAOs may use the + EntityManager.class.getSimpleName();https:/www.archunit.org/THANK YO U

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 常用办公文档
版权提示 | 免责声明

1,本文(架构分层模型适配.pptx)为本站会员(无敌的果实)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|