L7流量管理
在服务实例的不同子集(subsets
)之间,L7流量管理允许操作者使用Connect划分L7流量。
除了给负载均衡返回所有正常的实例之外,您还可以通过多种方式来维护单个数据中心的服务池。 金丝雀测试,A/B测试,蓝色/绿色部署以及弱多租户(soft multi-tenancy)(产品/质量保证/分段共享计算资源)都需要某种机制来精简Consul catalog的一部分,使其小于单个服务的级别,并配置该子集何时应收到流量。
注意:
此功能与内置代理、本机代理(native proxies)、某些Envoy代理(Escape-Hatch)不兼容。
阶段(Stages)
连接代理上游是通过以下一系列步骤发现的:路由、拆分和解析。 这些阶段代表了管理L7流量的不同方法。
https://www.consul.io/assets/images/l7-traffic-stages-25138e87.svg
可以通过各种配置条目来动态地重新配置此发现过程的每个阶段。 当缺少配置条目时,该阶段将恢复为合理的默认行为。
路由(Routing)
service-router
配置条目类型是第一个可配置阶段。
路由器配置条目允许用户使用L7标准(例如路径前缀或http标头)来拦截流量,并通过将流量发送到其他服务或服务子集来更改行为。
这些配置条目只能引用service-splitter
或service-resolver
条目。
可以在service-router
文档中找到示例。
拆分(Splitting)
service-splitter
配置条目类型是路由之后的下一阶段。
拆分器配置条目使用户可以选择将输入的请求拆分为单个服务的不同子集(例如在分阶段的Canary推出期间),也可以拆分为不同的服务(例如在v2重写或其他类型的代码库迁移期间)。
这些配置条目只能引用service-splitter
或service-resolver
条目。
如果一个拆分器引用了另一个拆分器,则将总体效果展平到一个有效的拆分器配置条目中,该条目反映了乘法并集。 例如:
splitter[A]: A_v1=50%, A_v2=50%
splitter[B]: A=50%, B=50%
---------------------
splitter[effective_B]: A_v1=25%, A_v2=25%, B=50%
可以在service-splitter
文档中找到示例。
解析(Resolution)
service-resolver
配置条目类型是最后一个阶段。
解析程序配置条目允许用户定义服务的哪些实例应满足对提供的名称的发现请求。
您可以使用解析器配置条目执行的操作示例:
如果当前数据中心中api的所有实例都不正常,则控制将流量发送到哪里。
根据Service.Meta.version值配置服务子集。
将未指定服务子集的Web的所有流量发送到version1子集。
将api的所有流量发送到new-api。
将所有数据中心中api的所有流量发送到dc2中api的实例。
创建一个“虚拟服务” api-dc2,将流量发送到dc2中的api实例。这可以在上游或其他配置条目中引用。
如果未为服务定义解析器配置,则假定100%的流量流向当前数据中心/命名空间中具有相同名称的服务的正常实例,并且发现终止。
这在精神上应与“准备查询”的各种用法相似,但目前不打算作为替代方法。
这些配置条目只能引用其他service-resolver
条目。
可以在service-resolver
文档中找到示例。
注意:
service-resolver配置条目种类在L4起作用(与service-router和service-splitter种类不同)。
可以为任何协议(例如tcp)的服务创建这些文件。