DevGang
Авторизоваться

Поддержка сжатия gRPC в Go, Java и Ballerina 

В распределенных приложениях мы иногда используем методы сжатия для экономии пропускной способности сети. gRPC поддерживает сжатие на уровне сообщений как на стороне клиента, так и на стороне сервера. В разных языках программирования есть разные способы включения / отключения сжатия gRPC. В этой статье описывается, как использовать сжатие gRPC на нескольких языках программирования; Go, Java и Ballerina. Алгоритм сжатия Gzip является наиболее часто используемым алгоритмом сжатия в gRPC, и в примерах в этой статье также используется Gzip.

Сжатие gRPC в Go

В Golang есть два разных способа включить сжатие на стороне клиента и на стороне сервера. На стороне клиента мы должны передать соответствующий компрессор в качестве опции для вызова RPC. На стороне сервера мы должны импортировать пакет gRPC Gzip, чтобы включить сжатие сообщений.

Используйте следующий блок кода, чтобы включить сжатие Gzip на стороне клиента Go:

compressor := grpc.UseCompressor(gzip.Name)
r, err := c.Hello(ctx, &wrapperspb.StringValue{Value: string("Hello")}, compressor)

Используйте следующий блок кода, чтобы включить сжатие Gzip на стороне сервера Go:

import (
   _ "google.golang.org/grpc/encoding/gzip"
)

Сжатие gRPC в Java

В Java также есть два разных способа включить сжатие на стороне клиента и на стороне сервера. Мы должны вызвать API withCompression в классе-заглушке, чтобы включить сжатие на Java-клиенте gRPC. Чтобы включить сжатие на сервере Java gRPC, мы должны использовать перехватчик.

Используйте следующий вызов API, чтобы включить сжатие Gzip на стороне клиента Java:

StringValue msg = client.blockingStub.withCompression("gzip").hello(StringValue.of("content"));

Используйте следующий перехватчик, чтобы включить сжатие Gzip на стороне сервера Java:

server = ServerBuilder.forPort(50052).intercept(
   new ServerInterceptor() {
   @Override
   public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
                                                                 ServerCallHandler<ReqT, RespT> next) {
       call.setCompression("gzip");
       return next.startCall(call, headers);
   }
})

Сжатие gRPC в Ballerina

В отличие от Go и Java, Ballerina не имеет двух разных способов включения сжатия на клиенте и сервере. Вместо этого мы можем вызвать API, чтобы включить сжатие, и он вернет карту заголовков, которую можно передать каждому RPC. Обычно клиент и сервер gRPC определяют, что полученное сообщение gRPC сжато или не использует заголовок grpc-encoding. Ballerina API для включения сжатия заполнит этот заголовок и вернет карту заголовков. Мы должны использовать эту заполненную карту заголовков в наших вызовах RPC. 

Ballerina внутренне проверяет, доступен ли соответствующий заголовок сжатия. Если этот заголовок доступен, Ballerina сжимает сообщение (я) gRPC. Обратите внимание, что следующий API сжатия поддерживается в Ballerina Swan Lake Beta 3 и новее. 

Пример включения сжатия в gRPC-клиенте Ballerina.

map<string|string[]> headers = grpc:setCompression(grpc:GZIP);
ContextString cs = check ep->helloContext({content: s, headers: headers});

Обратите внимание, что мы можем повторно использовать существующую карту заголовков для заполнения заголовков сжатия.

map<string|string[]> headers = {...}; // An existing header map
headers = grpc:setCompression(grpc:GZIP, headers);
ContextString cs = check ep->helloContext({content: s, headers: headers});

Пример включения сжатия на gRPC-сервере Ballerina.

remote function hello(string value) returns ContextString|error {
   ...
   map<string|string[]> headers = grpc:setCompression(grpc:GZIP);
   return {content: "content", headers: headers};
}

Тестирование

Сжатие gRPC не может быть легко проверено. Он должен захватить все пакеты gRPC и проверить следующие записи, чтобы убедиться в успешном сжатии.

  1. Сжатый флаг в сообщении gRPC
  2. Длина сообщения gRPC
  3. Кодировка сообщений gRPC

Заключение

Сжатие сообщения при сетевой связи - важная задача для экономии полосы пропускания и увеличения скорости связи. В этой статье мы обсудили, как использовать сжатие gRPC на разных языках программирования; Go, Java, and Ballerina.

#Golang #Java
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

В подарок 100$ на счет при регистрации

Получить