0Pricing
Go Academy · Lekcja

Kontekst w wywołaniach HTTP i baz danych

Przekazywanie kontekstu przez cały łańcuch wywołań

Kontekst w wywołaniach HTTP i baz danych 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.

Klient HTTP z kontekstem

Kontekst do wychodzącego żądania HTTP należy przekazać za pomocą req.WithContext(ctx). Żądanie zostanie anulowane, jeśli kontekst zostanie anulowany przed nadejściem odpowiedzi.

req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    if errors.Is(err, context.DeadlineExceeded) {
        // timeout
    }
}

http.NewRequestWithContext

Należy preferować http.NewRequestWithContext (Go 1.13+) zamiast tworzyć żądanie, a następnie wywoływać WithContext — kod jest wtedy bardziej przejrzysty i unika pośredniej alokacji.

Anulowanie żądania HTTP

Należy utworzyć kontekst, który można anulować, za pomocą WithCancel, przekazać go do żądania i wywołać cancel po zakończeniu lub wystąpieniu błędu. Klient przerwie połączenie TCP.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)

database/sql z kontekstem

Wszystkie metody database/sql mają warianty *Context: QueryContext, ExecContext i PrepareContext. Anulują one zapytanie po zakończeniu działania kontekstu.

rows, err := db.QueryContext(ctx, "SELECT id FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()

Sprawdzanie kontekstu przed zapytaniem

Przed rozpoczęciem długiego zapytania należy sprawdzić kontekst, aby natychmiast je pominąć, jeśli żądanie zostało już anulowane.

if err := ctx.Err(); err != nil {
    return err // context already done
}
rows, err := db.QueryContext(ctx, ...)

Kontekst a pula połączeń

Gdy kontekst zostanie anulowany w trakcie zapytania, database/sql oznacza połączenie jako nieprawidłowe, jeśli sterownik to obsługuje, dzięki czemu uszkodzone połączenie nie wróci do puli.

gRPC i kontekst

gRPC używa kontekstu do propagowania deadline'u. Klient ustawia deadline kontekstu, a serwer sprawdza go przy każdym odbiorze elementu strumienia. Metadane są również przekazywane za pośrednictwem kontekstu.

resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: id})

Kontekst przychodzącego żądania

Serwer HTTP dołącza kontekst do każdego przychodzącego żądania za pomocą r.Context(). Kontekst ten zostaje anulowany po rozłączeniu klienta.

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    result, err := db.QueryContext(ctx, query)
}

Kontekst w łańcuchach middleware

Middleware wzbogaca kontekst żądania o deadline'y, dane uwierzytelniania lub identyfikatory śledzenia, a następnie przekazuje wzbogacone żądanie do kolejnego handlera.

Propagowanie kontekstu przez wywołania usług

W architekturze mikrousług identyfikator śledzenia z kontekstu przychodzącego żądania należy wstrzyknąć do wszystkich wychodzących nagłówków HTTP i RPC, aby śledzenie rozproszone działało kompleksowo.

Testowanie z użyciem kontekstu

W testach należy używać context.Background() lub context.WithTimeout, aby zapobiegać wyciekaniu goroutines między przypadkami testowymi.

Szybkie sprawdzenie

Która funkcja tworzy żądanie HTTP z dołączonym kontekstem?

Podsumowanie: kontekst w HTTP i DB

Najważniejsze informacje:

  • Do wychodzących wywołań HTTP należy używać http.NewRequestWithContext
  • Metody *Context w database/sql anulują zapytania po zakończeniu działania kontekstu
  • r.Context() jest dostępny w przychodzących żądaniach i zostaje anulowany po rozłączeniu klienta
  • Kontekst (oraz identyfikator śledzenia) należy propagować przez wszystkie wywołania do usług podrzędnych

Często zadawane pytania

Czy lekcja „Kontekst w wywołaniach HTTP i baz danych” jest bezpłatna?

Tak — pełny tekst „Kontekst w wywołaniach HTTP i baz danych” 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 „Kontekst w wywołaniach HTTP i baz danych”?

Przekazywanie kontekstu przez cały łańcuch wywołań Ć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 „Kontekst w wywołaniach HTTP i baz danych”?

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. Dlaczego istnieje context.Context
  2. WithCancel i WithTimeout
  3. WithDeadline i WithValue
  4. Kontekst w wywołaniach HTTP i baz danych
← Powrót do Go Academy