2、Nacos通信gRPC

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();
}
  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值