JSON&JSON-RPC学习报告-2019091602014-冯新越
JSON部分
什么是JSON
JSON : JavaScript Object Notation(JavaScript 对象表示法)
- JSON是一种存储和交换文本信息的语法,类似于XML但是更小、更快,更易解析。
- JSON是独立于语言和平台的文本数据交换格式。JSON解析器/库支持许多不同的编程语言,多数动态编程语言都支持JSON。
- JSON是具有自我描述性的语法,易于理解,也方便机器进行解析和生成。
JSON与XML的横向对比
JSON | XML
|-:|:-|
相同 |都是纯文本、都具有自我描述性、都具有层级结构、都可通过JavaScript解析、都可使用AJAX进行数据传输
不同 |JSON没有结束标签、更简短且读写更快、能够使用内建的JavaScript eval()方法进行解析、能使用数组、不使用保留字
- 相对于XML语言来说,我们不难看出,JSON具有无可比拟的优越性。
它的简便、轻量、易于维护,繁多的功能支持让他逐渐在Web Service中占据一席之地。 - 但是相较于XML,JSON并没有它推广的这么深入人心和广泛使用, 通用性相对略低。
- 从我们项目的核心——云边融合控制器管理入手,我们在选取不同的数据交换格式时,不仅要考虑语言的可读性,通用性,实现难度,响应速度等基本因素,还要考虑数据在网络中的传输速度、安全性等问题。因此,我认为JSON是完美契合我们需求的选择。
JSON基础语法
JSON语法是JavaScript语法的子集
JSON基础语法规则:
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 名称/值对
JSON数据的书写格式:名称/值对
例如:
“firstName”:”John”
他等价于
firstName = “John”
JSON值
JSON值包括:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true或false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
JSON 对象
JSON对象在花括号中书写,例如:
{“firstName”:”John”,”lastName”:”Doe”}
他等价于
1 | firstName = "John" |
JSON数组
JSON数组在方括号中书写,数组可以包含多个对象。例如:
1 | { |
JSON使用JavaScript语法
通过JavaScript,我们可以创建一个对象数组,并直接进行赋值:
var employees = [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName": "Carter" }
];
访问数组
employees[0].lastName;
返回值
Gates
修改数据
employees[0].lastName = “Jobs”;
JSON文件
- JSON文件的文件类型“.json”
- JSON文本的MIME类型是”applicatio/json”
JSON-RPC部分
什么是RPC?
RPC : 即Remote Procedure Call Protocol、远程过程调用协议。它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC协议通过某些传输协议来实现,如传输二进制数据的Socket协议,为通信程序之间携带信息数据。在OSI网络通讯模型中,RPC跨越了传输层和应用层,使得开发包括微服务在内的应用程序更加容易。
- RPC指的是远程过程调用,简而言之,RPC是从一台机器上通过参数传递的方式调用另一台机器上的一个函数或方法并得到响应结果的方法。
- RPC隐藏底层的通讯细节。
- RPC是一个请求响应模型,客户端发起请求,服务器返回响应。
- RPC在使用形式上像调用本地函数一样去调用远程的函数。
我们为什么需要使用RPC
随着现代计算机网络应用的不断进化,大型项目所包含的业务越来越多,应用也越来越多。我们发现有些功能已经不能简单划分开来,甚至无法在一个进程内或一个计算机内通过本地调用的方式完成需求,比如不同系统、不同组织间的通讯。由于对计算能力提出了横向扩展的需求,我们需要在多台机器组成的集群上部署应用。此时,我们将公共业务逻辑抽离出来,将之改组为独立的Service应用。而原有或新增的应用都可以与那些独立的Service应用相交互,以此来构成完整的业务逻辑。因此,RPC的诸多特性使其成为了我们完成以上任务的重要手段。
RPC的具体原理
本例中我们使用Google Protolcol Buffer实现序列化。
先在RPC中注册callMethod函数,在服务端注册相同的callMethod。调用客户端向服务端发送命令,传送相应的命令和键值,调用callMethod函数实现序列化和反序列化,封包,发送消息。
将callMethod函数序列化后的结果发送到服务端,服务端收到消息后,使用callMethod函数进行反序列化,并根据其内容提供Service服务进行响应,对需要反馈的数据通过callMethod函数进行序列化,再将序列化后的结果发送给客户端,最终客户端进行反序列化,处理序列化的结果,完成一个完整的请求——处理——反馈的流程
同样的,JSON也可以实现如上图的流程
接下来我们再从内部视角探究RPC的结构
示例:
- RpcServer
负责导出(export)远程接口 - RpcClient
负责导入(import)远程接口的代理实现 - RpcProxy
远程接口的代理实现 - RpcInvoker
客户端实现:负责编码调用信息和发送调用请求到服务端并等待调用结果返回
服务端实现:负责调用服务端接口的具体实现并返回调用结果 - RpcProtocol
负责协议编/解码 - RpcConnector
负责维持客户端和服务端的连接通道和发送数据到服务端 - RpcAcceptor
负责接收客户端请求并返回请求结果 - RpcProcessor
负责在服务端控制调用过程,包括管理调用线程池、超时时间等 - RpcChannel
数据传输通道
RPC服务端通过RpcServer去导出远程接口方法,而客户端通过RpcClient去引入远程接口方法。
客户端像调用本地方法一样去调用远程接口方法,RPC框架提供接口的代理实现,实际的调用将委托给代理RpcProxy。 代理封装调用信息并将调用转交给RpcInvoker去实际执行。在客户端的RpcInvoker通过连接器RpcConnector去维持与服务端的通道RpcChannel,并使用RpcProtocol执行协议编码并将编码后的请求消息通过通道发送给服务端。
RPC 服务端接收器RpcAcceptor接收客户端的调用请求,同样使用RpcProtocol执行协议解码。解码后的调用信息传递给RpcProcessor去控制处理调用过程,最后再委托调用给RpcInvoker去实际执行并返回调用结果。[1]
Java中常用的几种RPC框架
RMI(远程方法调用)
RMI是JAVA自带的远程方法调用工具,作为JAVA语言最开始时的设计,在现在的应用环境中已经具有了一定的局限性。后来很多框架的原理都基于该框架。Hessian(基于HTTP的远程方法调用)
Hessian基于HTTP协议传输,在性能方面还不够完美,负载均衡和失效转移依赖于应用的负载均衡器。Hessian的使用与RMI类似,区别在于淡化了Registry的角色,通过显示的地址调用,利用HessianProxyFactory根据配置的地址create一个代理对象,另外还要引入Hessian的Jar包。Dubbo(淘宝开源的基于TCP的RPC框架)
Dubbo是基于Netty的高性能RPC框架,由阿里巴巴开源。它是一个分布式的服务框架与SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。自2011年开源后,已被许多非阿里系公司使用。
引用/资料来源
[1]From:RPC原理详解