java分布式系统架构
2025-07-21 15:28:43 0 举报
AI智能生成
java分布式系统架构演进趋势
作者其他创作
大纲/内容
事务管理
本地事务
单服务-单数据源
ACID
全局事务
单服务-多数据源
共享事务
多服务-单数据源
分布式事务
多服务-多数据源
ACP
可用性A
一致性C
分区容错性P
实现方式
可靠消息队列
最大努力交付
隔离性不够
TCC
业务侵入性强
强隔离性
尝试执行(确认所有业务可执行性)-确认执行(保证幂等)-取消执行(幂等)
SAGA
数据补偿
正向恢复
逆向恢复
流量管理
多级分流设计
DNS域名解析
DNS预取,前端资源加载时,通过link请求预解析
浏览器缓存
状态缓存
强制缓存
协商缓存
传输链路优化
http1.1
http2
http3
CDN
解决网络传输中的带宽、时延问题
优点
加速资源访问
安全防御
协议升级
状态缓存
访问控制
模式
主动推送
被动更新
负载均衡器
四层负载
传输层
网络层负载均衡
数据链路层负载均衡
七层负载
应用层
正向代理
代表客户端与服务器通信
反向代理
代表服务器与客户端通信
透明代理
服务器缓存
进程内缓存
分布式缓存
类型
复制式缓存
集中式缓存
常见问题
缓存穿透
现象
访问数据库不存在的数据
解决
布隆过滤器
将空值缓存
缓存击穿
现象
访问过期的key
解决
更新缓存时,加互斥锁
代码定时更新缓存数据
缓存雪崩
现象
大量热点key过期
解决
key失效时间随机
缓存污染
现象
缓存数据与数据源不一致
解决
先写数据库,再失效缓存
binlog监听
服务演进及相关组件
基于spring boot
版本
背景
组件
基于spring cloud alibba
背景
业务体量不断壮大,并发与可用方面的要求也越来越高
对开发人员要求变高
目标
数据去中心化
分散治理
组件及版本
服务发现
nacos
配置中心
nacos
限流安全
sentinel
服务调用
dubbo
分布式事务
seata
认证授权
OAuth2
服务网关
spring cloud gateway
基于istio + k8s
版本
istio 1.13.1
k8s 1.21.2
docker 20.10.2
背景
开发人员学习微服务相关中间件成本高
运维压力大
目标
尽可能减少非业务性代码比例
尽可能不影响现有代码,完成迁移
通过基础设施层面去解决这些分布式问题
灵活地扩容缩容
裁剪技术栈深度,回归单体架构中基于 Spring Boot 的开发模式
要求一小部分核心的成员对微服务、Kubernetes、Istio 等技术有深刻的理解即可
组件
服务发现
service
配置中心
configmap
限流、负载均衡
Envoy
服务网关
Istio Ingress Gateway
分布式事务
TCC
认证授权
OAuth2
云原生
概念
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用
容器、微服务、服务网格、不可变基础设施和声明式API
容器
容器演进
隔离文件
隔离访问
隔离资源
封装系统
封装应用
docker
封装集群
kubernetes
容器编排
隔离和协作
节点
应于集群中的单台机器,这里的机器即可以是生产环境中的物理机,也可以是云计算环境中的虚拟节点,节点是处理器和内存等资源的资源池,是硬件单元的最小单位
pod
Pod 中容器共享 UTS、IPC、网络等名称空间,是资源调度的最小单位
集群
管理多个节点;是处理元数据的最小单位
集群联邦
管理多个集群;支持跨可用区域多活、跨地域容灾
韧性与弹性
故障恢复
滚动更新
自动扩缩
网络
Docker
Kubernetes
持久化存储
volume
资源和调度
资源
namespace
pod
request
调度分配资源
limit
运行最大资源
可压缩资源
cpu
不可压缩
内存
超出会驱逐pod
调度
缓存
两个控制器参与调度
服务质量级别 和 优先级
策略
通用
最基础的调度过滤策略,用来检查节点是否能满足 Pod 声明中需要的资源。譬如处理器、内存资源是否满足,主机端口与声明的 NodePort 是否存在冲突,Pod 的选择器或者nodeAffinity指定的节点是否与目标相匹配,等等
卷
与存储相关的过滤策略,用来检查节点挂载的 Volume 是否存在冲突(譬如将一个块设备挂载到两个节点上),或者 Volume 的可用区域是否与目标节点冲突,等等
节点
宿主机相关的过滤策略,最典型的是 Kubernetes 的污点与容忍度机制(Taints and Tolerations),譬如默认情况下 Kubernetes 会设置 Master 节点不允许被调度,这就是通过在 Master 中施加污点来避免的。之前提到的控制节点处于驱逐状态,或者在驱逐后一段时间不允许调度,也是在这个策略里实现的
服务网格
通讯演进
与业务代码耦合
将通信的非功能性需求视作业务需求的一部分,通信的可靠性由程序员来保障
使用第三方网络通讯包
将代码中的通信功能抽离重构成公共组件库,通信的可靠性由专业的平台程序员来保障
与应用隔离,通过网络代理交互
将负责通信的公共组件库分离到进程之外,程序间通过网络代理来交互,通信的可靠性由专门的网络代理提供商来保障
网络代理以边车形式注入容器
将网络代理以边车的形式注入到应用容器,自动劫持应用的网络流量,通信的可靠性由专门的通信基础设施来保障
服务网格
将边车代理统一管控起来实现安全、可控、可观测的通信,将数据平面与控制平面分离开来,实现通用、透明的通信,这项工作就由专门的服务网格框架来保障
istio
数据平面
代理注入
动态注入
Kubernetes 会把拟新建 Pod 的元数据定义作为参数发送给此 HTTP Endpoint,然后从服务返回结果中得到注入了边车代理的新 Pod 定义,以此自动完成注入
流量劫持
基于iptables
可靠通信
将代理的转发的行为规则抽象成 Listener、Router、Cluster 三种资源
Listener 可以简单理解为 Envoy 的一个监听端口,用于接收来自下游应用程序(Downstream)的数据
Cluster 是 Envoy 能够连接到的一组逻辑上提供相同服务的上游(Upstream)主机
Router 则决定 Listener 在接收到下游的数据之后,具体应该将数据交给哪一个 Cluster 处理,由此定义可知,Router 实际上是承担了服务网关的职责
控制平面
与数据平面交互
流量控制
安全控制
可观测性
安全管理
模式
通讯信道认证
通讯协议认证
通讯内容认证
授权
OAuth 2
授权码模式
隐式授权
密码模式
客户端模式
方式
角色访问控制(RBAC)
关系
角色职责继承
角色职责分离
目的
(水平)数据权限
(垂直)功能权限
凭证
Cookie-Session 机制
JWT
保密
密码建议在服务端加密存储
通过https传输
传输
摘要、加密、签名
摘要:不可逆. 将报文hash加密传输
加密:可逆
签名: 客户端用私钥加密,服务端用公钥解密. 确认发送方是正确的
加密算法
对称
加密和解密都使用相同的密钥
非对称
公钥加密,私钥解密,这种就是加密
私钥加密,公钥解密,这种就是签名
混合
用非对称加密来安全地传递少量数据给通讯的另一方,然后再以这些数据为密钥,采用对称加密来安全高效地大量加密传输数据
由多种加密算法组合的应用形式,就被称为“密码学套件”,非对称加密在这个场景中发挥的作用被称为“密钥协商”
数字证书
传输安全层
TLS1.2
TLS1.3
验证
格式验证
业务验证
分布式组件
共识
达成一致性的方法和过程
服务注册
功能
注册
维护
发现
应用与实现
基于K/V存储框架
zookpeer、etcd
基于基础设施(DNS服务器)
k8s
专门定制工具
eurka、consul、nacos
服务网关
概念
作为服务集群对外的入口,承担统一对外交互的代理角色
充当服务器响应;
充当客户端请求;
充当客户端请求;
路由
对外提供统一的地址,并将访问该地址的流量,按照规则路由到内部服务上
应用与实现
nginx ingress controller
zuul
spring cloud gateway
负载均衡
客户端负载均衡
优点
与服务同属于一个进程,不存在额外的网络开销
集群服务内部流量不需要经过网关“绕一圈”
针对服务调用可配置负载参数
缺点
受限于编程语言
由于是共用一个进程,均衡器的稳定性会直接影响整个服务进程的稳定性,消耗的 CPU、内存等资源也同样影响到服务的可用资源
轮询服务注册中心,网络开销大
调用链路复杂,对集群安全性没有保障
应用
Spring Cloud Load Balancer
Netflix Ribbon
代理负载均衡
优点
与服务同属于一个pod,本机回环调用,比网络交互快速稳定
不受限于编程语言
当服务拓扑关系发生变更时,控制平面会向边车代理发送更新服务的指令
利于在服务间建立双向 TLS 通信
利于统计调用链路
缺点
学习成本高
应用
istio
服务容错
容错策略
快速失败
故障转移
安全失败
并行调用
广播调用
...
容错设计
断路器
通过代理(断路器对象)来一对一地(一个远程服务对应一个断路器对象)接管服务调用者的远程请求。断路器会持续监控并统计服务返回的成功、失败、超时、拒绝等各种结果,当出现故障(失败、超时、拒绝)的次数达到断路器的阈值时,它状态就自动变为“OPEN”,后续此断路器代理的远程访问都将直接返回调用失败,而不会发出真正的远程服务请求
一段时间(譬如 10 秒以内)内请求数量达到一定阈值(譬如 20 个请求)。这个条件的意思是如果请求本身就很少,那就用不着断路器介入。
一段时间(譬如 10 秒以内)内请求的故障率(发生失败、超时、拒绝的统计比例)到达一定阈值(譬如 50%)。这个条件的意思是如果请求本身都能正确返回,也用不着断路器介入。
一段时间(譬如 10 秒以内)内请求的故障率(发生失败、超时、拒绝的统计比例)到达一定阈值(譬如 50%)。这个条件的意思是如果请求本身都能正确返回,也用不着断路器介入。
快速失败策略
舱壁隔离模式(服务隔离)
失败静默策略
服务层面的隔离实现在服务调用端或者边车代理上,将系统层面的隔离实现在 DNS 或者网关处
服务重试
故障转移、故障恢复
仅在主路逻辑的关键服务上进行同步的重试
仅对由瞬时故障导致的失败进行重试,可对http状态码判断
仅对具备幂等性的服务进行重试
重试必须有明确的终止条件(超时、超次数)
仅对由瞬时故障导致的失败进行重试,可对http状态码判断
仅对具备幂等性的服务进行重试
重试必须有明确的终止条件(超时、超次数)
流量控制
流量统计指标
tps 每秒事务数
hps 每秒请求数
qps 每秒查询数
限流模式
计数控制
滑动窗口
漏桶
令牌桶
分布式限流
子主题
框架或实现
sentinel
Hystrix
redis
分布式锁、信号量等
可靠通信
零信任网络
传统网络安全模型与云原生时代零信任模型对比
- 零信任网络不等同于放弃在边界上的保护设施
- 身份只来源于服务
- 服务之间也没有固有的信任关系
- 集中、共享的安全策略实施点
- 自动化、标准化的变更管理
- 受信的机器运行来源已知的代码
- 强隔离性的工作负载
服务安全
认证
istio
用户认证
RequestAuthentication
服务认证
PeerAuthentication
spring cloud
用户认证
Spring Security
服务认证
授权
istio
AuthorizationPolicy
spring cloud
Spring Security
可观测性
日志收集
输出
必要输出
traceId
配置信息
运行事件信息
不必要输出
敏感信息
耗时信息
追踪诊断信息(入参、出参、耗时)
误导他人信息(已处理异常)
收集
缓存
kafka
聚合
查询
链路追踪
基于日志
基于服务
通过某些手段给目标应用注入追踪探针(Probe),针对 Java 应用一般就是通过 Java Agent 注入的
追踪的精确性与稳定性都有所保证
基于边车代理
envoy
聚合度量
prometheus
指标收集
监控预警
存储查询
时序数据库
规范化协议
OpenTelemetry

收藏
0 条评论
下一页