gRPC Частина 2: Створення простого клієнта та сервера gRPC з Spring Boot 3

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}!". Ось як ми будемо це робити:

  1. Визначити gRPC сервіс за допомогою Protocol Buffers.
  2. Згенерувати Java класи з файлу .proto.
  3. Реалізувати gRPC сервер в Spring Boot.
  4. Реалізувати gRPC клієнт в Spring Boot.
  5. Додати REST контролер для виклику gRPC клієнта для тестування.
  6. Запустити додаток та протестувати комунікацію.

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. Запуск додатка

  1. Запустіть Spring Boot додаток.
  2. gRPC сервер запуститься на порту 9090.
  3. 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

Leave a Reply

Your email address will not be published. Required fields are marked *