淺談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落地的資料請關注好吧啦網其它相關文章!
相關文章: