微服务架构
什么是架构
- 架构:描述组成系统的各部件及其之间的关系,关注其实现而不是需求
- 架构决定了软件的质量属性
- 可维护性,可测试性,可部署性
- 安全性,可靠性,可扩展性
- 4+1架构模型:(逻辑、实现、进程、部署)+场景
- 逻辑视图:开发时的架构
- 关注功能性需求,考虑问题域分解与抽象
- 组成部件:包(模块)、类、接口
- 关系:关联、继承、以来、组合、聚合
- 实现(开发)识图:构建时的架构
- 关注软件打包,与团队分配有关
- 部件:打包号的可执行,可部署的模块和组件,如jar包、war包,exe文件
- 关系:依赖关系
- 进程视图:运行时的架构
- 关注部件间的协作,考虑进程间通信
- 部件:各个运行当中的进程
- 关系:进程间的通信,如HTTP,信号量,共享内存
- 部署视图:运行时的架构
- 关注性能与可用性,考虑可扩展性
- 部件:运行着系统进程的物理机或虚拟机
- 关系:机器间的网络通信
- 四种视图并不互斥,相互可以融合
- 逻辑视图:开发时的架构
- 架构决定了软件的质量属性
- 分层架构
- 三层架构
- 六边形架构
三层架构
- 三层架构
- 属于逻辑视图
- 分为表示层(用户接口或API)、业务逻辑层、持久层
- api
- somethingController
- domain
- 实体类、somethingService
- persistence
- somethingRepository
- api
- 优点:表现层可以灵活更换
- 缺点:不支持多客户端、不支持多数据库、领域层依赖持久层
六边形架构
架构目录
- domain
- 实体类
- application
- SomethingApplicationService
- adapter
- inbound
- SomethingRestController
- SomethingController
- outbound
- SomethingRepository的实现接口
- inbound
- port
- inbound
- interface:SomethingUseCase
- outbound
- interface:SomethingRepository
- inbound
架构中各个包的解释与作用
- domain
- 存放业务逻辑
- 一切都依赖于domain,但domain不依赖任何东西
- application
- 实现用例,即实现端口中的接口(usecase)
- adapter(适配器):与外界联系
- inbound:对外界提供的服务,可以通过提供多个Controller对不同的外界设备进行适配
- outbound:实现操作数据库的接口,例子中使用JpaRepository接口实现对数据库的操作(见上图)
- port(端口)
- 出站必须定义为接口,入站推荐定义为接口,为了摆脱业务逻辑与持久层的依赖
- inbound(入站端口):因为接口功能像是UML中的用例所以一般命名为UseCase
- outbound(出站端口):需要数据库的服务,提供操作数据库的接口Repository
以Books管理为例
book:实体类
⬆
usecase:用例,抽象功能
⬆实现
BookApplicationService:提供实现的服务
⬆被依赖
repository:抽象数据库功能
⬆实现
JpaRepository:实现对数据库的具体操作
usecase
⬆依赖
BookRestController / BookController:提供不同端访问的方法