funcmain(){flag.Parse()creds,err:=credentials.NewClientTLSFromFile(data.Path("x509/server.crt"),"www.lixueduan.com")iferr!=nil{log.Fatalf("failed to load credentials: %v",err)}// 建立连接时指定要加载的拦截器conn,err:=grpc.Dial(*addr,grpc.WithTransportCredentials(creds),grpc.WithUnaryInterceptor(unaryInterceptor))iferr!=nil{log.Fatalf("did not connect: %v",err)}deferconn.Close()client:=ecpb.NewEchoClient(conn)callUnaryEcho(client,"hello world")}
funcmain(){flag.Parse()lis,err:=net.Listen("tcp",fmt.Sprintf(":%d",*port))iferr!=nil{log.Fatalf("failed to listen: %v",err)}creds,err:=credentials.NewServerTLSFromFile(data.Path("x509/server.crt"),data.Path("x509/server.key"))iferr!=nil{log.Fatalf("failed to create credentials: %v",err)}s:=grpc.NewServer(grpc.Creds(creds),grpc.UnaryInterceptor(unaryInterceptor))pb.RegisterEchoServer(s,&server{})log.Println("Server gRPC on 0.0.0.0"+fmt.Sprintf(":%d",*port))iferr:=s.Serve(lis);err!=nil{log.Fatalf("failed to serve: %v",err)}}
Test
Server
1
2
3
2021/01/24 19:18:09 Server gRPC on 0.0.0.0:50051
unary echoing message "hello world"LOG: RPC: /echo.Echo/UnaryEcho,req:message:"hello world" start time: 2021-01-24T19:18:10+08:00, end time: 2021-01-24T19:18:10+08:00, err: <nil>
Client
1
2
LOG: RPC: /echo.Echo/UnaryEcho, req:message:"hello world" start time: 2021-01-24T19:18:10+08:00, end time: 2021-01-24T19:18:10+08:00, err: <nil>
UnaryEcho: hello world
typewrappedStreamstruct{grpc.ServerStream}funcnewWrappedStream(sgrpc.ServerStream)grpc.ServerStream{return&wrappedStream{s}}func(w*wrappedStream)RecvMsg(minterface{})error{logger("Receive a message (Type: %T) at %s",m,time.Now().Format(time.RFC3339))returnw.ServerStream.RecvMsg(m)}func(w*wrappedStream)SendMsg(minterface{})error{logger("Send a message (Type: %T) at %v",m,time.Now().Format(time.RFC3339))returnw.ServerStream.SendMsg(m)}funcstreamInterceptor(srvinterface{},ssgrpc.ServerStream,info*grpc.StreamServerInfo,handlergrpc.StreamHandler)error{// 包装 grpc.ServerStream 以替换 RecvMsg SendMsg这两个方法。err:=handler(srv,newWrappedStream(ss))iferr!=nil{logger("RPC failed with error %v",err)}returnerr}
funcmain(){flag.Parse()lis,err:=net.Listen("tcp",fmt.Sprintf(":%d",*port))iferr!=nil{log.Fatalf("failed to listen: %v",err)}creds,err:=credentials.NewServerTLSFromFile(data.Path("x509/server.crt"),data.Path("x509/server.key"))iferr!=nil{log.Fatalf("failed to create credentials: %v",err)}s:=grpc.NewServer(grpc.Creds(creds),grpc.StreamInterceptor(streamInterceptor))pb.RegisterEchoServer(s,&server{})log.Println("Server gRPC on 0.0.0.0"+fmt.Sprintf(":%d",*port))iferr:=s.Serve(lis);err!=nil{log.Fatalf("failed to serve: %v",err)}}
Test
Server
1
2
3
4
5
6
7
8
9
lixd@17x:~/17x/projects/grpc-go-example/features/interceptor/server$ go run main.go
2021/01/24 19:58:12 Server gRPC on 0.0.0.0:50051
LOG: Receive a message (Type: *echo.EchoRequest) at 2021-01-24T19:58:14+08:00
bidi echoing message "Request 1"LOG: Send a message (Type: *echo.EchoResponse) at 2021-01-24T19:58:14+08:00
LOG: Receive a message (Type: *echo.EchoRequest) at 2021-01-24T19:58:14+08:00
bidi echoing message "Request 2"LOG: Send a message (Type: *echo.EchoResponse) at 2021-01-24T19:58:14+08:00
LOG: Receive a message (Type: *echo.EchoRequest) at 2021-01-24T19:58:14+08:00
Client
1
2
3
4
5
6
7
8
lixd@17x:~/17x/projects/grpc-go-example/features/interceptor/client$ go run main.go
LOG: Send a message (Type: *echo.EchoRequest) at 2021-01-24T19:58:14+08:00
LOG: Send a message (Type: *echo.EchoRequest) at 2021-01-24T19:58:14+08:00
LOG: Receive a message (Type: *echo.EchoResponse) at 2021-01-24T19:58:14+08:00
BidiStreaming Echo: Request 1LOG: Receive a message (Type: *echo.EchoResponse) at 2021-01-24T19:58:14+08:00
BidiStreaming Echo: Request 2LOG: Receive a message (Type: *echo.EchoResponse) at 2021-01-24T19:58:14+08:00