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_test/proto" "context" "fmt" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "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("接收到了一个新的请求") md, ok := metadata.FromIncomingContext(ctx) fmt.Println(md) if !ok { //已经开始接触到grpc的错误处理了 return resp, status.Error(codes.Unauthenticated, "无token认证信息") } var ( appid string appkey string ) if va1, ok := md["appid"]; ok { appid = va1[0] } if va1, ok := md["appkey"]; ok { appkey = va1[0] } if appid != "101010" || appkey != "I am key" { return resp, status.Error(codes.Unauthenticated, "无token认证信息") } 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_test/proto" "context" "fmt" "google.golang.org/grpc")type customCredential struct {}func (c customCredential) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { return map[string]string{ "appid": "101010", "appkey": "I am key", },nil}func (c customCredential) RequireTransportSecurity() bool { return false}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() // md :=metadata.New(map[string]string{ // "appid":"101010", // "appkey":"I am key", // }) // ctx = metadata.NewOutgoingContext(context.Background(), md) // err := invoker(ctx, method, req, reply, cc, opts...) // if err != nil { // return err // } // fmt.Printf("耗时: %s\n",time.Since(start)) // return err //} grpc.WithPerRPCCredentials(customCredential{}) var opts []grpc.DialOption opts = append(opts, grpc.WithInsecure()) opts = append(opts, grpc.WithPerRPCCredentials(customCredential{})) //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)}