服务注册与发现
核心功能
- 服务实例动态变化:实例可能因扩缩容、故障或迁移导致IP变动。
- 服务依赖解耦:调用方无需硬编码服务地址,降低耦合度。
- 负载均衡:自动选择健康实例,提升系统可用性。
核心组件
-
服务注册中心(Registry) :
- 作用:存储服务实例的元数据(如IP、端口、健康状态、标签),提供心跳检测和实例状态维护功能。
- 代表工具:Eureka、Consul、Nacos、ZooKeeper。
-
服务提供者(Provider) :启动时向注册中心注册自身信息;定期发送心跳以维持注册状态。
-
服务消费者(Consumer) :从注册中心获取可用服务实例列表;通过负载均衡策略(如轮询、权重)选择实例发起调用。
工作流程
- 注册阶段:服务提供者启动时,向注册中心发送注册请求(包含元数据);注册中心存储实例信息,并标记为“健康”状态。
- 心跳维护:提供者周期性(如30秒)发送心跳包,刷新存活状态;若注册中心未收到心跳,标记实例为“不健康”或删除。
- 发现阶段:消费者向注册中心查询目标服务的实例列表;注册中心返回当前健康的实例列表。
- 调用与负载均衡:消费者根据策略(如随机、轮询)选择实例发起请求。
流量控制策略
常见限流算法
算法 | 原理 | 适用场景 | 优缺点 |
---|---|---|---|
固定窗口计数器 | 每单位时间(如1秒)允许固定数量的请求,超出则拒绝。 | 简单场景(如API Key限流) | 实现简单,但窗口切换时可能突发流量溢出。 |
滑动窗口计数器 | 将时间窗口细分为多个小窗口,统计最近N个小窗口的总请求量。 | 需要平滑限流的场景 | 更精准,但计算复杂度较高。 |
漏桶算法 | 请求以恒定速率处理(类似水从漏桶流出),超出桶容量则丢弃或排队。 | 流量整形(如消息队列消费) | 输出流量恒定,但无法应对突发流量。 |
令牌桶算法 | 以固定速率向桶中添加令牌,请求需获取令牌才能执行,否则拒绝或等待。 | 允许突发流量(如秒杀场景) | 灵活支持突发,但需维护令牌状态。 |
-
单机限流:Guava RateLimiter:基于令牌桶算法,支持预热模式。
-
分布式限流:
- Redis + Lua脚本:利用Redis的原子操作统计全局请求量。
- Sentinel:阿里开源的流量控制组件,支持集群限流和动态规则配置。
- Nginx限流模块:通过
limit_req_zone
和limit_conn_zone
实现网关层限流。
熔断(Circuit Breaking)
-
熔断器:当服务调用失败率达到阈值时,后续请求直接拒绝,避免资源耗尽。
-
熔断器三态转换:
- Closed(闭合) :正常处理请求,统计失败率。
- Open(断开) :拒绝所有请求,直接返回错误或降级结果。
- Half-Open(半开) :尝试放行部分请求,若成功则恢复Closed状态。
-
熔断参数配置:
- 失败率阈值:如10秒内失败率超过50%触发熔断。
- 熔断时长:Open状态持续时间(如5秒后进入Half-Open)。
- 最小请求数:统计窗口内至少需要一定请求量才触发熔断(避免低流量误判)。
- 实现工具:Hystrix、Sentinel。
降级(Fallback)
-
手动降级:运维人员通过配置中心手动触发(如大促期间关闭积分兑换)。
-
自动降级:基于熔断规则或系统负载自动触发(如CPU超过80%时关闭推荐服务)。
-
降级策略:
- 返回默认值:如商品详情页降级时返回缓存中的静态信息。
- 简化流程:跳过非必要步骤(如下单时不校验库存,仅记录日志异步核对)。
- 功能屏蔽:直接关闭某功能入口(如隐藏“秒杀”按钮)。
负载均衡(Load Balancing)
-
流量分配:将请求合理分发到多个服务实例,避免单点过载。
-
健康检查:自动剔除不健康实例,保证请求成功率。
-
负载均衡算法
算法 原理 适用场景 轮询(Round Robin) 依次将请求分发到每个实例。 实例性能均匀的场景 加权轮询 根据实例权重分配请求(如CPU核数多的实例权重高)。 异构硬件环境 随机(Random) 随机选择一个实例。 快速简单,无状态场景 最小连接数 将请求分发给当前连接数最少的实例。 长连接服务(如WebSocket) 一致性哈希 相同请求参数(如用户ID)始终路由到同一实例。 缓存服务、会话保持需求
配置中心
核心功能
- 集中化存储:所有配置(数据库连接、功能开关、超时参数等)存储在统一平台,避免配置散落在代码或配置文件中。
- 动态更新:修改配置后无需重启服务,实时或近实时生效(如调整日志级别、限流阈值)。
- 环境隔离:支持多环境(dev/test/prod)配置隔离,同一服务在不同环境加载不同配置。
- 版本控制与回滚:记录配置变更历史,支持一键回滚到任意版本。
- 权限与审计:配置修改需权限控制,记录操作日志(如谁在何时修改了哪些配置)。
- 加密与安全:敏感配置(密码、密钥)加密存储,传输过程使用TLS加密。
核心组件
-
配置存储
- 数据库:MySQL、PostgreSQL等,存储配置键值对。
- 分布式KV存储:Etcd、Consul,支持高可用和快速读取。
- 文件系统:Git仓库(如Spring Cloud Config支持Git后端)。
-
配置管理平台:提供Web界面或API,供运维人员查看、修改和发布配置。
-
客户端SDK:集成到服务中,负责从配置中心拉取配置并监听变更(如Nacos Client、Spring Cloud Config Client)。
-
配置推送机制
- 长轮询(Long Polling) :客户端定期检查配置变更(如Nacos)。
- WebSocket/SSE:服务端主动推送变更(实时性更高)。
工作流程
- 服务启动:服务通过客户端SDK从配置中心拉取当前环境的配置。
- 配置修改:管理员通过Web界面修改配置并发布。
- 配置推送:配置中心通知所有订阅该配置的服务实例。
- 配置生效:服务动态加载新配置(如热更新线程池大小)。
可观测性
日志(Logs)
-
定义:系统运行时生成的文本记录,包含时间戳、事件描述和上下文信息。
-
结构化:使用JSON格式,便于解析(如
{"level":"ERROR","time":"2023-10-05","message":"connection failed"}
)。 -
分级:DEBUG、INFO、WARN、ERROR等级别,按需采集。
-
上下文:附加请求ID、用户ID、设备信息等,支持关联分析。
-
工具链:
- 采集:Fluentd、Filebeat。
- 存储与搜索:Elasticsearch、Loki。
- 可视化:Kibana、Grafana。
指标(Metrics)
-
定义:系统运行状态的数值化度量(如QPS、延迟、错误率)。
-
核心类型:
- 计数器(Counter) :累加值(如总请求数)。
- 仪表盘(Gauge) :瞬时值(如当前内存使用量)。
- 直方图(Histogram) :统计分布(如请求延迟的P50/P90/P99)。
- 摘要(Summary) :类似直方图,但客户端计算分位数。
-
工具链:
- 采集与存储:Prometheus、InfluxDB。
- 可视化与告警:Grafana、Alertmanager。
追踪(Traces)
-
定义:记录请求在分布式系统中的完整调用链路,展示跨服务、跨组件的执行路径和耗时。
-
核心概念:
-
Trace:一个请求的完整生命周期(如用户下单请求)。
-
Span:Trace中的一个操作单元(如调用支付服务),包含:
Span ID:唯一标识。
Parent Span ID:父级Span ID,构建树形结构。
Tags:附加信息(如HTTP状态码、数据库查询语句)。
-
上下文传播(Context Propagation) :通过HTTP头(如
traceparent
)在服务间传递Trace信息。
-
-
工具链:
- 采集与存储:Jaeger、Zipkin、SkyWalking。
- 协议标准:OpenTelemetry(统一日志、指标、追踪的API规范)。