1,RPC介绍
随着计算机技术的发展和需求场景的变化,有时就需要从一台计算机上执行另外一台计算机上的程序的需求。
重点的两个点:能否快速在各个服务器之间建立起连接、序列化和反序列化机制快不快;
框架很多:Dubbo、HSF、谷歌开源的gRPC、Apache的Thrift、新浪微博的Montan等;
RPC(Remote Procedure Call Protocol)远程过程调用协议。跨越了物理服务器的限制,在网络中完成。
RPC调用过程描述:Client-Server
-
1、C调用本地客户端Stub程序,调用想要使用的功能方法名;
-
2、客户端Stub程序接收请求,将客户端请求调用的方法名,携带的参数等信息做序列化操作,并打包成数据包。
-
3、客户端Stub查找到远程服务器程序的IP,调用Socket通信协议,通过网络发送给服务端。
-
4、服务端Stub程序接收到信息,并通过约定好的协议将数据进行反序列化,得到请求的方法名和请求参数等信息。
-
5、服务端Stub程序准备相关数据,调用本地Server对应的功能方法进行,并传入相应的参数,进行业务处理。
-
6、S根据业务逻辑执行调用过程,待业务执行结束,将执行结果返回给服务端Stub程序。
-
7、服务端Stub程序序列化结果,通过网络发送回客户端Stub程序。
-
8、客户端Stub程序接收到服务端Stub的返回数据,反序列化,并传递给客户端请求发起者。
-
9、C请求发起者得到调用结果,整个RPC调用过程结束。
**序列化:**把对象转换为字节序列的过程称为对象的序列化,编码过程。
**反序列化:**把字节序列恢复为对象的过程称为对象的反序列化,也解码过程。
2,RPC实例Demo(net/rpc)
服务端:net/rpc包
package main
import (
"math"
"net/rpc"
"net"
"net/http"
)
//数学计算
type MathUtil struct {
}
//该方法向外暴露:提供计算圆形面积的服务
func (mu *MathUtil) CalculateCircleArea(req float32, resp *float32) error {
*resp = math.Pi * req * req //圆形的面积 s = π * r * r
return nil //返回类型
}
//main 方法
func main() {
//1、初始化指针数据类型
mathUtil := new(MathUtil) //初始化指针数据类型
//2、调用net/rpc包的功能将服务对象进行注册
err := rpc.Register(mathUtil)
if err != nil {
panic(err.Error())
}
//3、把mathUtil中提供的服务注册到HTTP协议上,方便调用者可以利用http的方式进行数据传递
rpc.HandleHTTP()
//4、在特定的端口进行监听
listen, err := net.Listen("tcp", ":8081")
if err != nil {
panic(err.Error())
}
http.Serve(listen, nil)
}
客户端:在服务端是通过Http的端口监听方式等待连接的,因此在客户端就需要通过http连接,首先与服务端实现连接。
客户端连接服务端
client, err := rpc.DialHTTP("tcp", "localhost:8081")
if err != nil {
panic(err.Error())
}
远端方法调用
客户端成功连接服务端以后,就可以通过方法调用调用服务端的方法,具体调用方法如下:
var req float32 //请求值
req = 3
var resp *float32 //返回值
err = client.Call("MathUtil.CalculateCircleArea", req, &resp)
if err != nil {
panic(err.Error())
}
fmt.Println(*resp)
上述的调用方法核心在于client.Call方法的调用,该方法有三个参数,第一个参数表示要调用的远端服务的方法名,第二个参数是调用时要传入的参数,第三个参数是调用要接收的返回值。
异步调用代码实现如下:
var respSync *float32
//异步的调用方式
syncCall := client.Go("MathUtil.CalculateCircleArea", req, &respSync, nil)
replayDone := <-syncCall.Done
fmt.Println(replayDone)
fmt.Println(*respSync)
---------------------------------20200505---------------------------------------------
通信的协议http、rpc
RPC是一个技术思想,不是规范。就像调用本地的函数去调用远程函数。
核心就是通讯+序列化
Dubbo 高性能轻量级的远程RPC框架。
非入侵式,spring声明来暴露服务。
Dubbo只是一个Jar包,DubboAdmin是一个监控工具,看哪些服务被消费了,Zookpeer是一个注册中心!