文/明道云CTO金可伟
从PC时代到移动互联网时代,软件技术架构得到了充分的发展,尤其是互联网企业助推了一大波的技术拓展与变革,因为他们所面临的用户量、交易量、数据量并非传统架构可以解决,比如早年的阿里去IOE化,现在的数据中台战略等就可一窥究竟。随着业务的深入,他们对技术栈以及软件架构提出了更多的诉求,软件技术领域蓬勃发展,随之产生了非常多的现代软件架构理论与开源项目。
现代软件架构领域的变革之路,主要包括单体应用、SOA、微服务以及云原生应用
- 单体应用
软件发展早期通常都是单体应用,将前端界面、业务逻辑、数据存储逻辑等都放在一个war包或者一个工程里面,没有专业的技术分工,大家共用一个工程,要求开发人员具备前后端的能力。对于轻量级的应用采用这种架构无可厚非,测试与部署便捷,比如现在主流的Wordpress、Drupal,但对于现代互联网应用,比如APaaS这类复杂应用来说就显得力不从心了。单体应用耦合度太高,前后端混用,强部署依赖性(改个文案还要连带后端一起部署),根本无法满足现代互联网应用在迭代速度、系统扩展性、资源利用率优化上的要求。
- SOA(面向服务的架构)
由于单体应用无法满足现代复杂应用,对单体应用的拆分便应运而生,通常来说根据业务模块的诉求进行拆分,不同的业务通过消息总线进行通信与集成。虽然SOA架构对服务做了拆分,但SOA的组件一般比较大型,发布版本一般更加复杂,统一通过消息总线管道来处理不同业务之间的逻辑,导致消息总线也变得异常复杂,且不同业务之间严重依赖消息总线。
- 微服务
微服务架构和SOA架构非常类似,但微服务架构更强调“业务模块彻底的组件化、服务化以及去中心化“的原则,它去除了消息总线中心化的机制,各个服务之间在需要的情况下可相互调用,通常以Http Rest API或者RPC方式进行通信。服务自治是微服务架构最大的特点,每个服务可由独立的团队来负责开发,可独立部署扩展而不影响其它服务,也可采用不用的技术栈来实现业务。现代互联网产品特别是平台类产品是异常复杂的,通常采用微服务架构以及混合型语言进行开发迭代,由擅长不同领域的工程师各司其职。
- 云原生应用
随着云计算的普及,过去昂贵的IT资源变得像水电一样,我们仅仅只需要数分钟乃至数秒钟时间即可获得一台云主机,相比传统的服务器数据中心上架那可是指数级的效率提升。云时代需要需要新的技术架构,来帮助企业更好地利用云计算优势,充分释放云计算红利,帮助现代软件快速,持续,可靠,规模化地交付。云原生应用正是如此,一旦开发完成便可部署到任意公有云、私有云乃至跨云数据中心上,可便捷地跑在容器服务、Kubernetes服务、云主机上亦或无服务计算环境上。云原生应用以微服务作为基础要求,采用DevOps和容器为代表的基础架构组成。
现代APaaS是一个复杂的应用门类,一个完整的APaaS应用应当包含复杂健壮的数据模型、基于角色的管理权限体系、丰富的前端视图布局与自定义界面能力、稳定且可扩展的自动化流程引擎、强大的报表可视化以及分析能力、插件化扩展集成能力和充分的开放体系。
为了支撑以上能力,APaaS应用通常会使用微服务的架构模式,并且迎合云计算更多地实践云原生理念,使用云原生生态工具,同时APaaS会大量采用开源软件框架,并组合使用多种技术栈。
- 主流的技术框架
采用主流的技术框架体系,如Springboot、Dubble、.Netcore 跨平台方案、NodeJS Express、LAMP,前端主流三大框架Angular、React、Vue,RPC框架如gPRC、Thrift等。这些框架往往具备完整的文档,丰富的应用场景,活跃的社区生态,来满足软件快速高效迭代的工程诉求。
- 自动化流程引擎
APaaS应用通常会包含业务流程自动化的特性,这部分业界也有比较成熟的BPM开源方案,如Activiti,JFlow等,但以上技术框架往往比较复杂与臃肿,因此也有不少厂商会采用自研的方案。明道云的工作流就是完全自研的引擎,并通过消息队列引擎来进行拓展,如Kafka、RabbitMQ、Redis等。
- 消息队列
消息队列在现代软件中使用非常广泛,它可以覆盖到非常多的场景,典型的比如业务的异步处理、消息通知、自动化流程、日志处理、用户活动跟踪、运营指标、流式处理等。目前现代软件使用最多的是Kafka、RabbitMQ、RocketMQ与轻量级的Redis队列,合理的使用消息队列,不仅仅可以提高系统吞吐量,也可以有效降低系统耦合度减小复杂度,消息队列目前被广泛的运用在APaaS应用中。
- NoSQL
相较传统软件,现代APaaS通过SaaS模式向大量用户提供公共服务,动辄数万乃至数十万的流量是非常普遍的。因此,系统吞吐量从系统一开始设计的时候就被列为重要指标,一个健壮的APaaS服务应当是可以随时弹性扩展的。在这个约束下,传统的RDS难以为继,系统往往会引入NoSQL的缓存以及存储设计方案,提升系统性能,比如使用基于Key-Value的缓存体系如Redis、Memory,使用文档型数据库做数据存储如MongoDB,甚至使用列式数据存储来做数据存储如Cassandra、HBase等,这类NoSQL方案往往天生具备了集群部署、分布式存储的特征,大大简化了在系统架构设计上所面临的问题。
- 分布式存储
现代APaaS应用也面临着存储上限的问题,这里包括了结构化及非结构化的数据存储,这个问题主要是由于物理设备的容量引起的。为了规避以上问题,目前业界通常使用公有云的云存储服务,比如阿里云、腾讯云、七牛云、又拍云对象存储方案。当然也有使用自建方案,通常使用HDFS、FastDFS、Ceph、Minio等开源方案,这些方案不仅仅解决了存储上限的问题,多副本的架构设计同时解决了文件丢失与恢复的问题。
- 容器化与编排
现代APaaS应用都应当以微服务化为基础架构准则,基于微服务的应用方能引入容器化以及容器编排标准Kubernetes。容器以及使用编排工具带来的技术与运维优势是显而易见的,它带来了高效的资源管理,无缝的服务扩展,高可用的服务,以更低成本和大规模的运营,以及高效的跨云管理等。明道云的私有部署版本主要基于容器技术运行,也提供Kubernetes的部署版本,SaaS版本运行在Kubernetes集群下。它能够和SaaS版本保持核心代码一致,但满足了不同类型的客户需求。
- 云服务
云计算不仅为我们提供了云主机服务,还提供了多样的计算、存储、数据、文件等PaaS类服务。在此基础上,我们可以充分使用云计算服务,我们只需要关注我们应用上层逻辑,无需更多关注运行环境、运维保障等非工程事务,如我们可以使用云计算环境下的负载均衡、容器服务、RDS、消息队列、云函数等服务,充分发挥云计算给我们带来的技术红利。
以上所列技术栈是现代APaaS通常采用的方案,相信随着云计算的发展与深入,以及物联网、5G的发展,未来会有更多的技术栈与社区涌现出来!明道云作为现代APaaS服务的典型代表,也一直关注着技术前沿,也保持着技术栈的迭代与升级,我们也希望通过技术升级来提升用户体验与产品的可靠性。