1、简介
gRPC由 Google 开源的高性能 RPC 框架支持异构系统通讯,默认使用ProtoBuf (Protocol Buffers) 协议,云原生体系下和其它组件广泛结合。主要利用gRPC高性能通信能力,结合云原生容器化、微服务架构和弹性伸缩等特性,实现高效、灵活和可扩展的云原生应用开发。
2、gRPC核心设计
网络通讯:gRPC封装了网络通信,提供多种语言的网络通信封装 (C、Java[Netty]、GO)。
协议:HTTP2协议 (数据使用二进制传输,数据的传输更加高效,支持双向通信,多路复用)。
序列化:基于文本(Json XML),基于二进制,Java原生序列化,ProtoBuf。
动态代理:调用者像调用本地方法一样调用远程服务 (stub代理)。
3、gRPC通信方式
Unary RPC:基本(一元)RPC,客户端发送消息给服务端,阻塞等待服务端返回的响应消息。
Server Streaming RPC:服务端流式RPC,客户端发送消息给服务端服务端,客户端读取服务端响应多个消息,结束标记。
Client Streaming RPC:客户端流式RPC,客户端通过发送多个消息给服务端,客户端读取服务端返回的一个响应消息。
Bidirectional Streaming RPC:双向流RPC, 客户端和服务端之间建立一个双向的消息流,双方可以独立地发送和接收消息。
代理方式: BlockingStub 阻塞通信方式、Stub 异步通过监听处理、FutureStub 异步类似NettyFutre只能应用基本RPC通信方式。
4、Nacos定义gRPC通信
nacos_grpc_service.proto 文件定义消息结构和服务的RPC方法,描述应用程序的通信方式。
// 版本限定
syntax = "proto3";
// 导入文件
import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";
// 生成Java源文件个数
option java_multiple_files = true;
// 生成Java类的路径
option java_package = "com.alibaba.nacos.api.grpc.auto";
// 定义消息请求头
message Metadata {
string type = 3;
string clientIp = 8;
map<string, string> headers = 7;
}
// 定义消息请求体
message Payload {
Metadata metadata = 2;
google.protobuf.Any body = 3;
}
// 定义一元RPC通信
service Request {
rpc request (Payload) returns (Payload) {
}
}
// 定义双向流RPC通信
service BiRequestStream {
rpc requestBiStream (stream Payload) returns (stream Payload) {
}
}
GrpcSdkServer 服务与客户端通信,端口=HTTP端口+1000。
GrpcClusterServer 服务与集群之间通信,端口=HTTP端口+1001。
Nacos 需要开启3个相关端口,HTTP端口、HTTP端口+1000、HTTP端口+1001。
5、BaseGrpcServer
gRPC服务启动逻辑,通过@PostConstruct容器启动后执行,调用初始化 BaseGrpcServer.startServer() 方法。
NettyServerBuilder 是 gRPC中于构建 Netty 服务器的类,将处理请求RequestAcceptor注册到HandlerRegistry。
GrpcRequestAcceptor 普通RPC消息处理,GrpcBiStreamRequestAcceptor 双向流RPC消息处理。
@Override
public void startServer() throws Exception {
// 管理和注册服务实现
final MutableHandlerRegistry handlerRegistry = new MutableHandlerRegistry();
// 将服务注册到管理对象 (GrpcRequestAcceptor、GrpcBiStreamRequestAcceptor)
addServices(handlerRegistry, new GrpcConnectionInterceptor());
// 绑定端口和线程池
NettyServerBuilder builder = NettyServerBuilder.forPort(getServicePort()).executor(getRpcExecutor());
if (grpcServerConfig.getEnableTls()) {
if (grpcServerConfig.getCompatibility()) {
builder.protocolNegotiator(new OptionalTlsProtocolNegotiator(getSslContextBuilder()));
} else {
builder.sslContext(getSslContextBuilder());
}
}
//接收最大的消息大小,默认10*1024*1024(10M)
server = builder.maxInboundMessageSize(getMaxInboundMessageSize())
//服务器可处理的服务实现,gRPC服务器接收到客户端请求时查找服务实现
.fallbackHandlerRegistry(handlerRegistry)
//默认的压缩和解压策略
.compressorRegistry(CompressorRegistry.getDefaultInstance())
.decompressorRegistry(DecompressorRegistry.getDefaultInstance())
//添加拦截器服务器端对传输数据进行过滤和处理
.addTransportFilter(new AddressTransportFilter(connectionManager))
//保活检查的间隔时间
.keepAliveTime(getKeepAliveTime(), TimeUnit.MILLISECONDS)
//保活检查未收到响应后的超时时间
.keepAliveTimeout(getKeepAliveTimeout(), TimeUnit.MILLISECONDS)
//没有活动的情况下仍然允许保活的时间
.permitKeepAliveTime(getPermitKeepAliveTime(), TimeUnit.MILLISECONDS)
.build();
//启动服务
server.start();
}