大数跨境
0
0

微服务架构最佳实践 - 基础设施篇

微服务架构最佳实践 - 基础设施篇 二进制跳动
2024-05-18
0
导读:微服务架构最佳实践 - 基础设施篇

每项微服务基础设施都是一个平台、一个系统、一个解决方案,如果要自己实现,其过程和做业务系统类似,都需要经过需求分析、架构设计、开发、测试、部署上线等步骤。

自动化测试

微服务将原本的单体系统拆分为多个独立运行的微小服务,这导致微服务之间的接口数量大幅增加。此外,微服务倡导快速交付,版本周期短,版本更新频繁。如果每次更新都依赖人工进行整个系统的回归测试,那么工作量将会很大,效率也会很低,无法实现快速交付的目标。因此,必须通过自动化测试系统来完成绝大部分测试回归工作。

自动化测试的范围包括代码级的单元测试、单个系统级的集成测试以及系统间的接口测试。理想情况下,每种测试都应该实现自动化。如果由于团队规模和人力资源的原因无法全面覆盖,至少也要确保接口测试是自动化的。


自动化部署

相比于单体系统,微服务需要部署的节点数量增加了几倍甚至十几倍,部署频率也会大幅提升。以我们的业务系统为例,工作日有 70% 的时间都需要进行部署操作。综合计算下来,微服务的部署次数是单体系统部署次数的几十倍。这么高频的部署操作,如果仍然采用人工处理,将需要投入大量人力,并且容易出错。因此,需要通过自动化部署系统来完成部署操作。

自动化部署系统包括版本管理、资源管理(例如,机器管理、虚拟机管理)、部署操作和回退操作等功能。


配置中心

微服务的节点数量非常庞大,如果通过人工登录每台机器手动修改配置,效率会很低且容易出错。特别是在部署或排障时,需要快速进行增删改查配置,人工操作的方式显然不够有效。此外,一些运行期配置需要动态修改并且要求所有节点即时生效,这也是人工操作无法满足的。因此,微服务需要一个统一的配置中心来管理所有微服务节点的配置。

配置中心包括配置版本管理(例如,对于同一个微服务,有 10 个节点是为移动用户提供服务,有 20 个节点是为联通用户提供服务,配置项相同但配置值不同)、增删改查配置、节点管理、配置同步和配置推送等功能。


接口框架

微服务倡导采用轻量级的通信方式,通常使用 HTTP/REST 或 RPC 统一接口协议。然而,仅仅统一接口协议是不够的,还需要统一接口传递的数据格式。举例来说,我们需要指定接口协议为 HTTP/REST,但这仅仅是一部分,我们还需要指定 HTTP/REST 的数据格式应采用 JSON,并且 JSON 的数据都应遵循特定的规范。

如果我们只是简单地指定了 HTTP/REST 协议,而没有明确指定 JSON 和 JSON 数据规范,就会导致混乱的局面:一些微服务采用 XML,一些采用 JSON,还有一些采用键值对;即使使用了 JSON,JSON 数据格式也可能不一致。这样每个微服务都需要适配多种接口协议,相当于把曾经由 ESB 做的事情转嫁给了微服务自身,这显然效率是无法接受的。因此,需要统一接口框架。

接口框架通常以库或包的形式提供给所有微服务调用,它不是一个可运行的系统。例如,在上面的 JSON 示例中,某个基础技术团队可以提供多种不同语言的解析包(例如 Java 包、Python 包、C 库等)。


API 网关

系统拆分为微服务后,内部的微服务之间是互联互通的,相互之间的访问都是点对点的。如果外部系统想调用系统的某个功能,也采取点对点的方式,则外部系统会非常“头大”。因为在外部系统看来,它不需要也没办法理解这么多微服务的职责分工和边界,它只会关注它需要的能力,而不会关注这个能力应该由哪个微服务提供。

除此以外,外部系统访问系统还涉及安全和权限相关的限制,如果外部系统直接访问某个微服务,则意味着每个微服务都要自己实现安全和权限的功能,这样做不但工作量大,而且都是重复工作。

综合上面的分析,微服务需要一个统一的 API 网关,负责外部系统的访问操作。

API 网关是外部系统访问的接口,所有的外部系统接⼊系统都需要通过 API 网关,主要包括接入鉴权(是否允许接入)、权限控制(可以访问哪些功能)、传输加密、请求路由、流量控制等功能。

服务发现

由于微服务的种类和数量庞大,如果所有这些信息都通过手工配置的方式写入各个微服务节点,将会面临两个主要问题。首先,配置工作量巨大,配置文件可能需要几百上千行,几十个节点加起来可能会有几万甚至几十万行配置。人工维护如此庞大数量的配置项将是一场灾难。其次,微服务节点经常发生变化,可能是由于扩容导致节点增加,也可能是由于故障处理而隔离掉一部分节点,还可能是采用灰度升级的方式,先将一部分节点升级到新版本,然后让新老版本同时运行。无论是哪种情况,我们都希望节点的变化能够及时同步到所有其他依赖的微服务。然而,如果采用手工配置的方式,是不可能做到实时更改生效的。因此,需要一套服务发现的系统来支持微服务的自动注册和发现。

