go-kit中间件
-
go-kit提供了很多用于构建微服务的组件,包括中间件。中间件是在HTTP请求和响应之间处理请求的一些逻辑,可以用于实现一些通用的功能,例如认证、日志记录、缓存等。
-
官方中间件定义
type Middleware func(Endpoint) Endpoint
-
在go-kit中间件可以通过装饰器模式来实现,即在原来的服务之上再加上一层逻辑。Go-Kit中间件通常有三种类型:
-
服务(service)中间件:服务中间件是针对服务层面的中间件,可以拦截请求,修改上下文信息,添加一些必要的头信息,以及添加跨域资源共享(CORS)等。
-
传输(transport )中间件:传输中间件是针对传输层面的中间件,例如负载均衡器和熔断器等。
-
enpoint中间件:endpoint 中间件的一种常见方式是使用装饰器模式。可以定义一个函数,该函数接受一个 endpoint 作为参数,返回一个新的 endpoint,该新 endpoint 可以在原始 endpoint 被调用前或后添加一些逻辑。例如:
func MiddlewareOne(next endpoint.Endpoint) endpoint.Endpoint { return func(ctx context.Context, request interface{ }) (interface{ }, error) { // 在原始 endpoint 被调用前添加逻辑 // ... // 调用原始 endpoint response, err := next(ctx, request) // 在原始 endpoint 被调用后添加逻辑 // ... return response, err } }
-
-
go-kit提供了一些默认的中间件,例如Logging中间件,它可以记录每个请求的日志信息,包括请求的URL、方法、请求体、响应码和响应体等。还有一些其他的中间件,例如Circuit Breaker中间件、Rate Limiter中间件等。
日志中间件
1. transport 日志中间件
-
中间件定义
func LoggingMiddleware(logger log.Logger) endpoint.Middleware { return func(next endpoint.Endpoint) endpoint.Endpoint { return func(ctx context.Context, request interface{ }) (interface{ }, error) { logger.Log("msg", "starting request") // 计算请求处理时间