一.服务端
WEB-INF/rpc-servlet.xml
WEB-INF/web.xml
rpc org.springframework.web.servlet.DispatcherServlet 1 rpc /rpc/*
二.客户端
客户端使用
com.duowan.common.rpc.fortestinvoker.UserWebService userWebService = (UserWebService )applicationContext.getBean('userWebService');
三.maven依赖
com.duowan.common duowan-common-rpc 2.0.0 org.codehaus.jackson jackson-core-asl 1.9.2 org.codehaus.jackson jackson-mapper-asl 1.9.2 org.codehaus.jackson jackson-jaxrs 1.9.2 commons-io commons-io 1.4 commons-logging commons-logging 1.1.1 commons-lang commons-lang 2.5 commons-httpclient commons-httpclient 3.1
四.测试
比如有下面一个服务端方法
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})
实际调用
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.客户端网络连接出错重试
4.客户端Timeout(超时)配置
5.直接返回结果,不增加包装类
通过URL增加参数 &__noWrapResult=true,来指明直接返回结果,
{resultObject}
而不返回
{result: {resultObject} }
6.设置使用其它传输协议: json,java,hessian
默认的传输协议是: json,还可以使用其它传输协议
7.开启http gzip压缩
可以通过nginx压缩现在的http返回结果,客户端跟服务端都不需要作任何修改。