Einleitung

gRPC (gRPC Remote Procedure Call) ist ein modernes, Open-Source Remote Procedure Call (RPC)-Framework, das von Google entwickelt wurde. Es ermöglicht die einfache Kommunikation zwischen verteilten Systemen und Diensten in einer leistungsstarken und effizienten Weise. Durch die Verwendung von HTTP/2, Protokollpuffer (Protocol Buffers) und bidirektionalem Streaming bietet gRPC erhebliche Vorteile gegenüber traditionellen RESTful APIs, insbesondere in Bezug auf Leistung und Skalierbarkeit.

Spring Boot, ein beliebtes Framework für die Erstellung von Microservices in Java, unterstützt gRPC nicht direkt, aber durch die Verwendung des grpc-spring-boot-starter wird die Integration von gRPC in Spring Boot-Projekte erheblich vereinfacht. In diesem Artikel werden wir einen detaillierten Leitfaden zur Erstellung von gRPC-Services in Spring Boot mit dem grpc-spring-boot-starter bereitstellen.

Voraussetzungen

  • Grundlegende Kenntnisse in Java und Spring Boot
  • Maven oder Gradle als Build-Tool
  • Eine Entwicklungsumgebung wie IntelliJ IDEA oder Eclipse

Einrichtung des Projekts

Zuerst müssen wir ein neues Spring Boot-Projekt erstellen. Dies kann über die Spring Initializr-Webseite (https://start.spring.io/) erfolgen oder direkt in Ihrer bevorzugten Entwicklungsumgebung. Stellen Sie sicher, dass Sie Maven Project und Java auswählen, und fügen Sie die folgenden Abhängigkeiten hinzu:

  • Spring Boot DevTools
  • Spring Web
  • Protobuf (für Protokollpuffer)

Nachdem das Projekt erstellt wurde, müssen wir die grpc-spring-boot-starter-Abhängigkeit zu unserer pom.xml (für Maven) oder build.gradle (für Gradle) hinzufügen.

Für Maven:

<dependency>
    <groupId>net.devh</groupId>
    <artifactId>grpc-spring-boot-starter</artifactId>
    <version>2.13.0.RELEASE</version>
</dependency>Code-Sprache: HTML, XML (xml)

Für Gradle:

implementation 'net.devh:grpc-spring-boot-starter:2.13.0.RELEASE'Code-Sprache: JavaScript (javascript)

Definition des Protobuf-Dateiformats

Als Nächstes müssen wir unsere gRPC-Services in einer .proto-Datei definieren. Erstellen Sie eine neue Datei namens greeting.proto im Verzeichnis src/main/proto/ mit folgendem Inhalt:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "GreetingProto";

service GreetingService {
    rpc greet (GreetingRequest) returns (GreetingResponse);
}

message GreetingRequest {
    string name = 1;
}

message GreetingResponse {
    string message = 1;
}Code-Sprache: JavaScript (javascript)

Diese Datei definiert einen gRPC-Service GreetingService mit einer RPC-Methode greet, die eine GreetingRequest empfängt und eine GreetingResponse zurückgibt.

Generierung der Java-Klassen aus der Protobuf-Datei

Um die Java-Klassen aus der Protobuf-Datei zu generieren, müssen wir das protobuf-maven-plugin in unsere pom.xml hinzufügen:

<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.6.2</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.6.1</version>
            <configuration>
                <protocArtifact>com.google.protobuf:protoc:3.14.0:exe:${os.detected.classifier}</protocArtifact>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>Code-Sprache: HTML, XML (xml)

Führen Sie mvn clean install aus, um die Protobuf-Dateien zu kompilieren und die entsprechenden Java-Klassen zu generieren.

Implementierung des gRPC-Services

Jetzt können wir unseren gRPC-Service in Java implementieren. Erstellen Sie eine neue Klasse GreetingServiceImpl in einem geeigneten Paket (z.B. com.example.grpc.service) und erweitern Sie die generierte GreetingServiceGrpc.GreetingServiceImplBase-Klasse:

package com.example.grpc.service;

import com.example.grpc.GreetingRequest;
import com.example.grpc.GreetingResponse;
import com.example.grpc.GreetingServiceGrpc;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;

@GrpcService
public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {

    @Override
    public void greet(GreetingRequest request, StreamObserver<GreetingResponse> responseObserver) {
        String name = request.getName();
        String message = "Hello, " + name + "!";

        GreetingResponse response = GreetingResponse.newBuilder()
                .setMessage(message)
                .build();

        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}Code-Sprache: JavaScript (javascript)

Diese Klasse implementiert die greet-Methode des GreetingService. Sie empfängt eine GreetingRequest, erstellt eine GreetingResponse und sendet diese zurück an den Client.

Konfiguration von gRPC in Spring Boot

Die grpc-spring-boot-starter-Abhängigkeit konfiguriert gRPC automatisch in Ihrem Spring Boot-Projekt. Es sind jedoch einige Konfigurationen erforderlich, um den Server richtig zu starten. Fügen Sie die folgenden Einstellungen zu Ihrer application.properties hinzu:

grpc.server.port=9090

Diese Einstellung gibt den Port an, auf dem der gRPC-Server lauschen soll. Der Standardwert ist 9090, aber Sie können ihn nach Bedarf ändern.

Erstellen eines gRPC-Clients

Um den gRPC-Service zu testen, können wir einen einfachen gRPC-Client erstellen. Erstellen Sie eine neue Klasse GreetingClient:

package com.example.grpc.client;

import com.example.grpc.GreetingRequest;
import com.example.grpc.GreetingResponse;
import com.example.grpc.GreetingServiceGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class GreetingClient {

    private GreetingServiceGrpc.GreetingServiceBlockingStub stub;
    private ManagedChannel channel;

    @PostConstruct
    public void init() {
        channel = ManagedChannelBuilder.forAddress("localhost", 9090)
                .usePlaintext()
                .build();

        stub = GreetingServiceGrpc.newBlockingStub(channel);
    }

    public String greet(String name) {
        GreetingRequest request = GreetingRequest.newBuilder()
                .setName(name)
                .build();

        GreetingResponse response = stub.greet(request);
        return response.getMessage();
    }

    @PreDestroy
    public void shutdown() {
        if (channel != null) {
            channel.shutdown();
        }
    }
}Code-Sprache: JavaScript (javascript)

Dieser Client stellt eine Verbindung zum gRPC-Server her und ruft die greet-Methode auf. Um den Client zu verwenden, können Sie ihn in einem Spring Boot-Controller einbinden und eine REST-Endpoint erstellen:

package com.example.grpc.controller;

import com.example.grpc.client.GreetingClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private final GreetingClient greetingClient;

    public GreetingController(GreetingClient greetingClient) {
        this.greetingClient = greetingClient;
    }

    @GetMapping("/greet")
    public String greet(@RequestParam String name) {
        return greetingClient.greet(name);
    }
}Code-Sprache: JavaScript (javascript)

Mit diesem Controller können Sie den gRPC-Service über einen einfachen HTTP-GET-Request aufrufen, z.B. http://localhost:8080/greet?name=World.

Fazit

Die Integration von gRPC in Spring Boot mit dem grpc-spring-boot-starter ist relativ einfach und bietet eine leistungsstarke Alternative zu herkömmlichen RESTful APIs. Mit der Möglichkeit, bidirektionales Streaming und Protokollpuffer zu nutzen, ist gRPC besonders für hochskalierbare und performante Microservices-Architekturen geeignet. Durch die in diesem Artikel beschriebenen Schritte können Sie einen gRPC-Service schnell und effizient in Ihrem Spring Boot-Projekt implementieren.