RPC与gRPC的使用<一>

1 篇文章 0 订阅

RPC工作原理

  1. ClientStub:作为本地代理,暴露远程接口
  2. ServerStub:作为调用者在远程主机中的代理,代理客户端调用本地方法,并把结果返回给客户端。此模块又叫skeleton,相当于CS模式中的服务器端,要先于客户端运行,并且在某个socket端口监听。
  3. 这两个模块之间依靠socket进行通信。

RPC一些问题

RPC为什么存在?

一个模板的实现需要调用另一个模板的功能,但是两者不好写在一起,所以使用RPC。
更好的协同开发。
更好的业务拓展。

RPC和http、socket的关系?

RPC和http、socket并无必然关系,RPC的底层可以使用http或者soket实现。http是网络层的协议,socket是传输层的协议。

RPC优化的主要途径?

  1. 数据序列化的算法的提升 serialization 序列化
  2. 网络IO机制的提升

序列化过程

  1. 对象序列化的作用
     对象持久化(通常情况下,程序结束,对象消失,序列化可以将对象保存在文件中,下次运行时可以恢复对象)
     对象复制(对象可以通过序列化保存在内存中,以此制造出多个对象的副本,BtyeArrayInputStream[ ] 或者 ByteArrayOutputStream[ ])
     对象传输(通过序列化将对象转化为字节流之后,可以通过网络发送给其他的java程序)

  2. Java序列化基本要点
     对象想要序列化,则对象所在的类必须实现serializable接口
     对象序列化用到两个流ObjectInputStream ObjectOutputStream:
    前者有writeObject方法,后者有readObject方法。
    前者负责序列化对象信息的输出,后者负责读入序列化对象信息,即反序列化。
    后者使用时,初始化应该指输出的目的地址,参数可以是字节文件输出流FileOutputStream对象或者字节数组输出流ByteArrayOutputStream对象。
     两种序列化方向:将对象序列化后存进文件中。将对象序列化后存进内存中。
    内存需要使用ByteArrayInputStream来存入,ByteArrayOutputStram来读出。


java Grpc实现过程

  1. 使用maven构建工程,将所需要的依赖写进POM文件。
  2. 使用IDL定义接口语言,文件后缀为.proto,这个文件中定义了自己需要的函数接口和数据类型。
    文件具体书写格式:

头部信息(主要是设置编码格式,转化成另一种语言的一些操作,例如可以设置成将转化成的java文件放在自己指定的文件夹内)

定义自己的服务:

Service {name} {
填充自己想要的远程调用接口
rpc func1 ( para.1 ) returns ( para.2 ){}
rpc func2 ( para.A ) retruns ( para.B ){}
}

定义服务中涉及到的参数具体类型:

Message para.1{
Int32 ID = 1; //每个参数都需要指明其在参数对象中的位置
String Name = 2;
}

Message sigle_type{
	Int32 ID = 1;

}

Message para.2{
Repeated sigle_type arr = 1; //使用repeated 关键词定义数组类型的变量。
//在java中,客户端需要用迭代器遍历,服务端需//要将构造好的List当作参数传入。
}

  1. 书写好.proto文件之后,使用maven编译该文件,在target目录中得到生成的java文件(我采用的是java语言)。此时这些文件中包含了你在传输中需要用到的参数类型。比如上面定义的para.1等,可以直接使用这些类的对象来构造参数。
  2. 将生成的java文件分别复制到客户端和服务端。下面就可以分客户端和服务端来进行不同开发。

服务端:

  1. 新建一个类,继承
    {NAME}ServiceGrpc.{NAME}ServiceImplBase
    可以在此类中重写自己定义的方法,也就是服务端需要暴漏给客户端的接口。
    在书写的过程中,普通的处理过程是:
    读取客户端的参数对象,构造服务端的参数对象,将参数对象放进监听流,调用onNext()来将服务端响应送回客户端,onCompleted()来通知服务端自己已经完成了客户端的此次响应。
  2. 新建一个类,在此类中需要绑定服务端的服务接口,并将服务端的服务暴漏出来,运行(start())。

客户端:

  1. 新建一个类,用来定义自己需要的请求方法。
  2. 新建一个类,用来连接服务端和生成界面逻辑。
    连接服务端的时候,java中需要定义一个管道对象,该管道对象初始化的时候需要传入服务端的IP和port。
    而后在客户端建立stub,建立stub的时候需要将刚刚生成的管道对象当作参数传入,stub代替客户端与服务端通信,调用服务端服务,服务端给出的返回信息会直接在返回参数中,所以只需要指定对应类型的对象来接收返回的参数就可以。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值