RPC-原理和组成

   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是一个注册中心!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Thompson

相互学习,欢迎指正。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值