2. 路由策略基础:什么是路由策略,核心要素

好,我们正式进入这门课的核心区域了。讲多活部署,绕不开一个话题:流量到底怎么走?这个问题,说白了就是路由策略要干的活。

我记得刚接触多活那会儿,觉得路由不就是配个DNS解析嘛,把用户指向最近的数据中心就行。结果呢?第一次做灰度发布时,流量全打到新版本上去了,差点把线上搞崩。从那以后我意识到——路由策略可不是简单的“指路”,它是整个多活系统的神经中枢。

2.1 路由策略到底是什么?

我个人的理解,路由策略是一套决定流量如何分发、如何路由、如何隔离的规则体系。它不是一个单一的配置项,而是一个组合拳。

从技术层面拆解,路由策略至少包括三层含义:

  1. 流量入口层:用户请求从哪进?是DNS就近解析,还是通过Global Load Balancer分配?
  2. 应用路由层:请求到达网关后,该去哪个Region?哪个Cluster?哪个Pod?
  3. 数据路由层:读写操作该路由到哪个数据库分片?是否要做读写分离?

为什么要分层?你想想看,如果这三层混在一起管理,出问题的时候你根本不知道是DNS没配好,还是网关规则写错了,或者缓存穿透了数据库。

核心观点:路由策略的本质是可控的流量调度。不可控的调度叫“流量乱窜”,可控的才叫“策略”。

2.2 路由策略的核心要素

这些年摸爬滚打下来,我总结了四个核心要素,缺一不可。咱们一个一个聊。

2.2.1 流量来源与特征

这是路由策略的输入。你得先知道是谁在发请求,才能决定怎么路由。常见的流量来源包括:

  • 用户终端:App、浏览器、IoT设备。特征包括IP归属地、用户ID、国家码、语言偏好。
  • 内部服务:微服务间的RPC调用。特征通常是Header里的traceId、服务名、环境标识。
  • 定时任务/批处理:这类流量往往对延迟不敏感,但对带宽和稳定性要求高。

我在项目中遇到过一个大坑:把内部服务调用的流量和外部用户流量混在一起做路由。结果内部服务重试风暴,直接把网关打挂了。后来我们给内部服务单独加了个Header标记,路由规则里优先识别这个标记。

2.2.2 目的地与映射关系

这是路由策略的输出。流量最终要去哪?核心是建立流量特征到目的地的映射关系。

目的地可以按粒度分:

粒度 描述 例子
Region级 跨地域流量调度 华东用户 -> 上海Region
AZ级 同一地域内的可用区切换 上海Region -> 可用区B
Cluster级 Kubernetes集群间的分流 灰度用户 -> 新版本Cluster
实例级 负载均衡到具体Pod/VM 按权重分发到3个Pod

个人建议:映射关系不要写死在代码里。一定要做成可配置、可动态加载的。我曾经在代码里硬编码了路由映射,结果一次机房迁移,改了一周的代码才搞定。

2.2.3 规则与条件

这是路由策略的大脑。规则到底怎么写?常见的条件类型有:

  • 基于地理位置:IP归属地匹配,比如cn-north -> 北京Region。
  • 基于用户属性:VIP用户路由到高配集群;测试用户路由到灰度环境。
  • 基于时间窗口:白天流量走线上环境,凌晨做数据同步。
  • 基于负载指标:当前Region负载超过80%,自动迁移流量到其他Region。

嗯,这里要注意一个很隐晦的问题:规则执行的先后顺序。我遇到过的情况是,同时配置了“地理位置优先”和“灰度用户优先”,结果地理位置规则先执行,灰度用户永远匹配不上。所以,规则一定要有明确的优先级和短路机制。

避坑指南:我曾经在规则引擎里用了“取最低优先级”策略,结果所有规则都生效,流量被分到了四个不同的Region。测试环境一片混乱。从那以后,我统一用“匹配即终止”模式。

2.2.4 动作与副作用

