这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
前言
六边形架构如图下所示,这个架构是在公司跟大师学到的一个开发架构问题,他所带来的好处对于开发是很流畅的,在当下业务驱动技术的时代,一切都要以业务为主,当然六边形的架构就是随着不断地演进,从最初的三层一直演进到现在的DDD领域驱动设计。
什么是六边形
六边形正如上图所示,没有死角全是一个适配器,不管数据从哪里进来都可以经过中间的应用层,从而达到需要的数据,六个边都是适配器,把每一个应用的出口都抽象化,不管是谁只要实现整个抽象接口,那么你就可以使用这套业务逻辑代码,而不需要动所有的代码。而在这这种重点是一个名为端口的东西,端口就是应用的入口和出口,在我们公司采用三层架构,架构如下Api层,App层,domain层,infra层。
核心架构四层
Api层,接口层放置 controller 与 eventHandler位于六边形的入口
App层,业务层 service 与 service impl的业务层,用于对数据加工做业务处理
domain层,领域层 service 与 service impl的业务层,用于对数据加工做业务处理,不同的是这一层的粒度比上一层app粒度会更细
infra层,基础设施层,也叫防腐层,第三方的实现方式在此处放置,他也是六边形的出口
六边形的架构其实是想达到infra可以入,api可以入。中间service业务可以抽离的思想。
这里重点讲下infra层,infra层是一个尤为重要层,他又被成为防腐层,所谓防腐层是什么,他就是拿来隔离业务代码与第三方包的分界线,如果你的业务代码卸载了infra层,那么你的六边形架构除非在往下抽离一层,否则你这个业务代码会与第三方包特别的耦合。
这里我给大家看个例子就懂了。
-----------下面代码为 app层-----------
@Override
public List<AquafarmDto> getByUserId(Long tenantId, Long userId) {
List<AquafarmDto> dtos = new ArrayList<>();
List<Aquafarm> aquafarmList = business.getByUserId(tenantId, userId);
for (Aquafarm aquafarm : aquafarmList) {
AquafarmDto dto = new AquafarmDto();
List<Fish> fishList = fishBusiness.getByAquafarmId(aquafarm.getTenantId(), aquafarm.getId());
dto.setAquafarm(aquafarm);
dto.setFishStr(fishList.stream().map(Fish::getFishName).collect(Collectors.joining(",")));
dtos.add(dto);
}
return dtos;
}
-----------下面代码为 domain层-----------
@Override
public List<Fish> getByUserId(Long tenantId, Long userId) {
return repository.getByUserId(tenantId, userId);
}
-----------下面代码为 infra层-----------
@Override
public List<Fish> getByUserId(Long tenantId, Long userId) {
return fishMapper.getByUserId(tenantId, userId);
}
复制代码
总结
通过上面代码可以看出infra层抽离了与业务不相关的mybatis层,充当了防腐层,mybatis并没有侵入到我的业务当中,如果我那天不想用mhybatis了我想换个框架,甚至我要用原生jdbc去操作数据,那我也只需要实现infra层的接口就行,大家看到这里是不是觉得恍然大悟呢。