一、微服务架构介绍
1、系统架构演变历史
(1)单体架构:all in one process
优势:
- 性能最高
- 冗余小
劣势:
- debug困难
- 模块相互影响
- 模块分工,开发流程
(2)垂直应用架构:按照业务线垂直划分
优势:
- 业务独立开发维护
劣势:
- 不同业务存在冗余
- 每个业务还是单体
(3)分布式架构:抽出业务无关的公共模块
优势:
- 业务无关的独立服务
劣势:
- 服务模块bug可导致全站瘫痪
- 调用关系复杂
- 不同服务冗余
(4)微服务架构:彻底的服务化
优势:
- 开发效率
- 业务独立设计
- 自下而上
- 故障隔离
劣势:
- 治理、运维难度
- 观测挑战
- 安全性
- 分布式系统
2、微服务架构核心要素
(1)服务治理
- 服务注册
- 服务发现
- 负载均衡
- 扩缩容
- 流量治理
- 稳定性治理
- ...
(2)可观测性
- 日志采集
- 日志分析
- 监控打点
- 监控大盘
- 异常报警
- 链路追踪
- ...
(3)安全
- 身份验证
- 认证授权
- 访问令牌
- 审计
- 传输加密
- 黑产攻击
- ...
二、微服务架构原理及特征
1、基本概念
(1)服务(service)
一组具有相同逻辑的运行实体。
(2)实例(instance)
一个服务中,每个运行实体即为一个实例。
(3)实例与进程的关系
实例与进程没有必然对应关系,可以一个实例对应一个或多个进程(反之不常见)。
(4)集群(cluster)
通常指服务内部的逻辑划分,包含多个实例。
(5)常见的实例承载形式
进程、VM、k8s pod ...
(6)有状态/无状态服务
服务的实例是否存储了可持久化的数据(例如磁盘文件)。
(7)服务间通信
- 对于单体服务,不同模块通信只是简单的函数调用
- 对于微服务,服务间通信意味着网络传输。
2、服务注册及发现
在代码层面,如何指定调用一个目标服务的地址(ip:port)?
解决思路:新增一个统一的服务注册中心,用于存储服务名到服务实例的映射。
3、流量特征
- 统一网关入口
- 内网通信多数采用RPC
- 网状调用链路
三、核心服务治理功能
1、服务发布(deployment)
服务发布即指一个服务升级运行新的代码的过程。
服务发布的难点:
- 服务不可用
- 服务抖动
- 服务回滚
(1)蓝绿部署:
在蓝绿部署中,有两个相同的环境(或资源集)用于部署和测试新版本的软件。一个环境被认为是“蓝色”环境,另一个被认为是“绿色”环境。
当前版本的软件在蓝色环境中运行,新版本在绿色环境中进行部署和测试。一旦新版本在绿色环境中被认为稳定且功能齐全,流量可以从蓝色环境切换到绿色环境,使新版本成为当前版本。
这种方法的优点是它最大限度降低了部署新版本软件可能导致的停机或错误风险。若在部署或测试过程中出现问题,可以快速切换回蓝色环境,而不会对用户造成任何干扰。这使得蓝绿部署成为需要高可用性和正常运行时间的公司的热门选择。
优点:
- 停机时间最短:蓝绿部署允许零停机更新,因为新版本的应用程序在切换到蓝色环境之前部署到绿色环境,这可以导致停机时间最少。
- 降低风险:由于新版本的应用部署到绿色环境,部署过程中出现的任何问题都与绿色环境隔离,降低了大范围故障的风险。
- 简化回滚:如果部署过程中出现问题,很容易回滚到以前的版本,因为蓝色环境仍然运行以前的版本。
- 提高可靠性:由于蓝色和绿色环境相同,蓝绿部署可以帮助确保应用程序可靠和稳定。
缺点:
- 复杂性增加: 蓝绿部署的设置和管理可能很复杂,尤其是对于具有许多组件的大型应用程序。它需要仔细规划和协调,以确保正确设置绿色环境,并确保从蓝色环境到绿色环境的无缝切换。
- 增加资源使用:运行两个相同的环境可能需要更多资源,这会导致成本增加。
- 更长的部署时间: 蓝绿可能需要更长的部署时间,因为新版本的应用程序需要先部署到绿色环境,然后才能切换到蓝色环境。
- 配置漂移的风险:由于两个相同的环境同时运行,如果更改一个环境而不更改另一个环境,则存在配置漂移的风险。通过使用自动化和配置管理工具来确保环境保持相同,可以减轻这种风险。
(2)灰度发布(金丝雀发布)
金丝雀发布就像蓝绿部署,只是它风险更小。无需一步从蓝色切换到绿色,而是使用一种分阶段的方法。
通过金丝雀分布,可以在生产基础设施的一小部分部署新的应用程序代码,一旦应用程序被签署发布,只有少数用户被路由到新版本,这样可以最大限度地减少任何影响。
在没有错误报告的情况下,新版本可以逐步推广到基础架构的其余部分。
优点:
- 降低风险: 金丝雀部署可以降低风险,因为新版本的应用程序被推出到一小部分用户或服务器,允许在问题影响更广泛的受众之前检测和缓解任何问题。
- 早期反馈: 金丝雀部署提供一小部分用户对新版本应用程序的早期反馈,这有助于在向更广泛的受众推出之前识别问题并改进应用程序。
- 提高可靠性:金丝雀部署有助于提高应用程序的可靠性,确保在问题影响更广泛的受众之前及早发现并解决任何问题。
- 受控推出:金丝雀部署允许受控推出新版本的应用程序,这有助于确保推出顺利并且不会导致任何意外问题。
缺点:
- 复杂性增加:金丝雀部署的设置和管理可能很复杂,尤其是对于具有许多组件的大型应用程序。它需要仔细规划和协调,以确保正确设置金丝雀版本并且无缝推出。
- 增加资源使用:运行两个版本的应用程序可能需要更多资源,这会导致成本增加。
- 更长的部署时间: 金丝雀部署可能需要更长的时间才能部署,因为新版本的应用程序需要在向更广泛的受众推出之前进行测试和监控。
- 金丝雀超载的风险:如果金丝雀子集太小或不能代表更广泛的受众,它可能会因流量或使用而超载,这可能会扭曲结果并影响应用程序的整体性能。
2、流量治理
在微服务架构下,我们可以基于地区、集群、实例、请求等维度,对端到端流量的路由进行精确控制。
3、负载均衡(load balance)
负责分配请求在每个下游实例上的分布
常见的策略:
- Round Robin
- Random
- Ring Hash
- Least Request
- ...
4、稳定性治理
线上服务总会出现问题,这与程序的正确性无关。
- 网络攻击
- 流量突增
- 机房断电
- 光纤被挖
- 机器故障
- 机房空调故障
- ...
微服务架构中典型的稳定性治理功能: