Интернет+ , микросервисы --- модульное разделение сервисов, их взаимодействие и сотрудничество через TCP/IP с использованием пользовательских протоколов, стиля RESTful, RPC (удаленный вызов процедур) и т.д.
RPC (удаленный вызов процедур, удаленный вызов методов) --- позволяет программе на одном компьютере вызывать программу на другом компьютере, обеспечивая стандартизированный механизм общения. Для кросс-платформенной работы обычно используется язык описания интерфейсов (Interface Description Language, IDL), что позволяет сосредоточиться на разработке бизнес-требований, не заботясь о нижних уровнях реализации.
Thrift использует язык описания интерфейсов для определения и создания сервисов, поддерживает масштабируемую разработку кросс-языковых сервисов. Включенный в него генератор кода может создавать эффективные и бесшовные сервисы на различных языках, таких как C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk и др. Данные передаются в бинарном формате. Пример использования Thrift
gRPC поддерживает множество языков и может автоматически генерировать клиентские и серверные библиотеки на основе выбранного языка. На GitHub уже доступны версии C (grpc), Java (grpc-java) и Go (grpc-go). Другие языки активно разрабатываются, включая C, C++, Node.js, Python, Ruby, Objective-C, PHP и C#. Версия grpc-java уже поддерживает разработку для Android.
Поскольку gRPC основан на стандарте HTTP/2, он предоставляет больше мощных функций, таких как двунаправленные потоки, сжатие заголовков, мультиплексирование запросов и т.д. Эти функции приносят значительные преимущества для мобильных устройств, такие как экономия трафика, уменьшение количества TCP-соединений, снижение использования CPU и увеличение времени работы батареи. Кроме того, gRPC повышает производительность облачных сервисов и веб-приложений. gRPC может использоваться как на клиентской, так и на серверной стороне, что позволяет прозрачно реализовать взаимодействие между клиентом и сервером и упрощает построение систем связи. gRPC уже применяется в облачных сервисах Google и в предоставляемых API, его основные сценарии использования следующие:1. Системы с низкой задержкой, высокой масштабируемостью и распределенностью
Используя gRPC, клиентское приложение может напрямую вызывать методы серверного приложения, находящегося на другом компьютере, как если бы это были локальные методы. Это облегчает создание распределенных приложений и сервисов. Как и многие системы RPC, gRPC основана на концепции определения служб и указания параметров и типов возвращаемых значений для методов, которые можно вызывать удаленно. На стороне сервера служба реализует этот интерфейс и возвращает клиент gRPC для обработки запросов от клиентов. На стороне клиента создаются заглушки, предоставляющие те же методы, что и на сервере.
# Обратите внимание на настройку зависимости gmock --- (заблокирован)
./autogen.sh
```./configure --prefix=/usr
make && make check && make install
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;
}
<?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(); } }
Серверный построитель (построен на основе 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)
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 )