【后端开发】golang部分中间件介绍(任务调度/服务治理/数据库/缓存/服务通信/流量治理)
【后端开发】golang部分中间件介绍(任务调度/服务治理/数据库/缓存/服务通信/流量治理)
文章目录
- 1、中间件是什么?
- 1.1 中间件的定义
- 1.2 中间件和框架的区别
- 1.3 中间件与工具库的区别
- 1.4 云原生时代的中间件
- 1.5 中间件的生命周期
- 2、中间件的分类
- 2.1 计算类中间件(分布式计算,任务调度,服务治理)
- 2.2 存储类中间件(缓存,数据库,搜索引擎,数据同步)
- 2.3 网络类中间件(服务通信,流量治理,负载均衡,信息安全)
- 3、goland的部分常用中间件(以go-zero框架为例)
- 3.1 计算类(go-kit/cron/viper)
- 3.2 存储类(mysql/redis/elk/etcd/gorm/minio/mongo/migrate)
- 3.3 网络类(grpc/telemetry/jwt/kafka/kong/istio/jaeger/consul)
1、中间件是什么?
1.1 中间件的定义
中间件是软件开发中连接 “底层基础设施” 与 “上层业务应用” 的关键技术层,它通过封装通用能力、解决跨系统协作问题,降低业务开发复杂度,让开发者聚焦核心业务逻辑而非技术细节。
- 向上:为业务应用提供标准化的 API / 接口,屏蔽底层技术差异(如不同数据库的语法、不同消息队列的协议);
- 向下:适配不同的基础设施(如物理机、虚拟机、云服务器),确保通用能力在不同环境下稳定运行。
- 简单类比:若把业务应用比作 “餐厅”,底层基础设施是 “农场(食材供应)”,中间件就是 “中央厨房”——
它统一处理食材清洗、切配、标准化烹饪流程,餐厅只需直接使用中央厨房的半成品,无需关心食材来源和基础加工,大幅提升效率。
中间件的设计围绕“通用性、稳定性、可扩展性”展开,核心特性可归纳为以下6点:
特性 | 核心说明 | 典型场景举例 |
---|---|---|
通用性 | 封装“跨业务的通用需求”(如通信、数据存储、任务调度),可复用于多个业务系统 | 所有业务都需要“日志收集”,日志中间件可通用 |
解耦性 | 隔离业务应用与底层依赖(如数据库、缓存),或隔离不同业务模块 | 订单系统通过消息中间件通知库存系统,无需直接调用库存接口 |
标准化 | 提供统一的接口/协议,避免“重复造轮子”,降低跨团队协作成本 | 所有业务通过JDBC(数据库中间件接口)操作不同数据库 |
高可用性(HA) | 支持集群部署、故障自动转移,确保服务不中断(通常要求99.9%以上可用性) | 缓存中间件Redis的主从复制+哨兵模式,主节点故障后从节点自动接管 |
可扩展性 | 支持水平扩容(增加节点)或垂直扩展(提升单节点性能),应对业务流量增长 | 消息中间件Kafka通过增加Broker节点,支撑每秒百万级消息收发 |
透明性 | 业务应用无需感知中间件的内部实现(如负载均衡、数据分片) | 开发者调用RPC中间件时,无需关心请求如何路由到目标服务 |
1.2 中间件和框架的区别
中间件(Middleware)和框架(Framework)是分布式系统和软件开发中的两个核心但截然不同的概念,它们在架构层次、职责范围和使用方式上有本质区别
技术栈层级关系
┌─────────────────────────────────┐
│ Application │ ← 业务代码
├─────────────────────────────────┤
│ Framework │ ← 提供路由、依赖注入等基础设施
├─────────────────────────────────┤
│ Middleware │ ← 安全/日志等通用功能
├─────────────────────────────────┤
│ System (OS/Network/DB/etc.) │
└─────────────────────────────────┘
中间件和框架的对比
维度 | 中间件 (Middleware) | 框架 (Framework) |
---|---|---|
定位 | 功能增强插件 | 开发基础架构 |
职责 | 处理横切关注点(Cross-cutting Concerns) | 提供应用骨架和编程范式 |
侵入性 | 低(可插拔) | 高(需遵循框架约束) |
复用性 | 可跨框架使用 | 通常绑定特定技术栈 |
典型示例 | JWT 认证、日志中间件 | Gin、Spring、Django |
1.3 中间件与工具库的区别
中间件与普通工具库的差异,本质是“被动调用的工具”与“主动介入的基础设施”的区别
对比维度 | 普通工具库(Tool Library) | 中间件(Middleware) |
---|---|---|
核心定位 | 业务开发的“辅助工具”,聚焦单一、原子化的功能封装 | 系统运行的“基础设施层”,聚焦跨模块/跨系统的协作能力支撑 |
交互模式 | 「被动调用」:业务代码主动调用工具库API(如DateUtil.format() ),工具库不主动介入系统流程 | 「主动介入」:拦截/接管系统主干数据流(如请求、消息、SQL),无需业务代码显式调用核心逻辑(如网关自动拦截请求鉴权) |
依赖关系 | 业务代码依赖工具库,工具库不依赖业务/系统环境(低耦合) | 业务/系统依赖中间件,中间件需适配底层环境(如K8s、数据库),甚至主导系统流程(高耦合,是系统“骨架”的一部分) |
能力范围 | 单一功能(如加密、日期处理、JSON解析),无“分布式/高可用”属性 | 复合能力(如通信+负载均衡、消息+重试+死信队列),通常具备分布式、高可用、可扩展特性 |
运行形态 | 嵌入业务代码(如Jar包、源码依赖),无独立运行进程 | 独立进程/集群运行(如Redis集群、Kafka Broker),或作为框架核心组件嵌入但接管流程(如Gin中间件) |
故障影响 | 工具库故障仅影响调用它的局部业务(如日期解析失败) | 中间件故障会导致整个系统/链路不可用(如Redis集群宕机导致所有缓存查询失败) |
交互模式:“被动调用” vs “主动介入”
-
两者最本质的分界线,直接决定了“谁主导系统流程”:
-
普通工具库:业务代码是“主导者”
工具库仅提供“功能接口”,需业务代码主动触发调用,不干预其他流程。
示例:
用FastJSON
解析JSON时,业务代码需显式调用JSON.parseObject(jsonStr, User.class)
;
用Apache Commons Lang
处理字符串时,需主动调用StringUtils.isBlank(str)
。
工具库的逻辑“随调用启动、随调用结束”,不会主动拦截或修改业务代码之外的数据流。 -
中间件:中间件是“主导者”
中间件通过“拦截器、钩子、代理”等机制,主动接管系统的主干流程(如HTTP请求、数据库操作、消息传输),业务代码无需显式调用其核心逻辑,甚至感知不到中间件的存在。
示例:
API网关中间件(如Nginx、Gateway):用户请求到达时,网关自动拦截请求,完成鉴权、限流、路由,业务服务无需写一行鉴权代码;
ORM中间件(如MyBatis):业务代码调用userMapper.selectById(1)
时,MyBatis自动拦截SQL请求,完成参数替换、SQL执行、结果映射,业务无需关心JDBC连接池、SQL拼接;
分布式链路追踪中间件(如SkyWalking):通过字节码增强自动埋点,拦截服务间调用(如Dubbo、HTTP),记录调用链路,业务代码无需手动添加埋点代码。
1.4 云原生时代的中间件
中间件可以理解为高度专业化的工具库,
虽然其设计目标和应用场景与普通工具库有显著差异,但是现代中间件越来越呈现模块化工具库特征:
- 独立可插拔:如OpenTelemetry SDK既可集成到框架,也能单独使用
- 标准接口:遵循net/http.Handler等通用接口
- 微内核设计:如go-zero的中间件可脱离框架运行
黄金法则:当某个"工具库"需要拦截系统主干数据流而非被动调用时,它就演变成了中间件。
两者的界限在现代云原生架构中正变得越来越模糊。
1.5 中间件的生命周期
普通工具库与中间件在“进程生命周期绑定关系”上存在本质不同
-
中间件与进程生命周期(启动、运行、异常、退出、重启)的关联,是其区别于普通工具库的核心特征之一——普通工具库完全依附于业务进程生命周期(业务启动则加载,业务退出则销毁),而中间件的进程生命周期通常具备“独立性”,且需与业务进程、底层基础设施(如K8s)形成“协同管理机制”。这种关联差异,直接决定了中间件的高可用性、稳定性设计逻辑。
-
根据中间件是否 “嵌入业务进程”,其生命周期管理模式可分为 “独立进程模式” 和 “嵌入式模式”
-
独立进程模式(主流中间件采用)
中间件作为独立的服务进程运行(如 Redis、Kafka、Nginx、Elasticsearch),与业务进程完全分离,通过网络协议(TCP/HTTP)或 IPC(进程间通信)与业务进程交互。中间件的生命周期与业务进程无关,具备 “跨业务复用” 和 “独立运维” 能力。 -
嵌入式模式(轻量级中间件采用)
中间件无独立进程,而是以 “组件 / 库” 形式嵌入业务进程(如 Sharding-JDBC、Gin 中间件、Dubbo 客户端),与业务进程共享同一个运行时(如 JVM、Go 进程),但具备独立的生命周期管理逻辑。
中间件的生命周期与业务进程 “绑定但不完全依赖”—— 随业务进程启动 / 退出,但运行中的状态维护、异常处理独立于业务代码。
对比维度 | 普通工具库(如FastJSON、Apache Commons) | 中间件(如Redis、Kafka、API网关) |
---|---|---|
进程载体 | 无独立进程,完全嵌入业务进程(如Java应用的JVM进程、Go应用的进程) | 大多有独立进程/集群进程(如Redis Server进程、Kafka Broker进程);部分“嵌入式中间件”(如Sharding-JDBC)虽嵌入业务进程,但具备独立生命周期管理逻辑 |
启动时机 | 随业务进程启动而加载(如JVM加载Jar包时初始化工具类),无独立启动流程 | 独立于业务进程启动(如先启动Redis集群,再启动依赖Redis的电商应用);或与业务进程启动同步,但需优先完成初始化(如Gin框架的中间件需在路由初始化前加载) |
运行状态 | 完全依赖业务进程状态(业务进程阻塞则工具库无法调用,业务进程崩溃则工具库直接销毁) | 独立维护运行状态(如Redis进程持续监听6379端口,即使业务进程崩溃,Redis仍正常提供服务);需处理“连接保活、资源复用”(如RPC中间件维护长连接池) |
异常处理 | 无独立异常恢复能力(工具库调用报错后,需业务代码自行捕获处理,如JSON解析失败抛异常) | 具备独立异常自愈机制(如Kafka Broker崩溃后,ZooKeeper触发选主,新Broker接管分区;Redis主节点故障后,哨兵自动切换从节点为主) |
退出逻辑 | 随业务进程退出而被动销毁(无额外清理操作,或仅执行简单的内存释放) | 需执行“优雅退出”流程(如Kafka退出前同步未刷盘的消息到磁盘,避免数据丢失;API网关退出前拒绝新请求,等待存量请求处理完成) |
生命周期管理 | 由业务进程统一管理(无需额外运维操作) | 需独立运维管理( 如通过systemd、K8s管理中间件进程的启动/停止/重启;通过监控工具(Prometheus)感知进程状态) |
2、中间件的分类
中间件作为连接底层基础设施与上层业务的桥梁,其功能覆盖了计算、存储、网络三大核心领域。这种分类方式能更清晰地反映中间件在IT系统架构中的技术定位和作用边界。
按计算、存储、网络维度划分的中间件体系,共同构成了支撑现代分布式系统的技术底座:
- 计算类中间件解决 “如何高效处理任务”
- 存储类中间件解决 “如何高效管理数据”
- 网络类中间件解决 “如何高效传输数据”
2.1 计算类中间件(分布式计算,任务调度,服务治理)
计算类中间件聚焦于任务调度、资源分配、并行处理等计算能力的封装,解决“如何高效利用计算资源处理业务逻辑”的问题,核心是提升计算效率和资源利用率。
类别 | 核心特性 | 代表工具/框架 | 典型应用场景 |
---|---|---|---|
分布式计算框架 | 将大规模任务拆分到多节点并行处理,屏蔽分布式编程细节 | Hadoop MapReduce、Spark、Flink | 离线日志分析、实时风控计算、用户行为数据分析 |
任务调度中间件 | 管理任务触发、执行、重试及依赖关系,支持定时/事件驱动 | Quartz、XXL-Job、Airflow、Celery | 电商订单对账(每日凌晨)、银行账单生成(每月)、数据处理流水线编排 |
服务治理中间件 | 管控微服务调用关系,确保服务稳定运行(注册发现、负载均衡、熔断等) | Dubbo、Spring Cloud(Eureka/Ribbon/Hystrix)、Sentinel、Istio | 分布式系统服务调用管控、峰值流量削峰、服务熔断降级 |
容器编排中间件 | 管理容器生命周期、资源分配和调度策略,支持自动扩缩容和自愈 | Kubernetes(K8s)、Docker Compose、Mesos | 云原生应用部署、微服务集群扩缩容、容器化应用运维管理 |
2.2 存储类中间件(缓存,数据库,搜索引擎,数据同步)
存储类中间件专注于数据的持久化、缓存、检索等能力,解决“如何高效存储和访问数据”的问题,核心是平衡数据的可用性、一致性和性能。
类别 | 核心特性 | 代表工具/框架 | 典型应用场景 |
---|---|---|---|
缓存中间件 | 将热点数据存储在内存中,加速访问,减轻数据库压力 | Redis、Memcached、Caffeine、Ehcache | 电商商品详情页缓存、用户登录状态存储、高频查询结果缓存 |
数据库中间件 | 解决数据库扩展问题(分库分表、读写分离、分布式事务) | Sharding-JDBC、MyCat、Vitess、Seata | 海量订单数据分库分表、数据库读写分离提升性能、分布式事务一致性保障 |
搜索引擎中间件 | 支持全文检索、复杂条件查询,比传统数据库查询更高效 | Elasticsearch、Solr、Algolia | 电商商品搜索、日志检索分析、企业文档检索 |
数据同步中间件 | 实现不同存储系统间的数据同步和一致性,支持实时/离线同步 | Canal、Debezium、DataX、Sqoop | MySQL到Elasticsearch数据同步、跨地域数据备份、异构数据库数据迁移 |
2.3 网络类中间件(服务通信,流量治理,负载均衡,信息安全)
网络类中间件聚焦于数据传输、通信协议、网络资源管控,解决“不同系统/服务之间如何高效、可靠通信”的问题,核心是保证网络传输的效率、安全性和可靠性。
类别 | 核心特性 | 代表工具/框架 | 典型应用场景 |
---|---|---|---|
服务通信-远程调用(RPC)中间件 | 实现跨进程/跨机器服务调用,屏蔽网络编程细节(序列化、协议、连接管理) | Dubbo、gRPC、Thrift、Spring Cloud OpenFeign | 微服务间同步调用(如订单服务调用支付服务)、跨语言服务通信 |
服务通信-API网关中间件 | 统一服务入口,处理路由、鉴权、限流、监控等横切关注点 | Nginx、Spring Cloud Gateway、Kong、APISIX | 对外开放API统一管理、内部服务路由转发、接口访问控制与监控 |
流量治理-消息队列中间件 | 基于异步通信模式,实现系统解耦、流量削峰、异步通知 | Kafka、RabbitMQ、RocketMQ、ActiveMQ | 订单创建后异步通知库存系统、大促期间流量削峰、日志异步收集 |
负载均衡中间件 | 将请求分发到多个服务实例,提高系统可用性和吞吐量 | Nginx、LVS、F5、HAProxy | Web服务器集群请求分发、微服务实例负载分担、高可用系统流量分配 |
网络安全中间件 | 保障网络通信安全,提供加密、认证、授权能力 | OAuth2.0/OpenID Connect、ModSecurity(WAF)、OpenSSL、Vault | 用户身份认证、API接口权限控制、数据传输加密、敏感信息保护 |
3、goland的部分常用中间件(以go-zero框架为例)
框架分类(按范式)
类别 | Go 典型代表 | 特点 |
---|---|---|
全栈框架 | Beego | 包含 ORM、缓存等全套组件 |
微内核框架 | Gin、Echo | 仅提供路由等核心功能,依赖中间件扩展 |
RPC 框架 | gRPC-Go、go-zero | 专注服务间通信 |
Serverless 框架 | AWS Lambda SDK | 无服务架构适配 |
参考资料:1
3.1 计算类(go-kit/cron/viper)
计算类中间件主要解决服务治理、任务调度、流量控制等核心问题。
中间件类型 | 社区主流组件 | go-zero 对应实现 | 核心功能 |
---|---|---|---|
服务治理 | go-kit(27k+星) | 内置服务发现、负载均衡 | 服务注册发现、熔断降级、监控 |
流量控制 | uber-go/ratelimit(5k+星) | MaxConnsHandler、TimeoutHandler | 限流、连接数控制、超时管理 |
熔断机制 | afex/hystrix-go(4.3k+星) | BreakerHandler | 服务熔断、故障隔离 |
监控指标 | prometheus/client_golang(5.9k+星) | PrometheusHandler、MetricHandler | 指标收集、监控告警 |
配置管理 | spf13/viper(29k+星) | 无 | 多格式配置文件解析、动态配置更新 |
任务调度 | robfig/cron/v3(13k+星) | 无 | 定时任务调度、支持复杂 cron 表达式 |
任务调度中间件示例(cron)
robfig/cron(13k+星)是 Go 生态最流行的定时任务库:
package mainimport ("fmt""github.com/robfig/cron/v3"
)func main() {c := cron.New()// 每小时执行一次_, err := c.AddFunc("@hourly", func() {fmt.Println("执行定时任务:清理临时文件")})if err != nil {panic(err)}c.Start()defer c.Stop()// 保持程序运行select {}
}
3.2 存储类(mysql/redis/elk/etcd/gorm/minio/mongo/migrate)
存储类中间件专注于数据持久化、缓存、检索等功能。
中间件类型 | 社区主流组件 | go-zero 集成方式 | 核心功能 |
---|---|---|---|
关系型数据库 | go-sql-driver/mysql(15k+星) | 通过 sqlx 封装 | MySQL 连接、ORM 操作 |
缓存 | redis/go-redis(21k+星) | 内置 redis 客户端 | 缓存操作、分布式锁 |
日志收集 | elastic/go-elasticsearch(6k+星) | 结合 LogHandler 使用 | 日志收集、检索分析 |
配置中心 | etcd-io/etcd(50k+星) | 内置配置中心支持 | 分布式配置管理 |
关系型数据库ORM | gorm.io/gorm(38k+星) | 可手动集成 | 全功能ORM、支持多种数据库、事务管理 |
文档数据库 | mongodb/mongo-go-driver(8k+星) | 可手动集成 | MongoDB官方驱动、文档存储操作 |
嵌入式数据库 | badgerdb/badger(15k+星) | 无 | 高性能嵌入式KV数据库、持久化存储 |
分布式文件存储 | minio/minio-go(3k+星) | 无 | 对象存储客户端、兼容S3协议 |
数据库迁移 | golang-migrate/migrate(18k+星) | 无 | 数据库版本管理、迁移脚本执行 |
搜索中间件 | blevesearch/bleve(10k+星) | 无 | 纯Go实现的全文搜索引擎、索引管理 |
go-zero Redis 缓存使用示例
package mainimport ("fmt""github.com/zeromicro/go-zero/core/stores/redis"
)func main() {// 初始化 Redis 客户端rds := redis.MustNewRedis(redis.RedisConf{Host: "localhost:6379",Type: redis.NodeType,})defer rds.Close()// 设置缓存key := "user:10086"val := `{"id":10086,"name":"go-zero"}`_, err := rds.Setex(key, val, 3600) // 1小时过期if err != nil {panic(err)}// 获取缓存result, err := rds.Get(key)if err != nil {panic(err)}fmt.Println("获取缓存:", result)
}
3.3 网络类(grpc/telemetry/jwt/kafka/kong/istio/jaeger/consul)
网络类中间件解决服务通信、API 管理、安全等问题。
中间件类型 | 社区主流组件 | go-zero 对应实现 | 核心功能 |
---|---|---|---|
RPC 框架 | grpc/grpc-go(22k+星) | 内置 zrpc 框架 | 高性能 RPC 通信 |
API 网关 | kong/go-kong(437+星) | 内置 rest 网关 | 路由、鉴权、限流 |
消息队列 | streadway/amqp(5k+星,RabbitMQ客户端) | 支持集成 | 复杂路由、可靠投递 |
消息队列 | confluentinc/confluent-kafka-go(5k+星,Kafka客户端) | 支持集成 | 高吞吐、日志收集 |
链路追踪 | open-telemetry/opentelemetry-go(6k+星) | TraceHandler | 分布式追踪 |
认证授权 | golang-jwt/jwt(8k+星) | AuthorizeHandler | JWT 认证 |
更多网络中间件
中间件类型 | 组件名称(GitHub) | 核心特性 | 典型应用场景 |
---|---|---|---|
API 网关 | Traefik(56k+) | 1. 自动发现服务(与 K8s、Docker 深度集成) 2. 动态配置(无需重启) 3. 内置监控和仪表盘 4. 支持 HTTPS、WebSocket | 云原生环境网关、微服务入口、多环境路由管理 |
API 网关 | Kong Gateway(42k+) | 1. 基于 OpenResty,性能优异 2. 丰富的插件生态(限流、鉴权、监控等) 3. 支持声明式配置 4. 企业级稳定性 | 高并发 API 网关、多团队 API 管理、API 市场 |
API 网关 | Apache APISIX(15k+) | 1. 云原生、轻量级 2. 动态配置更新(基于 etcd) 3. 丰富的插件(支持自定义 Go 插件) 4. 支持 gRPC 转 HTTP | 微服务网关、K8s Ingress Controller、API 限流防护 |
身份认证网关 | ory/kratos(12k+) | 1. 专注于身份认证和授权 2. 支持 OAuth2.0、OpenID Connect 3. 与各种前端框架兼容 4. 可扩展的身份验证流程 | 用户认证网关、多因素认证、权限管理 |
服务网格 | Istio(37k+) | 1. 流量管理(动态路由、A/B 测试) 2. 安全通信(自动 mTLS) 3. 可观测性(全链路追踪、指标) 4. 服务间身份认证 | 大规模微服务治理、多集群服务管理、零信任网络 |
代理服务器 | Envoy(26.3k+) | 1. 高性能 L7/L4 代理 2. 动态配置 3. 健康检查、负载均衡 4. 熔断、限流 | 服务代理、API 网关底层、边缘代理 |
反向代理 | Caddy(67k+) | 1. 自动 HTTPS(默认启用 TLS) 2. 简单易用的配置 3. 插件化架构 4. 支持 HTTP/2、HTTP/3 | 静态资源服务、反向代理、简易 API 网关 |
分布式追踪 | Jaeger(20.4k+) | 1. 分布式链路追踪 2. 性能分析 3. 根因分析 4. 与 OpenTelemetry 兼容 | 微服务调用链监控、性能瓶颈定位、故障排查 |
服务注册发现 | Consul(29k+) | 1. 服务注册与发现 2. 分布式配置 3. 健康检查 4. 服务网格功能 | 服务自动发现、配置中心、分布式锁 |
go-zero 链路追踪中间件示例(TraceHandler)
package mainimport ("net/http""github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/rest/handler""github.com/zeromicro/go-zero/core/trace"
)func main() {// 初始化追踪器trace.SetGlobalTracer(trace.NewTracer(trace.TracerConf{ServiceName: "api-service",Endpoint: "http://jaeger:14268/api/traces", // Jaeger 地址}))engine := rest.MustNewServer(rest.RestConf{Port: 8080,})defer engine.Stop()// 添加链路追踪中间件engine.Use(handler.TraceHandler)// 注册路由engine.AddRoute(rest.Route{Method: http.MethodGet,Path: "/api/data",Handler: dataHandler,})engine.Start()
}func dataHandler(w http.ResponseWriter, r *http.Request) {w.Write([]byte("success"))
}
Kafka 消费示例(基于 confluent-kafka-go)
package mainimport ("fmt""log""github.com/confluentinc/confluent-kafka-go/kafka"
)func main() {// 初始化消费者c, err := kafka.NewConsumer(&kafka.ConfigMap{"bootstrap.servers": "localhost:9092","group.id": "my-group","auto.offset.reset": "earliest",})if err != nil {log.Fatalf("无法创建消费者: %v", err)}defer c.Close()// 订阅主题err = c.SubscribeTopics([]string{"user-tracking"}, nil)if err != nil {log.Fatalf("无法订阅主题: %v", err)}// 消费消息for {msg, err := c.ReadMessage(-1)if err != nil {log.Printf("消费错误: %v", err)continue}fmt.Printf("收到消息: %s 主题: %s 分区: %d 偏移量: %d\n",string(msg.Value), msg.TopicPartition.Topic,msg.TopicPartition.Partition, msg.TopicPartition.Offset)}
}
Caddy 作为 API 网关的简单配置示例
# Caddy 配置文件
:80 {# 将 /api/users 路由到用户服务route /api/users/* {reverse_proxy http://user-service:8080}# 将 /api/orders 路由到订单服务route /api/orders/* {reverse_proxy http://order-service:8081}# 全局配置:启用压缩encode gzip zstd# 简单的速率限制rate_limit * 100r/m # 每分钟最多 100 个请求
}