首页 > 编程语言 >为了给Javaer落地DDD,我们不得不写开源组件

为了给Javaer落地DDD,我们不得不写开源组件

时间:2024-08-12 12:38:56浏览次数:13  
标签:Java CAP 开源 组件 Javaer 我们 生态 DDD

本文上回书接《这是DDD建模最难的部分(其实很简单)》,欢迎关注我的同名公众号。 https://mp.weixin.qq.com/s/HZKMLF0_I10iczzp2mAR-w  

故事背景

2013年中,我们的Java后端团队为了落地DDD,全面引入了dotnet技术栈,具体过程和成果,可以看我的B站频道《Java8 到 .NET8,团队升级报告 - 第二弹》https://www.bilibili.com/video/BV14YgYedE1f   在近半年的时间,我将自己落地DDD的实践经验进行提炼和总结,以公众号文章和B站视频的方式分享出来,与更多的网友建立链接和交流,得到了很多肯定反馈,也因为大家提供的视角,使得我自己对DDD的认知有了更深层次的迭代。   目前我们借助dotnet强大的生态以及csharp优良的语言设计,已经可以非常丝滑地用代码表达模型和业务,整个软件交付的体验和效率,获得了前所未有的进步。我们netcorepal-cloud-framework框架在这个过程中也得到了进化和可用性验证,我们坚信找到了一套更加务实的软件设计认知和方法论。  

Javaer太难了

由于我们团队实际上还是Java和csharp双技术栈,于是我们萌生了一个想法,是否可以让我们的Java项目交付过程也如此地丝滑?带着这个想法,我们开始在Java生态中寻找可以帮助我们构建出类似csharp框架效果的组件:  
  • Web框架: aspnetcore vs springboot
  • ORM:EntityFrameworkCore vs JPA
  • 中介者模式:MediatR vs ?
  • 事件的最终一致性实现:CAP vs ?
  其中“中介者模式”和“事件的最终一致性”实现我们没有找到合适的替代品,经过分析,“中介者模式”并不是必须的,虽然最终实现起来,没有csharp那么优雅,但并不影响对建模设计的实现,但“事件的最终一致性”这个组件,我们认为是必不可少的,我们建模最底层的模型就是“命令-事件”模型,没有事件处理的健壮性,意味着最终系统的健壮性无法保障,最终无法满足业务对可用性的要求。  

事件的最终一致性

  在我们的建模模型中,是在命令处理逻辑中,由领域模型发出事件,而事件如果要在微服务间传递,我们期望达到的效果如下:  
  1. 如果命令处理逻辑成功,即对应的数据库事务提交成功,则确保事件一定能够发出;
  2. 如果命令处理逻辑失败,即对应的数据库事务回滚,则确保事件一定不发出;
  在需求层面,我们并不要求系统确保事件“确定只发一次”,我们知道,这个要求的技术实现难度远远大于前面的两个要求,而且业务可以做幂等处理解决重发的问题。   下图展示了我们csharp版本中关于“命令-事件”的建模实现,以及事务的具体实现:

 

  在我们csharp的版本,我们使用了比较流行的CAP组件,https://github.com/dotnetcore/CAP,这个组件本质上是实现了outbox模式,通常也叫“发件箱模式”,借助这个组件,我们很轻易就实现了对于事件的最终一致性。   下图来自CAP组件的介绍页面,展示了发件箱模式的具体工作原理:                               从原理上看,发件箱模式并不是一个复杂的能力,我们认为一向以生态好为优点的Java生态,也一定有类似且流行的组件,很不幸的是,我们在互联网以及能够触达的Java圈子里调研一番之后,得出了如下结论:
  1. Java生态有关于分布式事务的实现,例如:JEE,JBoss等,但目前基本没有团队在用了;
  2. Java生态没有现成的类似CAP这样的组件可以开箱即用;
  上述结论仅表示我们目前的认知和信息渠道,如果有大佬能够给指个路,不甚感激!  

cap4j

  基于前面的结论,为了实现Java项目的DDD代码体验实践,我们开源了一个cap4j项目,期望能将CAP项目的能力移植到Java生态,项目地址:https://github.com/netcorepal/cap4j 该项目目前实现了JPA+RocketMQ的组合,我们规划在未来支持更多的ORM和MQ中间件,同时也会支持与CAP组件的协议兼容,以实现Java、dotnet异构架构的进一步融合。也欢迎大家为项目贡献代码和想法。  

