项目简介

项目地址: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的代码。