RPC(remote process call),中文是远程过程调用的意思。怎么理解这个远程过程调用呢?可以这样理解,可以与本地的过程调用对比下,本地过程调用,也就是调用函数或者是调用方法,比如说,在单体架构中,我们要根据用户的id获取订单信息,我们就需要找到订单service,调用getOrderInfoById(String id)这个方法,这个调用动作这就是本地过程调用,就是调函数,调方法,让某个函数或方法为你服务。但是随着业务的增长以及用户量数据量的增加,这个单体架构就扛不住了,我们就需要对系统进行拆分,把订单模块当作一个服务拆分出去(就是再搞一个项目专门维护用户这块的业务),这时候我们就再获取用的订单信息就不是这么容易了,现在是跨项目了,跨网络了,不能跟以前那样愉快的调用了,但是不要慌,这时候RPC 这个远程过程调用就起到大作用了,它可以做到像调用本地方法或者函数一样调用远程的服务,程序员无需关注它内部是怎么实现的,只需要关注业务就可以了。
在解释RPC是啥的时候咱们也说了,RPC是随着项目细粒度划分出现的,所以它主要是用在解决SOA架构或者微服务架构各个服务之间数据交互或者通信,还拿上面的例子来说,当我把用户模块,与订单模块分成不同的服务的时候,我该用什么通信这两个服务,现在市面上有三种,一种是webservice,第二是restful,第三就是今天的主角RPC了。这个webservice一些老项目中还在用着,属于老古董了,restful风格现在用的挺多的。比如说在java生态中微服务架构的各个服务之间的调用spring官方提供的是基于http协议的restfull风格的工具fegin,再一个就是RPC了,也是现在的主流。其实我们可以发现,RPC主要就是用在垂直架构下各个服务通信的,然后你的单体架构根本用不到,业务全部代码全部堆在一个项目中,想调用谁就调用谁,根本用不到这东西。
垂直架构下到底是选择RPC还是Restful?
我只想说,各有优缺点。。。。
1.速度
RPC:基于tcp协议,速度是非常快的。互联网项目中应用比较多
Restful:基于http协议,是在tcp的基础上又封装了一层。速度较RPC要慢,在传统项目中使用的比较多
2.跨语言
RPC:要实现跨语言,就要序列化方式相同,而且需要开发不同的客户端与服务端,不是说不能做到,只是成本还是比较高的
Restful:restful是一种风格,跨语言很方便
3.成熟度
RPC:RPC落地框架是非常多的,也是非常成熟的,比如说ali的dubbo,grpc等等
Restful:是个restful风格的接口就可以啦
先说一下官方的话术:
一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。
客户端(Client),服务的调用方。
客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
服务端(Server),真正的服务提供者。
服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法。
借用网络上的一张图,它这边还更加细化了(这个图片上加上了网络传输)。
用java来实现上面的RPC:
客户端:java中的客户端就是你的方法调用方,你在哪个服务调用的那个服务就是客户端 ,比如说我在用户服务调用订单服务查询用户的订单(当然这里你得有订单服务的api接口),我可以这样写 OrderService.getOrderListByUid(String id);这样毛病吧。
客户端存根:我们在客户端层面使用的真的是OrderService 吗?no,它只是个公共的接口,而它的实际对象是啥呢,在java中我们可以使用动态代理技术(Proxy,字节码技术也行),来生成代理对象,我们实际的对象就是这个。那我们这个代理对象都干了些啥,一是,获取请求方法名字,参数等信息,封装起来。二是,找到真正提供这个服务的ip与端口,三是,拿着封装的信息,序列化一下,发送网络请求到提供服务的服务器上去
服务器存根:项目服务器一启动,就启动这个RPC服务,监听协定好的端口, 这时候收到了一个请求,就是客户端存根发过来那个,这边需要干什么事情呢,一是反序列化成能看懂的信息 ,二是,使用java 反射技术,对某个类的某个方法进行反射执行。三 是封装执行结果进行返回去。
服务器:这边就很简单了,只需要提供具体的服务提供实现类就行了,供服务器存根使用反射调用,并返回执行结果。
我只能说两个字 简单 ,非常简单
适合RPC的初学者,你上来搞搞dubbo源码试试,根本啃不动,dubbo加上单元测试啥的小10w行代码,这你怎么搞,里面弯弯绕绕的,直接搞晕了,不适合初学者。
但是xxl-rpc与dubbo的代码量比起来就是大巫见小巫了,框架虽小,但是五脏俱全,这种代码量的框架看起来会更舒服一些,能够瞬间搞懂RPC的实际落地,让你瞬间柳暗花明又一村。
在xxl-rpc 中你能学到什么?
1.服务调用者是怎么实现的
2.服务提供者是怎么提供服务的
3.不同的调用方式
4.不同的序列化方式
5.不同的底层通信方案
6.zk作为注册中心是怎样服务注册与发现的
7.模块化开发
8.优秀的代码设计
本文地址:http://lianchengexpo.xrbh.cn/quote/8284.html 迅博思语资讯 http://lianchengexpo.xrbh.cn/ , 查看更多