Обзор
gRPC — это универсальная высокопроизводительная RPC-инфраструктура Google с открытым исходным кодом, которая поддерживает использованиеProtocol BuffersДля написания определений службы он поддерживает больше платформ расширения языка и имеет мощный набор инструментов для двоичной сериализации. со статьями«Практика RPC Framework: Apache Thrift»Еще одна инфраструктура RPC общего назначения, рассматриваемая в этой статье.ThriftПодобно интерфейсу службы, который может автоматически генерировать соответствующий язык с помощью генератора, gRPC также можетавтоматически генерируетсяСервер и клиентСервисная заглушка (заглушка), нам просто нужнокомандаВы можете быстро создать среду выполнения RPC.
Давайте попрактикуемся с инфраструктурой gRPC.Что она делает: клиентская сторона вызывает интерфейс получения времени сервера через удаленный RPC, чтобы локально получить время сервера и отобразить его.
похож на предыдущийФреймворк RPC: экономияПрактические шаги описаны ниже.
Примечание:Эта статья была впервые опубликована на моем официальном аккаунтеCodeSheep,МогуНажмитеилисканированиеследующеебудь остороженЗаходи подписывайся ↓ ↓ ↓
Разработка gRPC-API
-
Сначала создайте проект на основе Maven: GrpcAPI
-
Добавьте зависимости, связанные с grpc, в pom
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.12.0</version>
</dependency>
Этот grpc-all содержит много компонентов, связанных с grpc:grpc-netty, grpc-protobuf, grpc-stubи т.д
- Добавьте подключаемые модули сборки, связанные с grpc, в pom
Здесь добавлены два плагина Maven, цель которых — использовать эти плагины для последующего выполнения команды Protocol Buffers, чтобы автоматически сгенерировать соответствующий код заглушки:
os-maven-plugin
: Создание независимых от платформы свойств.protobuf-maven-plugin
: выполнить команду Protocol Buffers и сгенерировать кодовую базу Stub.
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.4.1.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<pluginId>grpc-java</pluginId>
<protocArtifact>com.google.protobuf:protoc:3.0.2:exe:${os.detected.classifier}</protocArtifact>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.2.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- Написать файл определения службы .proto
Функция и метод записи файла .proto здесь такие же, как и в моей предыдущей статье.«Практика RPC Framework: Apache Thrift»Написание файла .thrift, требуемое Thrift в этой статье, имеет свои собственные требования к синтаксису!
syntax = "proto3”; // 语法版本
// stub选项
option java_package = "com.hansonwang99.grpc.api”;
option java_outer_classname = “RPCDateServiceApi”;
option java_multiple_files = true;
// 定义包名,类似于我的文章《RPC框架实践之:Apache Thrift》中的Thrift的namespace
package com.hansonwang99.grpc.api;
// 服务接口定义,服务端和客户端都要遵守该接口进行通信
service RPCDateService {
rpc getDate (RPCDateRequest) returns (RPCDateResponse) {}
}
// 定义消息(请求)
message RPCDateRequest {
string userName = 1;
}
// 定义消息(响应)
message RPCDateResponse {
string serverDate = 1;
}
- воплощать в жизнь
mvn compile
команда для автоматической генерации заглушек кода
После завершения компиляции maven вtarget/generated-sources
В каталоге вы можете увидеть, что в соответствии с приведенным выше.proto
Файл автоматически конвертируется и генерируетсяJava代码Stub
Результаты генерации кода следующие
Что ж, теперь, когда доступен gRPC-API, сервер и клиент можно написать отдельно ниже
Разработать сервер gRPC
-
Создайте проект на основе Maven: Сервер
-
Добавьте зависимость GrpcAPI к pom
<dependency>
<groupId>com.hansonwang99</groupId>
<artifactId>GrpcAPI</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
Следующий шаг важнее
- Внедрение интерфейса службы gRPC
public class RPCDateServiceImpl extends RPCDateServiceGrpc.RPCDateServiceImplBase{
@Override
public void getDate(RPCDateRequest request, StreamObserver<RPCDateResponse> responseObserver) {
RPCDateResponse rpcDateResponse = null;
Date now=new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("今天是"+"yyyy年MM月dd日 E kk点mm分”);
String nowTime = simpleDateFormat.format( now );
try {
rpcDateResponse = RPCDateResponse
.newBuilder()
.setServerDate( "Welcome " + request.getUserName() + ", " + nowTime )
.build();
} catch (Exception e) {
responseObserver.onError(e);
} finally {
responseObserver.onNext( rpcDateResponse );
}
responseObserver.onCompleted();
}
}
Я хочу переписать здесьgetDate()
Метод не незнакомый, это выше.protoИнтерфейс службы, определенный в файле.
Логика здесь относительно проста: получить текущее время и использовать его с запросомRPCDateRequest
извлеченный изuserName
Поля склеиваются, а затем возвращаются вызывающей стороне! образуют замкнутый цикл
- Создать класс запуска сервера gRPC
public class GRPCServer {
private static final int port = 9999;
public static void main( String[] args ) throws Exception {
Server server = ServerBuilder.
forPort(port)
.addService( new RPCDateServiceImpl() )
.build().start();
System.out.println( "grpc服务端启动成功, 端口=" + port );
server.awaitTermination();
}
}
Порт пользовательский 9999, то есть прослушивание на этом порту. Теперь вы можете запустить GRPCServer сразу, чтобы запустить сервер.
Разработка клиента gRPC
-
Создайте проект на основе Maven: Клиент
-
Зависимости GrpcAPI все еще необходимо добавить в pom
<dependency>
<groupId>com.hansonwang99</groupId>
<artifactId>GrpcAPI</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
- Создать класс запуска клиента gRPC
public class GRPCClient {
private static final String host = “localhost”;
private static final int serverPort = 9999;
public static void main( String[] args ) throws Exception {
ManagedChannel managedChannel = ManagedChannelBuilder.forAddress( host, serverPort ).usePlaintext().build();
try {
RPCDateServiceGrpc.RPCDateServiceBlockingStub rpcDateService = RPCDateServiceGrpc.newBlockingStub( managedChannel );
RPCDateRequest rpcDateRequest = RPCDateRequest
.newBuilder()
.setUserName(“hansonwang99”)
.build();
RPCDateResponse rpcDateResponse = rpcDateService.getDate( rpcDateRequest );
System.out.println( rpcDateResponse.getServerDate() );
} finally {
managedChannel.shutdown();
}
}
}
Запустите GRPCClient прямо сейчас!
Коммуникационный эксперимент CS
Помните нашу цель?
Что RPC завершает, так это удаленный вызов процедуры.В этом эксперименте клиент может удаленно вызвать процедуру getDate() сервера и передать результат клиенту для отображения!
постскриптум
Экспериментальный код этой статьи находится здесь →Нужно забрать
Другие практические статьи автора SpringBt находятся здесь:
- Мониторинг приложений Spring Boot на практике
- Приложения SpringBoot развертываются во внешнем контейнере Tomcat.
- Практика поисковой системы ElasticSearch в SpringBt
- Предварительное изучение совместного программирования Kotlin+SpringBoot
- Практика ведения журнала Spring Boot
- Элегантное кодирование SpringBoot: благословение Ломбока
Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:
- Используйте стек технологий K8S для создания личного частного облака Серийная статья
- Подробная конфигурация сервера Nginx из списка конфигураций
- Строительство центра мониторинга визуализации контейнеров Docker
- Использование ELK для создания контейнерного центра журналов приложений Docker
- Практика фреймворка RPC: Apache Thrift
- Практика фреймворка RPC: Google gRPC
- Построение микросервисного центра отслеживания цепочки вызовов
- Контейнеры Docker обмениваются данными между хостами
- Предварительное исследование кластера Docker Swarm
- Несколько рекомендаций по эффективному написанию Dockerfile