grpc是一个通用的rpc框架,用google实现,当然也有go语言的版本。在工作中主要用到这个库,所以看看源码加强自己对框架的了解。目前来说主要分析的都以go版本为主(并没有看其他语言版本).由于个人水平有限,代码中的有些思想也是个人揣测,难免有些错误,如果发现错误,还望帮忙指出。 2 源码目录浏览 grpc使用protobuf(go...
ClientConn 是广义上的 grpc 连接代理对象,和 grpc 客户端是一对一的关系,内部包含了一个连接池,根据配置可能同时管理多笔连接. 其中几个核心字段包括: target/parsedTarget:对服务端地址信息的封装 balancerWrapper:负载均衡器. 初始化时会启动一个守护协程,动态地对 ClientConn 及 Subconn 的状态进行刷新 blocking...
一个简单的rpc server示例如下: package main import ( "log" "net" "net/http" "net/rpc" "github.com/monoxy/rpc/common" ) func main() { server := rpc.NewServer() server.Register(new(common.Embed)) lis, err := net.Listen("tcp", ":1234") if err != nil { log.Fatalf("list er...
在阅读gRPC-go源码前,我们先从整体上简单了解一下gRPC-go框架中grpc客户端跟grpc服务器端整个的交互过程,都经历了哪些过程; 在后面的章节中,我们会对每个过程进行详细的分析; 在gRPC-go框架中grpc客户端跟grpc服务器端整个交互主要经历以下阶段: grpc客户端跟grpc服务器端整体交互…阅读全文 赞同2 ...
gRPC-Go源码解读一 客户端请求链路分析 最近在学习gRPC相关的知识,为啥要学呢?因为一直在用,古人云,“工欲善其事,必先利其器”。为此,花了不少时间阅读gRPC-Go的源码,收货甚多,比如透过服务发现和负载均衡这俩组件来学习复杂模块之间低耦合高内聚的设计方法,透过bdp采样与http2流量窗口自动伸缩学习网络性能优化等等...
开始源码分享之前,我们先问自己几个问题: 1,grpc client和server之间是长链接还是短链接? 2,我们通过grpc.Dial拿到的*ClientConn对应的是一个连接么? 3,grpc.Dial 拿到的连接应该什么时候释放? 4,同一个*ClientConn,多次rpc请求,中间连接会断开么?
grpc-go源码分析 核心数据模型 ClientConn是最核心的数据模型,该结构里面维护了一个连接的所有属性,理解了该数据结构的设计,grpc-go的源码也就不难了 // ClientConn represents a virtual connection to a conceptual endpoint, to// perform RPCs./// A ClientConn is free to have zero or more actual connec...
我们聊到了gRPC拥有Resolver,用来解析地址;拥有Balancer,用来做负载均衡。 在这一篇文章中,我们将从代码的角度来分析gRPC是怎么设计Resolver和Balancer的,并会从头到尾的梳理一遍连接是怎么建立的。 1 DialContext DialContext是客户端建立连接的入口函数,我们看看在这个函数里面做了哪些事情: ...
5从golang源码的角度,分析一下调用cancel()后,为什么ctx.Done()就不阻塞了? 模块9:截止时间deadline 1 截止时间相关介绍 2 客户端一侧,是如何处理截止时间呢? 3 服务器端一侧,是如何处理截止时间deadline呢? 4 假设在一条调用链上,存在多个grpc服务的调用,如A服务调用B服务调用C服务,那么他们的超时时间如何?
1 写在前面 在这个系列的文章中,我们将会从源码的层面学习和理解gRPC。 整个系列的文章的计划大概是这样的:我们会先从客户端开始,沿着调用路径逐步分析到服务端,以模块为粒度进行学习,考虑这个模块是为了解决什么问题,然后思考gRPC应该怎么去解决这个问题。在分析完这