超时是防止服务端被大量请求压垮的一种机制。
- gRPC 天然支持超时
- HTTP Leo提供了和gRPC用法一样的超时机制。
package main
import (
"context"
"github.com/go-leo/leo/v3/example/api/helloworld/v1"
"log"
"time"
)
func main() {
client := helloworld.NewGreeterHttpClient("localhost:60051")
// 设置超时时间为1秒
ctx, cancelFunc := context.WithTimeout(context.Background(), 1*time.Second)
defer cancelFunc()
r, err := client.SayHello(ctx, &helloworld.HelloRequest{})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
}package main
import (
"context"
"github.com/go-leo/leo/v3"
"github.com/go-leo/leo/v3/example/api/helloworld/v1"
"github.com/go-leo/leo/v3/serverx/grpcserverx"
"github.com/go-leo/leo/v3/serverx/httpserverx"
"github.com/go-leo/leo/v3/transportx/grpctransportx"
"github.com/gorilla/mux"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
"time"
)
func main() {
client := helloworld.NewGreeterGrpcClient("localhost:50051", grpctransportx.WithDialOptions(grpc.WithTransportCredentials(insecure.NewCredentials())))
router := helloworld.AppendGreeterHttpServerRoutes(mux.NewRouter(), client)
httpSrv := httpserverx.NewServer(router, httpserverx.Port(60051))
grpcSrv := grpcserverx.NewServer(grpcserverx.Port(50051))
helloworld.RegisterGreeterServer(grpcSrv, helloworld.NewGreeterGrpcServer(&server{}))
if err := leo.NewApp(leo.Runner(httpSrv, grpcSrv)).Run(context.Background()); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
type server struct{}
func (s *server) SayHello(ctx context.Context, in *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
// 获取超时时间
deadline, ok := ctx.Deadline()
log.Printf("timeout: %v, %v", deadline, ok)
// 模拟超时
time.Sleep(10 * time.Second)
log.Printf("after timeout")
return &helloworld.HelloReply{Message: "Hello " + in.GetName()}, nil
}