文档章节

GRPC源码解读

漂泊尘埃
 漂泊尘埃
发布于 2017/02/16 17:32
字数 610
阅读 135
收藏 0

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

© 著作权归作者所有

共有 人打赏支持
漂泊尘埃

漂泊尘埃

粉丝 5
博文 35
码字总数 70992
作品 0
朝阳
mac下grpc(golang server + php client)实践

目前微服务这么流行,RPC框架也是百花齐放,本文讲述一下mac下grpc的开发环境搭建,其中server端使用golang,客户端使用php。 服务端 golang grpc安装 这里列出了一个参考,由于grpc在githu...

陈晓风
07/01
0
0
Spring Boot 使用 gRPC 轻松调用远程方法

gRPC 简介 gRPC 是一个现代开源的高性能 RPC 框架,可以在任何环境下运行。它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡、跟踪、健康检查和认证。它也适用于分布式计...

Anoyi
04/23
0
0
gRPC 预览版 v1.14.0-pre1 发布,谷歌的高性能 RPC 框架

gRPC 1.14.0 首个预览版 v1.14.0-pre1 发布。本次预览版的更新内包含优化、改进和错误修复。未发现其他更新说明。 而上个稳定版 gRPC 1.13.0 主要是针对 Objective-C、PHP 和 Python 这几个语...

局长
07/28
0
1
gRPC 预览版 1.15.0-pre1 发布,谷歌的高性能 RPC 框架

gRPC Core 1.15.0 (glider) 的首个预览 版1.15.0-pre1 已发布。一如既往地,本次预览版的更新内包含优化、改进和错误修复。未发现其他更新说明。 此前发布的 gRPC 1.13.0 稳定版主要是针对 ...

局长
08/30
0
0
gRPC 1.13.0 发布,谷歌开源的高性能 RPC 框架

gRPC 1.13.0 已发布,此版本包含重要的改进和错误修复,针对 Objective-C、PHP 和 Python 这几个语言版本都有重要的更新,其中重点列出如下: Core gRPC stats will only be collected for d...

局长
06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0
麒麟AI首席科学家现世

8月31日,华为发布了新一代顶级人工智能手机芯片麒麟980,成为全球首款7nm工艺手机芯片,AI方面也实现飞跃,支持人脸识别、物体识别、物体检测、图像分割、智能翻译等。 虽然如今人人都在热议...

问题终结者
昨天
1
0
告警系统主脚本、告警系统配置文件、告警系统监控项目

告警系统主脚本 main.sh内容 #!/bin/bash#Written by aming.# 是否发送邮件的开关export send=1# 过滤ip地址export addr=`/sbin/ifconfig |grep -A1 "ens33: "|awk '/inet/ {pr...

芬野de博客
昨天
2
0
MySQL autocommit探究

-- sessionA:tx_isolation=REPEATABLE-READmysql> select connection_id();+-----------------+| connection_id() |+-----------------+| 28 |+-----------------+......

安小乐
昨天
8
0
c++多线程锁 Mutex  自动判断死锁

c++多线程锁可以使用absl::Mutex std::mutex这两种,下面是demo代码。 使用absl:Mutex的时候打印: [mutex.cc : 1338] RAW: Cycle: [mutex.cc : 1352] RAW: mutex@0x683b68 stack: @ 0x43856......

青黑
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部