后端架构师必知必会系列:云原生与微服务治理

发布于:2023-10-25 ⋅ 阅读:(84) ⋅ 点赞:(0)

作者:禅与计算机程序设计艺术

1.背景介绍

云计算、容器化、微服务架构、DevOps理念正在席卷全球IT界。而云原生技术则是云计算发展的必然趋势。企业在转型到云原生时需要考虑从传统应用迁移到云端应用、如何处理数据流动、如何构建服务之间的依赖关系等一系列复杂难题。微服务架构是云原生技术的基石之一,它将单体应用拆分成一个个独立运行的小服务,并通过轻量级通信协议互相调用。因此,理解微服务架构及其运作机制对于架构师来说至关重要。

“云原生”是云计算术语,泛指基于云平台构建的应用,主要目标是将应用程序架构和开发生命周期外包给云提供商,实现快速部署、弹性伸缩、可靠性保证等能力,可以实现应用与基础设施的自动化管理和交付。云原生技术包括容器、微服务、不可变基础设施、API网关、服务 meshes、CI/CD 流水线、健康监控、日志和Tracing等领域。

微服务架构作为云原生技术的一个基石,帮助企业解决了服务的复杂性,让应用架构变得更加模块化、灵活,增强了系统容错能力和弹性。但是,若将单个应用拆分成多个服务,每个服务又要负责不同职责,如何设计服务间通讯、如何保障服务的高可用、如何控制服务之间的数据流动都是一个复杂的话题。这一切都需要微服务架构师具备丰富的知识技能和工程经验。

针对以上两点需求,我想写一篇专门讨论微服务架构治理的文章,由浅入深地剖析微服务架构的各个环节以及相关治理策略,阐述微服务架构发展方向、实践经验,并与架构师共同探索未来架构发展方向。

本文基于微服务架构的一整套理论框架来阐述微服务治理的内容和策略。首先,本文主要侧重于微服务架构的“治理”——其目的不是讨论如何做微服务架构,而是在现有的微服务架构框架下探索如何更好地治理微服务架构。微服务架构能够解决过去单体应用无法解决的问题,但同时也引入了一系列新问题,如分布式系统的复杂性、服务间依赖关系的复杂性、服务部署、测试与发布等方面的挑战。因此,任何技术方案都是临时的,唯有长久坚持,才能真正解决问题。因此,微服务治理是确保微服务架构持续稳定、高效运营的关键所在。

第二,本文力求全面准确,避免陷入过多枝节。文中除了阐述微服务架构发展历史、理论模型、框架和最佳实践等基本概念之外,还将高度关注微服务治理过程中所涉及的各项技术和工具。每一章的结尾都会将专业词汇和算法与实际代码进行对照,对读者的阅读起到辅助作用。

第三,本文将关注微服务架构的技术选型、架构设计、性能调优、部署、测试、运维、监控、安全、以及其它方面。从微服务架构的发展历史、理论框架、最佳实践出发,本文逐步细化治理内容,帮助架构师们梳理微服务架构发展路径、掌握微服务架构的精髓、探索微服务架构未来的发展方向。

2.核心概念与联系

2.1微服务架构

微服务架构(Microservices Architecture)是一种新的分布式系统架构模式。其核心思想是通过构建一套小型、自治的服务,围绕业务领域进行设计、开发、测试和部署。每一个服务运行在自己的进程空间内,拥有独立的数据库、网络端口等资源,这些服务之间通过轻量级的通信协议互相通信。

根据 Martin Fowler 的说法,微服务架构的主要特征如下:

  1. 服务化:微服务架构将单个应用进行拆分,构建松耦合、可独立开发、部署和维护的服务单元。

  2. 自主性:微服务架构允许各个团队独立工作,按照业务功能划分服务,使得开发过程更加聚焦、清晰。

  3. 轻量级通信:微服务架构中的服务间通信采用轻量级的 RESTful API 或者消息队列的方式,降低了网络通信成本。

  4. 可复用性:微服务架构中的服务可被其他服务复用,提升了软件复用的能力。

  5. 动态扩展:微服务架构中的服务数量可以在不停机的情况下进行动态增加或减少,满足用户的业务需求。

