带值方式

This commit is contained in:
suguo.yao 2021-10-04 12:39:54 +08:00
parent 4af58eb034
commit 014b71c770
3 changed files with 57 additions and 3 deletions

View File

@ -4,19 +4,37 @@ import (
"context"
"encoding/json"
"log"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"myschools.me/suguo/protobuf-demo/gen"
"myschools.me/suguo/protobuf-demo/model"
)
//interceptor 客户端拦截器
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...)
log.Printf("method == %s ; req == %v ; rep == %v ; duration == %s ; error == %v\n", method, req, reply, time.Since(start), err)
return err
}
func main() {
rpc, err := grpc.Dial("127.0.0.1:53637", grpc.WithBlock(), grpc.WithInsecure())
rpc, err := grpc.Dial("127.0.0.1:55887", grpc.WithBlock(), grpc.WithInsecure(), grpc.WithUnaryInterceptor(interceptor))
if err != nil {
log.Fatalln(err)
}
srv := gen.NewDemoClient(rpc)
resp, err := srv.Call(context.Background(), &gen.DemoCallResquest{
rtx, cancel := context.WithTimeout(context.Background(), time.Second)
rtx = context.WithValue(rtx, "token", "hello")
defer cancel()
defer rpc.Close()
md := metadata.MD{}
md.Set("token", "hello")
rtx = metadata.NewOutgoingContext(rtx, md)
resp, err := srv.Call(rtx, &gen.DemoCallResquest{
C1: "hello",
})
if err != nil {

View File

@ -0,0 +1,35 @@
package middleware
import (
"context"
"log"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
)
// Interceptor 拦截器
func Interceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
// 进行认证
log.Println("interceptor...")
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
return nil, grpc.Errorf(codes.Unauthenticated, "no token ")
}
// md 是一个 map[string][]string 类型的
val, ok := md["token"]
if !ok {
if val == nil {
return nil, grpc.Errorf(codes.Unauthenticated, "token is null")
}
}
if val[0] != "hello" {
return nil, grpc.Errorf(codes.Unauthenticated, "token invalide: token=%s", val[0])
}
// 继续处理请求
return handler(ctx, req)
}

View File

@ -7,10 +7,11 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"myschools.me/suguo/protobuf-demo/gen"
"myschools.me/suguo/protobuf-demo/middleware"
)
func main() {
rpc := grpc.NewServer(grpc.MaxRecvMsgSize(1024*1024), grpc.MaxSendMsgSize(1024*1024))
rpc := grpc.NewServer(grpc.MaxRecvMsgSize(1024*1024), grpc.MaxSendMsgSize(1024*1024), grpc.UnaryInterceptor(middleware.Interceptor))
//register
gen.RegisterDemoServer(rpc, &Demo{})