项目地址:https://github.com/go-kratos/gateway
B站开源的微服务网关,从项目内容的复杂程度还是项目的简单说明都可以看出来,这仅是一个DEMO示例,而非一个成熟的项目,这也是我选择他进行研究的一个主要原因。B站自家的kratos微服务框架已经很成熟了,该API网关也是基于其框架之上建立起来的,也算是kateos的一个简要的使用案例吧。
项目目录|-cmd/gateway
| |-main.go 入口总文件,读取配置,启动kratos app
|-server/server.go 网关服务,注入kratos app
|-proxy/proxy.go 核心代理转发模块
|-router 路由模块
| |-mux/mux.go mux路由
|-client client模块,本质上是对http.net.client的扩展
| |-factory.go client factory,依据config.endpoint来注册client
| |-client.go client代理结构体
| |-node.go selector.Node接口的实现,对访问节点进行选择
| |-retry.go 重试机制实现
| |-target.go 解析最终访问目标
|-middleware 中间件模块
| |-middleware.go 中间件接口
| |-registry.go 中间件注册机制实现
| |-request.go 中间件请求配置关联上下文
| |-logging.go log关联上下文
| |-color/color.go 对“染色”的header的请求进行过滤
| |-cors/cors.go 跨域实现
| |-logging/logging.go 日志中间件
| |-otel/otel.go OpenTelemetry的tracer对接实现
| |-prometheus/prometheus.go prometheus监控
写了一个http代理的最简demo,与该项目的核心原理相同。当然golang写http代理,最方便的就是自带的ReverseProxy啦……
这里要注意的是RequestURI必须置空,否则出错,详见net.http.client.go
grpc代理则是修改client,基本与http代理大同小异,主要的不同点就是使用了HTTP/2。
工作流程1、服务初始流程
解析命令行参数->开启pprof服务->读取解析配置文件,同时监控该配置文件->通过配置文件建立代理模型->katos app启动服务
2、请求流程
请求进入->公共中间件->单服务配置中间件->对请求进行处理->发送请求->接收响应再次进入中间件->输出响应结果
中间件的结构比较有意思
输入输出同为一个handler的函数,这使得这使得实现了该接口的中间件可以无限叠加,也可以在响应前后进行处理。
初步解构了该项目的目录结构、功能以及流程,核心功能点稍提了一下,但没有详细讲解,其中有些涉及到微服务的功能点,依托了kratos本身的模块,接下来抽个时间梳理一下kratos的代码。