2.2微服务治理

微服务治理(Microservice Governance)是微服务架构所关心的问题。其目标是保证微服务架构的持续稳定、高效运营,从而促进组织业务目标的达成。微服务治理包括架构设计、技术选型、性能调优、部署、测试、运维、监控、安全、升级等内容。

微服务架构发展至今,已经经历了从单体应用到微服务架构的过渡。随着微服务架构的普及和规模化应用,微服务治理也越来越成为企业面临的主要挑战。微服务治理的基本方法有很多,比如 Service-Oriented Governance(SOG),微服务架构模式,以及其他各种架构模式和工具的组合。

根据 Jesse Collins 的说法,微服务架构的关键是服务化。服务化意味着将复杂的大型应用拆分为一个个独立的服务。良好的服务化架构需要围绕业务领域、业务功能和技术平台三个层次进行设计。微服务治理往往是将架构设计、技术选型、性能调优、部署、测试、运维、监控、安全、以及升级等内容纳入其中,协同各部门的专业能力。

2.3云原生

云原生(Cloud Native)是云计算技术和开源社区推崇的新一代架构风格。它追求简单性、可移植性、弹性扩展和可观测性。云原生的主要目标是通过云平台构建应用,并利用云计算提供的自动化能力、弹性伸缩、可靠性保证等优势。云原生技术包括容器技术、微服务架构、不可变基础设施、API网关、服务 meshes、CI/CD 流水线、健康监控、日志和Tracing等领域。

云原生架构和微服务架构的关系:云原生架构注重研发效率,在架构设计上将研发流程外包给云供应商。微服务架构则注重实现业务功能,通过拆分应用为多个服务来实现整体业务目标。

云原生的理念和微服务架构的目标是一致的,即要建立在云平台之上,充分利用云计算的优势。

2.4容器技术

容器技术(Containerization Technology)是利用 Linux 操作系统的轻量级虚拟化技术,来打包应用和其运行环境,形成标准的容器镜像文件。容器化后的应用和服务可以跨服务器、物理机甚至数据中心运行。

基于容器技术,云原生应用将运行环境隔离开来,实现环境一致性、资源共享、弹性伸缩和部署等优点。容器技术能够有效地利用系统资源、降低硬件使用成本。

2.5微服务架构模式

微服务架构模式(Microservice Architecture Pattern)是指微服务架构的一些常见的设计模式。微服务架构模式包括消息代理、服务发现、熔断器、限流器、网关、数据网格、Saga事务模式等。

2.6服务 meshes

服务 meshes (Service Meshes) 是用于处理微服务间通信的基础设施层。服务 meshes 以分布式的方式连接各个服务,提供请求路由、容错、流量控制、可观察性、加密传输等功能。

2.7无状态服务 VS 有状态服务

服务有两种类型:无状态服务(Stateless Services)和有状态服务(Stateful Services)。

无状态服务的特点是无须存储信息,只需通过外部接口获取输入参数并返回结果即可。例如,API Gateway 提供 HTTP 和 HTTPS 请求,应用服务消费此接口提供服务。

有状态服务的特点是需要存储信息。例如,Session Server 存储用户登录凭证信息。为了提升服务的高可用性,通常会把有状态服务部署到多台节点上。

有状态服务和无状态服务在业务逻辑上并没有太大的差别,它们只是需要不同的持久化技术。但是,有状态服务通常比无状态服务更加复杂,并且需要解决分布式数据一致性问题。

3.微服务架构设计

