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.