RPC很是重要,不少人面试的时候都挂在了这个地方!你要是还不懂RPC是什么?他的基本原理是什么?你必定要把下边的内容记起来!好好研究一下!特别是文中给出的一张关于RPC的基本流程图,重点中的重点,Dubbo RPC的基本执行流程就是他,RPC框架的基本原理也是他,别说我没告诉你!看了下边的内容你要掌握的内容以下,固然还有不少:前端
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已没法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。程序员
一、单一应用架构面试
当网站流量很小时,只需一个应用,将全部功能都部署在一块儿,以减小部署节点和成本。此时,用于简化增删改查工做量的数据访问框架(ORM) 是关键。sql
二、垂直应用架构编程
当访问量逐渐增大,单一应用增长机器带来的加速度愈来愈小,将应用拆成互不相干的几个应用,以提高效率。此时,用于加速前端页面开发的 Web框架(MVC) 是关键。安全
三、分布式服务架构服务器
当垂直应用愈来愈多,应用之间交互不可避免,将核心业务抽取出来,做为独立的服务,逐渐造成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。网络
此时,用于提升业务复用及整合的分布式服务框架(RPC),提供统一的服务是关键。架构
例如:各个团队的服务提供方就不要各自实现一套序列化、反序列化、网络框架、链接池、收发线程、超时处理、状态机等“业务以外”的重复技术劳动,形成总体的低效。并发
PS: 其实上述三个缘由也是为何要有Dubbo的缘由!不信你去Dubbo官网去看!
四、流动计算架构
PS:这个属于扩展内容,摘自Dubbo官网,属于架构演进的一个过程
当服务愈来愈多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增长一个调度中心基于访问压力实时管理集群容量,提升集群利用率。此时,用于提升机器利用率的资源调度和治理中心(SOA)是关键。
五、另一个缘由
就是由于在几个进程内(应用分布在不一样的机器上),没法共用内存空间,或者在一台机器内经过本地调用没法完成相关的需求,好比不一样的系统之间的通信,甚至不一样组织之间的通信。此外因为机器的横向扩展,须要在多台机器组成的集群上部署应用等等。
因此,统一RPC框架来解决提供统一的服务。
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。简言之,RPC使得程序可以像访问本地系统资源同样,去访问远端系统资源。比较关键的一些方面包括:通信协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。
简单的说,RPC就是从一台机器(客户端)上经过参数传递的方式调用另外一台机器(服务器)上的一个函数或方法(能够统称为服务)并获得返回的结果。
一个基本的RPC架构里面应该至少包含如下4个组件:
具体调用过程:
而RPC框架的实现目标则是将上面的第2-10步无缺地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感受上像调用本地服务同样的调用远程服务。
一、REST
能够看着是HTTP协议的一种直接应用,默认基于JSON做为传输格式,使用简单,学习成本低效率高,可是安全性较低。
二、SOAP
SOAP是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。而SOAP能够看着是一个重量级的协议,基于XML、SOAP在安全方面是经过使用XML-Security和XML-Signature两个规范组成了WS-Security来实现安全控制的,当前已经获得了各个厂商的支持 。
它有什么优势?简单总结为:易用、灵活、跨语言、跨平台。
三、SOA
面向服务架构,它能够根据需求经过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,能够直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
SOA是一种粗粒度、松耦合服务架构,服务之间经过简单、精肯定义接口进行通信,不涉及底层编程接口和通信模型。SOA能够看做是B/S模型、XML(标准通用标记语言的子集)/Web Service技术以后的天然延伸。
四、REST 和 SOAP、RPC 有何区别呢?
没什么太大区别,他们的本质都是提供可支持分布式的基础服务,最大的区别在于他们各自的的特色所带来的不一样应用场景 。
一、动态代理
生成Client Stub(客户端存根)和Server Stub(服务端存根)的时候须要用到Java动态代理技术,可使用JDK提供的原生的动态代理机制,也可使用开源的:CGLib代理,Javassist字节码生成技术。
二、序列化和反序列化
在网络中,全部的数据都将会被转化为字节进行传送,因此为了可以使参数对象在网络中进行传输,须要对这些参数进行序列化和反序列化操做。
目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。
三、NIO通讯
出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,所以咱们须要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。能够选择Netty或者MINA来解决NIO数据传输的问题。
四、服务注册中心
可选:Redis、Zookeeper、Consul 、Etcd。通常使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)。
**PS:**这张图很是重点,是PRC的基本原理,请你们必定记住!
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,因为不在一个内存空间,不能直接调用,须要经过网络来表达调用的语义和传达调用的数据。
好比说,A服务器想调用B服务器上的一个方法:
User getUserByName(String userName)
2.一、从服务提供者的角度看:
当服务提供者启动的时候,须要将本身提供的服务注册到指定的注册中心,以便服务消费者可以经过服务注册中心进行查找;
当服务提供者因为各类缘由导致提供的服务中止时,须要向注册中心注销中止的服务;
服务的提供者须要按期向服务注册中心发送心跳检测,服务注册中心若是一段时间未收到来自服务提供者的心跳后,认为该服务提供者已经中止服务,则将该服务从注册中心上去掉。
2.二、从调用者的角度看:
服务的调用者启动的时候根据本身订阅的服务向服务注册中心查找服务提供者的地址等信息;
当服务调用者消费的服务上线或者下线的时候,注册中心会告知该服务的调用者;
服务调用者下线的时候,则取消订阅。
3.一、序列化
当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息须要经过底层的网络协议如TCP传输到B机器,因为网络协议是基于二进制的,全部咱们传输的参数数据都须要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。而后经过寻址操做和网络传输将序列化或者编组以后的二进制数据发送给B机器。
3.二、反序列化
当B机器接收到A机器的应用发来的请求以后,又须要对接收到的参数等信息进行反序列化操做(序列化的逆操做),即将二进制信息恢复为内存中的表达方式,而后再找到对应的方法(寻址的一部分)进行本地调用(通常是经过生成代理Proxy去调用,
一般会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),以后获得调用的返回值。
B机器进行本地调用(经过代理Proxy和反射调用)以后获得了返回值,此时还须要再把返回值发送回A机器,一样也须要通过序列化操做,而后再通过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值以后,则再次进行反序列化操做,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(通常是业务逻辑处理操做)。
一般,通过以上四个步骤以后,一次完整的RPC调用算是完成了,另外可能由于网络抖动等缘由须要重试等。
分享免费学习资料
针对于还会准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)
为何某些人会一直比你优秀,是由于他自己就很优秀还一直在持续努力变得更优秀,而你是否是还在知足于现状心里在窃喜!但愿读到这的您能转发和关注下,之后还会更新技术干货,谢谢您的支持!
下面是部分资料截图,诚意满满:特别适合有1-5年开发经验的Java程序员们学习。
资料免费领取方式:加入合做Java架构学习交流Qqun:277763288,管理员处免费领取资料。
资料免费领取方式:加入合做Java架构学习交流Qqun:277763288,管理员处免费领取资料。