文档章节

GRPC源码解读

漂泊尘埃
 漂泊尘埃
发布于 2017/02/16 17:32
字数 610
阅读 163
收藏 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
Please DONOT use go get in China!

... Please DONOT use go get in China! Use git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 如果通过手搓 可以代替 的话, 那么自然也可以同步一份源码......

taadis
09/28
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

没有更多内容

加载失败,请刷新页面

加载更多

数据集可视化---张量场的可视表示

中国龙-扬科
5分钟前
0
0
JavaScript创建对象方法实例小结

本文实例讲述了JavaScript创建对象方法。分享给大家供大家参考,具体如下: 最简单的方式就是创建一个Object对象,并为其添加属性和方法。 //示例代码var person=new Object()person.name=...

peakedness丶
7分钟前
0
0
GO 读写锁实现原理剖析

前言 TODO:简单说明读写锁用法及规则。 读写锁数据结构 类型定义 TODO: 源码中数据结构 TODO:讲解每个成员作用 写锁阻止写锁 TODO:描述两个尝试写是如何避免的 写锁阻止读锁 TODO:描述获...

恋恋美食
11分钟前
0
0
Java核心(二)深入理解线程池ThreadPool

本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高...

王磊的博客
12分钟前
1
0
web项目中的乱码问题原理分析

Java web开发过程经常遇到乱码,本篇我们探讨一下乱码产生的原因与解决思路。 一次完整的Web请求会有4次编解码转换,如下所示。 第一次:客户端(通常为浏览器)将字符转换成TCP字节流发向服...

fame_yao
16分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部