- 浏览: 506436 次
- 性别:
- 来自: 宁波
博客专栏
-
浙大软院考研
浏览量:19353
文章分类
最新评论
-
J2EE大鸟:
muzeng 写道非常感谢,比淘宝的还全,向学长学习,谢谢哈哈 ...
2013浙大878计算机基础综合大题答案解析 -
muzeng:
非常感谢,比淘宝的还全,向学长学习,谢谢
2013浙大878计算机基础综合大题答案解析 -
J2EE大鸟:
tianxia2s 写道 求楼主给个选择题答案不不好意思,博客 ...
2012浙大878计算机专业基础综合大题答案解析 -
tianxia2s:
求楼主给个选择题答案不
2012浙大878计算机专业基础综合大题答案解析 -
tianxia2s:
感谢楼主
关于浙大考研878历年试卷的说明
接上:
3 基于Json的前后端数据交互
3.1 轻量级的数据交换形式
3.1.1 什么是Json
Json(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
Json的构建结构大致有两类:
1.“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
Json共有四种表现形式:
1.对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,以“}”结束。每个“名称”后跟一个“:”,“‘名称/值’对”之间使用“,”分隔。
2.数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”分隔。
3.值(value)可以是双引号括起来的字符串(String)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。
4.字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜体转义。一个字符(character)即一个单独的字符串(characeter string)。
3.1.2 Json的优势
上文提到了Json的一些特性,可以看出,Json可以描述大部分的数据结构。所以Json是适用于Ajax程序的一种很好的格式,原因是它使 JavaScript对象和字符串值之间能够快速的转换。由于Ajax应用程序非常适合将纯文本(字符串)发送给服务器端程序并对应地接收纯文本,相比不能生成文本的API,能生成文本的API自然更可取;而且,Json允许我们方便的处理本地JavaScript对象,而无需为如何表示这些对象多费心思。 虽然XML也可以提供文本方面的类似益处,但用于将 JavaScript对象转换成XML 的几个现有API没有JSON API成熟;有时,在创建和处理 JavaScript 对象时必须格外谨慎以确保所进行的处理能与所选用的XML会话API协作。但对于Json,情况就大不相同:它能处理几乎所有可能的对象类型,并会返回一个非常好的数据表示。因此,Json 的最大价值在于可以将JavaScript真的作为JavaScript而非数据格式语言进行处理。所有有关使用JavaScript对象的技巧都可以应用到代码中,而无需为如何将这些对象转变成文本而多费心思。
3.2 JavaScript与Java间的数据类型
3.2.1 JavaScript与Java常用的数据类型
JavaScript常用的数据类型有以下几种:
主要(基本)数据数据类型:字符串,数值,布尔;
复合(引用)数据类型:对象,数组;
对象中最常用的Date对象,常用于时间的计算。
Java中常用的数据对象有Integer,Double,Float,Boolean,Date,String,Char(这些类都是简单数据类型的封装)等等,集合最常见的有List,Map,Set,Array。
不同的语言对数据有着不同的描述与结构,如何在它们之间建立联系是实现Rpc的关键步骤之一。
3.2.2 利用Json建立JavaScript与Java数据类型的映射关系
在3.1里提到的Json的诸多优势和特性,使其非常适合作为两种编程语言的桥梁。下面是Java与JavaScript之间的数据类型映射表:
序号 |
Java |
JavaScript |
1 |
Integer |
数值,字符串,布尔 |
2 |
Double |
数值,字符串,布尔 |
3 |
Float |
数值,字符串,布尔 |
4 |
Boolean |
字符串,布尔 |
5 |
Date |
字符串 |
6 |
String |
字符串,Date |
7 |
Array, List,Set |
数组 |
8 |
JavaBean Obj,Map |
对象 |
表3-1 Java/JavaScript数据类型映射表
3.3 数据类型转换器
3.3.1 前后端交换数据转化流程
Rpc请求需要客户端->服务端->客户端的数据传递流程,数据转换大致需要进行以下几个步骤:
(1) 将JavaScript方法参数转化为Json字符串传递到服务端(客户端转化)
(2) 服务端解析Json串,并根据服务端方法参数类型将Json串所包含的数据转化为相应的类型(服务端转化)
(3) 执行方法,获取返回值,将返回值转化为Json串(服务端转化)
(4) 客户端接收Json串,并将其转化为Json格式的数据,供客户端访问。(客户端转化)
具体流程图见3-1。
图3-1 前后端数据流图
3.3.2 客户端数据类型转换器的实现
客户端转换器主要有两个转换过程,一种将客户端提交的数据转化为Json串,另外一种是将Json串转化为Js数据类型。因为Json是JavaScript的原生数据类型,故不需要额外的第三方库就能对其进行操作。使用JavaScript内置方法eval就能将Json串转化为Json,这样JavaScript就能对其进行识别了。相对比较麻烦是将各种数据类型转化为Json串的过程,下面就各类型数据一一举例说明转化算法。
简单类型数据统一转化为字符串,比如数值,布尔转化为字符串都是非常容易的。
对象的转化与数组类似,首先获得一个对象中的所有属性,根据属性获取其对应的值,并将这些数据拼接成类似{“a”:”1”,”b”:”2”,”c”:”3”}这样的结构。比如一个对象内有三个属性atr1,atr2,atr3,每个属性的值分别为val1,val2,val3,那么对应的Json串就是{atr1:val1,atr2:val2,atr3:val3}。
数组转化为Json串需要对其进行遍历,先获取数组长度,接着对数组进行循环遍历并拼成类似[a,b,c]这样的数据结构。比如数组内有三个字符串”str1”,”str2”,”str3”,那么对应的Json串则是[“str1”,”str2”,”str3”]。如果数组内的数据是数组类型那么就继续调用转化器将某一结点的值继续转化为Json格式,递归调用转化器直到转化为字符串或对象Json串为止。
上述转化流程图参见图3-2。
图3-3 服务端数据类型转化器算法 4 框架的其他设计 4.1 性能方面的设计 一个可用性高的框架在性能方面一定要有所考虑。要找出整个使用流程中的性能瓶颈,并有针对性的进行优化。 在Rpc远程请求过程中,有以下几个性能关注点: (1) 客户端,服务端数据格式转化 (2) 动态脚本生成效率 (3) Ajax性能 针对以上几个点,在Rpc远程调用框架内做了一些性能调优: (1)优化数据转换算法,比如尽量在一次遍历中将所有事情做完,减少循环次数。循环长度一次性获取,不要每次都计算。尽量使用Api中的方法,很多Api是针对Jvm调优过的,性能比自己实现要好。 (2)对动态生成的脚本做缓存,这样可以避免每一次访问都重新生成脚本。 (3)Ajax同步时如遇网络阻塞可能会导致调用无法响应,提供设置异步回调方法的接口,在很多时候可以使用异步Ajax,避免了界面无响应。 4.2 扩展性设计 初期Rpc框架基本是完整实现了所有的流程,随着技术的发展,在某些方面会有一些很好的开源解决方案,为了适应这些发展,需要提供一些可扩展的设计。比如在数据转换这一块,所有的转换器都实现了一个Convertor接口,这样做的好处是可以扩展使用性能更好第三方的转换工具来替代框架的转换方式。只要实现相应的接口即可。对于Cache,框架提供了Cache接口,目前的实现是简单的Map,开源缓存框架也有很多优秀的实现,比如OsCache,MemCache,这些缓存框架上在算法相对比较复杂,同时也能提供更好的性能,集成这些好的组件都是提高Rpc框架性能的很好的手段。 5 结束语 在Web2.0如火如荼的今天,相信Rpc远程调用框架的能够让Ajax开发变的更加简单,方便,目前框架实现了基本的Rpc请求功能,与Spring紧密集成。框架下一步的发展思路是更加简化的配置方式,更加快速的远程调用和以及更加安全的框架,并根据开发需要提供更多的框架集成。
发表评论
-
JAVA AOP
2014-07-10 01:37 3194AOP背景 Dijkstra--separation ... -
JAVA动态代理
2014-07-09 01:38 1412JAVA动态代理 在目前的Java开发包中包含 ... -
JAVA IOC及代理模式
2014-07-08 15:20 1360控制反转(Inversion of Control) ... -
JAVA Reflection(反射机制)续
2014-07-05 15:29 599接上一篇文章 JAVA Reflection(反射机制) ... -
JAVA Reflection(反射机制)
2014-07-03 23:27 3049Java 反射机制 反射 ... -
jsp,servlet交互驱动层实现
2013-08-23 15:21 1475在jsp和servlet中,参数 ... -
mybatis直接执行sql语句后续之一
2013-04-03 11:26 8699在上一篇文章中,我们提到了让mybatis直接执行sql语 ... -
根据sessionId获取Session对象
2013-03-29 17:32 1254Servlet2.1之后不支持SessionContext里 ... -
java修饰符作用域
2013-03-08 21:53 1019可见性: 作用域 当前 ... -
java 子类和父类中方法的引用
2013-03-07 18:58 977public class SuperA { publi ... -
面试题 数组长度可否赋值
2013-03-07 10:06 1158public class ArrayLength { ... -
处理json字符串的问题
2012-12-24 00:07 990处理json字符串的问题: 后台在做json字符串处理的时候 ... -
跟我学SpringMVC目录汇总贴、PDF下载、源码下载
2012-12-22 23:26 858http://jinnianshilongnian.iteye ... -
jsp加载常量的探讨
2012-12-24 10:43 1320今天遇到了一个jsp加载 ... -
jsp加载常量的探讨
2012-12-22 22:15 0今天遇到了一个jsp加载常量的问题 代码如下: pu ... -
如何查看正在使用端口号并利用任务管理器将其关闭
2012-12-22 18:47 2265在命令框中输入cmd 然后输入命令netstat - ... -
JSP页面是否需要重新编译--checkInterval
2012-12-22 17:27 1JspServlet Jasper用class ... -
tomcat上传文件,重新加载后删除以及在web.xml中配置全局路径
2012-12-21 21:57 1177<context-param> < ... -
输出流flush()用法
2012-12-21 14:16 4282flush() 是把缓冲区的数据强行输出, 主要用在IO中,即 ... -
Dangling meta character '?' near index 0
2012-12-19 20:20 1398Problem String str = " ...
相关推荐
基于java aio 的RPC 远程调用框架
基于java aio 的RPC 远程调用框架 组件介绍 Serializer 序列化和反序列的工具类,项目的实现为基于Gson的序列化工具 IOHandler 从Channel中读取数据并交由Serializer处理的类,本身是异步读取数据 在读取数据时 提供...
利用Java开发的socket客户端和服务端远程RPC通信框架,利用了动态代理和反射技术,
RPC RPC远程调用框架
XXL-RPC 是一个分布式服务框架,提供稳定高性能的RPC远程服务调用功能。拥有”高性能、分布式、注册中心、负载均衡、服务治理”等特性。现已开放源代码,开箱即用。
使用socket/反射/序列化等技术实现了一个基本的远程调用框架,可参考博客http://blog.csdn.net/u013177446/article/details/66473066
主要介绍了SpringBoot2.0 整合 Dubbo框架 实现RPC服务远程调用 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
通用grpc核心 基于grpc实现的rpc远程调用框架
RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码...
surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper
skynet_fly是基于skynet扩展的可以快速开发web,游戏,和需要rpc调用的框架。 使用skynet_fly的好处: * 支持不停服更新。 * 一键生成skynet的配置文件和skynet_fly的配置文件以及配套shell脚本。 * 对匹配房间类...
OpenFeign 和 Dubbo一样是一个RPC远程调用框架,目的是使的我们调用接口和调用本地方法一样简单,开发者无需关心和远程的交互细节( 即不需要通过常规的 Http Client 构建请求再解析返回数据,让开发者在调用远程接口...
主要介绍了Java利用Sping框架编写RPC远程过程调用服务的教程,包括项目管理工具Maven的搭配使用方法,需要的朋友可以参考下
surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper作为surging服务的注册中心,集成了哈希,随机,轮询作为负载均衡的算法,RPC集成采用的是netty框架,采用异步传输
python-jrpc-一个基于JSON RPC v2.0 的python 远程调用框架
适合学习/练手、毕业设计、课程设计、期末/期中/大作业、工程实训、相关项目/竞赛学习等。 项目资源具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些基础上学习借鉴进行修改和扩展,实现其它功能。 可下载...
RPC—远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。此项目用的是java+netty+zookeeper构建的自定义rpc框架。
使用mindmaster打开
基于Java语言开发的开源RPC服务框架,提供高性能,高可用的远程调用能力。
RPC,全称RemoteProcedureCall(远程过程调用),即调用远程计算机上的服务,就像调用本地服务一样。那么RPC的原理是什么呢?了解一个技术最好的思路就是寻找一个该类型麻雀虽小五脏俱全的开源项目,不负所期,找到...