RPC之Jersey服务调用处理(一)

时间:2022-01-13 22:52:29

1、定义
        远程过程调用, 也叫远程函数调用, 最早出现在Sun公司和HP公司的运行Unix操作系统的计算机中,用于系统间通信的一种机制.
        RPC的基本通信模型是基于Client/Server进程间相互通信模型的一种同步通信形式;它对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明的。在RPC中,Client即是请求服务的调用者(Caller),而Server则是执行Client的请求而被调用的程序 (Called)
2、协议及其用途:
        RPC是一种大而泛的远程调用机制,不局限于语言,更不局限于协议。我们可以认为RMI就是一种RPC,其区别在于RMI是基于对象的,本地虚拟机中通过Stub可以调用远程虚拟机的对象。
不过从传输的数据格式来说,RPC可以分为基于二进制的RPC、基于XML的RPC、以及其他诸如基于Json的RPC。
        它可以作为web服务的一种实现方式,Web服务可以从多层架构的关注点分离中受益。业务逻辑和数据可以由自动客户端和 GUI 客户端共享。惟一的不同点在于客户端的本质和中间层的表示层。此外,从数据访问中分离业务逻辑可实现数据库独立性,并为各种类型的数据存储提供插件能力.
3、三种请求传输模式:
(1)同步请求-响应(Synchronous Request-Response):客户端调用远程程序并阻塞,直到它收到一个返回值或异常。
(2)单向 RPC(One-Way RPC):客户端调用远程过程,但自身不阻塞或等待直到收到一个返回值。JAX-RPC 客户端的运行时系统可能会抛出异常。
(3)非阻塞 RPC 调用(Non-Blocking RPC Invocation):客户端调用远程过程,并继续处理同一个线程的内容而不等待返回值。此后,客户端通过阻塞来接受返回值或轮询返回值,以此来处理远程方法的返回。
4、应用场景:
        例如,在线电子商务分类网站为用户提供一个浏览器界面,用于搜索、查看和订购产品。如果还提供 Web 服务供公司、零售商甚至个人能够自动订购产品,它将非常有用。可以将其看作是构件设计思想的一种实践,也可以看作的是组件化设计的一种web实现方式。
5、现有的框架技术:
        现有的实现框架包括sun公司的jersey、Google的Protocol Buffers、 Facebook的Thrift还有Missian框架等
Missian简介
        Missian是一个构建于Mina和Hessian基础上的异步RPC框架,能够兼容HTTP协议和TCP协议,能和Hessian互通兼容,它提供了:
1)、一个基于mina的高性能服务器,具备mina所有的一切优秀基因。Missian服务器能够在一个端口之上兼容tcp和http协议格式,因 此开启了Missian服务之后,即可以用Missian客户端调用(同步/异步,HTTP/TCP),也可以供Hessian客户端调用。
2)、一个基于阻塞式的传统Socket的同步客户端,同样支持HTTP和TCP,它可以使用HTTP或TCP去访问Missian服务,同时也可以 使用HTTP方式去访问Hessian服务。您可以选择使用短连接的方式,也可以使用长连接(这时强制要求使用连接池,但Missian提供了一个基于 apache commons-pool的Socket连接池实现)。可以根据具体情况决定使用方式。
3)、一个基于Mina NioSocketConnector的异步客户端。默认使用一个4个线程的线程池来处理回调,但开发者也可以指定线程数,或者传入一个存在的线程池。异 步客户端只能调用Missian服务,而不能够调用Hessian服务(正在思考如何实现)。同样,协议可以是HTTP或者TCP。
其它相关框架的资料请自行搜集。
6、具体框架的使用(jersey使用)
        jersey支持通用的RPC请求类型,包括GET、POST等;请求参数的类型可以进行设置,包括application/xml、application/json等常见的数据类型具体可参见MediaType枚举类型中的类型;
1)、具体的一个get请求可以使用下面的方式进行处理:

@GET
@Path ("age/{name}" )
@Produces ("text/plain" )
@Consumes (MediaType. APPLICATION_JSON)
public String getAge(@PathParam ("name" ) JSONObject name) {
  // 返回数据信息
  return name+"result" ;
}

 上述get请求接收的参数类型为json类型,其他类型的参数将无法完成请求;

2)、具体的一个post请求可以使用下面的方式进行处理:

@POST
@Path ("testjson" )
@Consumes (MediaType. APPLICATION_JSON)
@Produces ({MediaType. APPLICATION_XML, MediaType. APPLICATION_JSON})
public String getTestJson( String str) {
  return str + "success" ;
}


上述post请求接收到的参数会自动转换为str这个参数
post请求可以使用下面的命令进行验证:
curl -d "{'name':'xiayy'}" -X POST http://10.16.204.31:8080/jerseyRestful/resources/helloworld/testjson -H "Content-Type: application/json"

这样可以成功的调用远程请求返回值情况。