规则匹配之后,得执行动作。动作不只是“转发”这么简单,我归纳了四种常见动作:

  1. 直接转发:把请求转发到指定实例。
  2. 重写/改造:修改请求Header、Path,甚至把HTTP转成gRPC。
  3. 拒绝/限流:当目的地不可达时,返回503或降级响应。
  4. 记录/审计:记录路由决策的日志,用于事后分析。

你想想看,如果没有“重写”这个动作,灰度发布怎么隔离?用户请求打到新版本,但Header里没有灰度标识,新版本就不知道该怎么处理。所以,路由策略的每个动作都得考虑清楚副作用。

2.3 路由策略的决策流程

光讲要素有点抽象。来,我画个图,把四个要素串起来。

路由策略决策流程图 入口流量到达 ① 识别流量来源与特征 ② 匹配路由规则与条件 ③ 选择目的地与映射关系 ④ 执行动作与副作用 流量到达目标实例 反馈:动态调整规则 说明:每一步都可能产生日志/指标,用于事后分析和规则优化。虚线表示反馈闭环,用于动态调整。

这个流程,说白了就是:流量进来 → 识别你是谁 → 查规则表 → 决定你去哪 → 执行动作。每一步都依赖上面讲的四个要素。

2.4 路由策略的分类维度

为了方便理解和选型,我把常见的路由策略按两个维度分类:

2.4.1 按决策时机分类

  • 静态路由:规则在部署时确定,运行期不变。比如“所有来自南方的流量都走深圳Region”。好处是简单、性能好,坏处是不够灵活。我建议刚起步的多活系统先用静态路由,踩坑成本低。
  • 动态路由:规则根据实时数据(如负载、延迟、错误率)自动调整。比如“当上海Region延迟超过100ms时,开始迁移流量到杭州”。好处是自适应,坏处是复杂度高,容易产生震荡。

我个人经验是:能用静态解决的,就别上动态。动态路由的调优周期太长,而且测试很难覆盖所有场景。

2.4.2 按路由层级分类

层级 典型技术 决策粒度
全局路由 DNS、GSLB 用户 → Region
网关路由 API Gateway、Ingress 请求 → Service
服务路由 Service Mesh、RPC框架 上游 → 下游实例
数据路由 ShardingSphere、Vitess SQL → 数据库分片

嗯,这里要注意:不同层级的路由策略是叠加的,不是互斥的。一个请求,可能先经过GSLB路由到Region,再经过网关路由到Service,最后经过Service Mesh路由到具体Pod。每一层都得配策略,而且策略必须保持一致。

2.5 一个简单示例

光说不练假把式。我们来看一个最简配置——基于地理位置的路由策略示例。

# 简化版路由规则(YAML风格)
routing_rules:
  - name: "华南用户走深圳"
    condition:
      ip_location: "cn-south"
    action:
      target_region: "sz-region"
      weight: 100

  - name: "华东用户走上海"
    condition:
      ip_location: "cn-east"
    action:
      target_region: "sh-region"
      weight: 100

  - name: "默认降级"
    condition:
      match_all: true
    action:
      target_region: "fallback-vip"
      weight: 100

这个例子看起来很简单吧?但在实际项目中,光这个“ip_location”怎么拿准,就能折磨你几天。我记得有一次,用户使用的是双栈网络(IPv4+IPv6),IP归属地表对IPv6的支持不完善,结果所有IPv6用户都被路由到了降级区域。所以,条件判断的核心是数据源的质量。

2.6 本章小结

回头看看,路由策略不是一个技术点,而是一套思维框架:

  • 四个核心要素:流量来源、目的地映射、规则条件、执行动作。
  • 决策流程:识别 → 匹配 → 选择 → 执行。
  • 分类维度:静态 vs 动态;全局、网关、服务、数据四层。
  • 一个原则:规则要可配、可观测、可回滚。

说白了,路由策略就是多活系统的交通规则。规则写得好,流量跑得顺;规则写不好,天天就是事故现场。这章的基础打好,后面讲具体实战才能听得有滋味。