gRPC є сучасним фреймворком для віддалених викликів процедур (RPC), розробленим Google. Він забезпечує ефективну комунікацію між клієнтськими та серверними додатками в різних середовищах. У цій статті ми розглянемо створення простого клієнта та сервера gRPC за допомогою Spring Boot 3. Наприкінці ви отримаєте робочий приклад сервісу gRPC, який дозволяє клієнту відправити запит привітання серверу і отримати відповідь.
Що таке gRPC?
gRPC — це фреймворк RPC з відкритим кодом, який використовує Protocol Buffers (Protobuf) як мову визначення інтерфейсу (IDL) та формат повідомлень. Він побудований на основі HTTP/2, що надає такі можливості, як мультиплексування, стиснення заголовків та двостороннє потокове передавання. gRPC широко використовується в архітектурах мікросервісів, системах реального часу та хмарних додатках завдяки своїй ефективності, підтримці різних платформ та сильно типізованим контрактам.
Чому використовувати gRPC з Spring Boot?
Spring Boot — популярний фреймворк для розробки Java-додатків, і поєднання його з gRPC дозволяє розробникам створювати високопродуктивні, масштабовані та взаємодіючі сервіси. Завдяки автонастроюванням та інжекції залежностей Spring Boot інтеграція з gRPC стає простим процесом.
Кроки для створення додатка
Ми створимо простий gRPC сервіс під назвою Greeter
, який дозволяє клієнту надіслати ім’я серверу і отримати відповідь "Hello, {name}!". Ось як ми будемо це робити:
- Визначити gRPC сервіс за допомогою Protocol Buffers.
- Згенерувати Java класи з файлу
.proto
. - Реалізувати gRPC сервер в Spring Boot.
- Реалізувати gRPC клієнт в Spring Boot.
- Додати REST контролер для виклику gRPC клієнта для тестування.
- Запустити додаток та протестувати комунікацію.
1. Визначення gRPC сервісу (файл .proto
)
Перший крок — визначити gRPC сервіс за допомогою Protocol Buffers. Створіть файл під назвою greeter.proto
в директорії src/main/proto
:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "GreeterProto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
Цей файл визначає:
- Сервіс
Greeter
з RPC методомSayHello
. - Повідомлення
HelloRequest
, яке містить полеname
. - Повідомлення
HelloResponse
, яке містить полеmessage
.
Додавання залежностей
Щоб використовувати gRPC з Spring Boot, додайте наступні залежності у ваш файл pom.xml
:
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
net.devh
grpc-spring-boot-starter
2.14.0.RELEASE
io.grpc
grpc-netty-shaded
1.54.0
io.grpc
grpc-protobuf
1.54.0
io.grpc
grpc-stub
1.54.0
com.google.protobuf
protobuf-java
3.22.2
org.xolstice.maven.plugins
protobuf-maven-plugin
0.6.1
com.google.protobuf:protoc:3.22.2:exe:${os.detected.classifier}
grpc-java
io.grpc:protoc-gen-grpc-java:1.54.0:exe:${os.detected.classifier}
compile
compile-custom
Ці залежності включають:
- Spring Boot Starter для базової конфігурації додатка.
- Spring Boot Web для підтримки REST контролерів (REST controllers).
- Бібліотеки gRPC для реалізації сервера та клієнта.
- Protobuf для серіалізації та десеріалізації.
3. Генерація Java класів
Запустіть наступну команду Maven для генерації Java класів з файлу .proto
:
mvn clean compile
Це створить класи GreeterGrpc
та інші відповідні класи в директорії target/generated-sources
.
4. Реалізація gRPC сервера
Далі реалізуємо gRPC сервер в Spring Boot. Створіть клас під назвою GreeterService
:
package com.example.grpc.server;
import com.example.grpc.GreeterGrpc;
import com.example.grpc.GreeterProto.HelloRequest;
import com.example.grpc.GreeterProto.HelloResponse;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;
@GrpcService
public class GreeterService extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver responseObserver) {
String name = request.getName();
String message = "Hello, " + name + "!";
HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();
// Надсилаємо відповідь
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
Цей клас розширює згенерований GreeterGrpc.GreeterImplBase
і реалізує метод sayHello
, щоб обробляти вхідні запити.
5. Реалізація gRPC клієнта
Тепер реалізуємо gRPC клієнт у Spring Boot.
Створіть клас під назвою GreeterClient
:
package com.example.grpc.client;
import com.example.grpc.GreeterGrpc;
import com.example.grpc.GreeterProto.HelloRequest;
import com.example.grpc.GreeterProto.HelloResponse;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.springframework.stereotype.Service;
@Service
public class GreeterClient {
private final GreeterGrpc.GreeterBlockingStub blockingStub;
public GreeterClient() {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090)
.usePlaintext()
.build();
this.blockingStub = GreeterGrpc.newBlockingStub(channel);
}
public String sayHello(String name) {
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloResponse response = blockingStub.sayHello(request);
return response.getMessage();
}
}
Цей клієнт підключається до gRPC сервера та надсилає запит до методу SayHello
.
6. Додати REST контролер для тестування
Для спрощення тестування gRPC клієнта додамо REST контролер, який надає точку доступу для виклику GreeterClient
. Створіть клас під назвою GreeterController
:
package com.example.grpc.controller;
import com.example.grpc.client.GreeterClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreeterController {
private final GreeterClient greeterClient;
@Autowired
public GreeterController(GreeterClient greeterClient) {
this.greeterClient = greeterClient;
}
@GetMapping("/greet")
public String greet(@RequestParam String name) {
return greeterClient.sayHello(name);
}
}
Цей контролер надає точку доступу /greet
, яка приймає параметр name
і повертає відповідь від gRPC сервера.
7. Створення Spring Boot додатка
Наприкінці створимо Spring Boot додаток для запуску сервера та клієнта:
package com.example.grpc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GrpcApplication {
public static void main(String[] args) {
SpringApplication.run(GrpcApplication.class, args);
}
}
8. Налаштування порту сервера
Додайте наступну конфігурацію до файлу application.properties
:
# Порт gRPC сервера
grpc.server.port=9090
# Порт Spring Boot сервера
server.port=8080
9. Запуск додатка
- Запустіть Spring Boot додаток.
- gRPC сервер запуститься на порту
9090
. - REST контролер буде доступний на порту
8080
.
Ви можете протестувати додаток, надіславши GET запит до точки доступу /greet
:
curl http://localhost:8080/greet?name=World
Відповідь буде:
"Hello, World!"
Висновок
У цій статті ми створили простий gRPC клієнт та сервер додаток за допомогою Spring Boot 3. Ми визначили gRPC сервіс за допомогою Protocol Buffers, згенерували Java класи, реалізували сервер та клієнт і додали REST контролер для зручного тестування. Цей приклад демонструє потужність та простоту gRPC для створення високопродуктивних, масштабованих та взаємодіючих сервісів.
Ви можете розширити цей приклад, включивши більш складні сервіси, стрімінг або обробку помилок. Удачі в кодінгу!
Github репозиторій : https://github.com/dinesharney/grpc-client-and-server-with-spring-boot
Перекладено з: gRPC Part 2: Building a Simple gRPC Client and Server with Spring Boot 3