本文公众号文章链接: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源码分析相关推荐

  1. Gorilla源码分析之gorilla/context源码分析

    公众号文章链接:https://mp.weixin.qq.com/s/KogOt-hd6KvXljwYwK7aQg csdn博客链接:http://blog.csdn.net/screscent/ar ...

  2. Gorilla源码分析之gorilla/mux源码分析

    本文公众号文章链接:https://mp.weixin.qq.com/s/LLcPDPtpjNeXAA_ffL3YCg 本文csdn博客链接:http://blog.csdn.net/screscen ...

  3. spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析

    spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...

  4. 微服务开源框架TARS的RPC源码解析 之 初识TARS C++服务端

    作者:Cony 导语:微服务开源框架TARS的RPC调用包含客户端与服务端,<微服务开源框架TARS的RPC源码解析>系列文章将从初识客户端.客户端的同步及异步调用.初识服务端.服务端的工 ...

  5. 第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析-namenode启动过程分析...

    第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析 4.1 namenode启动过程分析 org.apache.hadoop.hdfs.server.namenode. ...

  6. 第七章:小朱笔记hadoop之源码分析-hdfs分析 第五节:Datanode 分析

    第七章:小朱笔记hadoop之源码分析-hdfs分析 第五节:Datanode 分析 5.1 Datanode 启动过程分析 5.2 Datanode 心跳分析 5.3 Datanode 注册分析 5 ...

  7. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  8. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  9. 【OkHttp】OkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  10. HBase源码分析之HRegion上compact流程分析(三)

    在<HBase源码分析之HRegion上compact流程分析(二)>一文中,我们没有讲解真正执行合并的CompactionContext的compact()方法.现在我们来分析下它的具体 ...

最新文章

  1. php的yii2框架下开发环境xampp,vim,xdebug,DBGp的搭建
  2. 操作系统 作业调度实验报告
  3. 给AI一个洗衣机,TA会做点啥?斯坦福+FB研究了972种形状,只为教机器人开门
  4. 在tomcat下创建和发布WEB应用
  5. [NHibernate]基本配置与测试
  6. 【鬼网络】之DNS域名解析服务
  7. mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区
  8. Thinkphp3.2整合微信支付
  9. oracle中rac是什么意思,oracle rac是什么?
  10. Java关键字---this的由来和其三大作用
  11. 乐视轰然倒塌;智能驾驶上路;360回归A股 | 2017年度科技大事件盘点
  12. python初始化空列表_python list的深拷贝与浅拷贝-以及初始化空白list的方法(1)
  13. 顺序表的动态存储细节
  14. 西南科技大学OJ题 数字转换成字符0613
  15. 百度网盘断点续传下载工具IDM
  16. html 标签的语义化
  17. 苹果电脑怎么登录邮件服务器,Mac系统中的邮箱怎么创建126邮箱帐户?
  18. Gini Index vs Information Entropy
  19. 【图像检测-显著性检测】基于蚁群算法优化图像视觉显着性检测附matlab代码
  20. Mysql的基本操作和注意点

热门文章

  1. python列表去括号_python 去括号
  2. 求最小公倍数【牛客网】
  3. 给我两小时,我能写很长长长长长长的APP测试用例!
  4. 【题解】 小莫踩蘑菇
  5. 踩点上下班被HR约谈,网友:按时上下班,天经地义
  6. Linux配置拨号服务器
  7. [读书笔记]日本蜡烛图技术 阅读笔记
  8. Java 接收返回json数据动态取data里的值
  9. CSS中visibility 属性
  10. 以数据智能引领产业数字化,滴普科技宣布完成5000万美元A+轮融资