11#8 .4 RPC
2- 前面几个小节我们介绍了基于Socket和HTTP来编写应用,通过介绍我们了解了Socket和HTTP使用类似消息传递的模式,客户端发送一个消息到服务端,然后一般服务器端都会有一定的返回信息。客户端和服务端都需要约定交互的消息格式,双方都需要对这种消息能够解析。但是很多独立的应用不会使用这种消息传递的模式,而是采用类似函数调用的方式,这种方式应用通过调用带有一串参数的函数,然后返回一组值 。
2+ 前面几个小节我们介绍了如何基于Socket和HTTP来编写网络应用,通过学习我们了解了Socket和HTTP采用的是类似"信息交换"模式,即客户端发送一条信息到服务端,然后(一般来说)服务器端都会返回一定的信息以表示响应。客户端和服务端之间约定了交互信息的格式,以便双方都能够解析交互所产生的信息。但是很多独立的应用并没有采用这种模式,而是采用类似常规的函数调用的方式来完成想要的功能 。
33
44RPC就是想实现函数调用模式的网络化。客户端就像调用本地函数一样,然后客户端把这些参数打包之后通过网络传递到服务端,服务端解包到处理过程中执行,然后执行的结果反馈给客户端。
55
6- RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务 ,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在 ,如TCP或UDP,为通信程序之间携带信息数据 。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
6+ RPC(Remote Procedure Call Protocol)——远程过程调用协议,是一种通过网络从远程计算机程序上请求服务 ,而不需要了解底层网络技术的协议。它假定某些传输协议的存在 ,如TCP或UDP,以便为通信程序之间携带信息数据。通过它可以使函数调用模式网络化 。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
77
88##RPC工作原理
99
@@ -23,7 +23,7 @@ RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是
2323- 10.客户接收句柄返回的数据
2424
2525##Go RPC
26- Go标准包里面已经支持了RPC ,而且支持三个级别的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是独一无二的RPC,他和传统的RPC系统不一样,Go的客户端只能和Go的服务端交互,因为他们的交互采用了Go的Gob编码 。
26+ Go标准包中已经提供了对RPC的支持 ,而且支持三个级别的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是独一无二的RPC,它和传统的RPC系统不同,它只支持Go开发的服务器与客户端之间的交互,因为在内部,它们采用了Gob来编码 。
2727
2828Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下:
2929
@@ -88,7 +88,7 @@ http的服务端代码实现如下:
8888 }
8989 }
9090
91- 通过上面的例子我们看到我们注册了一个Arith的RPC服务 ,然后通过` rpc.HandleHTTP ` 函数把该服务注册到了HTTP协议上,然后我们就可以利用http的方式来传递数据了。
91+ 通过上面的例子可以看到,我们注册了一个Arith的RPC服务 ,然后通过` rpc.HandleHTTP ` 函数把该服务注册到了HTTP协议上,然后我们就可以利用http的方式来传递数据了。
9292
9393请看下面的客户端代码:
9494
@@ -144,7 +144,7 @@ http的服务端代码实现如下:
144144 Arith: 17*8=136
145145 Arith: 17/8=2 remainder 1
146146
147- 通过上面的调用我们看到参数和返回值是我们定义的结构体,在服务端我们把他们当做调用函数的参数类型 ,在客户端作为` client.Call ` 的参数。客户端最重要的就是这个 ` Call ` 函数,他三个参数,第一个参数是调用对象的函数,第二个参数是传递的参数,第三个参数是返回的参数 (注意是指针类型),通过上面服务端和客户端的代码例子我们发现,写Go的RPC相当的简单,调用也很方便 。
147+ 通过上面的调用可以看到参数和返回值是我们定义的struct类型,在服务端我们把它们当做调用函数的参数的类型 ,在客户端作为` client.Call ` 的第2,3两个参数的类型。客户端最重要的就是这个Call函数,它有3个参数,第1个要调用的函数的名字,第2个是要传递的参数,第3个要返回的参数 (注意是指针类型),通过上面的代码例子我们可以发现,使用Go的RPC实现相当的简单,方便 。
148148###TCP RPC
149149上面我们实现了基于HTTP协议的RPC,接下来我们要实现基于TCP协议的RPC,服务端的实现代码如下所示:
150150
@@ -210,9 +210,9 @@ http的服务端代码实现如下:
210210 }
211211 }
212212
213- 上面这个代码和http的服务器对比,唯一不同的就是这边是采用了TCP ,然后需要自己控制连接,这个连接通知给rpc来处理 。
213+ 上面这个代码和http的服务器相比,不同在于:在此处我们采用了TCP协议 ,然后需要自己控制连接,当有客户端连接上来后,我们需要把这个连接交给rpc来处理 。
214214
215- 而且我们可以发现这是一个阻塞型的单用户的程序 ,如果想要实现多并发,那么可以使用goroutine来实现,我们前面在socket小节的时候已经介绍过如何处理goroutine。
215+ 如果你留心了,你会发现这它是一个阻塞型的单用户的程序 ,如果想要实现多并发,那么可以使用goroutine来实现,我们前面在socket小节的时候已经介绍过如何处理goroutine。
216216下面展现了TCP实现的RPC客户端:
217217
218218 package main
@@ -264,7 +264,7 @@ http的服务端代码实现如下:
264264这个客户端代码和http的客户端代码对比,唯一的区别一个是DialHTTP,一个是Dial(tcp),其他处理一模一样。
265265
266266###JSON RPC
267- JSON RPC是数据编码采用了JSON,而不是gob编码,其他和上面介绍的RPC概念一模一样,下面我们来看Go标准包里面如何实现JSON RPC ,请看服务端代码的实现:
267+ JSON RPC是数据编码采用了JSON,而不是gob编码,其他和上面介绍的RPC概念一模一样,下面我们来演示一下,如何使用Go提供的json-rpc标准包 ,请看服务端代码的实现:
268268
269269 package main
270270
@@ -329,7 +329,7 @@ JSON RPC是数据编码采用了JSON,而不是gob编码,其他和上面介
329329 }
330330 }
331331
332- 我们可以发现上面的代码是基于TCP协议的,目前只支持基于TCP协议的方式,不支持HTTP方式 。
332+ 通过示例我们可以看出 json-rpc是基于TCP协议实现的,目前它还不支持HTTP方式 。
333333
334334请看客户端的实现代码:
335335
@@ -380,7 +380,7 @@ JSON RPC是数据编码采用了JSON,而不是gob编码,其他和上面介
380380 }
381381
382382##总结
383- Go的标准包已经对RPC支持的非常好,这样就可以开发很多分布式的Web应用, 通过上面HTTP、TCP、JSON RPC的实现,我们可以领会到这一点。但唯一遗憾的是目前Go标准包里面不支持SOAP RPC协议,当然第三方开源包有在实现类似的东西,我们也可以找到相应的开源代码 。
383+ Go已经提供了对RPC的良好支持, 通过上面HTTP、TCP、JSON RPC的实现,我们就可以很方便的开发很多分布式的Web应用,我想作为读者的你已经领会到这一点。但遗憾的是目前Go尚未提供对SOAP RPC的支持,欣慰的是现在已经有第三方的开源实现了 。
384384
385385
386386
0 commit comments