文档章节

GRPC源码解读

漂泊尘埃
 漂泊尘埃
发布于 2017/02/16 17:32
字数 610
阅读 101
收藏 0
点赞 0
评论 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 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
grpc实战——构建一个简单的名称解析服务

环境说明: 语言主要用java实现,ide使用的是idea,使用maven作为软件项目管理工具。 说明:本项目源码已发布,点击grpc名称服务可以看到本项目的源码。欢迎大家fork实践体验。 本篇主要是对...

程序员Sunny
05/27
0
0
grpc| python 实战 grpc

date: 2018-5-15 22:12:32 title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 swoole 写 server 时就接触过...

daydaygo
05/16
0
0
gRPC Windows编译应用

gRPC Windows编译 从github上clone出来后进行cmake的编译,参考上面的文档,需要注意的点: 必须安装所有的依赖,包括Perl,Go,YASM,Git,CMake 不要使用--recursive来递归clone,因为墙的...

水海云
06/20
0
0
通过阿里云容器服务K8S Ingress Controller实现gRPC服务访问

gRPC简介 gRPC是Google开源的一个高性能RPC通信框架,通过Protocol Buffers作为其IDL,可以在不同语言开发的平台上使用,同时基于HTTP/2协议实现,继而提供了连接多路复用、头部压缩、流控等...

chenqz
06/01
0
0
[笔记] consul用grpc做健康检查注意点

先上个代码片段开胃 protobuf写一个Health服务: https://github.com/grpc/grpc/blob/master/doc/health-checking.md package必须写成 ... consul源代码里写死了调用grpc的health check http......

疯狂的小企鹅
04/21
0
0
远程通信协议:从 CORBA 到 gRPC

自从产业界发明机器联网的那一天就已经开始探索最优的远程通信机制。操作系统如 UNIX、Windows 和 Linux 等都有实现远程通信的内部协议,挑战在于如何向开发人员开放一个通信框架。 一、远程...

RiboseYim
2017/10/31
0
0
Nginx 宣布从 1.13.10 开始正式支持 gRPC

最近,NGINX在其博客宣布,Nginx 宣布从 1.13.10 开始正式支持 gRPC 如下是正文翻译: 今天,我们很高兴在NGINX 1.13.10上分享gRPC流量的第一个本地支持。下一个NGINX Plus版本R15将包含对g...

xiaomin0322
05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CDH的坑之Sqoop导出数据到MySQL

CDH的坑之Sqoop导出数据到MySQL 最近使用Sqoop从Hive导出数据到MySQL中,出现了一系列的问题,下面将这个问题记录一下,避免再度踩坑! 导出语句 sqoop export --connect jdbc:mysql://192....

星汉
7分钟前
0
0
Hyperledger Fabric 客户端开发三

前面两篇文章介绍了Hyperledger Fabric SDK并使用一个实例介绍如何通过SDK和Hyperledger Fabric Blockchain交互, 现在详细分析相关的过程。 首先看 enroll (登录) admin 过程。 'use stric...

十一月不远
7分钟前
0
0
PowerDesigner连接MySQL和逆向工程图

最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样更直观一些。 想着...

Oo若离oO
8分钟前
0
0
威胁web应用安全的错误

一般绝大部分的web应用攻击都是没特定目标的大范围漏洞扫描,只有少数攻击确实是为入侵特定目标而进行的针对性尝试。这两种攻击都非常频繁,难以准确检测出来,许多网站的web应用防火墙都无法...

上树的熊
10分钟前
2
0
pypy2 install crypto error

install pycryptodome instead pip install pycryptodome

coord
14分钟前
0
0
Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
23分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
29分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
30分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
32分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部