gRPC og høyytelses-API-er · leksjon

Statuskoder og feilhåndtering

Lær å bruke gRPC-statuskoder effektivt og implementere riktig videreføring og håndtering av feil i tjenestene dine.

Leksjon 1 av 410 trinn

Statuskoder og feilhåndtering er en gratis leksjon i gRPC og høyytelses-API-er på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i gRPC og høyytelses-API-er, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i gRPC og høyytelses-API-er inneholder totalt 4 leksjoner.

Hvorfor håndtere gRPC-feil?

I alle robuste applikasjoner er feil uunngåelige. Måten vi håndterer dem på, kan være avgjørende for systemets pålitelighet og brukeropplevelsen.

For distribuerte systemer som bruker gRPC, er konsekvent feilhåndtering avgjørende. Det sikrer at tjenester kan kommunisere problemer tydelig, og at klienter kan reagere på riktig måte.

Bli kjent med gRPC-statuskoder

gRPC bruker et standardisert sett med statuskoder for å angi resultatet av et RPC-kall (Remote Procedure Call). Disse kodene gir en universell måte å forstå hvorfor et kall lykkes eller mislykkes på.

Tenk på dem som HTTP-statuskoder, men spesielt for gRPC. Noen vanlige koder er:

  • OK: RPC-kallet ble fullført.
  • NOT_FOUND: Ressursen ble ikke funnet (for eksempel fordi en bruker-ID ikke finnes).
  • INTERNAL: Det oppsto en uventet feil på serveren.
  • UNAUTHENTICATED: Forespørselen mangler gyldig autentisering.

Protobuf-tjenestedefinisjon

Før vi ser på feilhåndtering, definerer vi en enkel tjeneste i en .proto-fil. Dette definerer strukturen til meldingene våre og RPC-metodene.

Vi oppretter en UserService med en GetUser-metode som tar imot en UserRequest og returnerer en User.

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.coddykit.grpc.error";
option java_outer_classname = "ErrorProto";

package errorhandling;

message UserRequest {
  int32 id = 1;
}

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
}

service UserService {
  rpc GetUser (UserRequest) returns (User);
}

Signalere feil på serversiden

På serveren kaster De ikke et vanlig unntak når en operasjon mislykkes. I stedet oppretter De et gRPC-objekt av typen Status med riktig kode og beskrivelse, og konverterer det deretter til et StatusRuntimeException.

Dette unntaket sendes så tilbake til klienten via metoden responseObserver.onError(), slik at klienten mottar den standardiserte gRPC-feilen.

Implementering av serverfeil

Prøv å kjøre dette eksempelet. Serveren svarer med en NOT_FOUND-feil hvis du ber om en annen bruker-ID enn 1.

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.Status;
import io.grpc.stub.StreamObserver;

import com.coddykit.grpc.error.ErrorProto.User;
import com.coddykit.grpc.error.ErrorProto.UserRequest;
import com.coddykit.grpc.error.UserServiceGrpc;

public class ErrorServer {

  private static final int PORT = 50051;

  public static void main(String[] args) throws Exception {
    Server server = ServerBuilder.forPort(PORT)
        .addService(new UserServiceImpl())
        .build();

    server.start();
    System.out.println("Server started on port " + PORT);
    server.awaitTermination();
  }

  static class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {
    @Override
    public void getUser(UserRequest request, StreamObserver<User> responseObserver) {
      System.out.println("Received GetUser request for ID: " + request.getId());
      if (request.getId() == 1) {
        User user = User.newBuilder()
            .setId(1)
            .setName("Alice")
            .setEmail("alice@example.com")
            .build();
        responseObserver.onNext(user);
        responseObserver.onCompleted();
      } else {
        Status status = Status.NOT_FOUND.withDescription("User with ID " + request.getId() + " not found.");
        responseObserver.onError(status.asRuntimeException());
      }
    }
  }
}

Feilhåndtering på klientsiden

På klientsiden mottas gRPC-feil vanligvis som StatusRuntimeException. Du bør pakke inn gRPC-kallene dine i try-catch-blokker for å håndtere disse unntakene på en kontrollert måte.

Inne i catch-blokken kan du undersøke Status-objektet fra unntaket for å finne feilkoden og beskrivelsen. Da kan klienten reagere på en hensiktsmessig måte.

Demonstrasjon av klientfeilhåndtering

