RPC框架实战与对外服务

一、

1-RPC概述

1-1 RPC概述

1.RPC(Remote Proceduce Call Protocol),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
在这里插入图片描述
应用通过网络调用应用,不用关心是tcp协议还是udp协议。
传输层协议为不同主机上运行的进程提供逻辑通信(进程到端到端),而网络层协议为不同主机提供逻辑通信(端到端)

2.OSI网络通信模型

  1. 第一层:物理层
    第二层:数据链路层 802.2、802.3ATM、HDLC、FRAME RELAY
    第三层:网络层 IP、IPX、ARP、APPLETALK、ICMP
    第四层:传输层 TCP、UDP、SPX
    第五层:会话层 RPC、SQL、NFS、X WINDOWS、ASP
    第六层:表示层 ASCLL、PICT、TIFF、JPEG、MIDI、MPEG
    第七层:应用层 HTTP,FTP,SNMP等
    2.远程控制调用RPC的本质还是底层的Socket通信(socket中文叫套接字或者句柄,它是系统内核对象,由操作系统内核来维护其缓冲区; 它代表两个地址对 “本地ip:port”–“远程ip:port”)。
    3.RPC不是新事物,1960/70年代就有,由1981年Bruce Jay Nelson首次提出这个叫法,只不过近几年分布式系统、服务化、微服务的兴起才成为热点。
    4.过程如何理解?过程就是业务处理,直白理解就是程序,像调用本地方法一样调用远程方法。

1-2 远程调用和本地调用区别
Rpc属于远程调用,它比本地调用有以下特点
1.响应要慢几个数量级
2.不那么可靠。

1-3 深入浅出RPC三个过程
–网上摘抄
在这里插入图片描述
应用场景:去欧洲聘请一位小年轻去中国下地干活
1.首先确认是哪个通信协议,比如是坐飞机还是打电话联系。
2.比如确定坐飞机,那么需要确定对方位置,(在互联网可以理解为ip信息)
3.地址确认并且成功聘请,那么需要交流让老外来中国,这时候就需要对信息进行序列化。
4.最后老外听到指示来到中国下地干活。

1-4 为什么要用RPC?
我们为什么要用rpc,是因为技术牛采用?答案:不是的。
原因是我们的业务达到一定的量级,我们需要把业务划分出来,部署到不同的机器上面。如果业务之间需要交互,或者将公共的业务抽离出来,这时候rpc大显身手的机会就来了。
场景有:
1、服务化/微服务
2、分布式系统架构
3、服务可重用
4、系统间相互调用

1-5 RPC与其它协议的区别
–网上摘抄
远程通信协议有很多,比如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS
RPC和RMI区别?
1.RMI(Remote method invocation)远程方法调用是OOP领域中RPC的一种实现(RMI只能用于java)
2.我们熟悉的webservice restful接口调用都是RPC,只不过是消息的组织格式、消息协议不同罢了。

1-6 RPC特性和使用场景
网上摘抄--------------
功能特点
在架构上,RPC和Message的差异点是,Message有一个中间结点Message Queue,可以把消息存储。
消息的特点
Message Queue把请求的压力保存一下,逐渐释放出来,让处理者按照自己的节奏来处理。
Message Queue引入一个新的结点,让系统的可靠性会受Message Queue结点的影响。
Message Queue是异步单向的消息。发送消息设计成是不需要等待消息处理的完成。
所以对于有同步返回需求,用Message Queue则变得麻烦了。
PRC的特点
同步调用,对于要等待返回结果/处理结果的场景,RPC是可以非常自然直觉的使用方式。
#RPC也可以是异步调用
由于等待结果,Consumer(Client)会有线程消耗。
如果以异步RPC的方式使用,Consumer(Client)线程消耗可以去掉。但不能做到像消息一样暂存消息/请求,压力会直接传导到服务Provider。
适用场合说明
希望同步得到结果的场合,RPC合适。
希望使用简单,则RPC;RPC操作基于接口,使用简单,使用方式模拟本地调用。异步的方式编程比较复杂。
不希望发送端(RPC Consumer、Message Sender)受限于处理端(RPC Provider、Message Receiver)的速度时,使用Message Queue。
在这里插入图片描述
**

二、2-RPC流程及RPC协议

**在这里插入图片描述

