gRPC (gRPC Remote Procedure Calls) – это современный, открытый, высокопроизводительный фреймворк RPC (Remote Procedure Call), разработанный Google. Он предназначен для обеспечения эффективного взаимодействия между распределенными системами, что делает его особенно подходящим для архитектур микросервисов. Ниже приведено объяснение gRPC и его роли в коммуникации между микросервисами:
Что такое gRPC?
gRPC – это протокол, который позволяет клиентским и серверным приложениям взаимодействовать прозрачно, упрощая создание распределенных систем. Он использует HTTP/2 для транспорта, Protocol Buffers (Protobuf) в качестве языка определения интерфейса (IDL) и предоставляет функции такие как аутентификация, балансировка нагрузки и другие.
Вот некоторые характеристики gRPC:
- Независимый от языка. gRPC поддерживает несколько языков программирования, включая Java, Python, Go, C++ и другие.
- Эффективное взаимодействие. Он использует бинарную сериализацию с помощью Protobuf, которая быстрее и компактнее, чем текстовые форматы, такие как JSON.
- Основанный на HTTP/2. gRPC использует HTTP/2, что позволяет использовать функции, такие как мультиплексирование, потоки данных и снижение задержки.
- Сильная типизация. Сервисы и сообщения определяются с использованием Protobuf, обеспечивая типовую безопасность и снижая ошибки.
- Поддержка потоковой передачи. gRPC поддерживает четыре типа потоков: унарную, передачу данных с сервера, передачу данных с клиента и двустороннюю передачу данных.
Как работает gRPC
1. Определение сервисов и сообщений
С помощью Protobuf вы определяете интерфейс сервиса (методы) и структуру сообщений, которые будут обмениваться.
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
2. Генерация кода
Компилятор Protobuf (protoc
) генерирует код клиента и сервера на выбранном вами языке программирования.
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
3. Реализация сервера
Реализуйте логику на стороне сервера для определенного сервиса.
4. Создание клиента
Используйте сгенерированный клиентский код для вызова методов сервера.
Роль gRPC в коммуникации микросервисов
Архитектуры микросервисов включают разделение приложений на более мелкие, независимые службы, которые обмениваются данными по сети. gRPC играет ключевую роль в этом контексте благодаря своей эффективности и гибкости.
1. Высокая производительность
- gRPC использует бинарную сериализацию с помощью Protobuf, которая работает быстрее и компактнее, чем текстовые форматы, такие как JSON или XML.
- HTTP/2 снижает задержку и увеличивает пропускную способность, позволяя мультиплексирование и сжатие заголовков.
2. Четкое определение контракта
- Protobuf обеспечивает строгий контракт между службами, уменьшая вероятность ошибок в коммуникации.
- Изменения в определении сервиса могут быть управляемы с помощью версионирования, обеспечивая обратную совместимость.
3. Возможности потоковой передачи
- gRPC поддерживает двустороннюю потоковую передачу, что делает его идеальным для обмена данными в реальном времени, таких как чат-приложения или потоковая передача данных.
- Потоковая передача с сервера и с клиента обеспечивает эффективную обработку больших наборов данных или непрерывных потоков данных.
4. Взаимодействие
- gRPC не зависит от языка, что позволяет микросервисам, написанным на разных языках, взаимодействовать без проблем.
- Это особенно полезно в средах с микросервисами, написанными на разных языках.
5. Встроенные функции
- gRPC предоставляет встроенную поддержку функций, таких как аутентификация, шифрование (через TLS) и балансировка нагрузки, уменьшая необходимость в дополнительных библиотеках или инструментах.
6. Масштабируемость
- Легковесная природа gRPC и эффективное взаимодействие делают его подходящим для развертывания масштабных микросервисов.
- Он хорошо интегрируется с платформами оркестрации контейнеров, такими как Kubernetes.
Примеры использования gRPC в микросервисах
- Межсервисное взаимодействие. gRPC идеально подходит для обмена данными между микросервисами, особенно в ситуациях, где производительность играет решающую роль.
- Системы реального времени. Благодаря своим возможностям потоковой передачи, gRPC подходит для приложений в реальном времени, таких как игры, Интернет вещей или живая аналитика.
- Среды с микросервисами на разных языках. Когда микросервисы написаны на разных языках, gRPC обеспечивает беспрепятственное взаимодействие.
- Облачные приложения. gRPC хорошо интегрируется с облачными технологиями, такими как Kubernetes и сервисные сетки (например, Istio).
Преимущества gRPC
- Эффективность. Бинарная сериализация и HTTP/2 делают gRPC быстрее и более ресурсоэффективным.
- Типобезопасность. Protobuf обеспечивает строгую типизацию, снижая ошибки выполнения.
- Поддержка межъязыковая. Работает сразу на нескольких языках программирования.
- Потоки. Поддерживает передачу данных в реальном времени.
Проблемы с gRPC
- Сложность. Настройка gRPC может быть сложнее, чем REST из-за необходимости определений Protobuf и генерации кода.
- Инструменты. Отладка и тестирование служб gRPC могут быть сложнее по сравнению с REST, так как инструменты, такие как Postman, не являются нативно предназначенными для gRPC.
- Поддержка браузеров. gRPC не поддерживается нативно в браузерах, требуя инструменты, наподобие gRPC-Web, для веб-клиентов.
Почему использовать gRPC с Spring Boot?
Spring Boot – популярный фреймворк для создания приложений на Java, и его сочетание с gRPC позволяет разработчикам создавать высокопроизводительные, масштабируемые и взаимодействующие службы. Благодаря автоконфигурации и внедрению зависимостей Spring Boot интеграция gRPC становится простой.
Шаги построения приложения
Мы создадим простую службу gRPC под названием Greeter
, которая позволяет клиенту отправить имя на сервер и получить ответ “Привет, {имя}!” Вот как мы сделаем это:
- Определите службу 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
с методом RPCSayHello
. - Сообщение
HelloRequest
, содержащее полеname
. - Сообщение
HelloResponse
, содержащее полеmessage
.
2. Добавление зависимостей
Для использования gRPC с Spring Boot добавьте следующие зависимости в ваш pom.xml
:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Spring Boot Web for REST Controller -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- gRPC dependencies -->
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
<version>2.14.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.54.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.54.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.54.0</version>
</dependency>
<!-- Protobuf Java Format -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.22.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Protobuf Compiler Plugin -->
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.22.2:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.54.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Эти зависимости включают:
- Spring Boot Starter для базовой настройки приложения.
- Spring Boot Web для поддержки REST-контроллера.
- Библиотеки 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
При создании приложений Spring Boot, требующих интеграции gRPC, разработчики часто сталкиваются с выбором между несколькими библиотеками. Самые обсуждаемые варианты – net.devh.grpc
, org.lognet.grpc
и org.springframework.grpc
.
У каждой из этих библиотек есть свои сильные и слабые стороны, а также свои сферы применения. Давайте рассмотрим различия между этими библиотеками, их особенности и то, какую из них следует использовать для вашего проекта.
1. net.devh.grpc (grpc-spring-boot-starter)
net.devh.grpc
, также известный как grpc-spring-boot-starter
, является широко используемой библиотекой для интеграции gRPC с Spring Boot. Он активно поддерживается и предоставляет надежный набор функций для создания серверов и клиентов gRPC в приложении Spring Boot.
Основные функции
- Автонастройка. Упрощает настройку серверов и клиентов gRPC.
- Интеграция со Spring. Поддерживает внедрение зависимостей и другие функции Spring.
- Безопасность Spring. Легко интегрируется с Spring Security для безопасного общения.
- Проверки состояния. Предоставляет проверки состояния через Spring Boot Actuator.
- Синхронное и асинхронное общение. Поддерживает оба стиля общения.
Зачем его использовать?
- Активное обслуживание. Библиотека активно поддерживается и обновляется.
- Подробная документация. Хорошо задокументирована, с большим сообществом для поддержки.
- Готовность к производству. Широко используется в производственных средах.
Когда его использовать?
- Если вы создаете новое приложение Spring Boot и вам нужна надежная, функционально насыщенная интеграция gRPC.
- Если вам нужна безшовная интеграция с функциями Spring Boot, такими как внедрение зависимостей, безопасность и проверки состояния.
2. org.lognet.grpc (grpc-spring-boot-starter)
org.lognet.grpc
– еще одна библиотека для интеграции gRPC с Spring Boot. Однако она поддерживается менее активно по сравнению с net.devh.grpc
и не имеет некоторых продвинутых функций, предлагаемых последней.
Основные особенности
- Основная настройка gRPC. Предоставляет базовую поддержку серверов и клиентов gRPC.
- Интеграция с Spring Boot. Работает с Spring Boot, но с меньшим количеством функций.
Зачем его использовать?
- Историческое использование. Это было одной из первых библиотек для интеграции gRPC и Spring Boot.
- Простота. Подходит для простых случаев использования.
Когда его использовать?
- Если вы работаете над старым проектом, который уже использует эту библиотеку.
- Не рекомендуется для новых проектов из-за ограниченной поддержки и меньшего количества функций.
3. org.springframework.grpc (Spring gRPC)
org.springframework.grpc
– это экспериментальный или сообществом разрабатываемый проект по интеграции gRPC с Spring. Это не официальный проект Spring и может быть не таким зрелым или функционально насыщенным, как net.devh.grpc
.
Основные особенности
- Базовая интеграция с gRPC. Предоставляет базовую поддержку для серверов и клиентов gRPC.
- Совместимость с экосистемой Spring. Разработан для тесного взаимодействия с экосистемой Spring.
Почему использовать?
- Экспериментальное использование. Подходит для экспериментов или участия в проекте.
- Совместимость с Spring. Если вы предпочитаете использовать что-то, что тесно взаимодействует с Spring.
Когда использовать?
- Только если вы исследуете или участвуете в проекте.
- Не рекомендуется для использования в производстве из-за его экспериментального характера.
Какой выбрать?
Для новых проектов
Используйте net.devh.grpc
(grpc-spring-boot-starter). Это самый зрелый, активно поддерживаемый и функционально насыщенный вариант интеграции gRPC с Spring Boot. Его безупречная интеграция с функциями Spring Boot делает его лучшим выбором для новых проектов.
Для существующих проектов
Если вы уже используете org.lognet.grpc
, рассмотрите возможность перехода на net.devh.grpc
для лучшей поддержки и возможностей. В то время как org.lognet.grpc
может подходить для старых проектов, у него отсутствует активное обслуживание и передовые функции net.devh.grpc
.
Для экспериментального использования
Если вы изучаете или вносите вклад в интеграцию Spring gRPC, вы можете обратить внимание на org.springframework.grpc
. Однако не рекомендуется использовать его в производственных целях из-за его экспериментального характера.
Ключевые соображения
- Поддержка сообщества.
net.devh.grpc
имеет большее сообщество и лучшую документацию, что облегчает поиск помощи и ресурсов. - Готовность к производству.
net.devh.grpc
широко используется в производственных средах и считается стабильным и надежным. - Простота использования.
net.devh.grpc
обеспечивает автоконфигурацию и плавную интеграцию с Spring Boot, уменьшая сложность настройки.
Вывод
gRPC – мощный инструмент для обмена данными между микросервисами, предлагающий высокую производительность, строгую типизацию и передовые функции, такие как потоковая передача. Хотя для его использования требуется больше начальной настройки по сравнению с REST, его эффективность и масштабируемость делают его отличным выбором для современных распределенных систем.
По мере роста сложности архитектур микросервисов gRPC играет все более важную роль в обеспечении беспрепятственного взаимодействия между службами. В этой статье мы создали простое приложение клиента и сервера gRPC с использованием Spring Boot 3, определив службу gRPC с помощью Protocol Buffers, сгенерировав Java-классы, реализовав сервер и клиент, и добавив контроллер REST для удобного тестирования. Этот пример демонстрирует мощь и простоту gRPC для создания высокопроизводительных, масштабируемых и совместимых служб. Вы можете расширить его более сложными службами, потоковой передачей данных или обработкой ошибок. Счастливого кодирования!
Репозиторий GitHub: grpc-client-and-server-with-spring-boot.
Source:
https://dzone.com/articles/understanding-grpc-and-its-role-in-microservices-c