概览

    相关代码均可以在目录下找到。

    • logging: 用于请求日志的记录。
    • metrics: 用于启用metric。
    • recovery: 用于recovery panic。
    • tracing: 用于启用trace。
    • validate: 用于处理参数校验。
    • metadata: 用于启用元信息传递
    • auth: 用于提供基于JWT的认证请求
    • ratelimit: 用于服务端流量限制
    • circuitbreaker: 用于客户端熔断控制

    一个请求进入时的处理顺序为Middleware注册的顺序,而响应返回的处理顺序为注册顺序的倒序。

    NewGRPCServerNewHTTPServer中通过ServerOption进行注册。 如

    1. // http
    2. // 定义opts
    3. var opts = []http.ServerOption{
    4. http.Middleware(
    5. recovery.Recovery(), // 把middleware按照需要的顺序加入
    6. tracing.Server(),
    7. logging.Server(),
    8. ),
    9. }
    10. // 创建server
    11. http.NewServer(opts...)
    12. var opts = []grpc.ServerOption{
    13. grpc.Middleware(
    14. recovery.Recovery(), // 把middleware按照需要的顺序加入
    15. tracing.Server(),
    16. logging.Server(),
    17. ),
    18. }
    19. // 创建server
    20. 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

    1. import "github.com/go-kratos/kratos/v2/middleware/selector"
    2. http.Middleware(
    3. selector.Server(recovery.Recovery(), tracing.Server(),testMiddleware).
    4. Path("/hello.Update/UpdateUser", "/hello.kratos/SayHello").
    5. Regex(`/test.hello/Get[0-9]+`).
    6. Prefix("/kratos.", "/go-kratos.", "/helloworld.Greeter/").
    7. Build(),
    8. )

    grpc server

    1. import "github.com/go-kratos/kratos/v2/middleware/selector"
    2. grpc.Middleware(
    3. selector.Server(recovery.Recovery(), tracing.Server(),testMiddleware).
    4. Regex(`/test.hello/Get[0-9]+`).
    5. Build(),
    6. )

    grpc client

    operation查找

    gRPC path 的拼接规则为 /包名.服务名/方法名

    1. syntax = "proto3";
    2. package helloworld;
    3. import "google/api/annotations.proto";
    4. option go_package = "github.com/go-kratos/examples/helloworld/helloworld";
    5. // The greeting service definition.
    6. service Greeter {
    7. // Sends a greeting
    8. rpc SayHello (HelloRequest) returns (HelloReply) {
    9. option (google.api.http) = {
    10. get: "/helloworld/{name}",
    11. };
    12. }
    13. }
    14. // The request message containing the user's name.
    15. message HelloRequest {
    16. string name = 1;
    17. }
    18. // The response message containing the greetings
    19. message HelloReply {
    20. }