package main import ( fmt "fmt" "log" "net" "time" "golang.org/x/net/context" "google.golang.org/grpc" ) var port = ":5000" type myGrpcServer struct{} func (s *myGrpcServer) SayHello(ctx context.Context, in *HelloRequest) (*HelloReply, error) { panic("debug") return &HelloReply{Message: "Hello " + in.Name}, nil } func main() { go startServer() time.Sleep(time.Second) doClientWork() } func filter( ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler, ) (resp interface{}, err error) { log.Println("fileter:", info) defer func() { if r := recover(); r != nil { err = fmt.Errorf("panic: %v", r) } }() // valiate req return handler(ctx, req) } func startServer() { server := grpc.NewServer(grpc.UnaryInterceptor(filter)) RegisterGreeterServer(server, new(myGrpcServer)) lis, err := net.Listen("tcp", port) if err != nil { log.Panicf("could not list on %s: %s", port, err) } if err := server.Serve(lis); err != nil { log.Panicf("grpc serve error: %s", err) } } func doClientWork() { conn, err := grpc.Dial("localhost"+port, grpc.WithInsecure()) if err != nil { log.Fatal(err) } defer conn.Close() c := NewGreeterClient(conn) r, err := c.SayHello(context.Background(), &HelloRequest{Name: "gopher"}) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("doClientWork: %s", r.Message) }