(一) 容器原生
云原生(Cloud Native)架构,部署容器化(Containerization) 云原生中间件应进行云原生架构设计,以容器化形式进行服务部署。容器化部署可支持中间件服务快速启动,可以灵活完成服务及资源的扩缩容。容器隔离了用户底层 IaaS 资源的差异,利用容器编排可轻松实现多实例(Multiple Service Instances)部署;容器原生的中间件应用程序和容器镜像占用更少的资源,对于多容器部署的场景有更好的优化策略,提升基础资源利用率。
(二) 服务状态
有状态(Stateful)和无状态(Stateless)服务分离 在云原生时代,中间件架构设计时需要定义服务的状态:有状态部分和无状态部分。无状态部分主要伴随业务逻辑的产生,如服务间通信、链路跟踪等。无状态服务是指该服务运行的实例不会在本地存储数据,并且多个实例对于同一个请求响应的结果是完全一致的。有状态部分是指该中间件可以产生并存储数据,并且在创建一个新的有状态服务时,可以通过备份恢复这些数据,以达到数据持久化的目的。所以将状态保存在有状态的中间件中,如分布式缓存、消息队列等。 无状态的业务逻辑部分可以很容易的横向扩展,在用户分发的时候,可以很容易分发到新的进程进行处理。在有状态中间件设计时, 应考虑扩容时状态的迁移、复制、同步等机制,以更好的支撑无状态的业务层。
(三) 组件模块化
组件模块(Component Modules) 云原生中间件设计时应考虑可插拔、松耦合、可动态编排的组件 化特征。每个组件都是高度抽象的、自包含的、封闭的并和其它的组 件相有一定的逻辑隔离,使得不同的角色专注于其擅长领域的工作。开发人员可以通过组合模块的形式调度涉及到中间件,快速支撑业务, 适用系统的运行时特征。松耦合的中间件让开发人员可以在处理每个 中间件时都能够独立于其他中间件来工作。云原生中间件通过功能上 的分离,对外提供统一的应用程序编程接口(API)供开发人员调用, 使开发者可以专注于每项服务的核心功能,以提供细粒度的功能。
(四) 事件驱动
采用事件驱动架构 (Event-Driven Architecture)
事件驱动架构作为一种应用间集成模式,天然适合云原生中间件的调度和集成。在事件驱动的体系结构中,当服务执行其他中间件可能感兴趣的工作时,该服务将生成一个事件。其他服务使用这些事件, 进而执行由该事件触发的任务。事件成为了可以被消费的对象,而不仅仅是在函数间传递的临时参数,从而可以同时被多个中间件消费。中间件不需要直接和生成事件的服务进行交互,仅通过监听事件,触发对应的操作,从而降低了服务内部的复杂度。事件驱动架构具备以下优点:
1. 异步:基于事件的架构是异步的,没有阻塞。这使得中间件可以在工作单元完成后自由地转移到下一个任务,而不用担心之前发生了什么或者接下来会发生什么。
2. 松耦合:中间件之间不需要(也不应该)知道或依赖于其他服务。事件模型下的中间件可以独立的、更容易的更新、测试和部署。 3. 易于扩展:由于服务在事件驱动的体系结构下解耦,而且服务通常只执行一项任务,因此跟踪特定服务的瓶颈,并对该服务 (且仅对该服务)进行扩展变得很容易。
4. 恢复支持:带有队列的事件驱动架构可以通过“重播”过去的事件来恢复丢失的工作。当用户需要恢复时,这对于防止数据丢失非常有用。
(五) 可观测
可观测(Observable) 在由微服务和容器等技术形成的高度复杂的应用系统运行态中, 可观测性成为云原生中间件必须具备的能力。可观测性包含了监控、告警、日志聚合、分布式跟踪和依赖分析等部分,通过收集处理数据来定位问题,并简化信息的访问,实时深入的观察整个应用系统的健康状态,从业务资源计量等多个维度进行度量。日志、指标和请求跟踪是可观测性的基础。
从 CNCF 早期毕业的项目Prometheus 就是一个用于观测服务的云原生监控工具。由此可见可观测性在云原生技术中的重要性。
Prometheus 几乎可以监控所有内容,它还整合了像 Grafana 这样主流的可视化工具。
(六) 韧性设计
云原生中间件具备韧性(Resiliency) 具备韧性设计的中间件具有高延时宽容、容错和故障恢复逻辑。可以防止连锁故障,允许快速失败和快速恢复,且具备较强的系统自愈能力和抵抗外部冲击,为其上层运行的应用系统提供高性能、高容错、高安全地支撑。设计具有韧性设计的中间件,必须从两个方面考虑: 在最初设计和规划时,考虑中间件自身的在不同场景下的健壮性和鲁棒性。针对系统在运行过程中,可能出现导致程序崩溃的各种情况的应对能力,如计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,如何保障系统安全、稳定运行的措施、设计等。 中间件的功能和特性在设计时,应兼顾外围应用系统的适应能力。因此,基于云原生架构设计应用的同时,选择具有熔断机制的微服务治理框架,将在整体上为云原生应用提供系统鲁棒性,包括超时、重试、限流、服务降级等方式,从而降低整个系统崩溃的风险。
(七) 弹性伸缩
资源可扩展(scalability),服务可弹性(Elasticity)
可扩展指中间件具备资源按需动态伸缩能力,在保证业务连续性前提下,可以独立于其他服务对于底层资源进行扩展或者收缩。随着流量,需求和使用量的增加,中间件应用应具有弹性。弹性意味着当资源根据需求按比例地减少或者增加时,系统的吞吐量将自动地向下或者向上缩放,从而满足不同的需求。弹性是建立在可扩展的基础之上的,并通过添加自动的资源管理概念对其进行了扩充。
(八) 动态部署
服务全生命周期的动态部署(Dynamic Deployment) 云原生中间件具备服务全生命周期的动态部署与发布能力,在完成开发构建之后,能够以多种策略进行发布,如滚动发布、灰度发布、蓝绿发布等;具备多种部署策略,如批量并发部署、任务定时部署、分阶段部署等;具有版本控制功能,如版本追溯与回滚。
由于云原生中间件具备独立的运行进程,每个中间件也可以独立动态的部署。当某个中间件发生变更时无需编译、部署整个应用。如果应用需要多个中间件来进行支撑,那么多个中间件具备一系列可并行的发布流程,使得发布更加高效,同时降低对生产环境所造成的风险,最终缩短应用交付周期。
(九) 统一响应式与声明式的 API
将响应式API 与声明式API 统一(Unifies Reactive and
Declarative API)