gRPC en API's met hoge prestaties · Les

Aangepaste metadata verzenden

Ontdek hoe u aangepaste key-valueparen als metadata met gRPC-verzoeken en -antwoorden verzendt en ontvangt.

Les 2 van 411 stappen

Aangepaste metadata verzenden is een gratis gRPC en API's met hoge prestaties-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject gRPC en API's met hoge prestaties. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus gRPC en API's met hoge prestaties bevat in totaal 4 lessen.

Wat zijn gRPC-metagegevens?

In gRPC verwijst metadata naar sleutel-waardeparen die aan een RPC-aanroep zijn gekoppeld, vergelijkbaar met HTTP-headers.

In tegenstelling tot de hoofdgegevens van het bericht bevatten metagegevens informatie over de aanroep zelf, en niet over de toepassingsgegevens die worden verzonden.

  • Ze zijn bedoeld voor aanvullende gegevens.
  • Ze reizen mee met aanvragen en antwoorden.
  • Ze staan los van je protobuf-berichten.

Waarom metagegevens gebruiken?

Metagegevens zijn bijzonder nuttig voor het doorgeven van informatie die niet thuishoort in de primaire aanvraag- of antwoordberichten van je service.

Veelvoorkomende toepassingen zijn:

  • Authenticatietokens: JWT's of API-sleutels verzenden.
  • Traceer-ID's: Unieke aanvraag-ID's doorgeven voor gedistribueerde tracing.
  • Aangepaste headers: Andere contextuele informatie die je services nodig hebben.

Structuur en typen van metagegevens

Metagegevens bestaan uit een lijst met sleutel-waardeparen.

  • Sleutels: Zijn niet-hoofdlettergevoelige ASCII-tekenreeksen.
  • Waarden: Kunnen ASCII-tekenreeksen of binaire gegevens zijn.

Bij binaire waarden moet de sleutel eindigen op -bin (bijvoorbeeld auth-token-bin). gRPC verwerkt de codering hiervan.

Client: metagegevens van aanvragen verzenden

Clients voegen metagegevens toe aan uitgaande aanvragen met de gRPC-Metadata-klasse. Dit object wordt vervolgens toegevoegd aan de gRPC-aanroepstub.

Je maakt Metadata.Key-objecten om je headersleutels en hun marshallers te definiëren (de manier waarop ze naar en van tekenreeksen of bytes worden omgezet).

Client: voorbeeld van metagegevens verzenden

Dit Java-clientfragment laat zien hoe je een Metadata-object maakt en aan je stub koppelt voordat je een RPC-aanroep uitvoert. Zorg dat je `hello.proto` is gecompileerd.

package com.coddykit.grpc;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.Metadata;
import io.grpc.stub.MetadataUtils;
import io.grpc.StatusRuntimeException;
import java.util.concurrent.TimeUnit;

public class GrpcClient {
  private final ManagedChannel channel;
  private final GreeterGrpc.GreeterBlockingStub blockingStub;

  public GrpcClient(String host, int port) {
    this.channel = ManagedChannelBuilder.forAddress(host, port)
        .usePlaintext()
        .build();
    blockingStub = GreeterGrpc.newBlockingStub(channel);
  }

  public void shutdown() throws InterruptedException {
    channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
  }

  public void sayHello(String name, String customValue) {
    System.out.println("Sending custom-key: " + customValue);
    HelloRequest request = HelloRequest.newBuilder().setName(name).build();

    // 1. Create Metadata object
    Metadata headers = new Metadata();
    // 2. Define a Metadata.Key for your header
    Metadata.Key<String> customKey = Metadata.Key.of(
        "custom-key", Metadata.ASCII_STRING_MARSHALLER);
    // 3. Put the key-value pair into Metadata
    headers.put(customKey, customValue);
    
    // 4. Attach metadata to the stub
    GreeterGrpc.GreeterBlockingStub stubWithMetadata = 
        MetadataUtils.attachHeaders(blockingStub, headers);

    try {
      HelloReply response = stubWithMetadata.SayHello(request);
      System.out.println("Greeting: " + response.getMessage());
    } catch (StatusRuntimeException e) {
      System.err.println("RPC failed: " + e.getStatus());
    }
  }

  public static void main(String[] args) throws Exception {
    GrpcClient client = new GrpcClient("localhost", 50051);
    try {
      client.sayHello("CoddyKit User", "my-session-id-123");
    } finally {
      client.shutdown();
    }
  }
}

Server: metagegevens van aanvragen ontvangen

Aan de serverzijde worden binnenkomende metagegevens meestal geopend met een ServerInterceptor.

Een interceptor bevindt zich tussen de gRPC-runtime en je service-implementatie, zodat je aanroepen kunt inspecteren en aanpassen.

  • De interceptor ontvangt een Metadata-object.
  • Je kunt waarden ophalen met Metadata.Key.
  • Vaak worden metagegevens vervolgens toegevoegd aan de Context, zodat ze eenvoudig in servicemethoden toegankelijk zijn.

Server: voorbeeld van metagegevens ontvangen

Dit Java-servervoorbeeld laat zien hoe een ServerInterceptor een aangepaste header ophaalt en via Context beschikbaar maakt voor de service. Zorg dat je `hello.proto` is gecompileerd.

package com.coddykit.grpc;

import io.grpc.Context;
import io.grpc.Metadata;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.ServerCall;
import io.grpc.ServerCallHandler;
import io.grpc.ServerInterceptor;
import io.grpc.stub.StreamObserver;
import java.io.IOException;

