凤凰架构(读书笔记)
2022-08-12 20:52:22 55 举报
AI智能生成
架构
作者其他创作
大纲/内容
不同部件的价值
尽可能减少单点部件
奥卡姆剃刀原则
流量规划原则
状态缓存
受限于客户端的本地时间
无法处理涉及用户身份的私有资源
无法描述“不缓存”的语义
不足
Expires
max-age
s-maxage
public
private
no-cache
no-store
no-transform
min-fresh
only-if-cached
must-revalidate
proxy-revalidate
Cache-Control
概要
强制缓存
Last-Modified和If-Modified-Since
ETag和If-None-Match
协商缓存
HTTP缓存机制
客户端缓存
权威域名服务器
根域名服务器
DNS预取
性能
HTTPDNS
安全
域名解析
连接数优化
传输压缩
快速UDP网络连接
传输链路
网站服务器接入网络运营商的链路所能提供的出口带宽
用户客户端接入网络运营商的链路所能提供的入口带宽
从网站到用户经过的不同运营商之间的互联节点的带宽
从网站到用户的物理链路传输延时
影响一个互联网系统速度的因素
路由解析
主动分发(Push)
被动回源(Pull)
内容分发
负载均衡
加速静态资源分发
安全防御
协议升级
修改资源
访问控制
注入功能
CDN应用
工作过程
内容分发网络
四层负载均衡(性能高)
七层负载均衡(功能强)
轮询(Round Robin)
权重轮询(Weighted Round Robin)
随机(Random)
权重随机(Weighted Random)
一致性哈希(Consistency Hash)
响应速度(Response Time)
最少连接数(Least Connection)
均衡策略与实现
LVS(Linux Virtual Server)
直接建设在操作系统内核
Nginx
HAProxy
KeepAlived
应用程序形式
软件均衡器
F5
A10
硬件均衡器
从实现角度分类
为缓解CPU压力而引入缓存
为缓解I/O压力而引入缓存.
引入缓存的理由
吞吐量
FIFO(First In First Out)
LRU(Least Recent Used)
TinyLFU
W-TinyLFU
LFU(Least Frequently Used)
命中率
扩展功能
分布式缓存
缓存属性
对于业务逻辑本身不能避免的缓存穿透
对于恶意攻击导致的缓存穿透
缓存穿透
加锁同步
热点数据由代码来手动管理
缓存击穿
提升缓存系统可用性,建设分布式缓存的集群
启用透明多级缓存
将缓存的生存期改为随机时间
缓存雪崩
Cache Aside
Read/Write Through
Write Behind Caching
缓存污染
缓存风险
服务端缓存
工具与手段
透明多级分流
认证(Authentication)
授权(Authorization)
凭证(Credential)
保密(Confidentiality)
传输(Transport Security)
验证(Verification)
架构安全性
事务处理
访问远程服务(TODO)
1、架构师视角
状态转移
操作转移
状态机
状态机复制
Quorum机制
协商共识(Consensus)
概念
提案节点(Proposer)
决策节点(Acceptor)
记录节点(learner)
三类节点
Paxos
Multi Paxos
分布式共识(TODO)
服务发现
对消费者来说,外部的服务由谁提供?具体在什么网络位置?
服务的网关路由
对生产者来说,内部哪些服务需要暴露?哪些需要隐藏?应当以何种形式暴露服务?以什么规则在集群中分配请求?
服务的负载均衡
对调用过程来说,如何保证每个远程服务都接收到到相对平均的流量,获得尽可能高的服务质量与可靠性?
需要考虑的问题
Netflix Eureka
HashiCorp Consul
Ali Nacos
产品
服务的注册(Service Registration)
服务的维护(Service Maintaining)
服务的发现(Service Discovery)
Eureka
Consul
可用与可靠
Zookeeper
Doozerd
etcd
在分布式K/V存储框架自己开发的服务发现
CoreDNS
SkyDNS
以基础设施(主要是指DNS服务器)来实现服务发现
Nacos
专门用于服务发现的框架和工具
注册中心实现
服务发现(Service Discovery)
不能确保集群中每个节点都有外网连接
网络限制
不仅是服务节点的安全,外部自身也会会受到如浏览器同源策略的约束
安全限制
服务坐标这类信息不属于对外接口承诺的内容,随时可能变动,不应该依赖它
依赖限制
统一对外交互的代理人角色
四层流量转发
七层流量代理
负载均衡器是为了根据均衡算法对流量进行平均地路由
网关是为了根据流量中的某种特征进行正确地路由
负载均衡器和服务网关比较
网络协议层次
网关应尽可能轻量
网关选型时,应该尽可能选择较成熟的产品实现
在需要高可用的生产环境中,应当考虑在网关之前部署负载均衡器或者等价路由器
可用性
性能与可用性
考量的是
Netflix Zull
Kubernetes Ingress Controller
Istio VirtualServer
路由器(基础职能)
过滤器(可选职能)
网关
网关的职责
阻塞I/O模型
非阻塞I/O模型
select
epoll
kqueue
多路复用I/O模型
信号驱动I/O模型
同步I/O
异步I/O模型
异步I/O
类型
类型及模型
网络I/O模型
BFF网关
网关路由(Gateway)
Netflix Ribbon
Spring Cloud LoadBalancer
负载均衡器与服务之间的信息交换是进程内的方法调用,不存在任何额外的网络开销
不依赖集群边缘的设施,所有内部流量都仅在服务集群的内部循环,避免了“绕场一周”的尴尬局面
分散式的负载均衡器意味着天然避免了集中式的单点问题,它的带宽资源将不会像集中式负载均衡器那样敏感
客户端负载均衡器更加灵活
优点
它与服务运行于同一个进程内,意味着它的选型受到服务所使用的编程语言的限制
从个体服务来看,由于是共用同一个进程,负载均衡器的稳定性会直接影响整个服务进程的稳定性
由于请求的来源可能是集群中任意一个服务节点,而不再是统一来自集中式负载均衡器,使得内部网络安全和信任关系变得复杂,当攻破一个服务时,更容易通过该服务突破集群中的其他部分
服务集群的拓扑关系是动态的,数量庞大的客户端负载均衡器一直持续轮训服务注册中心,也会带来不小的负担
缺点
客户端负载均衡器( Client-Side Load Balancer)
不再受编程语言的限制
边车代理接受控制平面的统一管理,当服务节点拓扑关系发生变化时,控制平面就会主动向边车代理发送更新服务清单的控制指令
在安全性、可观测性上,由于边车代理都是一致的实现,有利于在服务间建立双向mTLS通信,也有利于对整个调用链路给出更详细的统计信息。
代理负载均衡器(Proxy Client-Side Load Balancer)
举例:华北、华南
特点:不用地域之间是没有内网连接的,所有流量都只能通过公网相连
地域(Region)
是Availability Zone(可用区域)的简称
概念:在地理上位于同一地域内,但电力和网络是互相独立的物流区域
举例:华东的上海、杭州、苏州的不同机房就是同一个地域的几个可用区域
特点:同一个地域的可用区域之间具有内网连接,流量不占用公网带宽,因此区域是微服务集群内流量能够触及的最大范围
追求高可用
追求低延迟
权衡
区域(Zone)
地域与区域
客户端负载均衡
从类库到服务
雪崩效应(服务容错)
请求积压(流量控制)
两个困扰
故障转移(Failover)
快速失败(Failfast)
安全失败(Failsafe)
沉默失败(Failsilent)
故障恢复(Failback)
针对调用失败如何弥补
并行调用(Forking)
广播调用(Broadcast)
调用之前如何获得最大的成功概率
容错策略(面对故障,我们应该做些什么)
一段时间(譬如10s以内)内请求数量达到一定阈值(譬如20个请求)
一段时间(譬如10s以内)内请求的故障率(发生失败、超时、拒绝的统计比例)到达一定阈值(譬如50%)
断路器模式
400
500
失败
401
403
拒绝
408
504
超时
调用外部服务的故障大致可以分为
在服务调用端或者边车代理上实现服务层面的隔离
在DNS或者网关处实现系统层面的隔离
舱壁隔离模式
仅在主路逻辑的关键服务上进行同步的重试
仅对由瞬时故障导致的失败进行重试
仅对具备幂等性的服务进行重试
超时终止
次数终止
重试必须具有明确的终止条件
是否应该且是否能够重试的条件
重试模式
容错设计模式(要实现某种容错策略,我们该如何去做)
服务容错
依据什么限流
具体如何限流
否决式限流
子主题
超额流量如何处理
要解决的三个问题
每秒事务数(TPS)
每秒请求数(HPS)
每秒查询数(QPS)
流量统计指标
流量计数器
滑动时间窗模式(Sliding Window Algorithm)
漏桶模式(Leaky Bucket Algorithm)
令牌桶模式(Token Bucket Algorithm)
限流设计模式
分布式限流
流量控制
流量治理
基于边界的安全模型(Perimeter-Based Security Model)
零信任安全网络不等同于放弃在边界上的保护设施
身份只来源于服务
服务之间没有固有的信任关系
集中、共享的安全策略实施点
受信任的机器运行来源已知的代码
自动化、标准化的变更管理
强隔离性的工作负载
观点
公开密钥基础设施(Public Key Infrastructure,PKI)
PKI是构建传输安全层(Transport Layer Security,TLS)的必要基础
单向TLS认证
双向TLS认证
TLS
建立信任
服务认证(Peer Authentication)
请求认证(Request Authentication)
分类
认证
授权
服务安全
零信任安全模型(Zero-Trust Security Model)
可靠通信
Application(应用输出日志)
Beats(收集)
Redis(缓冲)
Logstash(聚合、加工)
Elasticsearch(索引、存储)
Kibana(分析、查询)
步骤
避免打印敏感信息
避免引用慢操作
避免打印追踪诊断信息
避免误导他人
不应该有
处理请求时的TraceID
系统运行过程中的关键事件
启动时输出配置信息
应该有
输出
收集与缓冲
加工与聚合
存储与查询
每个步骤的目的与方法
事件日志(Logging)
应该由数据收集、数据存储、数据展示三个独立的子系统构成
广义上
只是指链路追踪数据的收集部分
狭义上
定义
低性能损耗
对应用透明
随应用扩缩
持续的监控
非功能性挑战
追踪与跨度
基于日志的追踪(Log-Based Tracing)
基于服务的追踪(Service-Based Tracing)
基于边车代理的追踪(Sidecar-Based Tracing)
追踪系统按数据收集方式分类
数据收集
追踪规范化
链路追踪(Tracing)
计数度量器(Counter)
瞬态度量器(Gauge)
吞吐率度量器(Meter)
直方图度量器(Histogram)
采样点分位图度量器(Quantile Summary)
如何定义指标
拉取式采集(Pull-Based Metrics Collection)
推送式采集(Push-Based Metrics Collection)
如何将这些指标告诉服务端
指标收集
时序数据库(Time Series Database)
存储查询
监控预警
聚合度量(Metrics)
方向
可观测性(Observability)
2、分布式的基石
虚拟化容器
容器间网络
持久化存储
资源与调度
服务网格
3、不可变基础设施
凤凰架构
0 条评论
下一页