服务发现主要有两种实现方式:自理式和代理式。

1.自理式

自理式结构就是指每个微服务自己完成服务发现。例如,图中 SERVICE INSTANCE A 访问 SERVICE REGISTRY 获取服务注册信息,然后直接访问 SERVICE INSTANCE B。

自理式服务发现实现比较简单,因为这部分的功能一般通过统一的程序库或者程序包提供给各个微服务调用,而不会每个微服务都自己来重复实现一遍;并且由于每个微服务都承担了服务发现的功能,访问压力分散到了各个微服务节点,性能和可用性上不存在明显的压力和风险。


2. 代理式

代理式结构如下:

代理式结构指微服务之间通过一个负载均衡系统(如图中的 LOAD BALANCER 节点)来完成服务发现。

虽然代理式方式看起来更清晰,微服务的实现也更简单,但实际上这种方案存在一定的风险。首先是可用性风险,一旦负载均衡系统发生故障,将影响所有微服务之间的调用;其次是性能风险,所有微服务之间的调用流量都必须经过负载均衡系统,性能压力随着微服务数量和流量的增加而增加,最终可能成为性能瓶颈。因此,负载均衡系统需要设计成集群模式,但负载均衡集群的实现本身又增加了复杂性。

不论是自理式还是代理式,服务发现的核心功能都是服务注册表。注册表记录了所有服务节点的配置和状态,每个微服务启动后都需要将自己的信息注册到服务注册表,然后由微服务或负载均衡系统查询服务注册表以获取可用服务。

服务路由

有了服务发现后,微服务可以方便地获取相关配置信息。然而,在具体发起调用请求时,我们需要从所有符合条件的可用微服务节点中选择一个来处理请求,这就是服务路由的功能。

服务路由与服务发现密切相关,通常情况下它们会一起实现,而不是作为独立的系统。在自理式服务发现中,服务路由由微服务内部实现;在代理式服务发现中,服务路由由负载均衡系统实现。无论实现方式如何,服务路由的核心功能都是路由算法。常见的路由算法包括随机路由、轮询路由、最小压力路由和最小连接数路由等。

服务容错

系统拆分为微服务后,单个微服务故障的概率变小,故障影响范围也减少,但微服务的节点数量大幅增加。从整体上看,系统中某个微服务出现故障的概率会显著增加。微服务具有故障扩散的特点。如果不及时处理故障,故障可能会扩散,导致系统中许多服务节点看似都出现故障。因此,微服务需要能够自动处理这种错误情况,及时进行处理。如果每次节点故障都需要人工处理,那么投入人力将会很大,处理速度也会很慢。一旦处理速度慢,故障就可能迅速扩散。因此,我们需要微服务具备服务容错的能力。

常见的服务容错包括请求重试、流控和服务隔离。通常情况下,服务容错会集成在服务发现和服务路由系统中。

服务监控

系统拆分为微服务后,节点数量大幅增加,需要监控的机器、网络、进程、接口调用数等监控对象也大幅增加。一旦出现故障,需要快速定位故障,这对人力来说是不现实的。举个例子,如果收到用户投诉说业务有问题,采用人工方式搜集、分析信息可能需要花费大量时间。因此,我们需要服务监控系统来监控微服务节点。

服务监控的主要作用包括:

  1. 实时搜集信息并进行分析,避免故障后再来分析,减少处理时间。

  2. 可以在实时分析的基础上进行预警,在问题发生初期就发现并预警,降低问题的影响范围和时间。

通常情况下,服务监控需要搜集并分析大量数据,因此建议将其设计为独立的系统,而不要集成到服务发现、API 网关等系统中。

服务跟踪

服务监控可以实现对微服务节点级的监控和信息收集,但要跟踪某一请求在微服务中的完整路径就比较困难。因为如果每个服务的完整请求链信息都实时发送给服务监控系统,数据量会变得非常庞大,难以处理。

服务监控和服务跟踪的区别可以简单概括为宏观和微观的区别。举个例子,服务A通过HTTP协议请求服务B 10次,B通过HTTP返回JSON对象。服务监控会记录请求次数、响应时间平均值、响应时间最高值、错误码分布等信息;而服务跟踪则会记录其中某次请求的发起时间、响应时间、响应错误码、请求参数、返回的JSON对象等详细信息。

服务安全

系统拆分为微服务后,数据分散在各个微服务节点上。从系统连接的角度来说,任意微服务都可以访问所有其他微服务节点;但从业务的角度来说,部分敏感数据或者操作,只能部分微服务可以访问,而不是所有的微服务都可以访问,因此需要设计服务安全机制来保证业务和数据的安全性。

服务安全主要分为三部分:接入安全、数据安全、传输安全。通常情况下,服务安全可以集成到配置中心系统中进行实现,即配置中心配置微服务的接入安全策略和数据安全策略,微服务节点从配置中心获取这些配置信息,然后在处理具体的微服务调用请求时根据安全策略进行处理。由于这些策略是通用的,一般会把策略封装成通用的库提供给各个微服务调用。



【声明】内容源于网络
0
0
二进制跳动
15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
内容 739
粉丝 0
二进制跳动 15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
总阅读5
粉丝0
内容739