public class GrpcServer {
  private Server server;

  // Context.Key to store the custom value for the service method
  private static final Context.Key<String> CUSTOM_VALUE_CTX_KEY = Context.key("custom-value");

  private void start() throws IOException {
    int port = 50051;
    server = ServerBuilder.forPort(port)
        .addService(new GreeterService())
        .intercept(new CustomHeaderInterceptor()) // Add our interceptor
        .build()
        .start();
    System.out.println("Server started, listening on " + port);
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
      System.err.println("*** shutting down server");
      try { GrpcServer.this.stop(); } 
      catch (InterruptedException e) { e.printStackTrace(System.err); }
      System.err.println("*** server shut down");
    }));
  }

  private void stop() throws InterruptedException {
    if (server != null) { server.shutdown().awaitTermination(); }
  }

  private void blockUntilShutdown() throws InterruptedException {
    if (server != null) { server.awaitTermination(); }
  }

  public static void main(String[] args) throws Exception {
    final GrpcServer server = new GrpcServer();
    server.start();
    server.blockUntilShutdown();
  }

  static class GreeterService extends GreeterGrpc.GreeterImplBase {
    @Override
    public void SayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
      // Retrieve custom value from Context
      String customValue = CUSTOM_VALUE_CTX_KEY.get();
      System.out.println("Service received custom-key: " + customValue);

      HelloReply reply = HelloReply.newBuilder()
          .setMessage("Hello " + request.getName() + 
                      "! Custom value: " + customValue)
          .build();
      responseObserver.onNext(reply);
      responseObserver.onCompleted();
    }
  }

  static class CustomHeaderInterceptor implements ServerInterceptor {
    // Define the Metadata.Key for our custom header
    private static final Metadata.Key<String> CUSTOM_KEY = 
        Metadata.Key.of("custom-key", Metadata.ASCII_STRING_MARSHALLER);

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
        ServerCall<ReqT, RespT> call,
        Metadata headers,
        ServerCallHandler<ReqT, RespT> next) {

      // Get the custom value from incoming headers
      String customValue = headers.get(CUSTOM_KEY);
      System.out.println("Interceptor received custom-key: " + customValue);

      // Store the custom value in the Context for the service to access
      Context context = Context.current().withValue(CUSTOM_VALUE_CTX_KEY, customValue);
      
      // Proceed with the call within the new context
      return Context.current().call(() -> next.startCall(call, headers));
    }
  }
}

Server: antwoordmetagegevens verzenden

Servers kunnen ook metagegevens terugsturen naar clients, als antwoordheaders of als antwoordtrailers.

  • Antwoordheaders: Worden vóór alle antwoordberichten verzonden. Gebruik ServerCall.sendHeaders(Metadata).
  • Antwoordtrailers: Worden aan het einde van de RPC verzonden, na alle antwoordberichten. Ze worden vaak gebruikt voor de status of de uiteindelijke context.

Beide worden verwerkt binnen het ServerCall-object, dat beschikbaar is in interceptors of geavanceerde service-implementaties.

Client: antwoordmetagegevens ontvangen

Clients kunnen de antwoordmetagegevens (headers en trailers) openen via de ClientCall.Listener-interface, die meestal wordt gebruikt met asynchrone (niet-blokkerende) stubs.

De listener biedt callbacks zoals onHeaders(Metadata) en onTrailers(Metadata), waarin je de binnenkomende metagegevens kunt inspecteren.

Toepassingen van metagegevens

Welke van de volgende opties is GEEN gebruikelijke toepassing van gRPC-metagegevens?

Samenvatting: metagegevens in gRPC

Je hebt geleerd hoe gRPC-metagegevens werken als HTTP-headers en essentiële gegevens die niet tot de toepassing behoren naast je RPC-aanroepen meedragen.

  • Clients verzenden metagegevens met aanvragen.
  • Servers ontvangen en verwerken metagegevens van aanvragen (vaak via interceptors).
  • Servers kunnen antwoordmetagegevens (headers en trailers) terugsturen naar clients.
  • Metagegevens zijn cruciaal voor zaken die meerdere onderdelen van een systeem doorkruisen, zoals authenticatie en tracing.

Als je metagegevens goed beheerst, kun je robuustere en beter observeerbare gRPC-services bouwen!

Gratis beginnen

Leer gRPC en API's met hoge prestaties met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
12
Lessen
48

Veelgestelde vragen

Is de les “Aangepaste metadata verzenden” gratis?

Ja — de volledige tekst van “Aangepaste metadata verzenden” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus gRPC en API's met hoge prestaties wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus gRPC en API's met hoge prestaties bevat in totaal 4 lessen.

Wat leer ik in “Aangepaste metadata verzenden”?

Ontdek hoe u aangepaste key-valueparen als metadata met gRPC-verzoeken en -antwoorden verzendt en ontvangt. Je oefent met gRPC en API's met hoge prestaties door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met gRPC en API's met hoge prestaties te beginnen?

Ervaring vooraf is niet nodig. gRPC en API's met hoge prestaties op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Aangepaste metadata verzenden”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over gRPC en API's met hoge prestaties?

Ja. Elke les over gRPC en API's met hoge prestaties bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Statuscodes en foutafhandeling
  2. Aangepaste metadata verzenden
  3. Context en deadlines
  4. Uitgebreide foutmodellen met google.rpc.Status
← Terug naar gRPC en API's met hoge prestaties