参考网址: https://www.cnblogs.com/FG123/p/10261676.html
这里的Stub是个存根,存根可以理解成联系方式或者信物,它是一段代码,用来转换RPC过程中传递的参数,在客户端叫ClientStub,在服务端叫ServetStub。实际上就是编码解码,序列化和反序列化的工程。
1.调用者(客户端Client)以本地调用的方式发起调用;
2. Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体;–编码
3. Client stub将消息体通过网络发送给服务端;
4. Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数;–解码
5. Server stub根据方法名和参数进行本地调用;
6. 被调用者(Server)本地调用执行后将结果返回给server stub;
7. Server stub将返回值打包编码成消息,并通过网络发送给客户端;–编码
8. Client stub收到消息后,进行拆包解码,返回给Client;–解码
9. Client得到本次RPC调用的最终结果。

2-1 RPC开发注意的问题
在这里插入图片描述
1.Client stub、Server stub的开发
2.参数如何编组为消息,以及解组消息;
3.消息如何发送
4.过程结果如何表示、异常情况如何处理等
2-2 RPC核心概念术语
–网上摘抄
1.Client(客户端)、Server(服务端)、calls(调用)、replies(响应)、services(服务)、programs、procedures(过程)、marshalling(编组)、unmarshalling(解组)
2.一个网络服务由一个或者多个远程程序集。
3.一个远程程序实现一个或者多个远程过程。
4.过程、过程的参数、结果在程序协议说明书中定义说明-类似接口说明

2-3 理解RPC协议是什么东西

1.rpc协议通俗理解
RPC调用过程需要将参数编组进行发送,接收方需要解组消息,返回结果也需要编码解码。消息由哪部分构成及消息的表现形式构成了消息协议。
RPC调用过程采用的消息协议就是RPC协议,所以我们可以选用通用的协议HTTP、https协议,也可以采用我们自己定义的协议。
2.RPC协议与HTTP协议的区别
参考网址:https://www.seowhy.com/faq/54_326_zh.html
1、RPC是一种API,HTTP是一种无状态的网络协议。RPC可以基于HTTP协议实现,也可以直接在TCP协议上实现。
2、RPC主要是用在大型网站里面,因为大型网站里面系统繁多,业务线复杂,而且效率优势非常重要的一块,这个时候RPC的优势就比较明显了。
HTTP主要是用在中小型企业里面,业务线没那么繁多的情况下。
3、HTTP开发方便简单、直接。开发一个完善的RPC框架难度比较大。
4、HTTP发明的初衷是为了传送超文本的资源,协议设计的比较复杂,参数传递的方式效率也不高。开源的RPC框架针对远程调用协议上的效率会比HTTP快很多。
5、HTTP需要事先通知,修改Nginx/HAProxy配置。RPC能做到自动通知,不影响上游。
6、HTTP大部分是通过Json来实现的,字节大小和序列化耗时都比Thrift要更消耗性能。RPC,可以基于Thrift实现高效的二进制传输。

**

三、3-RPC框架

**
3-1 常用的RPC框架
Rpc可以理解为远程过程调用,只要是远程调用就可以称为基于rpc的框架.
Java领域:
传统的webservice框架:Apache CXF、Apache Axis2、java自带的JAX-WS等。Webservice框架大多基于soap协议(webservice风格的rpc)。
新兴的微服务框架:Dubbo、Spring Cloud、Apache Thift、
ICE(面向对象的中间件平台的通信框架,号称很强大,比较活跃)、
GRPC(Google最近开发的基于HTTP/2协议标准和Protobuf序列化协议开发的高性能开源框架)等等。

3-2 RPC框架的服务暴露
服务提供者需要提供某种调用形式的相关信息,比如类似Webservice的wsdl文件,Facebook的Thirft的IDL文件
在这里插入图片描述
课外延伸:对外服务可以采用rpc,替代webservice,如果跨平台可以用Thirft接口实现
3-3 框架的远程代理对象
代理处理技术
1.Java至少提供了两种技术来提供动态代码生成,一种是jdk动态代理,另一种是字节码生成。动态代理比字节码使用方便,但是性能不如字节码,字节码在可读性上特别差。
总体权衡,牺牲性能追求可读性,采用jdk动态代理比较好。

