Поддержка сжатия 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 и проверить следующие записи, чтобы убедиться в успешном сжатии.
- Сжатый флаг в сообщении gRPC
- Длина сообщения gRPC
- Кодировка сообщений gRPC
Заключение
Сжатие сообщения при сетевой связи - важная задача для экономии полосы пропускания и увеличения скорости связи. В этой статье мы обсудили, как использовать сжатие gRPC на разных языках программирования; Go, Java, and Ballerina.