Gorilla源码分析之gorilla/rpc源码分析
本文公众号文章链接:https://mp.weixin.qq.com/s/6ZNJB1Qcwdk0MaC2fWu4ng
本文csdn博客链接:https://blog.csdn.net/screscent/article/details/79663424
Gorilla是一个go语言的web工具箱,包含了很多的模块。本文分析的模块gorilla/rpc:implements RPC over HTTP with codec for JSON-RPC.
代码目录如下:
一、实例
来自官网http://www.gorillatoolkit.org/pkg/rpc的例子
首先New了一个Server
然后在Server中注册了Codec
接着注册了rpc service
上面是具体的rpc service
github.com/gorilla/rpc/server.go
上面有两个东西,codecs,services。后面先分析这两个部分。
二、Codec
我们从简单的入手,先看看Codec
在github.com/gorilla/rpc/server.go,对Codec接口的定义如下
有两个接口:
1、 生成CoedcRequest的接口
2、 CodecRequest接口
那么我们来看看
github.com/gorilla/rpc/json/server.go
Codec接口
按照接口来看,很简单,只是NewRequest种封装了newCodecRequest
继续看源码
通过读取http.Request中的内容,然后经过json解析结构体CodecRequest,其中封装了serverRequest结构体
接下来,我们看看这个结构体
很简单的两个结构体 serverRequest和serverResponse。就不多解释了
继续看CodeRequest的实现的接口
之前通过json解析的Method内容保存在serverRequest结构体中。
在serverRequest中的Params为json.RawMessage,所以需要继续解析params
WriteResponse则相反,将传入的数据,封装到serverResponse结构体中,然后通过json编码,然后写入到http.ResponseWriter中。
三、rpc Service
在实例中,我们看到注册了Codec之后,就注册了Service。那么Service是怎么保存的
github.com/gorilla/rpc/map.go
ServiceMap,就是一个service集合。在实例中,注册的是一个HelloService
Service中有两个部分。
1、 name、rcvr、rcvrType
name其实就是一个标识,Service的名字
rcvr、rcvrType是service的信息,在实例中就是HelloService。
2、 methods。这一部分看ServiceMethod结构体,很直白,就是一个method的信息。对应的就是HelloService类所包含的方法
类名是只有一个的,而类的方法是可以有多个的。这就是为什么分为这两个部分。
注册部分:
Setup service。其中主要是name的操作,当name为空的时候,则直接用rcvr的名字。这部分,主要是第一部分的设置
中间代码略
Setup methods。直接遍历类所包含的method,然后将其信息,放到methods这个map中。
Add to the map
将解析好的service信息,放入到serviceMap中。
整个流程很直接,清晰。
看完了注册,看看上面的get函数。先对method拆分成两个部分,一个是类名或服务名部分,一个是方法部分。然后分别进行类名或服务名的查找(图中152行)。然后根据方法名进行查找(图中158行)
至此service部分讲解完。
四、rpc server部分
直接看代码吧
github.com/gorilla/rpc/server.go
其中最主要的两部分已经讲解过了
这个是初始化
初始化Codec
这个是注册服务。这个部分也介绍过了。
现在直接进入入口
上面就是获取Codec,在实例中是json,这个具体部分已经解释过了
看源码中的英文注释,解释的很清楚。
创建code Request
然后获取Service 和method
再接着是decode args。
上面,可以忽略,不常用。
这里进入正题,调用rpc函数。这里面有一个flag poassReq,差别在于注册的rpc函数,是否要传入r *http.Request参数。
最后就是将reply通过codec编码发出去。
到这里整个流程就结束了。
龚浩华
月牙寂道长
QQ 29185807
2018年03月22日
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注
Gorilla源码分析之gorilla/rpc源码分析相关推荐
- Gorilla源码分析之gorilla/context源码分析
公众号文章链接:https://mp.weixin.qq.com/s/KogOt-hd6KvXljwYwK7aQg csdn博客链接:http://blog.csdn.net/screscent/ar ...
- Gorilla源码分析之gorilla/mux源码分析
本文公众号文章链接:https://mp.weixin.qq.com/s/LLcPDPtpjNeXAA_ffL3YCg 本文csdn博客链接:http://blog.csdn.net/screscen ...
- spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析
spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...
- 微服务开源框架TARS的RPC源码解析 之 初识TARS C++服务端
作者:Cony 导语:微服务开源框架TARS的RPC调用包含客户端与服务端,<微服务开源框架TARS的RPC源码解析>系列文章将从初识客户端.客户端的同步及异步调用.初识服务端.服务端的工 ...
- 第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析-namenode启动过程分析...
第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析 4.1 namenode启动过程分析 org.apache.hadoop.hdfs.server.namenode. ...
- 第七章:小朱笔记hadoop之源码分析-hdfs分析 第五节:Datanode 分析
第七章:小朱笔记hadoop之源码分析-hdfs分析 第五节:Datanode 分析 5.1 Datanode 启动过程分析 5.2 Datanode 心跳分析 5.3 Datanode 注册分析 5 ...
- 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- 【OkHttp】OkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- HBase源码分析之HRegion上compact流程分析(三)
在<HBase源码分析之HRegion上compact流程分析(二)>一文中,我们没有讲解真正执行合并的CompactionContext的compact()方法.现在我们来分析下它的具体 ...
最新文章
- php的yii2框架下开发环境xampp,vim,xdebug,DBGp的搭建
- 操作系统 作业调度实验报告
- 给AI一个洗衣机,TA会做点啥?斯坦福+FB研究了972种形状,只为教机器人开门
- 在tomcat下创建和发布WEB应用
- [NHibernate]基本配置与测试
- 【鬼网络】之DNS域名解析服务
- mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区
- Thinkphp3.2整合微信支付
- oracle中rac是什么意思,oracle rac是什么?
- Java关键字---this的由来和其三大作用
- 乐视轰然倒塌;智能驾驶上路;360回归A股 | 2017年度科技大事件盘点
- python初始化空列表_python list的深拷贝与浅拷贝-以及初始化空白list的方法(1)
- 顺序表的动态存储细节
- 西南科技大学OJ题 数字转换成字符0613
- 百度网盘断点续传下载工具IDM
- html 标签的语义化
- 苹果电脑怎么登录邮件服务器,Mac系统中的邮箱怎么创建126邮箱帐户?
- Gini Index vs Information Entropy
- 【图像检测-显著性检测】基于蚁群算法优化图像视觉显着性检测附matlab代码
- Mysql的基本操作和注意点