RPC全称Remote Procedure Call,即远程过程调用。其本质上其实就是主机A通过某种网络协议向支持相同协议的主机B发送一个任务执行命令,并且在某些情况下,还能支持任务执行结果的返回。

几乎每一个RPC都有着自己的网络协议定义,如果要按照TCP/IP协议栈划分,这些RPC协议通HTTP/HTTPS协议一样属于应用层协议,不过相比较于HTTP/HTTPS协议来说,RPC协议在功能和性能之间更偏重与性能,即RPC框架是一种高性能的网络通信框架。

RPC通信单独来说只是一种高性能的网络通信技术,和http相比除了快和简单并没有任何更为出采的地方,更不可能取代http在网络通信中的地位。但是技术是要服务于架构的,只有在特定的场景下才能发挥其长处,在实际开发中,RPC框架多用于微服务架构中。

微服务是近些年才提出的概念,至于什么是微服务,在我查阅了许多资料之后也并没有找到让人豁然开朗的定义。要想了解什么是微服务,还是要看一下Java服务端开发的演变过程才能够有一个浅显的认识。

Java服务端开发在早期多指B/S架构下的JavaWeb应用程序开发。开发者遵循Servlet规范将开发好的JavaWeb程序打包成war包运行在支持http/https协议的Servlet容器中,比如tomcat,jetty等。而且当时互联网用户还比较少,JavaWeb应用程序还都比较简单,一般就是一台机器,如果挂了就人工重启。

随着时代的发展,互联网用户越来越多,网站的并发访问量也越来越大,一台机器已经无法满足我们的需求了,就产生了集群的概念。集群简单来说就是一群运行着相同程序的服务器,这群服务器对外提供的可能只是一个域名或者反向代理的机器地址,至于网站到底有多少服务器以及用户到底访问的是哪台服务器,用户是无感知的。

随着用户变得更多,集群愈发的庞大,我们每一次更新功能都需要将应用重新发布在所有服务器上,哪怕我们仅仅是改了一个数据库的地址。而且当应用越来越复杂时,代码体积也会越来越庞大,每一次重新运行都需要停机很长时间。对于一些用户量特别多且与金钱密切相关的系统中,这是我们不能接受的,其中最典型的就是电商。

为了改善上面的痛点,架构师根据业务自身的特性将整个系统拆分成一个个的小的系统,比如对于用户身份验证有专门的登录系统,购物车有专门的购物车系统,这些独立的功能各自有各自的实现,但应用最终组合起来依然满足业务的需求,而且解决了上述痛点,这各阶段应该叫做应用切分

应用切分虽然解决了应用臃肿的问题,但由于应用之间是互相独立的,所以有些本来相同的业务代码变得不可复用,比如在应用切分中,购物车系统和支付系统都需要订单系统的支持。但是由于代码不是共用的,在购物车系统和支付系统中都有着一套和订单系统进行交互的业务代码,比如http请求接口,数据转换等。

为了解决在 应用切分钟,系统间代码冗余度过高的问题,服务化架构出现了。在服务化架构中,系统依然被拆分为多个应用,但与此同时, 应用与应用之间相互冗余的部分也被抽取出来了,作为一个服务单独存在。比如上面讲到的购物车系统和支付系统中查询订单的业务代码,被提取出来作为一个订单查询服务而单独存在。

而服务化又带来了新的痛点。服务之间相互依赖,一个服务既可以作为Provider对外提供功能,又需要作为Consumer来依靠其他服务的实现,所以需要进行服务的治理。然而应用并不关心服务治理的细节,更不关心服务到底提供哪些功能。比如在APP上要实现一个下单成功的功能,总不能在APP客户端既要调用订单系统的服务去更新订单,又要调用购物车系统提供的服务去更新购物车吧。而是只需要一个API,调用成功就表示用户成功支付,订单已完成。而这一的一个个应用层之间使用的API,也可以被应用层看做一个个的服务,这就是微服务架构。其中用来对这些微服务中的API进行统一管理的模块通常被称为网关。

在微服务和服务化架构中,不同的服务之间想要互相通信就只能通过网络,而系统之所以被做成服务化,其中一条主要的原因就是因为访问量巨大,所以不同的功能模块之间的网络通信是一个极其频繁的事情。HTTP协议作为一个功能强大的网络通信协议,随之带来的问题是开销太大,用在微服务架构下过犹不及。因此,RPC通信协议产生了,协议简单随之而来的是性能优越。

早在Java1.2的时候,JDK就提供了RPC功能——RMI

RMI的使用起来也很简单,只需要定义一个服务的提供者,服务的调用者以及服务的具体实现:

服务的调用者

整体结构很简单,服务提供者通过LocateRegistry注册实现了Remote接口的服务。服务的调用者通过Naming,根据服务的地址返回服务的实现类注册的实例,然后服务调用方就可以在本地使用这个实例实现功能了。运行结果如下:

Rmi底层也是通过TCP协议实现的,我们可以在系统监控中看到Provider监听了12345这个端口:

监听
建立tcp连接

我们可以通过Wireshark抓包来看下Rmi协议交互的基本流程。因为Provider和Caller都在本地,由于底层优化,流量不会通过网卡,所以Wireshark是抓不到包的,可以装一个npcap工具就行了:

wireshark如何抓取本机包 - Avatarx - 博客园​www.cnblogs.com

