rpc 服务器不可用_RPC和微服务

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的使用起来也很简单,只需要定义一个服务的提供者,服务的调用者以及服务的具体实现:

54fca273e1ebbc5f50d49bb022fc61a9.png

9d72ce4253277b9d857978816a620478.png

513c6a1fed6f1c49f22d3bd3a808ed23.png

005994608cf9a352b2d4b474f0543251.png
服务的调用者

2c5c437755e8372b9c6945d2a93b1b8b.png

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

a761542927458386205476330af083e9.png

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

c219952477bdb48cceec2c529911eb40.png
监听

3a807ae21ffc64f3f71fc5add0aa3940.png
建立tcp连接

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

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

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

506c848bf6a64249ba6ce23d7372c6ab.png

64fe204d34d23c741740c207543052c1.png

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

6000d91ee42f6fddd7c98e573ac20494.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统分析与控制_质量体系文件:测量系统分析控制程序

本公众号知识分享:体系管理、质量管理、书籍教程;国标行标、团标企标;课件教材、系统培训、资料下载、以及部分软件及教程等; 告诉我您的需求,小编随时恭候为您服务!下面让我们一起开启本章内容学习&#x…

python商城源码_自学Python才几天,就成功编写出俄罗斯方块游戏,附自学教程

人们常说,python不适合做游戏,但我偏爱玩游戏,做不了大的,做个小的也行啊。于是,我在自己毫无基础的条件下,用两天时间学python基础理论,再用已有的俄罗斯方块游戏源码和源文件,在我…

matlab 中曲线颜色,matlab曲线颜色样式设置

满意答案南渡江ndj2013.09.03采纳率:43% 等级:12已帮助:19801人你好 这是我总结的画图资料比如画一条蓝色的x号线plot(x,y,bg)画图:线形:-实线 -. 点划线 --长虚线 :短虚线符号 颜色 符号 线形b 蓝 . 点c 青 。 圈g 绿 标记k 黑 - 实线m …

小程序动态class_会后剧透!百度智能小程序的最新动态都在这儿了!

月活突破5亿,入驻智能小程序数量42万。这是百度智能小程序在万象-百度2020移动生态大会上交出的最新成绩单。当天,百度方面还以“生态进化,共创共荣”为主题,召开了智能小程序分论坛。分论坛上,百度特别邀请了百度副总…

matlab qtdecomp,Opencv图像识别从零到精通(25)------区域分裂与合并

区域分割一般认为有漫水填充,区域分裂与合并,分水岭,这篇是中间的区域分裂和合并。区域分裂合并算法的基本思想是先确定一个分裂合并的准则,即区域特征一致性的测度,当图像中某个区域的特征不一致时就将该区域分裂成4个相等的子区域,当相邻的…

去调频体制下的 rd算法_【技术文章】一次调频工作原理及控制 学习1+1

1、基本概念一次调频:PrimaryFrequencyControl。在电网实际运行中,当电量消耗与电量供给不匹配时,即可引起电网频率出现变化较小、变动周期较短的微小分量,这种频率扰动主要靠汽轮发电机组本身的调节系统直接自动调整汽轮机调门完…

蓝牙版本avrcp怎么选_500元内无线蓝牙耳机测评年轻人的第一款廉价蓝牙耳机怎么选?...

这是马克君的第 90 篇对比测评-建议佩戴耳机体验-?- 10款TWS耳机测评 -TWSTrue Wireless Stereo⇩真无线立体声自AirPods问世以来,真无线耳机的概念开始爆火?。虽然AirPods“真香”,但售价也是真滴贵,所以有没有便宜又好用的真无线蓝牙耳机…

数据库查询语句慢如何优化_常见Mysql的慢查询优化方式

1 概念 MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。 具体环境中,运行时间超过long_query_time值的SQL语句,则会被记录到慢查询日志中。 long_query_time的默…

c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于腾讯云,作者:算法与编程之美前言对学算法的同学来说,动态规划是其必学且较为重要的问题之一;…

element ui 多个子组件_vue前端UI框架,一点都不圆润,盘它!

面对众多vue前端UI框架,看着它们干干巴巴、麻麻赖赖的样子,一点都不圆润,跟我一起盘它!Vue移动端UI框架1、Vux(star:15620)VUX(读音 [v’ju:z],同 views)是基于WeUI和Vue(2.x)开发的…

python 图像处理_Python中的十大图像处理工具

文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。来源 | 大数据文摘(BigDataDigest)编译 | 张秋玥、小七、蒋宝尚本文主要介绍了一些简单易懂最常用的 Python 图像处理库。当今世界充满了各种数据&am…

mysqlclient==1.3.7对应mysql版本_「MySQL」CentOs 7 下安装MySQL

MySQLMySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一YUM 安装mysql1、下载 YUM 仓库文件打开网址: https://dev.mysql.com/downloads/…

nginx log response_nginx优化配置大全

很多程序员面试被问到nginx优化做过哪些,因此来记录下配置文件样例为生产环境样例。1、nginx基本优化安装方式有2种:1、源码包安装 2、yum(apt-get)安装区别为如果用yum安装的话,很方便,并且基本不报错。如…

指纹对比软件_iQOO VS 小米9屏幕指纹大对决,这次我为vivo疯狂打Call!

在经历了性能、续航、充电的对比之后,我们今天带来了iQOO和小米9的屏幕指纹对比,看看两者在屏幕指纹方面究竟有何不同的表现。▼屏幕指纹原理目前屏幕指纹技术大致分为光电屏幕指纹和超声波屏幕指纹两种,而iQOO和小米9所采用的都是光电屏幕指…

python绘制3d坐标轴_matplotlib在python上绘制3D散点图实例详解

大家可以先参考官方演示文档: 效果图:3D scatterplotDemonstration of a basic scatterplot in 3D.from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np def randrange(n, vmin, vmax):Helper function to mak…

翻转链表python递归_Python实现链表反转的方法【迭代法与递归法】

导读 这篇文章主要介绍了Python实现链表反转的方法,结合实例形式分析了Python迭代法与递归法实现链表反转的相关操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下: Python实现链表反转 …

python鸡兔同笼编程运行结果_Python少儿编程:鸡兔同笼

Python少儿编程:解决鸡兔同笼问题 一笼鸡和兔子,我们数了一下,咳咳,鸡和兔子的头一共有35个,但是鸡和兔子的脚一共有94只。 好的,那么吃货们我们来好好算一算,到底能做几只德州扒鸡和双流兔头呢…

keil debug如何在watch直接修改变量值_python日志记录系列教程,内置logging模块(一),直接使用logging模块的基础日志记录

前言:成熟的软件开发不可避免的要进行日志记录,python内置模块logging提供了强大的日志记录能力,本文将从多个角度,由浅入深的介绍logging的常见使用方法和一些基本概念,本此系列文章分为两篇,本文为系列文…

linux进程管理子系统分析,linux进程管理子系统简要分析

Linux进程管理:进程与程序:程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体。进程:是一个执行中的程序,它是动态的实体进程四要素:1. 有一段程序供其执行,这段程…

c语言变量命名规则_带你学习C语言—变量

在编写程序时,常常需要将数据存储在内存中,以便于使用这个数据或者修改这个数据的值。我们通常使用变量来存储数据,而且使用变量可以引用存储在内存中的数据,并随时根据需要对数据进行处理。变量的概念在程序设计中,允…