返回

一个简洁的Kratos中间件使用指南

后端

前言

在本文中,我们将介绍Kratos 中间件的使用方法。Kratos 是一个用于构建微服务的 Go 框架,它提供了一个通用的中间件类型,使得一个这样类型的中间件可以同时用在 gRPC 和 HTTP 服务中使用。通过使用中间件,我们可以实现诸如日志记录、身份认证、限流等功能。

定义中间件

首先,我们需要定义一个中间件类型。中间件类型是一个接口,它定义了两个方法:HandleNext

type Middleware interface {
	Handle(ctx context.Context, req interface{}) (interface{}, error)
	Next(ctx context.Context, req interface{}) (interface{}, error)
}

Handle 方法是中间件的核心方法,它接收一个请求并返回一个响应。Next 方法用于调用下一个中间件或服务方法。

注册中间件

要使用中间件,我们需要将它注册到 Kratos 服务中。我们可以使用 RegisterMiddleware 方法来注册中间件。

func RegisterMiddleware(mw Middleware)

RegisterMiddleware 方法接收一个中间件类型作为参数,并将它添加到 Kratos 服务的中间件列表中。

使用中间件

在服务中使用中间件非常简单,只需要在服务方法中调用 Middleware 方法即可。

func (s *Service) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
	resp, err := s.Middleware(ctx, req)
	if err != nil {
		return nil, err
	}
	return resp.(*pb.HelloResponse), nil
}

Middleware 方法接收一个请求并返回一个响应。如果中间件处理请求时发生错误,则 Middleware 方法会返回一个错误。

内置中间件

Kratos 提供了一些内置的中间件,我们可以直接使用这些中间件来实现常见的功能。

  • RecoveryMiddleware: 捕获服务方法中的恐慌并返回错误响应。
  • LoggingMiddleware: 记录服务方法的请求和响应。
  • TimeoutMiddleware: 为服务方法设置超时时间。
  • CircuitBreakerMiddleware: 为服务方法实现断路器功能。
  • RateLimitMiddleware: 为服务方法实现限流功能。

自定义中间件

除了使用内置中间件之外,我们还可以自定义中间件来实现我们自己的功能。

例如,我们可以自定义一个中间件来实现身份认证功能。

type AuthMiddleware struct {
	verifier *jwt.Verifier
}

func NewAuthMiddleware(verifier *jwt.Verifier) *AuthMiddleware {
	return &AuthMiddleware{
		verifier: verifier,
	}
}

func (m *AuthMiddleware) Handle(ctx context.Context, req interface{}) (interface{}, error) {
	token := req.Header.Get("Authorization")
	if token == "" {
		return nil, errors.New("missing Authorization header")
	}

	claims, err := m.verifier.Verify(token)
	if err != nil {
		return nil, errors.New("invalid token")
	}

	ctx = context.WithValue(ctx, "claims", claims)
	return req, nil
}

func (m *AuthMiddleware) Next(ctx context.Context, req interface{}) (interface{}, error) {
	return m.Next(ctx, req)
}

这个中间件首先从请求头中获取 Authorization 字段的值。如果 Authorization 字段为空,则返回错误。

然后,这个中间件使用 verifier 校验令牌的有效性。如果令牌无效,则返回错误。

如果令牌有效,则这个中间件将令牌的声明添加到请求上下文中。

最后,这个中间件调用下一个中间件或服务方法。

总结

Kratos 中间件是一个非常强大的功能,它可以帮助我们实现各种各样的功能。通过使用中间件,我们可以轻松地扩展 Kratos 服务的功能,而无需修改服务本身的代码。