之后在Wireshark中使用Npcap的网卡适配器就能抓到本地数据了

可以看到最长的一个数据包长达328个字节,即使数据看起来应该经过了特殊处理,还是能够看到其返回的应该是服务实现类实例的一个代理:

不过由于RMI底层是通过BIO来实现的,必然无法应用在复杂场景下,所以一些基于NIO的RPC框架产生了,比较典型的有阿里巴巴的Dubbo、HSF,Spring的Spring Cloud等。

rpc 服务器不可用_RPC和微服务相关推荐

  1. rpc wmi 服务不可用_在Windows上修复“RPC服务器不可用”的方法

    关注奕奇科技,学习更多小妙招,工作效率加倍小妙招,值得收藏 RPC服务器,是指Remote Procedure Call Protocol,中文释义为(RFC-1831)远程过程调用协议:一种通过网络 ...

  2. rpc wmi 服务不可用_“RPC服务器不可用”使用WMI查询

    我有一个运行Server 2008 R2的Web服务器工作组,我试图管理一个检查所有这些磁盘空间的脚本.几个月前,我在设置服务器时设置了这一点,我相信它工作正常.现在我去检查,它给出了一个错误,说&q ...

  3. 【RPC服务器不可用】解决方法

    发生[RPC服务器不可用]的情况,可以先去看下DC(域控)的服务下[COM+ Event System]和[Computer Browser]服务是否启动,如果已经启动,restart一下,也许就能解 ...

  4. win7系统安装信息服务器不可用怎么办,win7系统提示rpc服务器不可用怎么办

    很多时候我们先要在netsh命令中添加ip地址或者安装打印机的时候,发现电脑会提示:rpc服务器不可用,虽然这个问题很常见,不过很多用户都不知道怎么解决,那么win7系统提示rpc服务器不可用怎么办呢 ...

  5. 网络打印机 RPC服务器不可用

    RPC服务器不可用,是指没有调取到打印机. 一种可能是打印的服务没有开启,另一种可能是网络打印机无法连接. 1.原因一:目标打印机名称等可能发生改变,导致网络上远程无法连接该打印机. 如果是打印机无法 ...

  6. 使用wmi显示rpc服务器不可用,详解WMI RPC 服务器不可用的解决方案

    本文介绍了详解wmi rpc 服务器不可用的解决方案,分享给大家,具体如下: connectionoptions connectionoptions = new connectionoptions() ...

  7. 电脑无限重启rpc服务器不可用,StarUML启动时候出现System Error. Code:1722. RPC服务器不可用.错误的解决办法...

    评论 # re: StarUML启动时候出现"System Error. Code:1722. RPC服务器不可用."错误的解决办法 2010-01-30 11:47 s love ...

  8. 打印机显示rpg服务器不可用,网络打印机“RPC服务器不可用”的终极解决办法

    今天打印文件遇到下面两个问题: 问题一:打印Excel文件时提示:无法打印.微软给出三条建议:1.内存不够2.驱动不正确3.电缆松动: 问题二:打印CAD的dwg图形时:提示RPC服务器不可用. 解决 ...

  9. rpc服务器进不了系统,Win7系统RPC服务器不可用怎么解决?

    最近有Win7系统用户反映,在安装打印机或者虚拟磁盘时,系统总是会弹出提示"RPC服务器不可用",用户并不知道这是怎么回事,也不知道该怎么解决,为此非常苦恼.那么,Win7系统RP ...

最新文章

  1. 【仿去哪儿登录】UITextField输入时检查输入框是否为空
  2. 机器学习从Python 2迁移到Python 3,你需要注意的一些事……
  3. Windows Phone 8 开发资源汇总
  4. 【HihoCoder - 1850】字母去重 (字符串,思维)
  5. 初学JAVA,javaoo小结
  6. Setting Expires and Cache-Control: max-age headers for static resources in ASP.NET
  7. php微框架 flight源码阅读
  8. Android 样式
  9. win10访问不了win7文件服务器,win7系统无法访问win10系统的共享文件的解决方法
  10. mysql 嵌入式linux版本_PHP专栏 : MySQL 数据库安装详细
  11. c语言画简谐振动图像,[求助] 实心小球沿正弦曲线运动
  12. 爬取网易云音乐个人动态中的视频(Ⅱ): 分析并获取api
  13. 变频器维修-丹佛斯变频器常见报警故障代码排除
  14. oracle rac mpp,DB2 purescale vs Oracle RAC
  15. 巴贝奇的差分机与分析机
  16. 定向光和天空盒(个人笔记)
  17. 关于服务被挖矿程序minerd入侵解决方法
  18. java boxplot_【gloomyfish】数据分析之 – 离群值(Outliers) BoxPlot
  19. vdo虚拟存储器简介及创建/删除方法
  20. 迈德威视相机的图像获取

热门文章

  1. c++ qt获取电脑的内存_Qt官方示例-TCP客户端/服务器示例
  2. 二隐层的神经网络实现MNIST数据集分类
  3. 从技术分工的角度来看996.ICU
  4. VS编译器安装Eigen
  5. React基础语法学习
  6. Java加密与解密的艺术~DigestInputStream
  7. oracle表参数,Oracle 表的创建 及相关参数
  8. mysql update nowait_MySQL 8.0新特性 -- nowait以及skip locked
  9. Homework2-project review score of each team
  10. python time智能等待_Python Selenium智能等待