以太坊源码解读-第5.1讲-rpc官翻及个人理解

前言

rpc在ethereum中是很重要的一个模块,官方在该模块的一个叫做doc.go的文件中专门介绍了RPC的机制。本文小编会带着自己的理解逐步翻译doc.go中对RPC机制的描述。

什么是RPC

RPC全称是Remote Procedure Call,翻译过来就是远程程序调用,通俗的说就是远程服务器开放出某程序的方法(接口),客户端通过网络或者其它的I/O通道调用这个方法,从而完成交互。又或者用另一种通俗的解释:调用远程计算机上的服务,就像调用本地服务一样。

当一个service创建后,将其注册到服务器上,这样该service就可以被外界的客户端访问了。
符合以下标准的方法可用于远程访问:

  • 对象必须导出
  • 方法必须导出
  • 方法返回0,1(响应或错误)或2(响应和错误)值
  • 方法参数必须导出或是内置类型
  • 方法返回值必须导出或是内置类型

RPC在此支持使用订阅来支持发布/订阅模式。要满足此类模式的方法必须满足如下条件:

  • 对象必须导出
  • 方法必须导出
  • 第一个方法参数类型必须是context.Context
  • 方法参数必须导出或内置类型
  • 方法必须返回元组订阅错误

发生以下情况时,订阅将会被删除:

  • 用户发出取消订阅的请求
  • 创建订阅的连接被关闭。这种情况可能由客户端或者服务器触发。 服务器在写入出错或者是通知队列长度太大的时候会选择关闭连接。

ps:被调用者认为是服务器,调用者认为是客户端

案例

示例1-基本操作:

如果返回的error不为空,则返回的int会被忽略,那error会被发送给客户端;反之若error为空,则发送int给客户端。

1
func (s *CalcService) Add(a, b int) (int, error)

示例2-参数支持指针

关于这个示例官方写了很多解释,但越解释越乱,按小编的意思,知道可以接收指针就行。

1
func (s *CalService) Add(a, b int, mod *int) (int, error)

示例3-服务器端接收

服务器端提供一个ServeCodec方法,用来接收一个ServeCodec实例,其中的codec用来读取客户端发出的request。codec处理request后,会把response返回给客户端。
服务器的这些请求或者响应,当然是并发的,不用解释了吧。
下面来看一个json形式的codec例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type CalculatorService struct {}  //定义服务

//CalculatorService对应的第一个方法
func (s *CalculatorService) Add(a, b int) int {
return a + b
}

//CalculatorService对应的第二个方法
func (s *CalculatorService Div(a, b int) (int, error) {
if b == 0
return 0, errors.New("divide by zero")
return a/b, nil
}

calculator := new(CalculatorService) // 实例化
server := NewServer() //服务管理器
server.RegisterName("calculator", calculator) //注册服务

//监听获取回调
l, _ := net.ListenUnix("unix", &net.UnixAddr{Net: "unix", Name: "/tmp/calculator.sock"})
for {
c, _ := l.AcceptUnix()
codec := v2.NewJSONCodec(c)
go server.ServeCodec(codec) //
}

示例4-发布/订阅

1
2
3
func (s *BlockChainService) NewBlocks(ctx context.Context) (Subscription, error) {
...
}

全文总结

整体来说,本文主要还是介绍了rpc的一些基本规范,真正的掌握这个内容,还需要我们再代码中来理解。小编下一部分来解析rpc模块的具体代码。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信