GRPC源码解读

GRPC源码解读

使用的protobuf文件

syntax = "proto3";

package servers;

// The greeter service definition.
service Greeter {
    // Sends a greeting
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
    string name = 1;
}

// The response message containing the greetings
message HelloReply {
    string message = 1;
}

Client

连接

conn, err := grpc.Dial("localhost:8080", grpc.WithInsecure())

创建一个 ClientConn 并将传入的 DialOption 应用到 ClientConndopts (dialOptions) 字段上。 设置默认的编解码类 protoCodec, backoff配置,负载均衡策略(roundRobin)。

从负载均衡器中拿到地址列表,启动goroutine连接各个地址(看下面的<连接address>),主协程设置超时时间(根据 dopts.timeout)),在超时时间内等待连接完成。

如果有地址列表监控Watcher(当负载均衡设置了naming.Resolver时会有),异步监控地址列表的变动(变动时更新 ClientConn的连接列表 conns)。

连接address

如果 dopts.insecure 为false,检查证书相关信息。

将创建的 addrConn 放入到 ClientConnconns map中,并销毁被替换的 addrConn

重置 Transport:

连接地址,一旦出错,重试,重试间隔时间由 dopts.bs 指定。

如果没出错则调用负载均衡的Up方法(标记一下这个地址已经连接了而已)。

监控 Transport: 如果有错误发生就重置 Transport(关闭之前的,重新连接一个)。

调用方法

c := servers.NewGreeterClient(conn)
reply, err := c.SayHello(context.Background(), &servers.HelloRequest{"person"})

创建Client没有什么东西。

调用 SayHello 时主要代码就下面这句:

grpc.Invoke(ctx, "/servers.Greeter/SayHello", in, out, c.cc, opts...)

ClientConn 中获取 Transport

利用获取到的transport 创建一个 Stream, Stream的id每次递增2,将 Stream 保存在transport的activeStreams中。设置各种 header 字段。将 header 按照 frame 发送给服务端以开启一个stream,frame最大16KB。

HelloRequest 编码写到 stream 中。

等待读取服务器的相应到 HelloReply

最后关闭 stream

roundRobin

Start

默认是没有指定 naming.Resolver 的,所以 Start 只是将地址放入到 addrs 字段中。

如果指定了 naming.Resolver, 会调用它返回一个 Watcher,然后启动 goroutine,循环从 Watcher 中获取地址变动的信息(增加或删除地址),一旦地址列表变动了,就将新的地址列表发给 addrCh 这个channel。

Up

标记地址是已经连接的了。

Get

获取上一次调用时拿到的地址的下一个地址。

如果获取不到地址,就创建 waitCh 然后等待有人关闭这个 waitChUpClose 方法都会检测并关闭 waitCh

转载于:https://my.oschina.net/u/2004526/blog/840295

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GRPC是一种高性能、开源、通用的RPC框架。它基于HTTP/2协议标准设计,支持多种编程语言。在Java中,GRPC提供了完整的Java API和工具链。 下面是GRPC Java源码分析的一些关键点: 1. 服务定义:GRPC使用Protocol Buffers(protobuf)作为服务定义语言。通过编写.proto文件,定义服务接口和数据结构。 2. 代码生成:使用protobuf编译器生成Java代码,包括服务接口和数据结构的类定义、序列化和反序列化方法等。 3. 服务实现:实现服务接口的方法,完成实际的业务逻辑。GRPC支持两种类型的服务:普通服务和流式服务。普通服务是一次请求-响应的模式,流式服务则可以支持客户端和服务端之间的多次交互。 4. 服务绑定:将服务实现绑定到GRPC服务器上。GRPC提供了一个ServerBuilder类来创建和配置GRPC服务器。 5. 客户端调用:使用GRPC提供的客户端Stub类,调用服务接口中的方法。GRPC客户端支持同步和异步两种调用方式,以及流式调用。 6. 传输协议:GRPC使用HTTP/2作为传输协议。HTTP/2提供了流控制、头部压缩、多路复用等特性,可以提高网络传输效率和性能。 7. 序列化和反序列化:GRPC使用protobuf作为序列化和反序列化的工具。protobuf提供了高效的二进制序列化和反序列化方法,可以减少数据传输量和网络延迟。 总之,GRPC Java源码分析需要理解上述关键点,并深入了解GRPC的底层实现原理和机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值