带值方式
This commit is contained in:
parent
4af58eb034
commit
014b71c770
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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{})
|
||||
|
|
|
|||
Loading…
Reference in New Issue