2.代理对象以在请求之前或者请求之后进行一些额外的工作,或者说客户的请求不合法,直接拒绝客户的请求.
3-4 RPC框架通信
网上摘抄–
RPC协议与具体的通信无关,RPC协议可以基于HTTP协议或者TCP协议,Webservice就是基于http协议的rpc框架,它具有良好的跨平台性,但性能远不如基于TCP协议的RPC(DUBBO,Netty)
在这里插入图片描述
备注:NIO是non-blocking I/O): 异步非阻塞,适用于高并发连接比较多,
BIO是blocking I/O): 同步并阻塞,链接比较小,
思考:NIO一定比BIO快吗?
答:不是,如果高并发连接比较多,每次传输数据量比较小,那么NIO快,如果每次的传输时大数据量或者大数据包,那么BIO快,所以不能一概而论就说NIO比BIO快(需要深入IO模块学习)。

3-5 RPC框架序列化
两个方面影响传输性能:一是传输方式 二是序列化
在这里插入图片描述
常说的报文就是消息头+消息体。

**

四、4-手写RPC框架

**
4-1 用户使用RPC框架需要做的事情
1.定义接口
2.服务端实现过程—服务端实现接口,提供给客户端服务。
3.客户端生成stub代理对象。–客户端调用服务端业务代码
在这里插入图片描述

4-2 RPC最初版实现
在这里插入图片描述

下面截图补充
在这里插入图片描述

4-3 RPC升级版实现
由于最初版,服务端采用阻塞方式,如果多个客户端同时来请求服务端,如果超出线程池处理线程数,那么服务端需要处理完一个请求释放线程,再去处理下一个请求(BIO),所以基于这种情况,可以让服务端采用NIO非阻塞模式来实现。
参考improve代码,

4-4 RPC框架实现

4-4-1.客户端设计
1.客户端设计
在这里插入图片描述
客户端存根代理对象,代理对象(接口)采用jdk代理,在执行业务逻辑时,由于接口发送到服务端需要进行参数封装,需要代理实现这些业务方法,就是invoke方法,这个方式是jdk的proxy代理的一个方法,必须实现。
2.客户端流程

  1. 从zookeeper获取服务信息(如果没有用zookeeper,这步骤可以省略)
    2.构造request对象,封装客户端信息
    3.根据协议进行编组
    4.网络层发送请求
    5.收到通知,解组信息,处理结果
    在这里插入图片描述
    3.客户端服务发现者
    服务发现,通俗理解,就是客户端获取服务端的接口信息,端口信息等,这里对应服务端的服务注册,比如拿本案例讲:服务端注册是ZookeeperExportServiceRegister,里面有一个register方法,将服务端方法暴露,那么客户端想要发现,就对应ZookeeperServiceInfoDiscoverer的getServiceInfo从zookeeper
    获取信息。
    在这里插入图片描述
    4.客户端协议层设计
    客户端协议,通俗理解就是与服务端信息交互方式,比如通过json协议交互,http协议等。
    Rpc框架要求支持多种协议,所以要想实现多种协议通用,需要使用策略模式双重组合。
    在这里插入图片描述

5.客户端网络层设计
网络层一般属于通信,比如本案例有两种:一种是BIO阻塞通信工具, 另一种是Netty ,
本案例采用Netty作为通信框架。
在这里插入图片描述

4-4-2.服务端设计

在这里插入图片描述在这里插入图片描述

客户端请求服务端,服务端做了以下事情
1.客户端请求服务端,服务端开启网络服务,消息协议层采用客户端协议,最后通过过程调用调用服务端方法。–(这里说的没有zookeeper注册发布情况)
-----------有zookeeper
3.服务端最好需要一个类似zookeeper的注册发现机制,否则客户端不知道有哪些接口方法。这时候用到了zookeeper注册中心。
4.服务端将接口信息注册到zookeeper,并register注册信息封装到RequestHandler里面去,交给netty执行。

在这里插入图片描述

5.当客户端连接来得时候会触发RequestHandler的channelRead方法。这时候读取客户端信息。
在这里插入图片描述
6.服务端处理客户端request,经过一系列的解码、查找服务、方法反射,将结果封装成Response并最后编组返回给客户端。
在这里插入图片描述