微服务架构设计可以概括为以下四个阶段:

  1. 业务需求分析:定义业务范围、核心需求和目标,明确产品发展路线图。
  2. 技术方案设计:制定服务拆分和技术选型决策矩阵。
  3. 服务开发:编写服务代码、编写Dockerfile文件,完成服务编译和打包,实现服务镜像制作。
  4. 服务集成:完成服务测试、集成测试、联调验证等工作,并上线生产环境。

微服务架构一般分为五层架构,各层的功能如下:

  1. 基础设施层:包括网络、存储、消息队列等。
  2. 数据层:提供数据的访问服务,如 MySQL、MongoDB、Redis 等。
  3. 业务逻辑层:包括服务注册与发现、配置中心、网关服务等。
  4. 服务层:包括多个独立的服务,如用户服务、订单服务等。
  5. 用户界面层:包括 Web UI、移动端 App 等。

3.1服务注册与发现

服务注册与发现(Service Registry and Discovery)是微服务架构设计过程中必不可少的一环。服务注册与发现可以让各个服务实例在启动的时候自动注册到服务中心,并通过注册表查找可用服务实例。服务中心除了保存服务实例的信息之外,还提供了负载均衡、容错等功能。

服务注册与发现的两种模式:

  • Client-Side Load Balancing:客户端负载均衡模式。该模式下,服务消费者自己负责向服务中心查询服务实例列表并负载均衡。优点是可以自己选择负载均衡策略,缺点是每次服务调用都要向服务中心查询。
  • Server-Side Load Balancing:服务端负载均衡模式。该模式下,服务消费者向一个固定的服务地址发送请求,由服务中心根据当前负载情况对服务实例进行调配。优点是服务消费者不需要轮询所有服务实例,缺点是服务消费者无法选择负载均衡策略。

服务注册与发现一般使用如下几种协议:

  • DNS:域名系统服务,主要用于服务发现。
  • ZooKeeper:Apache Hadoop项目下的开源分布式协调工具,主要用于服务注册与发现。
  • Consul:HashiCorp公司开源的服务发现和配置工具,支持多数据中心、ACL权限控制、健康检查等。
  • Eureka:Netflix公司开源的基于REST的服务发现组件。

3.2服务配置中心

服务配置中心(Service Configuration Center)是微服务架构设计过程中必不可少的一环。服务配置中心主要用于保存微服务的配置信息,包括数据库连接串、密钥、加密算法等。服务配置中心可以使用本地文件、远程文件、数据库、ZooKeeper等方式保存配置信息。

服务配置中心需要遵循一定规则来实现配置信息的管理,如分组、版本、命名空间等。配置中心一般需要有防止配置泄露的措施,如加密、权限控制、白名单控制等。

服务配置中心使用的协议有多种,如 Spring Cloud Config、Consul Key-Value、Zookeeper、etcd 等。

3.3网关服务

网关服务(Gateway Service)是微服务架构设计过程中必不可少的一环。网关服务位于业务逻辑层,位于服务调用链路的最后一环,主要用来统一、聚合、过滤传入请求。网关服务的功能主要有以下几点:

  • 服务路由:根据请求的 URL、header 信息等,匹配到对应的服务。
  • 身份认证和授权:验证用户身份和用户权限。
  • 请求速率限制:控制服务调用频率。
  • 请求聚合:将多个 API 请求合并成一个请求。
  • 缓存:将常用数据缓存起来,减少响应时间。
  • 监控与日志:收集请求和响应信息,生成日志文件。

常见的网关服务框架有 Zuul、Spring Cloud Gateway、Kong。

3.4服务编排与调度

服务编排与调度(Service Orchestration and Scheduling)是微服务架构设计过程中必不可少的一环。服务编排与调度主要用于管理微服务集群上的容器资源,包括分配资源、弹性伸缩、服务健康检查等。

服务编排与调度的任务包括资源调度、服务治理、日志采集、跟踪、报警、监控等功能。一般使用编排工具来实现服务编排与调度,如 Kubernetes、Mesos、Docker Swarm 等。

3.5服务测试

