基于微服务形成的软件架构风格称为微服务架构(Microservices Architecture),它涵盖了使用微服务构建应用程序的全套原则、模式和最佳实践,关注如何将应用程序分解为多个微服务,以及这些服务如何交互、如何维护服务之间的独立性、如何实现服务的持续交付和部署等。在日常使用中,微服务又常被称为微服务架构,两者不区分使用。
微服务架构与云原生架构微服务架构和云原生架构是现代软件开发中两个紧密相关且经常一起使用的概念,但它们关注的侧重点和应用的范围等有所不同。
云原生架构是一种基于云环境设计和构建应用程序的方法,它天然利用了云计算的优势,如弹性、可扩展性、自动化和敏捷性。Matt Stine 于2013年首次提出云原生(CloudNative)的概念,随着技术的不断演进,其定义也在不断地迭代和更新,云原生可以概括为四个要素:微服务、容器、DevOps 和持续交付。
云原生架构的主要目的是如何最大化地利用云平台的特性来实现高效的资源利用、快速迭代和自动化运维。
微服务架构的目的则是为了提高应用程序的模块化,使得开发、部署和扩展可以更加独立和灵活。
总结来看,微服务架构和云原生架构是相辅相成的。微服务架构可以被视为云原生架构的基石,为云原生应用提供了架构设计、分布式部署、敏捷开发等方案,以适应云计算平台的动态特性,为更高层次的云原生架构打下坚实的基础,而云原生技术则提供了实施微服务架构的最佳实践和平台支持。
微服务架构的演进微服务架构主要是为了解决在应用软件架构时不断出现的业务挑战而产生的。
从最初传统的单体架构,它将应用程序作为一个整体部署和运行,可扩展性、容错性、可靠性等都有很大限制,而且单体架构的应用通常具有大量的代码和复杂的代码结构,导致维护成本极高。
随着业务架构的不断演进,后续有人提出拆分单体架构,解耦代码,形成一个个独立的功能单元,每个功能单元可以远程服务的方式提供(比如 Web 服务,通过80端口向用户提供网页访问服务),即面向服务架构(Service-oriented Architecture,简称 SOA)。虽然SOA能够解决单体架构的一些问题,但是也存在一些缺陷,比如服务相互依赖,性能差和部署运维复杂等问题。
后来越来越多的应用部署在云端,软件应用需要满足快速迭代、高并发访问、业务逻辑更加复杂等业务需求,微服务架构应运而生。
微服务架构按照业务功能划分服务,服务之间调用采用轻量级的通信框架,具备以下优势:
降低应用复杂度:当一个系统变得庞大且复杂时,微服务架构可以将系统拆分成多个小服务,每个服务专注于一个特定的业务领域,简化了应用的复杂性,提高了开发和维护的效率。比如应用在电子商务平台。
高并发处理:在需要处理大量并发请求的场景下,通过微服务架构,将系统拆分成多个独立的服务,每个服务独立扩展和部署,从而实现更好的并发处理能力。比如应用在社交媒体应用。
快速迭代和持续交付:微服务架构可以将系统拆分成多个小的服务,每个服务可以独立地进行开发、测试和部署。因此可以实现快速迭代和持续交付,不同的团队可以并行开发和部署各自的服务,允许每个服务使用适合自身需求的最佳技术栈,加快了软件发布的速度,提高了系统的灵活性和可扩展性。比如应用在游戏产业。
可伸缩性和弹性:微服务架构具有良好的可伸缩性,可以根据负载的变化,对系统中某些服务做水平扩展或收缩,更好地适应流量峰值并节省资源。比如应用在流媒体服务。
微服务架构的典型组件及实践选型微服务架构的典型组件概览如下图。
业务入口。从终端设备(例如IoT、PC、Moblie等)通过网关入口访问后端微服务,网关对南北向流量提供服务路由到对应的后端服务中。
微服务的业务处理链路。后端微服务通常会根据业务领域或功能进行划分,每个微服务负责一部分独立的业务逻辑。为了完成更复杂的业务流程,微服务之间可能会存在依赖关系。从服务间通信的交互方式可以分为同步阻塞式和异步非阻塞式调用,主要的实现方式包括:同步RPC调用和异步消息调用。所有的交互调用本质上都是数据的交换,数据最终会存储到各类存储介质中。在服务交互过程中需要特定的组件来保证数据一致性,对流量精细化管理以及提供强大的运维和可观测能力。
微服务的OPS链路。利用微服务运维过程中的一系列操作和工具链,开发运维团队可以构建出高效、稳定和可维护的微服务系统。通过自动化、监控和智能化的运维治理实践,可以大幅降低系统复杂性带来的挑战。
在实际应用时,您需要根据具体业务选择合适的组件构建应用架构。
组件
描述
实践选型
微
服
务
网关
网关用于统一管理微服务的访问和暴露,提供了安全性、流量控制和治理等功能。
常用的选型:Higress、Kong 和 Nginx 等。
阿里云云原生网关:提供流量调度、服务治理、安全防护三合一的下一代云原生网关。
微服务内核
微服务开发框架:提供了构建和运行微服务所需的基础设施和开发工具。
常用选型包括:Spring Cloud 和 Apache Dubbo。
阿里云开源的 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。在 Spring Cloud 的原生支持基础上接入阿里分布式应用解决方案,通过阿里云中间件来迅速搭建分布式应用系统。Apache Dubbo 为构建企业级微服务提供框架、通信、服务治理能力。
服务注册与发现:是微服务基础组件,用于管理和维护服务的状态。服务注册与发现与微服务开发框架构成微服务的最小内核。
常用的选型:Nacos、Eureka 和 Zookeeper等。
微服务引擎 MSE:提供 Nacos、ZooKeeper 和 Eureka 的原生支持。
配置管理:提供微服务运行时的动态配置能力。动态配置可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置,消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
常用的选型:Nacos、Apollo 和 Consul 等。
微服务引擎 MSE:提供 Nacos 企业版支持。
异部调用
消息服务:消息通过异步通信方式和发布订阅的消息传输模型使上下游服务解耦,同时具备流量削峰填谷的优势。
常用的选型:Apache RocketMQ、Kafka和Pulsar等。
云消息队列:提供 RocketMQ 和 Kafka 的原生支持。
定时任务:提供微服务后台业务的动态任务调度能力,同时围绕定时任务提供限流、并发控制、路由、可观测等解决方案。
常用的选型:XXL-JOB、ElasticJob、K8s CronJob、Spring Scheduling等。
SchedulerX:提供XXL-JOB、ElasticJob、K8s CronJob、Spring Scheduling的开源兼容,提供企业级高可用、高安全、可观测支持,另外支持分布式跑批和任务编排能力。
事务控制
分布式事务为微服务各种异常或错误场景提供数据一致性保障,避免出现资损问题,是从应用架构层保障企业数据的防线。在微服务中需要为跨服务调用和分库分表等业务场景提供数据一致性的解决方案。
常见的选型:Apache Seata(incubating)和消息最终一致性。
Apache Seata(incubating): 致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
数据存储
通常使用各种数据库和持久化技术来存储和管理数据。
常见的数据库包括关系型数据库(如MySQL、PostgreSQL)和NoSQL数据库(如MongoDB、Redis)等。
阿里云具有多款可靠稳定的关系型数据库与NoSQL数据库。完整列表请详见文档。此处只列举两款:
关系型数据库
云数据库 RDS:支持MySQL、PostgreSQL等引擎,具备容灾、备份、恢复等方面的全套解决方案。
云原生数据库 PolarDB:阿里巴巴自研的新一代云原生数据库,可提供具备极致弹性、海量存储、安全可靠的数据库服务。100%兼容MySQL和PostgreSQL生态,高度兼容Oracle语法。
阿里云NoSQL数据库:
云数据库 Redis 版:兼容开源Redis协议标准,充分满足高吞吐、低延迟及弹性变配的业务需求。
云数据库 MongoDB 版:完全兼容MongoDB协议,提供多节点高可用架构、弹性扩容、容灾、备份恢复、性能优化等功能。
微服务治理
微服务治理可以帮助企业消除变更过程中的风险,消除偶发问题引发的风险和低成本实现微服务敏捷开发,全面增强微服务线上稳定性和提升研发效率。
微服务引擎 MSE 提供原生支持 Spring Cloud、Dubbo、Sentinel,同时遵循了 OpenSergo 的服务治理规范。
微服务运维
微服务运维可以使用容器化技术(如Docker)和容器编排工具(如Kubernetes、Docker Swarm),简化微服务架构的部署和管理。它们提供了高度可伸缩、弹性和自动化的运行环境。
常用选型:KubeVela,开箱即用的现代化应用交付与管理平台,它使得应用在面向混合云环境中的交付更简单。
容器服务 Kubernetes 版 ACK:提供高性能且可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。
微服务可观测
微服务可观测可以对服务的运行进行监控和追踪,以确保微服务架构的健康运行。
常用的监控和追踪工具包括 OpenTelemetry、Prometheus 和 Grafana 等。
应用实时监控服务 ARMS:能对应用做全方位监控。您无需修改代码,只需为应用安装一个探针,助力全面掌控应用的运行状态。
阿里云如何帮助您顺利应用微服务架构?阿里云在实施微服务架构方面有非常丰富的最佳实践案例,此处只列举了部分案例供您参考。更多最佳实践,请参见对应云服务的最佳实践文档。
微服务
网关
云原生网关安全解决方案:介绍云原生网关如何实现安全防护,为站点提供基础的防护功能。
通过MSE云原生网关实现蓝绿部署、A/B测试和金丝雀发布:介绍基于容器服务 K8s 和 Nacos 注册中心两种服务发现机制来实践不同的服务发布策略。
微服务内核
在Spring Cloud应用中接入MSE Nacos作为服务注册中心:介绍如何在MSE上快速构建 ZooKeeper、Eureka 和 Nacos 等服务注册中心,实现 Spring Cloud 应用的服务注册与发现,以及消费者对提供者的调用。
MSE Sync迁移方案:介绍如何通过MSE提供基于 MSE Sync(MSE 基于开源 Nacos Sync 优化的一款数据同步工具)的注册中心进行迁移。
自建Nacos配置中心迁移到MSE Nacos:介绍如何从开源自建 Nacos 配置中心迁移到 MSE Nacos 配置中心。
异步调用
RocketMQ全链路追踪解决方案:介绍如何将云消息队列 RocketMQ 版的 Trace 数据应用于全链路追踪解决方案。
如何使用定时任务的灰度:介绍如何使用 SchedulerX 定时任务灰度功能。
微服务治理
基于MSE云原生网关实现全链路灰度:介绍如何通过 MSE 提供的全链路灰度能力,无需修改业务代码,实现全链路流量控制。
基于MSE实现微服务应用无损上下线:介绍 MSE 如何实现在应用发布时提供无损上下线和服务预热能力,有效规避线上发布所出现的流量损失,降低研发运维成本。
微服务敏捷开发最佳实践:介绍本地网络与阿里云不互通场景下实现微服务敏捷开发的最佳实践。
微服务运维
使用ACK支持的Nginx镜像部署无状态应用:介绍如何使用 Nginx 镜像快速部署无状态应用。
云原生ACK应用管理:介绍阿里云容器服务 Kubernetes 版 ACK 如何做集群应用高效管理,包括应用编排文件如何管理,应用包含哪些 K8s 资源并能否统一管理问题,如何管理应用版本同时能否快速回滚等。
微服务可观测
使用ARMS监控异步任务:介绍如何通过 ARMS 排查异步任务出现接口超时等异常问题。
使用ACK Net Exporter定位网络问题:介绍 Kubernetes 如何使用 ACK Net Exporter(是部署在集群内部的网络可观测性增强组件,能够提供容器网络相关的详尽监控数据),帮助您快速发现和定位网络问题。