一.服务端
WEB-INF/rpc-servlet.xml
<bean id="blogInfoService" class="com.duowan.common.rpc.fortest.api.BlogInfoServiceImpl"/> <!-- 服务发布 --> <bean class="com.duowan.common.rpc.server.RPCServiceExporter"> <property name="serviceInterface" value="com.duowan.common.rpc.fortest.api.BlogInfoService" /> <property name="service" ref="blogInfoService"/> </bean>
WEB-INF/web.xml
<servlet> <servlet-name>rpc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>rpc</servlet-name> <url-pattern>/rpc/*</url-pattern> </servlet-mapping>
二.客户端
<bean name="userWebService" class="com.duowan.common.rpc.client.RPCProxyFactoryBean"> <property name="serviceUrl" value="http://localhost:6060/rpc/UserWebService"/> <property name="serviceInterface" value="com.duowan.common.rpc.fortestinvoker.UserWebService" /> </bean>
客户端使用
com.duowan.common.rpc.fortestinvoker.UserWebService userWebService = (UserWebService )applicationContext.getBean('userWebService');
三.maven依赖
<!-- 兼容性: 2.0的服务端兼容1.0,2.0客户端; 1.0的客户端不兼容2.0的服务端 --> <dependency> <groupId>com.duowan.common</groupId> <artifactId>duowan-common-rpc</artifactId> <version>2.0.0</version> </dependency> <!-- json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.2</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.2</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.9.2</version> </dependency> <!-- apache commons --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>
四.测试
比如有下面一个服务端方法
public interface BlogInfoService { Blog findSingleBlog(String group,String blogId); public BlogQuery returnBlogQuery(BlogQuery query); } public class BlogQuery { private String username; private String password; private int age; // ... property get and set method }
那么可以采用如下 URL进行访问测试:
1. http://localhost:8080/rpc/BlogInfoService/findSingleBlog?__params=group;blogId 2. http://localhost:8080/rpc/BlogInfoService/findSingleBlog?group=2222&blogId=4444 对象参数传递: 1. http://localhost:8080/services/BlogInfoService/returnBlogQuery?username=1&password=100
五.返回结果控制
通过URL参数: format=json|js来控制
1.返回Json(默认)
请求
http://localhost:6060/services/BlogInfoService/findDate?__format=json
返回
{"result":199999999,"errno":null,"error":null}
2.返回Jsonp(用于解决JavaScript跨域)
请求
http://localhost:6060/services/BlogInfoService/findDate?__format=jsonp&__jsoncallback=findDateCallback
返回
findDateCallback({"result":199999999,"errno":null,"error":null})
实际调用
<html> <head> <script src="http://code.jquery.com/jquery-latest.js"></script> </head> <body> <script> $.getJSON("http://openuic.game.yy.com/openrpc/UserGameRecommendWebService/listUserGameRecommend?__format=jsonp&__jsoncallback=?&passport=xiaolove0806", { format: "json" }, function(data) { alert(data.result); });</script> </body> </html>
JQuery Jsonp应用: Jquery应用JSONP
其它特性
1.客户端exception处理
如果服务端抛出 com.duowan.common.rpc.WebServiceException,则客户端可以try catch这个异常,服务端的任何异常都会转换为这个WebServiceException
切换行号显示
1 public class WebServiceException extends RuntimeException { 2 /** 未知错误 as HTTP 500 */ 3 public static String UNKNOW_ERROR = "UNKNOW_ERROR"; 4 /** 非法参数 as HTTP SC_BAD_REQUEST:400 */ 5 public static String ILLEGAL_ARGUMENT = "ILLEGAL_ARGUMENT"; 6 /** 7 * 错误码 8 */ 9 private String errorNo; 10 11 }
2.服务端得到Request,Response
通过 RPCContext.getRequest(),RPCContext.getResponse()得到HttpServletRequest,HttpServletResponse
3.客户端网络连接出错重试
<bean name="userWebService" class="com.duowan.common.rpc.client.RPCProxyFactoryBean"> <property name="serviceUrl" value="http://localhost:6060/rpc/UserWebService"/> <property name="serviceInterface" value="com.duowan.common.rpc.fortestinvoker.UserWebService" /> <!-- socket出错重试三次,间隔1秒,5秒,10秒 --> <property name="retryIntervalMills" value="1000,5000,10000"/> </bean>
4.客户端Timeout(超时)配置
<bean name="httpInvokerRequestExecutor" class="com.duowan.common.rpc.client.CommonsHttpInvokerRequestExecutor"> <!-- 每次调用超时配置,单位毫秒,默认10秒 --> <property name="readTimeout" value="1000"></property> <!-- 远程服务连接超时配置,单位毫秒,默认3秒 --> <property name="connectionTimeout" value="1000"></property> </bean> <bean name="userWebService" class="com.duowan.common.rpc.client.RPCProxyFactoryBean"> <property name="serviceUrl" value="http://localhost:6060/services/UserWebService"></property> <property name="serviceInterface" value="com.duowan.common.rpc.fortestinvoker.UserWebService" /> <property name="httpInvokerRequestExecutor" ref="httpInvokerRequestExecutor"></property> </bean>
5.直接返回结果,不增加包装类
通过URL增加参数 &__noWrapResult=true,来指明直接返回结果,
{resultObject}
而不返回
{result: {resultObject} }
6.设置使用其它传输协议: json,java,hessian
默认的传输协议是: json,还可以使用其它传输协议
<bean name="httpInvokerRequestExecutor" class="com.duowan.common.rpc.client.CommonsHttpInvokerRequestExecutor"> <!-- 使用java序列化,共支持: application/json,application/java,application/hessian --> <property name="contentType" value="application/java"></property> </bean> <bean name="userWebService" class="com.duowan.common.rpc.client.RPCProxyFactoryBean"> <property name="serviceUrl" value="http://localhost:6060/services/UserWebService"></property> <property name="serviceInterface" value="com.duowan.common.rpc.fortestinvoker.UserWebService" /> <property name="httpInvokerRequestExecutor" ref="httpInvokerRequestExecutor"></property> </bean>
7.开启http gzip压缩
可以通过nginx压缩现在的http返回结果,客户端跟服务端都不需要作任何修改。
相关推荐
dao层使用 ibatis3 并使用分页方言(Diaelct)进行数据分页,具体请查看rapid文档 view层使用 springmvc_rest /* * Powered By [rapid-framework] * Web Site: http://www.rapid-framework.org.cn * Google Code: ...
这个“最新Delphi 10说明书”显然是一份详尽的指南,旨在帮助初学者快速掌握编程基础,特别是针对Delphi 10和它的23个开发工具的使用。下面将对Delphi 10及其主要特点、开发工具和学习路径进行详细介绍。 1. Delphi...
Resourceful是一种基于Symfony2的即用型“快速API开发”(RAPID)设置,可轻松创建REST API。 特征 足智多谋的现成功能包括以下功能: 用户管理。 oAuth2 授权和客户端管理。 i18n和使用Accept-Language标头的...
Warewolf到底是什么? 面向服务的体系结构终于进入了21世纪。 Warewolf允许开发人员使用可视的,基于流程的拖放环境来设计和创建微服务,然后直接在其...发行说明可从获得 您可以从下载最新的编译版本。 请注意,Wa
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...
目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来...