1. 分层架构(垂直)前端
- 分层架构是最基础的,即好久以前就接触的mvc,固然书里说的是基础设施层,领域层,服务层,用户接口层;
- 因这种架构各层之间极易耦合,即顶层依赖底层教严重;就引入DI(depency inverse)原则,使得各层之间再也不相互依赖实现,而是依赖接口,实现了解耦;抽象不依赖于细节,细节依赖于抽象;
- DI原则的引用,各层之间上下界限不在明显;能够当作平面的六角形;
2. 六边形架构(平面)spring
- 六边形是平面的架构,其核心是端口和适配器;
- 将前端和后端的概念延伸为系统外部区域和系统内部区域
- 端口处理输入或处理输出,适配器将输入或输出适配到API中;
- 端口可提供各类通讯协议,如rest,http,soap,AMQP协议;
- 适配器用于调用API,且能够提供各类具体的实现形式;
- 目前大部分使用spring的架构都是六边形架构(使用ioc);
3. 面向服务架构 (SOA) service-Oriented architecture,其设计原则以下:json
- 服务契约 经过契约文档进行描述
- 松耦合 服务将依赖关系最小化
- 服务抽象 隐藏内部实现
- 服务重用性 能够被其余服务所重用
- 服务自治性 服务自行控制环境和资源保持独立性,
- 服务无状态性 服务负责消费方的状态管理
- 服务可发现性 客户能够经过服务元素就来查找服务
- 服务组合性 一种服务能够由其余服务组合而成
- 使用soa设计时在于肯定服务的界限上下文,不能为soa而SOA;
- 在ddd中,业务价值大于战术策略,战略目标大于项目利益;在soa实施中,多考虑业务和战略 4. rest风格
- rest Represential State Transfer 表现层状态转化
- 包含http的动做:get,put,post,delete,patch
- get 获取资源查询结果,安全,幂等;可缓存
- put 覆盖资源进行更新,非安全,幂等(idempotent)
- post 新建资源,非安全,非幂等
- delete 删除操做,非安全,幂等
- patch 局部更新,非安全,幂等
- 数据交换格式大致为xml或json;通常用json
- 使用HATEOAS(hymedia as the engine of application service)技术,能够返回相关资源的连接;
- 该架构风格具备良好的松耦合性和可扩展性
5. CQRS(读写分离command-query responsibility sgregation )后端
- 紧缩(Stringent)对象设计原则和命令-查询分离(CQRS)原则共同应用的结果
- 系统中一部分专门负责数据的command命令,另外一部分负责query;
- 分为读模型和命令模型;读模型能够新建若干具体的视图,针对不一样的需求进行查询;
- 命令处理器(Command Processor):处理接受命令.有三种风格:分类风格,专属风格,消息风格
- 分类风格(categorized style) 一个服务中不一样的方法处理不一样类型的命令
- 专属风格(dedicated style) 每一个处理器只有一个单独的方法,单独的类处理单独的命令
- 消息风格(messaging style) 专属风格的异步用法
- 事件订阅器 用来更新查询模型
- 查询结果是否同步 大部分是作不到同步;有三种方法:1.命令结束,修改缓存数据;2.记录查询模型的最新时间,命令操做后自动触发时间更新,然数据不是最新的能够发出提醒;3.直接通知数据已被处理,但还须要一段时间才能查看结果; 6. 事件驱动架构(Event-Driven Architecture,EDA)
- 基于管道和过滤器风格(pipe,filter) 6.1. 基于消息的管道和过滤器处理过程的基本特征 - 管道是消息通道 - 端口链接过滤器和通道 - 过滤器既是处理器 能够对消息进行处理 - 分离处理器 每一个过滤处理器都是一个分离的组件 - 松耦合 每一个过滤处理器都是单独的参与处理,处理器组合经过配置完成 - 可换性 位置组合科幻 - 过滤器可使用多个管道 并行处理 - 同种类型的过滤器能够并行运行
-经过消息处理组件订阅上游的事件,处理以后,发布自己的事件,下游的消息处理组件将订阅它; 7. 长时处理过程(Long-Running Process) 7.1. 长时处理过程的设计方法缓存
- 将处理过程设计成一个组合任务,使用一个执行组件对任务进行跟踪,对各个步骤和任务完成状况进行持久化
- 将处理过程设计为聚合,这些聚合在一系列的活动中相互协做.一个或多个聚合实例充当执行组件并维护整个处理过程的状态
- 设计一个无状态的处理过程,其中每个处理组件都将对所接受到的信息进行扩充--即向其中加入额外的数据信息--而后将消息发送给下一个处理组件;整个处理过程的状态包含在每条信息中 7.2. 执行器和跟踪器
- 每一个长时处理过程的状态实例
- 如何处理系统中消息的重复投递: 1.查看该事件中的相应的状态属性,若是状态已被设值,执行器会忽略该事件并对该事件做出应答; 2.将状态对象设置为幂等,执行后消息不会产生其余改变.
- 执行时间校验;被动校验和主动校验;
- 被动校验:完成事件到达时执行;经过调用hasTimedOut()方进行判断;风险:1.事件未完成,未触发而没超时;
- 主动校验:外部的定时器来校验.好比JMX的TimerMBean实例,建立一个定时监听器.缺点,须要更多的系统资源,可能会增长系统的运行负担;