服务测试(Service Testing)是微服务架构设计过程中必不可少的一环。服务测试是为了保证微服务的质量,主要包括单元测试、集成测试、性能测试、监控测试、压力测试等。

服务测试的目标是保障服务的正确性、完整性、可用性、可靠性。服务测试方案需要考虑单元测试、集成测试、接口测试、端到端测试、场景测试、定时测试、错误模拟测试等。

3.6服务发布与升级

服务发布与升级(Service Publishing and Upgrading)是微服务架构设计过程中必不可少的一环。服务发布与升级主要用于对生产环境的微服务进行更新和修复。

服务发布与升级的过程包括以下几个步骤:

  1. 准备发布包:将微服务代码编译为 Docker 镜像,并生成部署描述文件,如 Dockerfile、docker-compose 文件。
  2. 上线发布包:将发布包上传到镜像仓库或镜像制品库,供其他部署系统拉取使用。
  3. 配置发布包:修改服务配置,通知服务注册中心更新地址信息。
  4. 部署发布包:部署系统拉取镜像部署微服务。
  5. 验证发布包:启动微服务,执行测试用例,确认发布包成功。
  6. 执行回滚:如遇故障,需要回滚之前的版本,则先回滚到上一版本再重新上线。

服务发布与升级的流程可以使用自动化工具来实现,如 Jenkins、Ansible、Spinnaker、Tekton、Chronos 等。

4.微服务架构最佳实践

4.1服务拆分

服务拆分(Service Splitting)是微服务架构设计的关键因素。服务拆分是将单体应用拆分为多个服务,服务之间通过轻量级的通信协议互相调用,以实现模块化、分布式的架构。当单体应用变得庞大、复杂时,就需要拆分为多个服务。

服务拆分的原则:

  • 业务相关性:相同功能的服务放在一起。
  • 易维护性:服务不能太大,应该拆分到每个服务承担的业务范围内。
  • 易扩展性:服务能适当划分粒度,便于按需扩展。

服务拆分的步骤:

  1. 对应用功能进行分类。
  2. 根据业务特性划分服务。
  3. 根据技术特性划分服务。
  4. 使用轻量级通信协议进行通信。
  5. 服务之间通过独立的 DB、MQ 消费数据。

4.2服务粒度

服务粒度(Service Granularity)是服务拆分的重要方式。服务粒度是指服务的大小,即服务中具体包含哪些功能模块。服务粒度决定了服务的模块化程度、服务间的耦合度,影响了服务的开发和运维难度。

服务粒度的原则:

  • 小粒度服务:微服务越细,反映业务含义就越多,需要更多的人力投入。
  • 中粒度服务:适当划分服务粒度,可以保持服务模块化、服务间耦合度低。
  • 大粒度服务:对于业务比较复杂的系统,建议划分服务粒度比较大。

服务粒度的原因:

  • 耦合度:服务之间的耦合度越低,服务间通信就越容易实现。
  • 模块化程度:服务模块化程度越高,就可以实现更细粒度的功能开发和测试。
  • 资源消耗:服务占用的资源越少,开发、测试和部署速度就越快。

4.3微服务架构模式

微服务架构模式(Microservice Architecture Pattern)是指微服务架构的一些常见的设计模式。微服务架构模式包括消息代理、服务发现、熔断器、限流器、网关、数据网格、Saga事务模式等。

4.4服务间通信

服务间通信(Inter-Service Communication)是微服务架构设计的关键内容。服务间通信可以让各个服务互相调用,但需要注意避免循环调用,导致死锁或雪崩。

服务间通信的原则:

  • 通过异步消息传递:服务间异步通信,提高吞吐量、提升性能。
  • 通过事件驱动架构:事件驱动架构,削峰填谷,提高吞吐量。
  • 用 RESTful API 或消息队列进行通信:采用 RESTful API 或消息队列进行通信,避免双向通信带来的额外开销。
  • 采用接口定义语言定义通信协议:使用 OpenAPI 规范、AsyncAPI 规范定义通信协议。

