本文主要记录掘金字节内部课程笔记,主要分为基本介绍、原理特征、核心功能三个部分,如有错误之处,感谢读者指正!
一、基本介绍
主要包含微服务架构的背景由来、架构慑览、基本要素
1、演变历史:
单体架构
- 特点:all in one process
- 优势:1.性能最高 2.冗余小
- 劣势:1.debug 困难 2.模块相互影响 3.模块分工、开发流程
垂直应用架构
- 特点:按照业务线垂直划分
- 优势:1.业务独立开发维护
- 劣势:1.不同业务存在冗余 2.每个业务还是单体
分布式架构
- 特点:抽出业务无关的公共模块
- 优势:1.业务无关的独立服务
- 劣势:1.服务模块bug可导致全站瘫痪 2.调用关系复杂 3.不同服务冗余
SOA架构(Service Oriented Architecture)
- 特点:面向服务
- 优势:1.服务注册
- 劣势:1.整个系统设计是中心化的 2.需要从上至下设计 3.重构困难
微服务架构
- 特点:彻底地服务化
- 优势:1.开发效率 2.业务独立设计 3.自下而上 4.故障隔离
- 劣势:1.治理、运维难度 2.观测挑战 3.安全性 4.分布式系统
2、核心要素
-
服务治理
服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理
-
可观测性
日志采集、日志分析、监控打点、监控大盘、异常报警、链路追踪
-
安全
身份验证、认证授权、访问令牌、审计、传输加密、黑产攻击
二、微服务架构原理及特征
1、基本概念
-
服务(service ):一组具有相同逻辑的运行实体
-
实例(instance):一个服务中,每个运行实体即为一个实例。
-
实例与进程的关系:实例与进程之间没有必然对应关系,可以一个实例可以对应一个或多个进程 (反之不常见)
-
集群 (cluster):通常指服务内部的逻辑划分,包含多个实例。
-
常见的实例承载形式:进程、VM、k8s pod ......
-
有状态 / 无状态服务:服务的实例是否存储了可持久化的数据(例如磁盘文件)
-
服务间通信 对于单体服务,不同模块通信只是简单的函数调用。 对于微服务,服务间通信意味着网络传输。
2、服务注册及发现
在代码层面,如何指定调用一个目标服务的地址(ip:port)?
本地 DNS 存在缓存,导致延时、负载均衡问题、不支持服务实例的探活检查、域名无法配置端口。
解决思路: 新增一个统一的服务注册中心,用于存储服务名到服务实例的映射。
3、流量特征
统一网关入口内网
通信多数采用RPC
网状调用链路
三、核心服务治理功能
核心的服务治理功能,包括服务发布、流量治理、服务均衡、稳定性治理
1、服务发布
服务发布 (deployment),即指让一个服务升级运行新的代码的过程
难点:服务不可用、服务抖动、服务回滚
灰度发布(金丝雀发布):试探,新建一个实例,删除一个,再新建一个
2、流量治理
在微服务架构下,我们可以基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行控制,通过加权百分比的形式。
3、负载均衡
负载均衡(Load Balance)负责分配请求在每个下游实例上的分布 常见的 LB 策略:Round Robin、random、Ring Hash、Least Request
4、稳定性治理
笔者的理解是微服务架构相当于把一整个系统切分成很多个子系统,每一个系统视为微小的服务组份,分别开发,建立关联,向客户提供服务,避免系统的庞大冗余。