浅谈Java开发架构之领域驱动设计DDD落地
整个过程大概是这样的,开发团队和领域专家一起通过 通用语言(Ubiquitous Language)去理解和消化领域知识,从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域),并在子领域上建立模型,再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型。
依靠领域驱动设计的设计思想,通过事件风暴建立领域模型,合理划分领域逻辑和物理边界,建立领域对象及服务矩阵和服务架构图,定义符合DDD分层架构思想的代码结构模型,保证业务模型与代码模型的一致性。通过上述设计思想、方法和过程,指导团队按照DDD设计思想完成微服务设计和开发。
1、拒绝泥球小单体、拒绝污染功能与服务、拒绝一加功能排期一个月
2、架构出高可用极易符合互联网高速迭代的应用服务
3、物料化、组装化、可编排的服务,提高人效
三、服务架构接口服务位于用户接口层,用于处理用户发送的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落地的资料请关注好吧啦网其它相关文章!
相关文章:
1. css代码优化的12个技巧2. MyBatis JdbcType 与Oracle、MySql数据类型对应关系说明3. ASP 信息提示函数并作返回或者转向4. .NET SkiaSharp 生成二维码验证码及指定区域截取方法实现5. 在JSP中使用formatNumber控制要显示的小数位数方法6. CentOS邮件服务器搭建系列—— POP / IMAP 服务器的构建( Dovecot )7. ASP中实现字符部位类似.NET里String对象的PadLeft和PadRight函数8. jsp网页实现贪吃蛇小游戏9. 存储于xml中需要的HTML转义代码10. ASP中if语句、select 、while循环的使用方法