服务间通信的步骤:

  1. 将通信协议、序列化工具、消息队列选型。
  2. 服务间采用异步通信。
  3. 服务间不发生循环调用。
  4. 服务间采用 API 网关进行通信。

4.5熔断器

熔断器(Circuit Breaker)是微服务架构设计的重要内容。熔断器用于保护微服务免受异常流量或故障服务拖累,以防止级联失败。

熔断器的原理:熔断器通过监控系统的服务质量,判断是否有必要进行熔断,并尝试释放资源以避免服务过载。

熔断器的作用:

  1. 避免级联失败:熔断器在检测到依赖服务故障时,能够快速失败,并释放依赖服务资源,避免级联故障。
  2. 保护微服务资源:熔断器能够在检测到依赖服务发生错误时,停止对该服务的调用,缓解依赖服务压力,保护微服务资源。
  3. 提升性能:熔断器能够通过减少流量或降低质量,来提升微服务的性能。

4.6限流器

限流器(Rate Limiter)也是微服务架构设计的重要内容。限流器用于保护微服务免受异常流量或恶意攻击。限流器能够对 API 或微服务提供者的请求速率进行限制,以防止过载或资源浪费。

限流器的作用:

  1. 保护微服务资源:限流器能够通过限制微服务调用速率,限制并发用户,保护微服务资源。
  2. 降低成本:当出现攻击或爬虫等行为时,限流器能够快速失败,降低成本。
  3. 提升性能:限流器能够通过限制请求频率,提升微服务的性能。

4.7异步消息传递

异步消息传递(Asynchronous Messaging)是微服务架构设计的关键内容。异步消息传递可以降低微服务间的延迟,提升微服务的吞吐量。

异步消息传递的原则:

  • 不等待回复:采用异步消息传递,发送方不需要等待接收方的响应,可以提升系统的响应能力。
  • 批量处理:采用异步消息传递,可以批量处理多个请求,提升系统的吞吐量。
  • 避免重复发送:采用异步消息传递,可以避免重复发送消息,提升系统的幂等性。
  • 支持多种消息中间件:采用异步消息传递,支持多种消息中间件,可以适应不同场景的消息通信需求。

异步消息传递的步骤:

  1. 选取消息中间件。
  2. 创建消息队列。
  3. 异步发送消息。
  4. 订阅消息。
  5. 获取消息。

4.8服务端渲染

服务端渲染(Server Side Rendering)是微服务架构设计的关键内容。服务端渲染可以降低客户端加载页面的延迟,提升用户体验。

服务端渲染的原理:服务端渲染就是将 HTML、CSS、JavaScript 渲染到浏览器上,并显示给用户。

服务端渲染的优点:

  1. 更快的首屏加载速度:服务端渲染能够降低客户端加载页面的延迟,提升用户体验。
  2. 更好的 SEO 效果:服务端渲染能够提供更好的搜索引擎优化 (SEO) ,提升网站流量。
  3. 更容易实现前后端分离:服务端渲染能够更容易实现前后端分离架构,简化开发工作。

服务端渲染的步骤:

  1. 为前端选择前端框架。
  2. 使用模板引擎渲染视图。
  3. 生成静态文件。

4.9微服务架构设计工具

微服务架构设计工具(Microservice Architecture Design Tool)是指微服务架构设计过程中使用的工具。微服务架构设计工具可以帮助企业更好地进行架构设计,提升架构设计的效率。

微服务架构设计工具的作用:

  1. 降低架构设计难度:微服务架构设计工具能够简化架构设计的复杂度,提升架构设计效率。
  2. 提升架构设计质量:微服务架构设计工具能够提供可视化的架构设计,能够直观展示架构设计的质量。
  3. 提升架构设计输出质量:微服务架构设计工具能够将架构设计输出为可执行的代码,帮助架构师快速验证架构设计方案。