微服务治理与可观测性

服务注册与发现

核心功能

  • 服务实例动态变化:实例可能因扩缩容、故障或迁移导致IP变动。
  • 服务依赖解耦:调用方无需硬编码服务地址,降低耦合度。
  • 负载均衡:自动选择健康实例,提升系统可用性。

核心组件

  • 服务注册中心(Registry)

    • 作用:存储服务实例的元数据(如IP、端口、健康状态、标签),提供心跳检测和实例状态维护功能。
    • 代表工具:Eureka、Consul、Nacos、ZooKeeper。
  • 服务提供者(Provider) :启动时向注册中心注册自身信息;定期发送心跳以维持注册状态。

  • 服务消费者(Consumer) :从注册中心获取可用服务实例列表;通过负载均衡策略(如轮询、权重)选择实例发起调用。

工作流程

  • 注册阶段:服务提供者启动时,向注册中心发送注册请求(包含元数据);注册中心存储实例信息,并标记为“健康”状态。
  • 心跳维护:提供者周期性(如30秒)发送心跳包,刷新存活状态;若注册中心未收到心跳,标记实例为“不健康”或删除。
  • 发现阶段:消费者向注册中心查询目标服务的实例列表;注册中心返回当前健康的实例列表。
  • 调用与负载均衡:消费者根据策略(如随机、轮询)选择实例发起请求。

流量控制策略

常见限流算法

算法原理适用场景优缺点
固定窗口计数器 每单位时间(如1秒)允许固定数量的请求,超出则拒绝。 简单场景(如API Key限流) 实现简单,但窗口切换时可能突发流量溢出。
滑动窗口计数器 将时间窗口细分为多个小窗口,统计最近N个小窗口的总请求量。 需要平滑限流的场景 更精准,但计算复杂度较高。
漏桶算法 请求以恒定速率处理(类似水从漏桶流出),超出桶容量则丢弃或排队。 流量整形(如消息队列消费) 输出流量恒定,但无法应对突发流量。
令牌桶算法 以固定速率向桶中添加令牌,请求需获取令牌才能执行,否则拒绝或等待。 允许突发流量(如秒杀场景) 灵活支持突发,但需维护令牌状态。
  • 单机限流Guava RateLimiter:基于令牌桶算法,支持预热模式。

  • 分布式限流

    • Redis + Lua脚本:利用Redis的原子操作统计全局请求量。
    • Sentinel:阿里开源的流量控制组件,支持集群限流和动态规则配置。
    • Nginx限流模块:通过limit_req_zonelimit_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规范)。
全部评论

相关推荐

勇闯测开#牛客AI配图神器#bg双非,开发岗拼尽全力拿不到面试,有的面试拿到了也是kpi,对答如流也一面挂。字节甚至被捞起来鞭尸离了开发发现外面根本没有下雨。4.2一面 90分钟1.自我介绍2.我看你是开发,那么测试了解多少?(简单答了答jmeter压测流程、junit测试以及arthas线上排障)3.实习经历(学校旁边的小厂开发)4.操作系统底层状态?(没准备,说了个内核态用户态,不知道对不对)继续询问操作系统io流程(实在不会了,直接说不了解)5.讲讲你的nginx负载均衡和动静分离是怎么做的?(没搞懂面试官想问什么,简单答了答config配置方法,讲了讲docker部署和负载均衡对比,把动静分离和oss的区别简单说了说)6.你们项目用了redis吗?说说redis和mysql的区别。(八股背诵,顺带讲了讲项目redis用法,缓存预热之类)7.redis除了缓存还能做什么?(背诵分布式锁八股)8.问问测开相关,你们测试项目的时候会注重什么性能指标?(凭感觉答了cpu内存和硬盘空间,面试官不满意再追问,又答了网络相关,结合项目实际经历讲了讲遇到过的网络瓶颈问题与解决办法)9.怎么追踪内存和cpu使用的?(arthas的dashboard或者top命令等,有的服务器自带面板可以直接看)10..linux指令知道什么?(cd,top,findstr,tail,cat说了一大堆)11.对测试流程了解多少?(实习的时候辅助过测试人员,也帮忙出过case)12.公司用的什么自动化测试框架?(UJ什么什么,测java的,跑在类似cmd的地方,没用过只看同事用过)算法题:用递归迭代两种方法实现拿到二叉树中序遍历,水题,但是面试官竟然让我自己投屏用idea去写,在之前没见过。反问:我看我没投这个岗位,为什么会安排面试?部门业务五天后约二面4.7二面 60分钟1.自我介绍(比一面多说了点)2.会python吗?(用python的numpy和pandas写过数据处理,会读python代码,底层不清楚但学起来会很快)那我问问python?(别)3.那问问java,讲讲线程创建的四种方式。(八股背诵,着重讲了讲项目里的线程池快慢分流)4.讲讲异常处理(没搞明白面试官想问什么,讲了讲try catch相关以及统一异常处理实现)追问throw和throws的区别(脑子短路没想出来,笑)5.讲讲java内存模型(输出八股,搞笑的是忘了程序计数器,面试官不满意)6.问问计算机网络,路由器转发流程?(不知道)7.ip与mac区别?(狠狠回想上学期的知识,燃尽了)8.子网掩码?子网掩码下有多少机器?(同上)9.三次握手?为什么要三次?第四次丢包会怎样?(八股背诵,着重讲了讲三次握手的目的)10.输入网址到显示网页发生了什么,dns原理(八股背诵,但不知道为什么面试官不太满意)11.计网掌握的一般啊,你第一个课程不是写的计网吗?(尴尬,上学期学的了,除了常见八股别的记的七七八八)12.讲讲数据库索引(索引类型失效log应用场景底层数据结构回表聚簇巴拉巴拉……)13.讲讲redis数据类型(数据类型用法结合项目全部说了一遍)14.hash存对象怎么拿?(直接从redis依赖答的,水了一下redis template原理)15.测开会多少?(会出case,会线上排障和压测,python可以学)算法:投屏idea,最长回文子串限时十五分钟先说了说两种思路,然后直接动规。期间脑抽循环写错了,脑子很乱还好最后剩俩分钟写出来了(吹一波idea,要是面试平台的编辑器带debug,我还能撕不出困难题?)16.什么时候到岗?实习多长时间?反问:部门业务没回答出来的面试题4.16三面 11:00 30minLD看起来是个技术大佬,比起业务更注重于技术1.自我介绍2.讲讲实习和项目3.上一场面试面试官评价你项目经历丰富,那丰富的项目经历带给了你什么?4.为什么要选择测开5.你讲项目讲的全是宏观业务啊,着重讲讲项目的技术难点,不要讲业务6.学Java的?那问一下GC?7.问问GC调优8.设计测试用例:幼儿园小朋友的椅子反问:实习生的工作
点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

更多
牛客网
牛客企业服务