fixed markdown format

This commit is contained in:
yetist
2012-10-28 21:00:50 +08:00
parent c3abc9b6c7
commit 81a61b9ced
59 changed files with 280 additions and 280 deletions

14
8.4.md
View File

@@ -1,11 +1,11 @@
#8.4 RPC
# 8.4 RPC
前面几个小节我们介绍了如何基于Socket和HTTP来编写网络应用通过学习我们了解了Socket和HTTP采用的是类似"信息交换"模式,即客户端发送一条信息到服务端,然后(一般来说)服务器端都会返回一定的信息以表示响应。客户端和服务端之间约定了交互信息的格式,以便双方都能够解析交互所产生的信息。但是很多独立的应用并没有采用这种模式,而是采用类似常规的函数调用的方式来完成想要的功能。
RPC就是想实现函数调用模式的网络化。客户端就像调用本地函数一样然后客户端把这些参数打包之后通过网络传递到服务端服务端解包到处理过程中执行然后执行的结果反馈给客户端。
RPCRemote Procedure Call Protocol——远程过程调用协议是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议。它假定某些传输协议的存在如TCP或UDP以便为通信程序之间携带信息数据。通过它可以使函数调用模式网络化。在OSI网络通信模型中RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
##RPC工作原理
## RPC工作原理
![](images/8.4.rpc.png?raw=true)
@@ -22,7 +22,7 @@ RPCRemote Procedure Call Protocol——远程过程调用协议是一
- 9.客户句柄由内核接收消息
- 10.客户接收句柄返回的数据
##Go RPC
## Go RPC
Go标准包中已经提供了对RPC的支持而且支持三个级别的RPCTCP、HTTP、JSONRPC。但Go的RPC包是独一无二的RPC它和传统的RPC系统不同它只支持Go开发的服务器与客户端之间的交互因为在内部它们采用了Gob来编码。
Go RPC的函数只有符合下面的条件才能被远程访问不然会被忽略详细的要求如下
@@ -40,7 +40,7 @@ T、T1和T2类型必须能被`encoding/gob`包编解码。
任何的RPC都需要通过网络来传递数据Go RPC可以利用HTTP和TCP来传递数据利用HTTP的好处是可以直接复用`net/http`里面的一些函数。详细的例子请看下面的实现
###HTTP RPC
### HTTP RPC
http的服务端代码实现如下
package main
@@ -145,7 +145,7 @@ http的服务端代码实现如下
Arith: 17/8=2 remainder 1
通过上面的调用可以看到参数和返回值是我们定义的struct类型在服务端我们把它们当做调用函数的参数的类型在客户端作为`client.Call`的第23两个参数的类型。客户端最重要的就是这个Call函数它有3个参数第1个要调用的函数的名字第2个是要传递的参数第3个要返回的参数(注意是指针类型)通过上面的代码例子我们可以发现使用Go的RPC实现相当的简单方便。
###TCP RPC
### TCP RPC
上面我们实现了基于HTTP协议的RPC接下来我们要实现基于TCP协议的RPC服务端的实现代码如下所示
package main
@@ -263,7 +263,7 @@ http的服务端代码实现如下
这个客户端代码和http的客户端代码对比唯一的区别一个是DialHTTP一个是Dial(tcp),其他处理一模一样。
###JSON RPC
### JSON RPC
JSON RPC是数据编码采用了JSON而不是gob编码其他和上面介绍的RPC概念一模一样下面我们来演示一下如何使用Go提供的json-rpc标准包请看服务端代码的实现
package main
@@ -379,7 +379,7 @@ JSON RPC是数据编码采用了JSON而不是gob编码其他和上面介
}
##总结
## 总结
Go已经提供了对RPC的良好支持通过上面HTTP、TCP、JSON RPC的实现,我们就可以很方便的开发很多分布式的Web应用我想作为读者的你已经领会到这一点。但遗憾的是目前Go尚未提供对SOAP RPC的支持欣慰的是现在已经有第三方的开源实现了。