Практика фреймворка RPC: Google gRPC

задняя часть Google gRPC maven
Практика фреймворка RPC: Google gRPC

Обзор

gRPC — это универсальная высокопроизводительная RPC-инфраструктура Google с открытым исходным кодом, которая поддерживает использованиеProtocol BuffersДля написания определений службы он поддерживает больше платформ расширения языка и имеет мощный набор инструментов для двоичной сериализации. со статьями«Практика RPC Framework: Apache Thrift»Еще одна инфраструктура RPC общего назначения, рассматриваемая в этой статье.ThriftПодобно интерфейсу службы, который может автоматически генерировать соответствующий язык с помощью генератора, gRPC также можетавтоматически генерируетсяСервер и клиентСервисная заглушка (заглушка), нам просто нужнокомандаВы можете быстро создать среду выполнения RPC.

Давайте попрактикуемся с инфраструктурой gRPC.Что она делает: клиентская сторона вызывает интерфейс получения времени сервера через удаленный RPC, чтобы локально получить время сервера и отобразить его.

похож на предыдущийФреймворк RPC: экономияПрактические шаги описаны ниже.

Примечание:Эта статья была впервые опубликована на моем официальном аккаунтеCodeSheep,МогуНажмитеилисканированиеследующеебудь остороженЗаходи подписывайся ↓ ↓ ↓

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相关的包

  • Добавьте подключаемые модули сборки, связанные с 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

mvn编译

Результаты генерации кода следующие

代码生成结果

Что ж, теперь, когда доступен 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() сервера и передать результат клиенту для отображения!

RPC调用成功


постскриптум

Экспериментальный код этой статьи находится здесь →Нужно забрать

Другие практические статьи автора SpringBt находятся здесь:


Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:


CodeSheep · 程序羊