拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

fabio:基于 Consul 的零配置 HTTP(S) 与 TCP 负载均衡路由器实战指南

fabio:基于 Consul 的零配置 HTTP(S) 与 TCP 负载均衡路由器实战指南 后端API网关微服务【免费下载链接】fabioConsul Load-Balancing made simple项目地址https://gitcode.com/gh_mirrors/fa/fabio点击查看免费下载fabio 是一个为 Consul 管理的应用集群而设计的快速、现代、零配置负载均衡路由器支持 HTTP(S) 与 TCP 协议转发。本文将围绕仓库根目录 README.md 展开讲解 fabio 的核心工作模型、安装方式、基于urlprefix-标签的路由声明语法以及它与 Consul、Vault、Amazon ELB/API Gateway 等生态的集成方式读完本文你将掌握从服务注册到流量接入的完整实战流程并了解路由表在底层是如何被生成与维护的。fabio 是什么为 Consul 应用而生的零配置路由器fabio 的核心设计哲学只有一个零配置。按照 README.md 的描述你只需在 Consul 中注册服务并提供健康检查fabio 就会自动开始向这些服务转发流量——不需要为 fabio 本身编写任何路由配置文件。服务部署、升级、重构因此变得前所未有的简单。这一设计直接体现在项目结构上主程序 main.go 在启动时会依次完成配置加载、度量初始化、注册后端registry backend初始化、监听器启动等动作其中initBackend会根据registry.backend配置选择 Consul、文件、静态或自定义后端而 Consul 后端registry/consul/backend.go会在启动时连接 Consul Agent 并确认所在数据中心随后通过WatchServices与WatchManual两条通道持续监听服务与手动路由配置的变化。fabio 由 The Fabio Authors 开发维护长期支撑着澳大利亚的大型站点如 gumtree.com.au自 2015 年 9 月起以每日 2.3 万请求/秒的规模稳定运行。需要说明的是这一数据来自项目官方 README 的陈述属于项目自身对外公布的历史运营信息而非本仓库可验证的基准测试数据。版本注意事项自 1.5.14 起README 在开头用 Notes 形式列出若干版本相关的关键变化使用 fabio 时值得留意1.6.1 起最低支持 Go 版本为 1.161.6.0 起不再支持 statsd 度量后端statsd_raw行为类似但会正确重置计数器使用 DataDog 的用户建议迁移到支持标签tags的 dogstatsd 后端Graphite 直方图功能因切换到 go-kit 框架略有变化Prometheus 已原生支持1.5.15 起默认 GOGC 从 800 恢复为 Go 默认值 100仍可通过runtime.gogc配置1.5.14 起发布哈希改用新 PGP 密钥签名二进制使用 Go 1.15 编译这意味着 fabio 将不再校验缺少与服务器名匹配的 SAN 扩展的 HTTPS 上游证书——如果后端证书配置有误可在路由上指定tlsskipverifytrue来规避。fabio 如何工作注册、健康检查、标签与路由表fabio 的流量分发模型可以概括为一条清晰的生产链路服务注册应用实例在 Consul 中注册每个实例必须使用唯一的 ServiceID服务名不能包含空格健康检查在 Consul 中为服务注册健康检查。默认情况下 fabio只向健康检查状态为 passing 的服务转发流量可通过registry.consul.service.status覆盖路由标签为服务实例添加一个或多个urlprefix-前缀标签每个标签声明该实例服务的一个host/path前缀路由表生成Consul 后端将这些标签翻译成路由命令route commandfabio 据此构建并持续更新内存路由表流量转发所有 HTTP 流量发送到 fabio 的 9999 端口fabio 根据路由表选择目标并代理。从源码看第 4 步的关键实现在 registry/consul/service.go 的ServiceMonitor中它通过 Consul 的Health().State(any)订阅健康状态变更过滤出带配置前缀的检查项checksWithTagPrefix再由passingServicesregistry/consul/passing.go依据registry.consul.service.status与registry.consul.checksRequired判断哪些实例可用。随后 registry/consul/routecmd.go 把urlprefix-标签逐条解析为route add ...形式的命令文本。这里有一个容易被忽略的细节fabio 的健康判断不仅看服务自身的检查还综合了节点健康serfHealth、节点维护模式_node_maintenance与服务维护模式_service_maintenance状态——节点宕机或进入维护模式的服务实例都会被自动剔除出路由表。这正是部署、升级、重构从未如此简单的底气所在。安装 fabio源码、Docker、Homebrew 与二进制README 提供了四种安装途径任选其一即可# 源码安装需要 go 1.15 或更高版本1.6.1 起需要 1.16 go install github.com/fabiolb/fabiolatest # HomebrewmacOS brew install fabio # 稳定版 brew install --devel fabio # 开发版 # Docker docker pull fabiolb/fabio # 预编译二进制从 https://github.com/fabiolb/fabio/releases 下载当前仓库源码中的版本号可在 main.go 处看到var version 1.8.0正式发布时由构建脚本通过链接器注入。执行fabio -v即可查看版本与 Go 运行时信息——这一逻辑在 config/load.go 的parse函数中处理遇到-v、-version、--version参数时直接返回版本信息。快速开始六步把流量接入 fabio以 Consul Agent 运行在localhost:8500为前提README 给出了完整的上手流程第 1 步安装 fabio见上文四种方式。第 2 步在 Consul 中注册服务。关键约束是每个实例使用唯一 ServiceID、服务名不含空格。第 3 步注册健康检查。参考 Consul 官方 Agent 检查文档操作。默认只有 passing 状态的服务才会被纳入路由可覆盖配置项为registry.consul.service.status。第 4 步为服务添加urlprefix-标签。每个标签对应服务的一个host/path前缀示例# HTTP/S 示例 urlprefix-/css # 路径路由 urlprefix-i.com/static # 主机特定路径路由 urlprefix-mysite.com/ # 主机特定兜底路由catch all urlprefix-/foo/bar strip/foo # 路径剥离将 /bar 转发给上游 urlprefix-/foo/bar protohttps # HTTPS 上游 urlprefix-/foo/bar protohttps tlsskipverifytrue # HTTPS 上游 自签名证书 # TCP 示例 urlprefix-:3306 prototcp # 路由外部端口 3306注意HTTP 路由的路径前缀必须至少包含一个斜杠/。第 5 步无配置文件启动 fabio观察日志输出。fabio 会在日志中展示它是如何拾取到你的服务路由的尝试启停服务实例可以看到路由表随之即时变化——这正是动态重载、无需重启特性的直观体现。第 6 步把所有 HTTP 流量发送到 fabio 的 9999 端口。TCP 代理场景参考 TCP proxy 特性文档。完成。标签语法背后的实现原理urlprefix-标签并不仅限于 README 列出的几种写法。registry/consul/routecmd.go 中的parseURLPrefixTag展示了完整的解析规则标签格式为urlprefix-host/path[ opts]空格后为可选的 opts 参数以:开头的标签如urlprefix-:3306被识别为端口路由用于 TCP 场景host/path形式的标签会做 host 小写化处理并支持$x/${x}环境变量展开当前注入的环境变量为数据中心名DC标签内的 opts 会翻译为路由命令中的 optsprototcp生成tcp://目标地址protohttps生成https://目标地址protogrpc/protogrpcs同理weight提取为路由权重redirectcode,url解析为重定向规则其余参数如strip、tlsskipverify原样透传到路由选项。生成的命令形如route add service route dst weight w tags t1,t2 opts ...随后这些命令会被 route/parse_new.go 的Parse函数逐行解析成RouteDef定义见 route/route_def.go再由路由表模块组装为可查询的路由结构。健康检查过滤、标签解析、命令生成三个环节环环相扣共同构成了 fabio 的自动发现能力。核心特性从 TLS 到 BGP 的完整能力清单README 列出了 fabio 的完整特性集各特性的详细文档位于本仓库 docs/content/feature 目录动态证书存储的 TLS 终止certificate-stores.md证书来源支持文件、路径、HTTP、Consul、Vault 及 Vault PKI 等多种类型对应配置 config/load.go 中parseCertSource的type分支原始 TCP 代理tcp-proxy.mdTCPSNI 代理tcp-sni-proxy.md不解密即可实现全链路端到端 TLSHTTPSTCPSNI 代理https-tcp-sni-proxy.mdTCPSNI 与 HTTPS 回退的混合模式TCP 动态代理tcp-dynamic-proxy.md根据路由表自动启停端口监听器main.go 中tcp-dynamic分支的轮询逻辑会按l.Refresh周期扫描路由表中的:port目标并动态拉起/关闭监听HTTPS 上游支持https-upstream.mdWebsocketswebsockets.md与SSEsse.md长连接支持无需重启的动态重载dynamic-reloading.mdmain.go 的watchBackend循环持续消费服务配置与手动配置通道一旦路由表变化就重建并切换日志中以增量delta形式展示变化流量整形traffic-shaping.md支持蓝绿部署场景的权重分配多后端度量metrics.mdPrometheus、Circonus、Graphite、StatsD、DataDogWebUI 管理界面web-ui.md默认监听:9998支持no/ro/rw三种访问模式见 config/load.go 中ui.access的取值校验BGP 任播地址通告bgp.md仅限非 Windows 平台支持 gobgpd 配置与 gRPC 管理接口。此外 fabio 还提供了 gRPC 代理能力grpc-proxy.md通过grpc.UnknownServiceHandler透明转发未知 gRPC 方法。配置体系默认值、配置来源与优先级虽然主打零配置fabio 仍提供了丰富的可调参数。仓库 config 目录集中了配置相关的实现默认值config/default.go 定义了所有内置默认项包括 HTTP 监听:9999、UI/API 监听:9998、Consul 地址localhost:8500、KV 路径/fabio/config、标签前缀urlprefix-、路由策略rnd、匹配器prefix、无路由状态码 404、拨号超时 30s 等配置来源config/load.go 的Load函数支持从命令行参数、环境变量FABIO_前缀或直接同名以及配置文件/URL-cfg参数支持本地文件与http(s)://URL三者联合加载优先级为命令行 环境变量 配置文件 默认值常用参数速查均来自 config/load.go 的 flag 定义参数默认值说明proxy.addr:9999代理监听地址支持多监听器与proto协议声明ui.addr:9998UI/API 监听地址registry.backendconsul注册后端consul / file / static / customregistry.consul.addrlocalhost:8500Consul Agent 地址支持https://前缀registry.consul.kvpath/fabio/config手动路由覆盖的 KV 路径registry.consul.tagprefixurlprefix-路由标签前缀registry.consul.service.statuspassing纳入路由的健康状态列表registry.consul.checksRequiredone健康检查通过策略one 或 allregistry.consul.pollInterval0轮询间隔0 表示使用 Consul 阻塞查询/事件驱动proxy.strategyrnd负载均衡策略rr 或 rndproxy.matcherprefix路径匹配算法prefix / glob / iprefixproxy.maxconn10000最大缓存连接数proxy.noroutestatus404无匹配路由时的状态码必须为三位数log.access.formatcommon访问日志格式common / combinedlog.routes.formatdelta路由表变更日志格式delta / detail / allmetrics.target空度量后端runtime.gogc100Go GC 百分比runtime.gomaxprocsCPU 数Go 最大处理器数bgp.enabledfalse是否启用 BGP 任播通告注意load.go中的若干校验规则proxy.strategy仅接受rr或rndproxy.matcher仅接受prefix、glob、iprefixui.access仅接受ro、rw、noproxy.noroutestatus必须在 100~999 之间且registry.consul.allowStale与registry.consul.requireConsistent不能同时为 true——这些约束会在配置加载时直接报错避免运行时踩坑。路由命令语言手动路由的完整语法除了从 Consul 自动生成路由fabio 还支持在 Consul KV 中默认路径/fabio/config以路由命令形式手动声明路由覆盖自动发现的结果手动配置优先级更高。完整语法定义在 route/parse_new.go 的Commands常量中route add svc src dst[ weight w][ tags t1,t2,...][ opts k1v1 k2v2 ...] - 为服务 svc 添加从 src 到 dst 的路由可带权重、标签与选项。 合法选项包括 strip/path : 将 /path/to/file 转发为 /to/file prepend/prefix : 将 /path/to/file 转发为 /prefix/path/to/file prototcp : 上游为 TCP 服务dst 为 :port protohttps : 上游为 HTTPS 服务 tlsskipverifytrue : 禁用 HTTPS 上游的 TLS 证书校验 hostname : 设置 Host 头为 name若 name dstHost 头将设为注册的上游主机名 registername : 将 fabio 注册为新服务 name用于为主机特定路由注册主机名 authname : 使用的认证方案名称定义在 proxy.auth 中 route del svc[ src[ dst]] - 删除匹配 svc、src 和/或 dst 的路由 route del svc tags t1,t2,... - 删除服务 svc 中匹配标签的所有路由 route del tags t1,t2,... - 删除所有匹配标签的路由 route weight svc src weight w tags t1,t2,... - 将 w% 的流量路由到匹配 svc、src 和标签的所有服务 另有省略 svc、src 或 tags 的多种变体见源码权重语义同样在Commands中定义w为大于 0 的浮点百分比0.5 即 50%w 0表示不固定权重、流量均匀分布w 0时该路由接收 n% 流量若sum(w) 1则归一化sum(w) 1时只有匹配的服务才会收到流量。需注意所有匹配路由收到的流量总和为w%。Parse函数按行顺序解析这些命令顺序很重要——先删除尚未创建的路由与先创建再删除会产生不同的结果。解析器同时支持#与//注释行和空行跳过route/route_def.go 中定义了三种命令类型route add/route del/route weight及对应的RouteDef数据结构。生态集成与更多资源fabio 与以下系统深度集成README 明确列出Consul 目录实现了 vault 及 vault-pki 证书源、Amazon ELB、Amazon API Gateway 等。继续深入学习的路径均在本仓库内特性文档docs/content/feature 目录按主题组织证书存储、TCP/SNI 代理、流量整形、度量、WebUI、BGP 等配置参考docs/content/ref 目录逐条收录了全部配置参数proxy.*、registry.*、metrics.*、bgp.*、ui.*等部署指南docs/content/deploy 覆盖直接部署、已有负载均衡器、Amazon ELB、Amazon API Gateway 等场景源码阅读起点路由解析见 route/parse_new.goConsul 集成见 registry/consul主流程与监听器分发见 main.go配置加载见 config/load.go默认值见 config/default.go。结语fabio 用一套极简的模型解决了微服务时代的流量接入难题把路由声明下沉到 Consul 服务标签中让路由表随着服务注册与健康检查状态自动伸缩。无论是快速搭建开发环境六步上手还是承载大规模生产流量TLS 终止、TCP/SNI 代理、流量整形、多后端度量、BGP 任播fabio 都以零配置为起点提供了充分的扩展空间。理解urlprefix-标签语法与路由命令语言这两块核心就掌握了 fabio 的全部使用精髓。赞分享后端API网关微服务【免费下载链接】fabioConsul Load-Balancing made simple项目地址https://gitcode.com/gh_mirrors/fa/fabio点击查看免费下载相关推荐如何通过GitHub配置Resume简历无需代码的终极解决方案如何通过GitHub配置Resume简历无需代码的终极解决方案 Resume是一款功能强大的在线简历生成器让你无需编写代码即可轻松创建专业简历。通过GitH前端Laradock 中的 HAProxy基于 Docker Socket 自配置的 TCP/HTTP 负载均衡器完整指南Laradock 中的 HAProxy基于 Docker Socket 自配置的 TCP/HTTP 负载均衡器完整指南 导读 HAProxy 是业界广泛使用的后端开发工具DevOpsTraefik 与 Docker基于容器标签的动态路由与负载均衡实战指南Traefik 与 Docker基于容器标签的动态路由与负载均衡实战指南 TraefikCloud Native Application Proxy最具代后端API网关负载均衡微服务网络云原生上一篇Lucky开发贡献指南代码提交规范与PR流程参与开源项目下一篇一次调用从数据到结果用 TabPFN 做表格分类与回归的实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表