1. proto

  1. syntax = "proto3";
  2. option go_package = ".;proto";
  3. service Greeter {
  4. rpc SayHello (HelloRequest) returns (HelloReply);
  5. }
  6. message HelloRequest {
  7. string name = 1;
  8. }
  9. message HelloReply {
  10. string message = 1;
  11. }

2. 服务端

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "google.golang.org/grpc/codes"
  6. "google.golang.org/grpc/metadata"
  7. "google.golang.org/grpc/status"
  8. "net"
  9. "google.golang.org/grpc"
  10. "start/token_interceptor/proto"
  11. )
  12. type Server struct{}
  13. func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply,
  14. error){
  15. return &proto.HelloReply{
  16. Message: "hello "+request.Name,
  17. }, nil
  18. }
  19. func main(){
  20. lis, err := net.Listen("tcp", ":50051")
  21. if err != nil {
  22. fmt.Println(err.Error())
  23. return
  24. }
  25. var interceptor grpc.UnaryServerInterceptor
  26. interceptor = func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
  27. md, ok := metadata.FromIncomingContext(ctx)
  28. if !ok {
  29. return resp, status.Errorf(codes.Unauthenticated, "无Token认证信息")
  30. }
  31. var (
  32. appid string
  33. appkey string
  34. )
  35. if val, ok := md["appid"]; ok {
  36. appid = val[0]
  37. }
  38. if val, ok := md["appkey"]; ok {
  39. appkey = val[0]
  40. }
  41. if appid != "golangblogs" || appkey != "good good study" {
  42. return resp, status.Errorf(codes.Unauthenticated, "Token认证信息无效: appid=%s, appkey=%s", appid, appkey)
  43. }
  44. // 继续处理请求
  45. return handler(ctx, req)
  46. }
  47. var opts []grpc.ServerOption
  48. opts = append(opts, grpc.UnaryInterceptor(interceptor))
  49. s := grpc.NewServer(opts...)
  50. ser :=& Server{}
  51. proto.RegisterGreeterServer(s, ser)
  52. s.Serve(lis)
  53. }

3. 客户端

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "google.golang.org/grpc"
  6. "start/token_interceptor/proto"
  7. )
  8. type customCredential struct{}
  9. func (c customCredential) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
  10. return map[string]string{
  11. "appid": "golangblogs",
  12. "appkey": "good good study",
  13. }, nil
  14. }
  15. func (c customCredential) RequireTransportSecurity() bool {
  16. return false
  17. }
  18. func main() {
  19. var opts []grpc.DialOption
  20. //opts = append(opts, grpc.WithUnaryInterceptor(interceptor))
  21. opts = append(opts, grpc.WithInsecure())
  22. opts = append(opts, grpc.WithPerRPCCredentials(new(customCredential)))
  23. // 指定客户端interceptor
  24. conn, err := grpc.Dial("localhost:50051", opts...)
  25. if err != nil {
  26. panic(err)
  27. }
  28. defer conn.Close()
  29. c := proto.NewGreeterClient(conn)
  30. //rsp, _ := c.Search(context.Background(), &empty.Empty{})
  31. rsp, err := c.SayHello(context.Background(), &proto.HelloRequest{
  32. Name: "叶良辰",
  33. })
  34. if err != nil {
  35. panic(err)
  36. }
  37. fmt.Println(rsp.Message)
  38. }