7.课外:查找服务对象
服务端获取zookeeper的服务对象是通过ZookeeperExportServiceRegister这个类的getServiceObject获取的。具体看类图,里面的serviceMap是方法在注册到zookeeper时,顺便缓存的,这样就没必要总是访问zookeeper,而是直接从map缓存里面取。
在这里插入图片描述
8.服务端总结
1.RpcServer中实现网络层、Netty,使用RequestHandler。
2.ServerRegister模块实现服务注册、发布获取
3.RequestHandler中实现消息协议处理、过程调用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据来源:中经数据库 主要指标110多个(全部都是纯粹的 市辖区 指标),大致是: GDP GDP增速 第一产业增加值占GDP比重 第二产业增加值占GDP比重 第三产业增加值占GDP比重 人均GDP 社会消费品零售总额 固定资产投资(不含农户) 新设外商投资企业数_外商直接投资 实际利用外资金额(美元) 一般公共预算收入 一般公共预算支出 一般公共预算支出_教育 一般公共预算支出_科学技术 金融机构人民币各项存款余额_个人储蓄存款 金融机构人民币各项存款余额 金融机构人民币各项贷款余额 规模以上工业企业单位数 规模以上工业企业单位数_内资企业 规模以上工业企业单位数_港澳台商投资企业 规模以上工业企业单位数_外商投资企业 规模以上工业总产值 规模以上工业总产值_内资企业 规模以上工业总产值_港澳台商投资企业 规模以上工业总产值_外商投资企业 规模以上工业企业流动资产合计 规模以上工业企业固定资产合计 规模以上工业企业利润总额 规模以上工业企业应交增值税 规模以上工业企业主营业务税金及附加 户籍人口数 年均户籍人口数 户籍人口自然增长率 第一产业就业人员占全部城镇单位就业人员比重 第二产业就业人员占全部城镇单位就业人员比重 第三产业就业人员占全部城镇单位就业人员比重 城镇非私营单位就业人员数 城镇非私营单位就业人员数_第一产业 城镇非私营单位就业人员数_第二产业 城镇非私营单位就业人员数_第三产业 城镇非私营单位就业人员数_农、林、牧、渔业 城镇非私营单位就业人员数_采矿业 城镇非私营单位就业人员数_制造业 城镇非私营单位就业人员数_电力、热力、燃气及水生产和供应业 城镇非私营单位就业人员数_建筑业 城镇非私营单位就业人员数_批发和零售业 城镇非私营单位就业人员数_交通运输、仓储和邮政业 城镇非私营单位就业人员数_住宿和餐饮业 城镇非私营单位就业人员数_信息传输、软件和信息技术服务业 城镇非私营单位就业人员数_金融业 城镇非私营单位就业人员数_房地产业 城镇非私营单位就业人员数_租赁和商务服务业 城镇非私营单位就业人员数_科学研究和技术服务业 城镇非私营单位就业人员数_水利、环境和公共设施管理业 城镇非私营单位就业人员数_居民服务、修理和其他服务业 城镇非私营单位就业人员数_教育 城镇非私营单位就业人员数_卫生和社会工作 城镇非私营单位就业人员数_文化、体育和娱乐业 城镇非私营单位就业人员数_公共管理、社会保障和社会组织 城镇非私营单位在岗职工平均人数 城镇就业人员数_私营企业和个体 城镇非私营单位在岗职工工资总额 城镇非私营单位在岗职工平均工资 城镇登记失业人员数 建成区面积 建设用地面积 建设用地面积_居住用地 液化石油气供气总量 液化石油气供气总量_居民家庭 人工煤气、天然气供气总量 人工煤气、天然气供气总量_居民家庭 液化石油气用气人口 人工煤气、天然气用气人口 城市公共汽电车运营车辆数 城市出租汽车运营车辆数 城市公共汽电车客运总量 道路面积 排水管道长度 建成区绿化覆盖面积 建成区绿化覆盖率 绿地面积 公园绿地面积 维护建设资金支出 土地面积 生活用水供水量 供水总量 全社会用电量 城乡居民生活用电量 工业生产用电量 房地产开发投资 房地产开发投资_住宅 限额以上批发和零售业法人单位数 限额以上批发和零售业商品销售总额 普通中学学校数 中等职业教育学校数 普通小学学校数 普通高等学校专任教师数 普通中学专任教师数 中等职业教育专任教师数 普通小学专任教师数 普通高等学校在校生数 普通中学在校生数 中等职业教育在校生数 普通小学在校生数 电视节目综合人口覆盖率 公共图书馆总藏量_图书 医疗卫生机构数_医院和卫生院 卫生人员数_执业(助理)医师 医疗卫生机构床位数_医院和卫生院 城镇职工基本养老保险参保人数 职工基本医疗保险参保人数 失业保险参保人数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值