1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/502959937-grpc

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
readme.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 20.05.2025 08:42 3ad8d65

О GRPC и proto3: практическое руководство

Введение

Интернет+ , микросервисы --- модульное разделение сервисов, их взаимодействие и сотрудничество через TCP/IP с использованием пользовательских протоколов, стиля RESTful, RPC (удаленный вызов процедур) и т.д.

RPC (удаленный вызов процедур, удаленный вызов методов) --- позволяет программе на одном компьютере вызывать программу на другом компьютере, обеспечивая стандартизированный механизм общения. Для кросс-платформенной работы обычно используется язык описания интерфейсов (Interface Description Language, IDL), что позволяет сосредоточиться на разработке бизнес-требований, не заботясь о нижних уровнях реализации.

Apache Thrift, разработанный Facebook

Thrift использует язык описания интерфейсов для определения и создания сервисов, поддерживает масштабируемую разработку кросс-языковых сервисов. Включенный в него генератор кода может создавать эффективные и бесшовные сервисы на различных языках, таких как C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk и др. Данные передаются в бинарном формате. Пример использования Thrift

GRPC, разработанный Google> gRPC — это высокопроизводительный, универсальный открытый RPC-фреймворк, разработанный Google в основном для мобильных приложений и основанный на стандартном протоколе HTTP/2. Он использует протокол сериализации ProtoBuf (Protocol Buffers) и поддерживает множество языков разработки.+ Apache Thrift и gRPC используют IDL в качестве механизма общения. Для подробного описания IDL и выбора схемы сериализации см. четвертый выпуск

Построение gRPC

Поддержка множества языков

gRPC поддерживает множество языков и может автоматически генерировать клиентские и серверные библиотеки на основе выбранного языка. На GitHub уже доступны версии C (grpc), Java (grpc-java) и Go (grpc-go). Другие языки активно разрабатываются, включая C, C++, Node.js, Python, Ruby, Objective-C, PHP и C#. Версия grpc-java уже поддерживает разработку для Android.

Основан на стандарте HTTP/2

Поскольку gRPC основан на стандарте HTTP/2, он предоставляет больше мощных функций, таких как двунаправленные потоки, сжатие заголовков, мультиплексирование запросов и т.д. Эти функции приносят значительные преимущества для мобильных устройств, такие как экономия трафика, уменьшение количества TCP-соединений, снижение использования CPU и увеличение времени работы батареи. Кроме того, gRPC повышает производительность облачных сервисов и веб-приложений. gRPC может использоваться как на клиентской, так и на серверной стороне, что позволяет прозрачно реализовать взаимодействие между клиентом и сервером и упрощает построение систем связи. gRPC уже применяется в облачных сервисах Google и в предоставляемых API, его основные сценарии использования следующие:1. Системы с низкой задержкой, высокой масштабируемостью и распределенностью

  1. Мобильные клиентские приложения, взаимодействующие с облачными серверами
  2. Разработка новых протоколов, независимых от языка, эффективных и точных
  3. Иерархический дизайн, удобный для расширения в различных аспектах, таких как аутентификация, балансировка нагрузки, ведение журналов, мониторинг и т.д.

Что такое gRPC

Используя gRPC, клиентское приложение может напрямую вызывать методы серверного приложения, находящегося на другом компьютере, как если бы это были локальные методы. Это облегчает создание распределенных приложений и сервисов. Как и многие системы RPC, gRPC основана на концепции определения служб и указания параметров и типов возвращаемых значений для методов, которые можно вызывать удаленно. На стороне сервера служба реализует этот интерфейс и возвращает клиент gRPC для обработки запросов от клиентов. На стороне клиента создаются заглушки, предоставляющие те же методы, что и на сервере.

grpc_what

Установка и компиляция proto3

  1. Основные требования для компиляции
  • autoconf
  • automake
  • libtool
  • curl (используется для загрузки gmock)
  1. Сборка
# Обратите внимание на настройку зависимости gmock --- (заблокирован)
./autogen.sh
```./configure --prefix=/usr
make && make check && make install
  1. Написание IDL-файла
syntax = "proto3";

option java_multiple_files = true;

package pb;

// Определение службы приветствия.
service Greeter {
    // Отправляет приветствие
    rpc  SayHello (HelloRequest) returns (HelloResponse){}
}

service Test {
    // Отправляет приветствие
    rpc  SayHello (HelloRequest) returns (HelloResponse){}
}


// Запрос, содержащий имя пользователя.
message HelloRequest {
    string name = 1;
}

// Ответ, содержащий приветствие.
message HelloResponse {
    string message = 1;
}
  1. Зависимость от maven, сборка компилятора GRPC

Компилятор

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">


    <modelVersion>4.0.0</modelVersion>


    <properties>
        <protobuf.version>3.0.0-beta-2</protobuf.version>
        <grpc.version>0.9.0</grpc.version>
    </properties>

    // Модули, необходимые для зависимости gRPC
    <dependencies>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-core</artifactId>
            <version>${grpc.version}</version>
        </dependency>```xml
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>${grpc.version}</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>${grpc.version}</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty</artifactId>
            <version>${grpc.version}</version>
        </dependency>

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>${protobuf.version}</version>
        </dependency>```xml
<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.4.0.Final</version>
        </extension>
    </extensions>
    <plugins>
        <!-- плагин gRPC -->
        <plugin>
            <groupId>com.google.protobuf.tools</groupId>
            <artifactId>maven-protoc-plugin</artifactId>
            <version>0.4.4</version>
            <configuration>
                <!--
                  Версия protoc должна соответствовать версии protobuf-java. Если вы не используете
                  protobuf-java напрямую, вы будете транзитивно зависеть от версии protobuf-java,
                  на которую зависит gRPC.
                -->
                <pluginId>grpc-java</pluginId>
                <protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}
                </protocArtifact>
                <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.9.0:exe:${os.detected.classifier}</pluginArtifact>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
</project>
```### Сгенерированный объект разбора

