GoZero微服务个人探究之路添加中间件、自定义中间件
在GoZero框架中,可以很容易地添加和使用中间件。以下是如何添加和使用中间件的示例。
首先,在你的服务中定义一个全局的中间件管理器:
var (
Greeter = zrpc.NewServer(
zrpc.Address(":9000"),
zrpc.Timeout(time.Second*3),
)
)
然后,你可以添加GoZero框架内建的中间件,比如日志、超时、限流等:
Greeter.Use(
zrpc.Logger(),
zrpc.Recovery(),
zrpc.Timeout(time.Second*3),
zrpc.RateLimit(zrpc.RateLimitOption{
Frequency: 3,
Duration: time.Second * 10,
}),
)
你也可以自定义中间件。自定义中间件需要实现 znet.HandlerFunc
接口:
func MyMiddleware(fn znet.HandlerFunc) znet.HandlerFunc {
return func(ctx context.Context, req ziface.IRequest) {
// 在请求处理前执行的逻辑
fmt.Println("Before request handling")
// 调用下一个中间件或最终的处理函数
fn(ctx, req)
// 在请求处理后执行的逻辑
fmt.Println("After request handling")
}
}
然后,将自定义的中间件添加到服务中:
Greeter.Use(MyMiddleware)
完整示例代码:
package main
import (
"context"
"fmt"
"time"
"github.com/zeromicro/go-zero/zrpc"
"github.com/zeromicro/go-zero/zrpc/internal/znet"
"github.com/zeromicro/go-zero/zrpc/internal/ziface"
)
var (
Greeter = zrpc.NewServer(
zrpc.Address(":9000"),
zrpc.Timeout(time.Second*3),
)
)
func MyMiddleware(fn znet.HandlerFunc) znet.HandlerFunc {
return func(ctx context.Context, req ziface.IRequest) {
// 在请求处理前执行的逻辑
fmt.Println("Before request handling")
// 调用下一个中间件或最终的处理函数
fn(ctx, req)
// 在请求处理后执行的逻辑
fmt.Println("After request handling")
}
}
func main() {
Greeter.Use(
zrpc.Logger(),
zrpc.Recovery(),
zrpc.Timeout(time.Second*3),
zrpc.RateLimit(zrpc.RateLimitOption{
Frequency: 3,
Duration: time.Second * 10,
}),
MyMiddleware,
)
// ... 其他服务启动代码
}
在这个示例中,我们定义了一个名为 Greeter
的RPC服务,并向它添加了内建的中间件和自定义的中间件。这样,每个请求在处理前后都会执行相应的逻辑。
评论已关闭