深度解析xxl-rpc之RPC原理

深度解析xxl-rpc之RPC原理一.什么是RPC?RPC(remoteprocesscall),中文是远程过程调用的意思。怎么理解这个远程过程调用呢?可以这样理解,可以与本地的过程调用对比下,本地过程调用,也就是调用函数或者是调用方法,比如说,在单体架构中,我们要根据用户的id获取订单信息,我们就需要找到订单service,调用getOrderInfoById(Stringid)这个方法,这个调用动作这就是本地过程调…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

一.什么是RPC?

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主要就是用在垂直架构下各个服务通信的,然后你的单体架构根本用不到,业务全部代码全部堆在一个项目中,想调用谁就调用谁,根本用不到这东西。

三.Restful与RPC

垂直架构下到底是选择RPC还是Restful?

我只想说,各有优缺点。。。。

1.速度

RPC:基于tcp协议,速度是非常快的。互联网项目中应用比较多

Restful:基于http协议,是在tcp的基础上又封装了一层。速度较RPC要慢,在传统项目中使用的比较多

2.跨语言

RPC:要实现跨语言,就要序列化方式相同,而且需要开发不同的客户端与服务端,不是说不能做到,只是成本还是比较高的

Restful:restful是一种风格,跨语言很方便

3.成熟度

RPC:RPC落地框架是非常多的,也是非常成熟的,比如说ali的dubbo,grpc等等

Restful:是个restful风格的接口就可以啦

四.RPC原理

先说一下官方的话术:

一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。

客户端(Client),服务的调用方。

客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。

服务端(Server),真正的服务提供者。

服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法。

借用网络上的一张图,它这边还更加细化了(这个图片上加上了网络传输)。

深度解析xxl-rpc之RPC原理

用java来实现上面的RPC:
客户端:java中的客户端就是你的方法调用方,你在哪个服务调用的那个服务就是客户端 ,比如说我在用户服务调用订单服务查询用户的订单(当然这里你得有订单服务的api接口),我可以这样写 OrderService.getOrderListByUid(String id);这样毛病吧。

客户端存根:我们在客户端层面使用的真的是OrderService 吗?no,它只是个公共的接口,而它的实际对象是啥呢,在java中我们可以使用动态代理技术(Proxy,字节码技术也行),来生成代理对象,我们实际的对象就是这个。那我们这个代理对象都干了些啥,一是,获取请求方法名字,参数等信息,封装起来。二是,找到真正提供这个服务的ip与端口,三是,拿着封装的信息,序列化一下,发送网络请求到提供服务的服务器上去

服务器存根:项目服务器一启动,就启动这个RPC服务,监听协定好的端口, 这时候收到了一个请求,就是客户端存根发过来那个,这边需要干什么事情呢,一是反序列化成能看懂的信息 ,二是,使用java 反射技术,对某个类的某个方法进行反射执行。三 是封装执行结果进行返回去。

服务器:这边就很简单了,只需要提供具体的服务提供实现类就行了,供服务器存根使用反射调用,并返回执行结果。

五.为啥要选择xxl-rpc?

我只能说两个字 简单 ,非常简单

适合RPC的初学者,你上来搞搞dubbo源码试试,根本啃不动,dubbo加上单元测试啥的小10w行代码,这你怎么搞,里面弯弯绕绕的,直接搞晕了,不适合初学者。

但是xxl-rpc与dubbo的代码量比起来就是大巫见小巫了,框架虽小,但是五脏俱全,这种代码量的框架看起来会更舒服一些,能够瞬间搞懂RPC的实际落地,让你瞬间柳暗花明又一村。

在xxl-rpc 中你能学到什么?

1.服务调用者是怎么实现的

2.服务提供者是怎么提供服务的

3.不同的调用方式 

4.不同的序列化方式

5.不同的底层通信方案

6.zk作为注册中心是怎样服务注册与发现的

7.模块化开发

8.优秀的代码设计

….

官方网站:http://www.xuxueli.com/xxl-rpc/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230737.html原文链接:https://javaforall.net

(0)
上一篇 2025年6月19日 上午7:01
下一篇 2025年6月19日 上午7:43


相关推荐

  • idea设置删除一行快捷键_删除空白页快捷键

    idea设置删除一行快捷键_删除空白页快捷键IDEA删除当前一行快捷键默认是Ctrl+Y但是有时候会和反撤销键冲突,所以还是自己设置一下也可以自定义双击选中输入框,在键盘上按下ctrl+y就可以了。然后点击OK就可以了当然你也可以直接使用Ctrl+X剪切的快捷键,也是可以充当删除当前行的快捷键…

    2025年9月29日
    6
  • 如何使用eclipse运行一个简单的java程序

    如何使用eclipse运行一个简单的java程序1 打开 eclipse 选择 file new Javaproject nbsp 2 为我们的 java 项目取一个名字 然后点击完成 3 nbsp 这时候左侧列表就有了我们刚才新建的 java 项目 点开项目 在 src 目录下新建一个 class 4 nbsp 在弹框中 填写我们 jave 程序的名字 选择完成 5 nbsp 这里编写一个简单的 java 程序为例 Ctrl s 保存

    2026年3月16日
    2
  • 微信默认表情符号的代码对照表(微信公众号使用到)

    微信默认表情符号的代码对照表(微信公众号使用到)先给大家推荐几个好玩的微信昵称工具 微信上标电话号码生成器 微信下划线昵称生成器 微信彩色昵称生成器在微信用户可以发送表情符号 如下图 这些符号公众平台是将其处理成文本 下面就列出微信默认表情符号代码对照表 表情图片 字符串代码 替换关键字 微笑 伤心 B 美女

    2026年3月17日
    3
  • C语言逗号运算符_c语言逗号运算符优先级最低

    C语言逗号运算符_c语言逗号运算符优先级最低逗号也是运算符?是的,但是其实我更愿意说它是分隔符。在C语言中我们就经常使用逗号,看似逗号是非常平凡的分隔符,但是它关联到一个你必须知道但可能未曾思考的小知识:理论上,每条语句(分号结束),最终都会转换成一个值。例子1:#include<stdio.h>intmain(){ 3,4,5;//这是一条语句 //把上面这条语句的值赋值给变量a inta=(3,4,5); printf(“a=%d\n”,a);}输出结果:a=5因为a的值是整条语句的值,

    2025年7月15日
    7
  • 【程序人生】程序员接私活常用平台汇总

    【程序人生】程序员接私活常用平台汇总00 目录文章目录 00 目录 01 前言 02 程序员客栈 03 码市 04 猪八戒网 05 开源众包 06 智城外包网 07 实现网 08 猿急送 09 人人开发 10 开发邦 11 电鸭社区 12 快码 13 英选 14 Upwork15 Freelancer16 Dribbble17 Remoteok18 Toptal19 AngelList20 Topcoder21

    2026年3月18日
    2
  • Servlet–HttpServlet实现doGet和doPost请求的原理

    Servlet–HttpServlet实现doGet和doPost请求的原理Servlet–HttpServlet实现doGet和doPost请求的原理更多原创性能测试文章关注十年性能测试专家&7DGroup公众号一、HttpServlet简介1、HttpServlet是GenericServlet的子类,又是在Generi…

    2025年7月27日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号