概览
相关代码均可以在目录下找到。
- logging: 用于请求日志的记录。
- metrics: 用于启用metric。
- recovery: 用于recovery panic。
- tracing: 用于启用trace。
- validate: 用于处理参数校验。
- metadata: 用于启用元信息传递
- auth: 用于提供基于JWT的认证请求
- ratelimit: 用于服务端流量限制
- circuitbreaker: 用于客户端熔断控制
一个请求进入时的处理顺序为Middleware注册的顺序,而响应返回的处理顺序为注册顺序的倒序。
在NewGRPCServer
和NewHTTPServer
中通过ServerOption
进行注册。 如
// http
// 定义opts
var opts = []http.ServerOption{
http.Middleware(
recovery.Recovery(), // 把middleware按照需要的顺序加入
tracing.Server(),
logging.Server(),
),
}
// 创建server
http.NewServer(opts...)
var opts = []grpc.ServerOption{
grpc.Middleware(
recovery.Recovery(), // 把middleware按照需要的顺序加入
tracing.Server(),
logging.Server(),
),
}
// 创建server
grpc.NewServer(opts...)
需要实现Middleware
接口。 中间件中您可以使用获得Transporter实例以便访问接口相关的元信息
基本的代码模板
对特定路由定制中间件
- 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
,匹配成功,ctx
可使用transport.FromServerContext(ctx)
或者transport.FromClientContext(ctx
获取Transporter
http server
import "github.com/go-kratos/kratos/v2/middleware/selector"
http.Middleware(
selector.Server(recovery.Recovery(), tracing.Server(),testMiddleware).
Path("/hello.Update/UpdateUser", "/hello.kratos/SayHello").
Regex(`/test.hello/Get[0-9]+`).
Prefix("/kratos.", "/go-kratos.", "/helloworld.Greeter/").
Build(),
)
grpc server
import "github.com/go-kratos/kratos/v2/middleware/selector"
grpc.Middleware(
selector.Server(recovery.Recovery(), tracing.Server(),testMiddleware).
Regex(`/test.hello/Get[0-9]+`).
Build(),
)
grpc client
operation查找
gRPC path 的拼接规则为 /包名.服务名/方法名
syntax = "proto3";
package helloworld;
import "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) {
option (google.api.http) = {
get: "/helloworld/{name}",
};
}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
}