/** Серверная реализация интерфейса */ public static interface Greeter {

public void sayHello(pb.HelloRequest request,
    io.grpc.stub.StreamObserver<pb.HelloResponse> responseObserver);

}

/**
 * Клиентская реализация интерфейса
 */

public static interface GreeterBlockingClient {

public pb.HelloResponse sayHello(pb.HelloRequest request);

}

/**
 * Метод вызова
*/
@java.lang.Override
public void sayHello(pb.HelloRequest request,
    io.grpc.stub.StreamObserver<pb.HelloResponse> responseObserver) {
  asyncUnaryCall(
      getChannel().newCall(METHOD_SAY_HELLO, getCallOptions()), request, responseObserver);
}

}

/* Привязка службы --- * / public static io.grpc.ServerServiceDefinition bindService( final Greeter serviceImpl) { return io.grpc.ServerServiceDefinition.builder(SERVICE_NAME) .addMethod( METHOD_SAY_HELLO, asyncUnaryCall( new io.grpc.stub.ServerCalls.UnaryMethod< pb.HelloRequest, pb.HelloResponse>() { @java.lang.Override public void invoke( pb.HelloRequest request, io.grpc.stub.StreamObserver<pb.HelloResponse> responseObserver) { serviceImpl.sayHello(request, responseObserver); } })).build(); } }

Ключевые фрагменты кода

Структурный обзор

Серверная сторона

  1. Серверная сторона включает 2 модуля: сетевой модуль, модуль привязки службы

Серверный построитель (построен на основе Netty для HTTP/2)

Корневой модуль сетевой службы сервера

Сетевой модуль

Структура кода сетевого модуля

    /**
     * Пул потоков для обработки логики
     * Используется для выполнения бизнес-логики
     */
    private static final ExecutorService executorService =
            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()
                    , new NamedThreadFactory("logic-handler"));
```    /**
     * Запуск службы
     *
     * @throws Exception
     */
    public void startGrpc() throws Exception {

        // инициализация билдера
        initServerBuilder();

        // привязка службы
        server = nettyServerBuilder.build().start();
    }
``````java
        // регистрируем хук
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                // Используем stderr, так как логгер может быть сброшен хуком завершения JVM.
                logger.debug("*** завершение работы gRPC-сервера, так как JVM завершает работу");
                if (server != null) {
                    server.shutdown(); // завершение работы
                }
                executorService.shutdown();
                logger.debug("*** сервер завершил работу");
            }
        });
``````markdown
        if (logger.isDebugEnabled()) {
            logger.debug("grpc_server bind service port:" + port);
        }

    }

    /**
     * Приостановить службу, предоставить постоянную внешнюю службу
     * @throws InterruptedException
     */
    public void awaitTermination() throws InterruptedException {
        server.awaitTermination();
    }

Привязка модуля службы

Абстрактный класс привязки службы

Простая логическая реализация (внешняя служба)

Обработка логики службы

Клиент

Отправляемый канал ---- ManagedChannel, grpc-java встроенное выбор соответствующего канала на основе веса (netty, okhttp, inprocess)

Корневой код выбора канала

Инициализация канала```java

    if (PlatformDependent.isAndroid()) { // платформа Android
        channel = OkHttpChannelBuilder.forAddress(host, port)
                .usePlaintext(true)
                .build();
    } else {
        ManagedChannelBuilder managedChannelBuilder = ManagedChannelBuilder.forAddress(host, port);
        if (managedChannelBuilder instanceof NettyChannelBuilder) {
            NettyChannelBuilder nettyChannelBuilder = (NettyChannelBuilder) managedChannelBuilder;
#### Простое использование
```java
  /**
     * В качестве одиночного объекта
     */
    HelloWorldClient client = new HelloWorldClient("localhost", 50051);
    // создание блокирующего stub (клиент)----
    GreeterGrpc.GreeterBlockingClient greeterBlockingClient =
                       GreeterGrpc.newBlockingStub(grpcClient.getChannel());
    // создание отправляемых данных
    HelloRequest request = HelloRequest.newBuilder().setName(name).build();
    grpcClient.shutdown();
```#### Демонстрация
```

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/502959937-grpc.git
git@api.gitlife.ru:oschina-mirror/502959937-grpc.git
oschina-mirror
502959937-grpc
502959937-grpc
master