Не так давно в релиз был выкачена первая мажорная версия библиотеки Spring gRPC - для встроенной поддержки gRPC-сервисов в приложении Spring Boot. Она развивается внутри экосистемы Spring, а значит версионирование и интеграция с Boot - это теперь не вызывает проблем. У меня появился интерес протестить это in action.
Начнем с того, что подключим необходимые зависимости в build.gradle.kts:
implementation("org.springframework.grpc:spring-grpc-spring-boot-starter")
implementation("com.google.protobuf:protobuf-java")
Допустим, у нас есть такой proto-файл:
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
Реализация сервиса на kotlin будет выглядить следующим образом:
@GrpcService
class GreeterService : GreeterGrpc.GreeterImplBase() {
override fun sayHello(
request: HelloRequest,
responseObserver: StreamObserver<HelloReply>
) {
val reply = HelloReply.newBuilder()
.setMessage("Hello, ${request.name}!")
.build()
responseObserver.onNext(reply)
responseObserver.onCompleted()
}
}
// можно использовать и аннотацию @Service, но на личный вкус @GrpcService выглядит нагляднее
Spring gRPC автоматически обнаружит все бины, которые реализуют BindableService (это интерфейс, от которого наследует ImplBase), и зарегистрирует их на gRPC-сервере.
Дело за малым - осталось всё собрать и протестировать. Делать я это буду с помощью cli тулзы grpcurl, которая как раз предназначена для протыкивания grpc сервисов.


Подводя итог, можно сказать, что Spring gRPC успешно решает главную задачу - делает интеграцию gRPC в Spring Boot максимально бесшовной и нативной. Как показал тест, весь процесс настройки сводится к подключению стартера и созданию класса с аннотацией @Service. Автоматическое обнаружение сервисов и привычная работа через DI позволяют сосредоточиться на бизнес-логике, не отвлекаясь на инфраструктурные сложности.