电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談Java開發架構之領域驅動設計DDD落地

瀏覽:2日期:2022-08-10 11:37:25
目錄一、前言二、開發目標三、服務架構3.1、應用層{application}3.2、領域層{domain}3.3、基礎層{infrastructrue}3.4、接口層{interfaces}四、開發環境五、代碼示例六、綜上總結一、前言

整個過程大概是這樣的,開發團隊和領域專家一起通過 通用語言(Ubiquitous Language)去理解和消化領域知識,從領域知識中提取和劃分為一個一個的子領域(核心子域,通用子域,支撐子域),并在子領域上建立模型,再重復以上步驟,這樣周而復始,構建出一套符合當前領域的模型。

淺談Java開發架構之領域驅動設計DDD落地

二、開發目標

依靠領域驅動設計的設計思想,通過事件風暴建立領域模型,合理劃分領域邏輯和物理邊界,建立領域對象及服務矩陣和服務架構圖,定義符合DDD分層架構思想的代碼結構模型,保證業務模型與代碼模型的一致性。通過上述設計思想、方法和過程,指導團隊按照DDD設計思想完成微服務設計和開發。

1、拒絕泥球小單體、拒絕污染功能與服務、拒絕一加功能排期一個月

2、架構出高可用極易符合互聯網高速迭代的應用服務

3、物料化、組裝化、可編排的服務,提高人效

三、服務架構

淺談Java開發架構之領域驅動設計DDD落地

3.1、應用層{application} 應用服務位于應用層。用來表述應用和用戶行為,負責服務的組合、編排和轉發,負責處理業務用例的執行順序以及結果的拼裝。 應用層的服務包括應用服務和領域事件相關服務。 應用服務可對微服務內的領域服務以及微服務外的應用服務進行組合和編排,或者對基礎層如文件、緩存等數據直接操作形成應用服務,對外提供粗粒度的服務。 領域事件服務包括兩類:領域事件的發布和訂閱。通過事件總線和消息隊列實現異步數據傳輸,實現微服務之間的解耦。3.2、領域層{domain} 領域服務位于領域層,為完成領域中跨實體或值對象的操作轉換而封裝的服務,領域服務以與實體和值對象相同的方式參與實施過程。 領域服務對同一個實體的一個或多個方法進行組合和封裝,或對多個不同實體的操作進行組合或編排,對外暴露成領域服務。領域服務封裝了核心的業務邏輯。實體自身的行為在實體類內部實現,向上封裝成領域服務暴露。 為隱藏領域層的業務邏輯實現,所有領域方法和服務等均須通過領域服務對外暴露。 為實現微服務內聚合之間的解耦,原則上禁止跨聚合的領域服務調用和跨聚合的數據相互關聯。3.3、基礎層{infrastructrue} 基礎服務位于基礎層。為各層提供資源服務(如數據庫、緩存等),實現各層的解耦,降低外部資源變化對業務邏輯的影響。 基礎服務主要為倉儲服務,通過依賴反轉的方式為各層提供基礎資源服務,領域服務和應用服務調用倉儲服務接口,利用倉儲實現持久化數據對象或直接訪問基礎資源。3.4、接口層{interfaces}

接口服務位于用戶接口層,用于處理用戶發送的Restful請求和解析用戶輸入的配置文件等,并將信息傳遞給應用層。

四、開發環境

jdk1.8【jdk1.7以下只能部分支持netty】

springboot 2.0.6.RELEASE

idea + maven

五、代碼示例

itstack-demo-ddd-01

└── src

    ├── main

    │   ├── java

    │   │   └── org.itstack.demo

    │   │       ├── application

    │   │       │├── event

    │   │       ││   └── ApplicationRunner.java

    │   │       │└── service

    │   │       │    └── UserService.java

    │   │       ├── domain

    │   │       │├── model

    │   │       ││   ├── aggregates

    │   │       ││   │   └── UserRichInfo.java

    │   │       ││   └── vo

    │   │       ││       ├── UserInfo.java

    │   │       ││       └── UserSchool.java

    │   │       │├── repository

    │   │       ││   └── IuserRepository.java

    │   │       │└── service

    │   │       │    └── UserServiceImpl.java

    │   │       ├── infrastructure

    │   │       │├── dao

    │   │       ││   ├── impl

    │   │       ││   │   └── UserDaoImpl.java

    │   │       ││   └── UserDao.java

    │   │       │├── po

    │   │       ││   └── UserEntity.java

    │   │       │├── repository

    │   │       ││   ├── mysql

    │   │       ││   │   └── UserMysqlRepository.java

    │   │       ││   ├── redis

    │   │       ││   │   └── UserRedisRepository.java

    │   │       ││   └── UserRepository.java

    │   │       │└── util

    │   │       │    └── RdisUtil.java

    │   │       ├── interfaces

    │   │       │├── dto

    │   │       ││└── UserInfoDto.java

    │   │       │└── facade

    │   │       │└── DDDController.java

    │   │       └── DDDApplication.java

    │   ├── resources

    │   │   └── application.yml

    │   └── webapp

    │       └── WEB-INF

    │        └── index.jsp

    └── test

         └── java

             └── org.itstack.demo.test

                 └── ApiTest.java

