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
- Dlaczego istnieje context.Context
- WithCancel i WithTimeout
- WithDeadline i WithValue
- Kontekst w wywołaniach HTTP i baz danych