0Pricing
Go Academy · Lekcja

Interceptory gRPC i metadane

Uwierzytelnianie, middleware logowania i metadane gRPC

Interceptory gRPC i metadane to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Czym są interceptory?

Interceptory gRPC (middleware) są uruchamiane przed obsługą RPC lub po niej. Dodają mechanizmy przekrojowe, takie jak logowanie, weryfikacja tokenów uwierzytelniających, metryki, odzyskiwanie po panice i śledzenie.

Interceptor unary po stronie serwera

Interceptor unary po stronie serwera opakowuje handler dodatkową logiką:

func LoggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    log.Printf("RPC: %s", info.FullMethod)
    resp, err := handler(ctx, req)
    log.Printf("done: %v", err)
    return resp, err
}

grpcSrv := grpc.NewServer(grpc.UnaryInterceptor(LoggingInterceptor))

Interceptor strumieniowy po stronie serwera

Podobnie jak w przypadku unary, ale opakowuje handler strumienia:

func StreamLogging(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
    log.Printf("stream: %s", info.FullMethod)
    return handler(srv, ss)
}

Łączenie interceptorów

Należy użyć grpc.ChainUnaryInterceptor (Go gRPC v1.38+), aby zastosować wiele interceptorów w określonej kolejności:

grpcSrv := grpc.NewServer(
    grpc.ChainUnaryInterceptor(LoggingInterceptor, AuthInterceptor, MetricsInterceptor),
)

Interceptory klienta

Interceptory unary po stronie klienta opakowują wywołania wychodzące — przydają się do wstrzykiwania tokenów uwierzytelniających, ponawiania prób lub nagłówków śledzenia:

conn, _ := grpc.NewClient(addr,
    grpc.WithUnaryInterceptor(ClientAuthInterceptor),
    grpc.WithTransportCredentials(insecure.NewCredentials()),
)

Metadane gRPC

Metadane to pary klucz-wartość wysyłane wraz z RPC, analogiczne do nagłówków HTTP. Po stronie klienta należy użyć metadata.New i metadata.NewOutgoingContext.

md := metadata.New(map[string]string{"authorization": "Bearer " + token})
ctx := metadata.NewOutgoingContext(context.Background(), md)

Odczytywanie metadanych na serwerze

Metadane przychodzące należy wyodrębnić za pomocą metadata.FromIncomingContext:

md, ok := metadata.FromIncomingContext(ctx)
if !ok { return nil, status.Error(codes.Unauthenticated, "no metadata") }
token := md["authorization"]

Wysyłanie metadanych z serwera

Nagłówki odpowiedzi i przyczepy należy wysyłać z serwera za pomocą grpc.SetHeader i grpc.SetTrailer:

grpc.SetHeader(ctx, metadata.Pairs("x-request-id", requestID))

go-grpc-middleware

Biblioteka github.com/grpc-ecosystem/go-grpc-middleware/v2 udostępnia gotowe interceptory: odzyskiwanie po panice, logowanie (zap/logrus), uwierzytelnianie i inne.

Wzorzec interceptora uwierzytelniania

Należy wyodrębnić i zweryfikować token w interceptorze, a następnie dołączyć użytkownika do kontekstu dla handlerów niższego poziomu:

func AuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    md, _ := metadata.FromIncomingContext(ctx)
    if !validateToken(md["authorization"]) {
        return nil, status.Error(codes.Unauthenticated, "invalid token")
    }
    return handler(ctx, req)
}

Interceptor odzyskiwania po panice

Handler należy opakować tak, aby odzyskać działanie po panice i zwrócić błąd Internal zamiast doprowadzić do awarii:

defer func() {
    if r := recover(); r != nil {
        err = status.Errorf(codes.Internal, "panic: %v", r)
    }
}()

Szybki test

W jaki sposób przekazuje się tokeny uwierzytelniające między klientem gRPC a serwerem?

Podsumowanie: interceptory i metadane gRPC

Najważniejsze informacje:

  • Interceptor unary: func(ctx, req, info, handler) (resp, error)
  • grpc.ChainUnaryInterceptor do obsługi wielu interceptorów
  • Metadane to pary klucz-wartość, analogiczne do nagłówków HTTP
  • Interceptor uwierzytelniania: wyodrębnienie metadanych → weryfikacja → dodanie użytkownika do kontekstu

Często zadawane pytania

Czy lekcja „Interceptory gRPC i metadane” jest bezpłatna?

Tak — pełny tekst „Interceptory gRPC i metadane” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Interceptory gRPC i metadane”?

Uwierzytelnianie, middleware logowania i metadane gRPC Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Interceptory gRPC i metadane”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Protocol Buffers i pliki .proto
  2. Implementowanie jednożądaniowej usługi gRPC
  3. Strumieniowanie po stronie serwera i klienta
  4. Interceptory gRPC i metadane
← Powrót do Go Academy