application/UserService.java | 應用層用戶服務,領域層服務做具體實現

public interface UserService { UserRichInfo queryUserInfoById(Long id);}

domain/repository/IuserRepository.java | 領域層資源庫,由基礎層實現

public interface IUserRepository { void save(UserEntity userEntity); UserEntity query(Long id);}

domain/service/UserServiceImpl.java | 應用層實現類,應用層是很薄的一層可以只做服務編排

@Service('userService')public class UserServiceImpl implements UserService { @Resource(name = 'userRepository') private IUserRepository userRepository; @Override public UserRichInfo queryUserInfoById(Long id) {// 查詢資源庫UserEntity userEntity = userRepository.query(id);UserInfo userInfo = new UserInfo();userInfo.setName(userEntity.getName());// TODO 查詢學校信息,外部接口UserSchool userSchool_01 = new UserSchool();userSchool_01.setSchoolName('振華高級實驗中學');UserSchool userSchool_02 = new UserSchool();userSchool_02.setSchoolName('東北電力大學');List<UserSchool> userSchoolList = new ArrayList<>();userSchoolList.add(userSchool_01);userSchoolList.add(userSchool_02);UserRichInfo userRichInfo = new UserRichInfo();userRichInfo.setUserInfo(userInfo);userRichInfo.setUserSchoolList(userSchoolList);return userRichInfo; }}

infrastructure/po/UserEntity.java | 數據庫對象類

public class UserEntity { private Long id; private String name; get/set ...}

infrastructrue/repository/UserRepository.java | 領域層定義接口,基礎層資源庫實現

@Repository('userRepository')public class UserRepository implements IUserRepository { @Resource(name = 'userMysqlRepository') private IUserRepository userMysqlRepository; @Resource(name = 'userRedisRepository') private IUserRepository userRedisRepository; @Override public void save(UserEntity userEntity) {//保存到DBuserMysqlRepository.save(userEntity);//保存到RedisuserRedisRepository.save(userEntity); } @Override public UserEntity query(Long id) {UserEntity userEntityRedis = userRedisRepository.query(id);if (null != userEntityRedis) return userEntityRedis;UserEntity userEntityMysql = userMysqlRepository.query(id);if (null != userEntityMysql){ //保存到Redis userRedisRepository.save(userEntityMysql); return userEntityMysql;}// 查詢為NULLreturn null; }}

interfaces/dto/UserInfoDto.java | DTO對象類,隔離數據庫類

public class UserInfoDto { private Long id;// ID public Long getId() {return id; } public void setId(Long id) {this.id = id; }}

interfaces/facade/DDDController.java | 門面接口

@Controllerpublic class DDDController { @Resource(name = 'userService') private UserService userService; @RequestMapping('/index') public String index(Model model) {return 'index'; } @RequestMapping('/api/user/queryUserInfo') @ResponseBody public ResponseEntity queryUserInfo(@RequestBody UserInfoDto request) {return new ResponseEntity<>(userService.queryUserInfoById(request.getId()), HttpStatus.OK); }}六、綜上總結

以上基于DDD一個基本入門的結構演示完成,實際開發可以按照此模式進行調整。目前這個架構分層還不能很好的進行分離,以及層級關系的引用還不利于擴展。

以上就是淺談Java開發架構之領域驅動設計DDD落地的詳細內容,更多關于Java開發架構 領域驅動設計DDD落地的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 无线对讲-无线对讲系统解决方案-重庆畅博通信 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 云南成人高考_云南成考网| 道康宁消泡剂-瓦克-大川进口消泡剂供应商| 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 防堵吹扫装置-防堵风压测量装置-电动操作显示器-兴洲仪器 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 深圳成考网-深圳成人高考报名网 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 模具硅橡胶,人体硅胶,移印硅胶浆厂家-宏图硅胶科技 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 风化石头制砂机_方解石制砂机_瓷砖石子制砂机_华盛铭厂家 | 上海阳光泵业制造有限公司 -【官方网站】 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 协议书_协议合同格式模板范本大全 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 顺辉瓷砖-大国品牌-中国顺辉| 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 |