Go 언어로 gRPC에 들어가는 3 단독 캡처기

14015 단어 GogRPCtech
이전 기사에서 GRPC로 검증 처리를 실험했습니다.
그때 여기 있었어.
https://zenn.dev/miyazi777/articles/a560e691fcee0b6449e4
콘센트는 인증 외에도 로킹 등 정형 처리가 준비돼 있어 편리해 보인다.
다만, 실제 업무에서 혼자 처리할 때가 있을 것 같아서 이 글에서 카스타임 캡처기 테스트를 해봤습니다.
rails의before,after,java의Spring의interceptor에 익숙해진 사람이라면 금방 인상을 남길 수 있을 것 같아요.
이 글에서 이전 이름만 주면 hello을 반환할 수 있습니다.
지난번 기사가 여기 있습니다.
https://zenn.dev/miyazi777/articles/dbed823239aa17a9c82b
  • 발송된 명칭을 <<<>로 묶음
  • 반환한 Hello를 ****로 둘러싸기
  • 예:name:world를 서버에 보낼 때 "**hello**<"반환

    단독 절취기 추가


    server.go에서 다음 함수를 정의합니다.
    이것은 단독 캡처기의 처리 내용이다.
    함수 중간의handler () 는 원시 처리를 요청해야 합니다.
    func CustomInterceptor() grpc.UnaryServerInterceptor {
        return func(ctx context.Context, request interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHand
            fmt.Printf("before process")
            helloMessage, _ := request.(*hello.HelloMessage)
            helloMessage.Name = fmt.Sprintf("<<< %s >>>", helloMessage.Name)
    
            res, err := handler(ctx, request)
            if err != nil {
                return nil, err
            }
    
            fmt.Println("after process")
            helloResponse, _ := res.(*hello.HelloResponse)
            helloResponse.Msg = fmt.Sprintf("*** %s ***", helloResponse.Msg)
            return res, nil
        }
    }
    

    단독 캡처 설정


    server.goo의 다음 부분을 수정합니다.
    이렇게 매번 요청할 때마다 처리해야 하는 캡처기를 등록합니다.
        server := grpc.NewServer(
            grpc.UnaryInterceptor(CustomInterceptor()),
        )
    

    코드 전체 텍스트


    다음은 서버입니다.goo의 코드 전문.
    package main
    
    import (
    	"context"
    	"fmt"
    	"log"
    	"net"
    	"test/hello"
    
    	"google.golang.org/grpc"
    )
    
    func main() {
    	listenPort, err := net.Listen("tcp", ":19003")
    	if err != nil {
    		log.Fatal(err)
    	}
    	server := grpc.NewServer(
    		grpc.UnaryInterceptor(CustomInterceptor()),
    	)
    	hello.RegisterHelloServer(server, &Hello{})
    	server.Serve(listenPort)
    }
    
    type Hello struct{}
    
    func (h *Hello) Hello(cts context.Context, message *hello.HelloMessage) (*hello.HelloResponse, error) {
    	res := hello.HelloResponse{Msg: fmt.Sprintf("hello %s", message.Name)}
    	return &res, nil
    }
    
    func CustomInterceptor() grpc.UnaryServerInterceptor {
    	return func(ctx context.Context, request interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    		fmt.Printf("before process")
    		helloMessage, _ := request.(*hello.HelloMessage)
    		helloMessage.Name = fmt.Sprintf("<<< %s >>>", helloMessage.Name)
    
    		res, err := handler(ctx, request)
    		if err != nil {
    			return nil, err
    		}
    
    		fmt.Println("after process")
    		helloResponse, _ := res.(*hello.HelloResponse)
    		helloResponse.Msg = fmt.Sprintf("*** %s ***", helloResponse.Msg)
    		return res, nil
    	}
    }
    

    좋은 웹페이지 즐겨찾기