1.proto
syntax = "proto3";option go_package = ".;proto";service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}//将session放入 放入cookie中 http协议message HelloRequest { string name = 1;}message HelloReply { string message = 1;}
2.server
package mainimport ( "OldPackageTest/grpc_interceptor/proto" "context" "fmt" "google.golang.org/grpc" "net")type Server struct {}func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) { return &proto.HelloReply{ Message: "hello " + request.Name, }, nil}func main() { var interceptor grpc.UnaryServerInterceptor interceptor = func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { //继续处理请求 fmt.Println("接收到新请求") res, err := handler(ctx, req) fmt.Println("请求处理完成") return res, err } var opts []grpc.ServerOption opts = append(opts, grpc.UnaryInterceptor(interceptor)) g := grpc.NewServer(opts...) proto.RegisterGreeterServer(g, &Server{}) lis, err := net.Listen("tcp", "0.0.0.0:50051") if err != nil { panic("failed to listen" + err.Error()) } err = g.Serve(lis) if err != nil { panic("failed to start" + err.Error()) }}
package mainimport ( "OldPackageTest/grpc_test/proto" "context" "fmt" "google.golang.org/grpc" "net")type Server struct {}func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) { return &proto.HelloReply{ Message: "hello " + request.Name, }, nil}func main() { interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { fmt.Println("接收到了一个新的请求") res,err := handler(ctx, req) fmt.Println("请求已经完成") return res,err } opt := grpc.UnaryInterceptor(interceptor) g := grpc.NewServer(opt) proto.RegisterGreeterServer(g, &Server{}) lis, err := net.Listen("tcp", "0.0.0.0:8080") if err != nil { panic("failed to listen" + err.Error()) } err = g.Serve(lis) if err != nil { panic("failed to start" + err.Error()) }}
3.client
package mainimport ( "OldPackageTest/grpc_interceptor/proto" "context" "fmt" "google.golang.org/grpc" "time")func interceptor(ctx context.Context,method string,req,reply interface{},cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error{ start := time.Now() err := invoker(ctx, method, req, reply, cc, opts...) if err != nil { return err } fmt.Printf("耗时: %s\n",time.Since(start)) return err}func main() { //stream var opts []grpc.DialOption opts = append(opts,grpc.WithInsecure()) //指定客户端 interceptor opts = append(opts,grpc.WithUnaryInterceptor(interceptor)) conn,err := grpc.Dial("localhost:50051",opts...) if err != nil{ panic(err) } defer conn.Close() c := proto.NewGreeterClient(conn) r, err := c.SayHello(context.Background(), &proto.HelloRequest{Name: "Anwma"}) if err != nil { panic(err) } fmt.Println(r.Message)}
package mainimport ( "OldPackageTest/grpc_test/proto" "context" "fmt" "google.golang.org/grpc" "time")func main() { //stream interceptor := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error{ start := time.Now() err := invoker(ctx, method, req, reply, cc, opts...) if err != nil { return err } fmt.Printf("耗时: %s\n",time.Since(start)) return err } var opts []grpc.DialOption opts = append(opts,grpc.WithInsecure()) opts = append(opts,grpc.WithUnaryInterceptor(interceptor)) //opt := grpc.WithUnaryInterceptor(interceptor) //conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure(),opt) conn, err := grpc.Dial("127.0.0.1:8080", opts...) if err != nil { panic(err) } defer conn.Close() c := proto.NewGreeterClient(conn) r, err := c.SayHello(context.Background(), &proto.HelloRequest{Name: "Anwma"}) if err != nil { panic(err) } fmt.Println(r.Message)}
4. 拦截器的应用场景