概览 | kratos


本站和网页 https://go-kratos.dev/docs/component/middleware/overview 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

概览 | Kratos
Skip to main content
Kratos
Docs
Blog
API
Changelog
中文
English
ctrl
简介
设计理念
常见问题
项目结构
快速开始
项目初始化
CLI工具
插件
代码示例
框架组件
API 定义
配置
序列化
错误处理
日志
元信息传递
监控接口
服务注册与发现
路由与负载均衡
中间件
概览
认证
熔断器
监控
限流器
异常恢复
链路追踪
参数校验
传输协议
HTTP
gRPC
用户指南
Protobuf 规范
OpenAPI Swagger 使用
Wire 依赖注入
Ent 数据库框架使用
运维指南
Docker
开源社区
贡献指南
文档维护
核心贡献者
共建企业
On this page
Kratos 内置了一系列的 middleware(中间件)用于处理 logging、 metrics 等通用场景。您也可以通过实现
Middleware
接口,开发自定义 middleware,进行通用的业务处理,比如用户登录鉴权等。
内置中间件
相关代码均可以在
middleware
目录下找到。
logging
: 用于请求日志的记录。
metrics
: 用于启用 metric。
recovery
: 用于 recovery panic。
tracing
: 用于启用 trace。
validate
: 用于处理参数校验。
metadata
: 用于启用元信息传递。
auth
: 用于提供基于 JWT 的认证请求。
ratelimit
: 用于服务端流量限制。
circuitbreaker
: 用于客户端熔断控制。
生效顺序
一个请求进入时的处理顺序为 Middleware 注册的顺序,而响应返回的处理顺序为注册顺序的倒序,即先进后出(FILO)。
┌───────────────────┐
│MIDDLEWARE 1
│ ┌────────────────┐│
│ │MIDDLEWARE 2
││
│ │ ┌─────────────┐││
│ │ │MIDDLEWARE 3 │││
│ │ │ ┌─────────┐ │││
REQUEST
│ │ │ │
YOUR
│ │││
RESPONSE
──────┼─┼─┼─▷ HANDLER ○─┼┼┼───▷
│ │ │ └─────────┘ │││
│ │ └─────────────┘││
│ └────────────────┘│
└───────────────────┘
使用中间件
NewGRPCServer
NewHTTPServer
中通过
ServerOption
进行注册。
例如:
// http
// 定义opts
var
opts
http
Recovery
// 把middleware按照需要的顺序加入
Server
// 创建server
NewServer
...
//grpc
grpc
自定义中间件
需要实现
接口。
中间件中您可以使用
tr, ok := transport.FromServerContext(ctx)
获得
Transporter
实例以便访问接口相关的元信息。
基本的代码模板:
import
"context"
"github.com/go-kratos/kratos/v2/middleware"
"github.com/go-kratos/kratos/v2/transport"
func
Middleware1
return
handler middleware
Handler
ctx context
Context
req
interface
reply
err
error
if
tr
ok
:=
transport
FromServerContext
ctx
// Do something on entering
defer
// Do something on exiting
handler
定制中间件
对特定路由定制中间件:
server:
selector.Server(ms...)
client:
selector.Client(ms...)
匹配规则(多参数):
Path(path...)
: 路由匹配
Regex(regex...)
: 正则匹配
Prefix(prefix...)
: 前缀匹配
Match(fn)
: 函数匹配,函数格式为
func(ctx context.Context,operation string) bool
operation
为 path,函数返回值为
true
,匹配成功,
可使用
transport.FromServerContext(ctx)
或者
transport.FromClientContext(ctx
获取
Transporter)
http server
"github.com/go-kratos/kratos/v2/middleware/selector"
selector
testMiddleware
Path
"/hello.Update/UpdateUser"
"/hello.kratos/SayHello"
Regex
`/test.hello/Get[0-9]+`
Prefix
"/kratos."
"/go-kratos."
"/helloworld.Greeter/"
Build
http client
WithMiddleware
Client
Match
string
bool
strings
HasPrefix
"/go-kratos.dev"
||
HasSuffix
"world"
FromClientContext
false
RequestHeader
Get
"go-kratos"
==
"kratos"
grpc server
grpc client
注意: 定制中间件是通过 operation 匹配,并不是 http 本身的路由!!!
operation 是 HTTP 及 gRPC 统一的 gRPC path。
operation 查找
gRPC path 的拼接规则为
/包名.服务名/方法名(/package.Service/Method)
比如在如下 proto 文件中,我们要调用 SayHello 这个方法,那么 operation 就为
/helloworld.Greeter/SayHello
syntax
"proto3"
package
helloworld
"google/api/annotations.proto"
option
go_package
"github.com/go-kratos/examples/helloworld/helloworld"
// The greeting service definition.
service
Greeter
// Sends a greeting
rpc
SayHello
HelloRequest
returns
HelloReply
google
api
get
"/helloworld/{name}"
// The request message containing the user's name.
message
name
// The response message containing the greetings
Edit this page
Previous
Next
Kratos is a web application framework with expressive, elegant syntax. We've already laid the foundation.
Guides
Kratos v1(legacy)
Docs Repo
Community
Discord
More
GitHub
Copyright © 2021 go-kratos.dev