这是我参与「第五届青训营 」伴学笔记创作活动的第 3天
微服务架构发展历史简介
架构发展历史
- 单体架构
- 垂直应用架构
- 分布式架构
- SOA架构
- 微服务架构
单体架构
优势: 性能最高 、冗余小
劣势:debug困难、模块相互影响、分工难
垂直应用架构
优势: 不同业务独立开发维护
劣势:不同业务冗余、每个业务都是单体
分布式架构
优势: 服务可以独立于业务
劣势:调用关系复杂、服务冗余、服务模块bug导致业务瘫痪
SOA架构
优势: 服务注册中心
劣势:系统中心化、需要从上到下设计、重构困难
微服务架构
优势:
- 不同部分解耦,开发效率高、
- 业务不影响服务可独立设计
- 自下而上设计、
- 故障隔离,不会因为一个服务不行bug导致业务瘫痪\
劣势
- 治理、运维难度高
- 观测挑战
- 安全性
- 分布式系统
微服务的核心要素
核心要素就是闭幕微服务的劣势
- 服务治理
- 可观测性
- 安全性
微服务的原理架构和特性
服务(service) 一组相同逻辑的运行实体
实例(instance) 一个服务中,每一个运行实体即为一个实例
实例与进程的关系 一个实例可以对应多个进程
集群(lcuster) 服务内部的逻辑划分,包含多个实例
常见的实例形式 进程、VM、K8s pod
有状态/无状态服务 服务实例是否存储了可持久化的数据(比如磁盘文件)
HDFS可以看做一组微服务
服务间的通信
单体服务:简单函数调用
微服务:网络传输
服务注册及发现
一个服务可能有很多服务器,如何确定服务器IP和端口?
hardcode:写死ip和端口
服务器损坏、负载均衡
DNS:把IP和端口存到数据库
- 本地DNScu缓存,导致延迟
- 负载均衡问题
- 域名无法配置端口
- 不支持服务实例的探活检查
解决办法
新增统一的注册中心,用于存储服务名到服务实例(服务器)的映射
服务实例(服务器)的上线和下线
下线:
- 注册中心删掉服务器ip和端口
- 关闭对应的服务器
上线:
- 启动新的服务器,并检查
- 注册中心添加新的服务器ip和端口
流量特征
- 统一网关
- 内部通信多采用RPC
网络调用链路
服务发布
让一个服务升级到最近代码的过程
服务发布难点
难点解决办法
蓝绿部署
一半机器维护、另一半工作
简单稳定,但是需要双倍资源
灰度(金丝雀)部署\
流量治理
在微服务的框架下可以基于地区、集群、实例、请求等维度,实现端到端的流量治理
稳定性治理
字节跳动治理实践
重试的意义
重试:顾名思义就是让相同代码运行多次
一次运行的错误率是百分之一,那么2次运行就可以降到万分之一
重试的难点
- 超时设置
- 重试风暴
- 幂等性
重试风暴
上游的简单重复调用,可能会导致下游服务器崩溃
重试解决办法
- 设置阈值
- 防止链路重试
- hedged request