Kjør denne klientkoden etter at du har startet serveren fra forrige scene. Se hvordan den håndterer både et vellykket brukeroppslag og en «ikke funnet»-feil.

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.StatusRuntimeException;

import com.coddykit.grpc.error.ErrorProto.User;
import com.coddykit.grpc.error.ErrorProto.UserRequest;
import com.coddykit.grpc.error.UserServiceGrpc;

public class ErrorClient {

  private static final int PORT = 50051;
  private static final String HOST = "localhost";

  public static void main(String[] args) {
    ManagedChannel channel = ManagedChannelBuilder.forAddress(HOST, PORT)
        .usePlaintext() // For local testing without TLS
        .build();

    UserServiceGrpc.UserServiceBlockingStub blockingStub = UserServiceGrpc.newBlockingStub(channel);

    // Scenario 1: User found
    try {
      UserRequest foundRequest = UserRequest.newBuilder().setId(1).build();
      User user = blockingStub.getUser(foundRequest);
      System.out.println("User found: " + user.getName());
    } catch (StatusRuntimeException e) {
      System.err.println("Error calling GetUser (found scenario): " + e.getStatus().getCode() + " - " + e.getStatus().getDescription());
    }

    System.out.println("\n--- Trying to get a non-existent user ---");

    // Scenario 2: User not found (expected error)
    try {
      UserRequest notFoundRequest = UserRequest.newBuilder().setId(99).build();
      User user = blockingStub.getUser(notFoundRequest);
      System.out.println("User found (unexpected): " + user.getName()); // This line should not be reached
    } catch (StatusRuntimeException e) {
      System.err.println("Error calling GetUser (not found scenario):");
      System.err.println("  Status Code: " + e.getStatus().getCode());
      System.err.println("  Description: " + e.getStatus().getDescription());
    } finally {
      channel.shutdown();
    }
  }
}

Effektiv videreføring av feil

Riktig videreføring av feil er avgjørende. Når en gRPC-tjeneste kaller en annen intern tjeneste og støter på en feil, er det ofte best å:

  • Logge feilen med tilstrekkelig detaljgrad for feilsøking.
  • Oversette feilen til en passende gRPC-Status-kode for klienten som foretok kallet. Ikke eksponer interne systemfeil direkte.
  • Unngå å undertrykke feil. Håndter dem alltid eller kast dem videre, slik at de ikke forsvinner uten at noen merker det.

Test kunnskapene dine

Du bygger en gRPC-tjeneste som utfører en kompleks beregning. Hvis inndataene er ugyldige (for eksempel negative tall når bare positive tall er tillatt), hvilken gRPC-Status-kode er det mest passende å returnere?

Viktigste punkter

Du har lært det grunnleggende om feilhåndtering i gRPC!

  • gRPC bruker standardiserte Status Codes til å kommunisere resultatet av RPC-kall.
  • Servere signaliserer feil ved å opprette et Status-objekt og kalle responseObserver.onError().
  • Klienter håndterer feil ved å fange opp StatusRuntimeException og undersøke Status-objektet.
  • Viderefør alltid feil på en tydelig måte, og oversett dem slik at de passer for klientene.

Denne strukturerte tilnærmingen sikrer pålitelig kommunikasjon i distribuerte systemer.

Gratis å komme i gang

Lær deg gRPC og høyytelses-API-er med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Statuskoder og feilhåndtering» gratis?

Ja – hele teksten i «Statuskoder og feilhåndtering» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av gRPC og høyytelses-API-er-kurset, kan du oppgradere til CoddyKit PRO. Kurset i gRPC og høyytelses-API-er inneholder totalt 4 leksjoner.

Hva lærer jeg i «Statuskoder og feilhåndtering»?

Lær å bruke gRPC-statuskoder effektivt og implementere riktig videreføring og håndtering av feil i tjenestene dine. Du øver på gRPC og høyytelses-API-er med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med gRPC og høyytelses-API-er?

Ingen tidligere erfaring er nødvendig. gRPC og høyytelses-API-er på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Statuskoder og feilhåndtering»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne gRPC og høyytelses-API-er-leksjonen?

Ja. Alle gRPC og høyytelses-API-er-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Statuskoder og feilhåndtering
  2. Overføring av egendefinerte metadata
  3. Kontekst og tidsfrister
  4. Detaljerte feilmodeller med google.rpc.Status
← Tilbake til gRPC og høyytelses-API-er