最后

  关于技术生态这件事,可以说Java的生态好,但其它语言的生态我认为也都不差,在各自的领域都有非常多的优点。我在各个评论区,总是能看到各种不切实际的偏激言论,感受到种种的恶意。期望各个语言的技术栈从业者,能够更友好地交流,大家都是软件工程师,满足业务需求,实现商业价值,才是大家的更应该关注的。

标签:Java,CAP,开源,组件,Javaer,我们,生态,DDD
From: https://www.cnblogs.com/xiaoweiyu/p/18354728

相关文章

  • C#窗体自定义快捷操作键的实现 - 开源研究系列文章
          这次想到应用程序的窗体的快捷操作键的使用的问题。      上次发布过一个快捷键的例子(https://www.cnblogs.com/lzhdim/p/18342051),区别在于它是操作系统全局注册的热键,如果其它应用程序注册了对应的热键,那就会失效。此例子是对某个窗体里的按键的操作进行的......
  • 实用好软-----开源 很好用的计算机工具箱
    特点:软件版本:2.0软件特色:独立任务管理器,‘可以修复大部分的系统功能。默认以管理员模式运行。支持VMWARE、VBOX等虚拟机运行内置注册表。MBR防护支持系统:XP-11界面:   注意:0.由于本程序由易语言编写,某些杀毒软件(不包括火绒安全)对我的软件产品存在误报,我保证我的软件产......
  • 实用好软-----开源的文件比较工具
         文件比较工具       WinMerge是一款Windows平台下的开源差异比较与合并工具。WinMerge可比较文件和文件夹,以易于理解和处理的可视文本格式显示差异。此工具对于一些开发者比较适合。特征WinMerge对于确定项目版本之间的更改,然后合并版本之......
  • 【书生浦语大模型实战营学习笔记】第一课 浦语大模型全链路开源开放体系
    视频内容总结:视频是由汪周谦主讲,主题是介绍书生谱语大模型开源开放体系。内容主要包括以下几个方面: 1.**书生谱语大模型的发展历程**:-从2023年7月6日起,书生谱语大模型(Interlm)开始免费开源并商用,提供了全链条的开源工具体系。-2023年9月底,发布了适合中小企业和科研......
  • 智谱清影开源!
    6小时前,智谱清影开源!原创 陆再谋 AI电影共创社 2024年08月06日09:07 引言2024年8月6日,智谱清影(THUDM)团队宣布开源其创新的视频生成模型CogVideoX系列,这标志着视频内容创作的一个新里程碑。开源不仅促进了技术的共享和进步,也为广大开发者和研究者提供了探索和创新的......
  • 这是DDD建模最难的部分(其实很简单)
     本文书接上回《为了落地DDD,我是这样“PUA”大家的》,欢迎关注我的同名公众号。https://mp.weixin.qq.com/s/DjC0FSWY1bgJyLPIND5evA 什么是最重要的事 如果你认真读过前面的文章,那么一定知道我们的核心逻辑:领域驱动是一种价值观,这个价值观是:“领域(边界)”的明确是软件设......
  • DBSyncer:一款开源的数据同步中间件
    dbmotiondbsyncerdatax…介绍DBSyncer(英[dbsɪŋkɜː®],美[dbsɪŋkɜː®简称dbs)是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务,提供监控全量和增量数据统计......
  • YOLOv8开源揭秘:AI视觉技术在智能设备与系统全景应用
    目录一、引言二、YOLOv8模型简介三、YOLOv8的功能特性四、YOLOv8应用场景五、代码示例示例一:对图像进行目标检测示例二:对视频进行目标检测示例三:批量处理图像文件夹示例四:自定义模型进行目标检测示例五:实时摄像头目标检测示例六:获取目标检测的详细信息六、结语一......
  • 大冤种慧哥 - 10台充电桩赢利24万?【慧哥开源充电桩平台 HZCOS-chargeOS-cloud】
    特别申明:仅仅代表个人观点,错的地方虚心请教学习,各位手下留情众所周知,投资一门生意能否盈利的关键就在于成本和收入。为了更好的给大家讲解投资充电桩场站这门生意是否划算,本文详细讲解、如有不足之处、请大家多多谅解。建设一处充电桩运营场站的成本和收入如下:Ⅰ主要成......
  • 手把手教你运行Java开源框架若依RuoYi(视频教程)
    很多小伙伴在学习若依框架的时候,可能会遇到项目启动失败等各种问题。于是,我抽空制作了若依各个版本的项目启动教程,希望对初学者有一定帮助!在启动若依框架的时候,需要配置好基础开发环境。JDK版本使用1.8.xMySQL版本使用5.7.xNode版本使用14.xNacos版本使用2.0.xReids......