按照分层架构设计出来的微服务,其内部各层服务主要功能和职责如下:
位于用户接口层,包括接口和实现两部分。用于处理用户发送的Restful请求和解析用户输入的配置文件等,并将数据传递给应用层。或者在获取到应用层数据后,将DO组装成DTO,将数据传输到前端应用。
位于应用层。用来表述应用和用户行为,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果拼装,对外提供粗粒度的服务。
位于领域层。领域服务封装核心的业务逻辑,实现需要多个实体协作的核心领域逻辑。它对多个实体或方法的业务逻辑进行组合或编排,或者在严格分层架构中对实体方法进行封装,以领域服务的方式供应用层调用。
位于基础层。提供基础资源服务(比如数据库、缓存等),实现各层的解耦,降低外部资源变化对业务应用逻辑的影响。基础服务主要为仓储服务,通过依赖倒置提供基础资源服务。领域服务和应用服务都可以调用仓储服务接口,通过仓储服务实现数据持久化。
微服务架构采用前后端分离,前端应用独立部署。前端应用调用发布在API网关上的Facade服务,Facade定向到应用服务。应用服务作为服务组织和编排者,它的服务调用有如下两种路径:
微服务间的应用服务可直接访问,也可通过API网关。由于跨微服务操作,在进行数据新增和修改操作时,注意保证数据一致性。
领域事件驱动包括微服务内和微服务之间的事件。微服务内通过事件总线完成聚合之间的异步处理。微服务之间通过MQ完成。异步化的领域事件驱动机制是一种间接的服务访问方式。
当应用服务业务逻辑处理完成后,如果发生领域事件,可调用事件发布服务,完成事件发布。
当接收到订阅的主题数据时,事件订阅服务会调用事件处理领域服务,完成进一步的业务操作。
服务形态主要是仓储服务。仓储服务包括接口和实现:
领域层实现核心业务逻辑,负责表达领域模型业务概念、业务状态和业务规则。主要的服务形态有实体方法和领域服务。
实体采用充血模型,在实体类内部实现实体相关的所有业务逻辑,实现的形式是实体类中的方法。 实体是微服务的原子业务逻辑单元。在设计时我们主要考虑实体自身的属性和业务行为,实现领域模型的核心基础能力。不必过多考虑外部操作和业务流程,这样才能保证领域模型的稳定性。
业务规则和逻辑校验在领域层。
DDD提倡富领域模型,尽量将业务逻辑归属到实体对象,实在无法归属的部分则设计成领域服务。领域服务会对多个实体或实体方法进行组装和编排,实现跨多个实体的复杂核心业务逻辑。
对于严格分层架构,如果单个实体的方法需要对应用层暴露,则需要通过领域服务封装后才能暴露给应用服务。
表述应用和用户行为,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装,负责不同聚合之间的服务和数据协调,负责微服务之间的事件发布和订阅。
通过应用服务对外暴露微服务的内部功能,这样就可以隐藏领域层核心业务逻辑的复杂性以及内部实现机制。
应用层的主要服务形态有:
应用服务内用于组合和编排的服务,主要来源于领域服务,也可以是外部微服务的应用服务。
应用服务内还可完成
为了实现微服务内聚合之间的解耦,聚合之间的服务调用和数据交互应通过应用服务来完成。原则上我们应该禁止聚合之间的领域服务直接调用和聚合之间的数据表关联。
前端应用和微服务之间服务访问和数据交换的桥梁。 处理前端发送的Restful请求和解析用户输入的配置文件等,将数据传递给应用层 或获取应用服务的数据后,进行数据组装,向前端提供数据服务。 主要服务形态是Facade服务。
Facade服务分为接口和实现两个部分。完成服务定向,DO与DTO数据的转换和组装,实现前端与应用层数据的转换和交换。
每层服务只能向直接上层提供服务。虽然实体、实体方法和领域服务都在领域层,但实体和实体方法只能暴露给领域服务,领域服务只能暴露给应用服务。
服务如果需要跨层调用,下层服务需要在上层封装后,才可以提供跨层服务。 比如实体方法需向应用服务提供服务时,需先封装成领域服务。
通过封装:
先建立DO和PO的映射:
大多数情况下PO和DO一一对应。但也存在DO和PO多对多,在DO和PO数据转换时,需数据重组。
比如时间范围查询时,会有辅助字段,如:beginTime和endTime,PO这怎么处理?我们的处理方式是增删改用PO,查询时候用QueryPO,QueryPO继承了PO并额外增加用于查询的辅助字段(比如时间、集合、模糊查询等)。
一般聚合根用的少,很多情况聚合根要作为对象传到基础层。
入参是DO,返回值是DO。
DO是实体和值对象的数据和业务行为载体,承载基础的核心业务逻辑。通过DO和PO转换可完成数据持久化和初始化。
入参是DO,返回值是DO。
如果需调用其它微服务的应用服务,DO会转换为DTO,完成跨微服务的数据组装和传输。 用户接口层先完成DTO到DO的转换,然后应用服务接收DO进行业务处理。 如果DTO与DO是一对多的关系,就需进行DO数据重组。
完成DO和DTO的互转,完成微服务与前端应用数据交互及转换。
Facade服务会对多个DO对象进行组装,转换为DTO对象,向前端应用完成数据转换和传输。
主要是VO。 展现层使用VO进行界面展示,通过用户接口层与应用层采用DTO对象进行数据交互。
参考