github:https://github.com/xuxueli/xxl-hex
git.osc:http://git.oschina.net/xuxueli0323/xxl-hex
博客地址(内附使用教程):http://www.cnblogs.com/xuxueli/p/5003305.html
Tips:这篇基于hex的通讯方案,和网上其他的,或者你目前了解的完全不是同一个玩意儿,疑惑看代码;
简介:xxl-hex是一个轻量级的remoting onhttp工具,使用简单的方法提供了rpc的功能。 采用的是16进制编码协议,拥有以下特点:1、数据加密;2、跨语言;
跨语言,数据传输方案:
JSON:一种轻量级的数据交换格式,完全独立于语言(Bean对象 》》》 Json字符串);
XML:可扩展标记语言,设计宗旨是传输数据(Bean对象 》》》 XML字符串);
xxl-hex(本方案):一种需要预定规则的Hex数据传输方案(Bean对象 》》》 Hex字符串);
通讯方案:HttpClient + Servlet
在设计xxl-hex之前,可选的通讯方案有NETTY、MINA、JETTY等等(可以参考我的另一个轮子:http://www.cnblogs.com/xuxueli/p/4845111.html),但是出于kiss考虑,使用最方便系统集成的HttpClient+Servlet方式;
实现原理,部分逻辑点介绍:
1、总调用逻辑为:Client端封装IRequest编码为Hex后Post给Server端,Server端解码后匹配Handler执行handle逻辑后分装IResponse响应给Client端,Client接收后,一次请求Finish。
2、IRequest消息结构:IRequest消息首部存放该消息的ClassName,服务端可以根据ClassName反射实例化IRequest,并且匹配Handler执行handle逻辑;
3、IRequest匹配Handler:服务端维护一张消息哈希表,根据请求消息的ClassName可以定位到处理的Handler,例如:handlerMap.put("com.xxl.demo.msg.request.DemoRequest", "com.xxl.service.impl.DemoHandler");
4、Server端注册Handler:业务Handler必须为IHandler的子类并且需要被启动时初始化(可通过声明为Spring的Service搞定),无参构造里调用super.registry(XRequest.class);即可完成与XRequest的关系匹配;
使用教程:
1、引入依赖(自行打JAR包,如若需要提供JAR包,可以给我邮件):
<dependency> <groupId>com.xxl</groupId> <artifactId>xxl-hex-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
2、API开发:Request、Response
package com.xxl.demo.msg.request; import com.xxl.hex.core.codec.impl.IRequest; public class DemoRequest extends IRequest { private String param; public String getParam() { return param; } public void setParam(String param) { this.param = param; } }
package com.xxl.demo.msg.response; import com.xxl.hex.core.codec.impl.IResponse; public class DemoResponse extends IResponse { private String result; public String getResult() { return result; } public void setResult(String result) { this.result = result; } }
3、Server端开发:
配置hexServlet:
<servlet> <servlet-name>hexServlet</servlet-name> <servlet-class>com.xxl.hex.http.servlet.HexServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hexServlet</servlet-name> <url-pattern>/hexServlet</url-pattern> </servlet-mapping>
开发Handle:
package com.xxl.service.impl; import org.springframework.stereotype.Service; import com.xxl.demo.msg.request.DemoRequest; import com.xxl.demo.msg.response.DemoResponse; import com.xxl.hex.core.codec.impl.IRequest; import com.xxl.hex.core.codec.impl.IResponse; import com.xxl.hex.core.handler.IHandler; @Service public class DemoHandler extends IHandler{ public DemoHandler() { super.registry(DemoRequest.class); } @Override public IResponse handle(IRequest request) { DemoRequest msg = (DemoRequest) request; DemoResponse res = new DemoResponse(); res.setCode(200); res.setMsg("success"); res.setResult("hi, jack. (" + msg.getParam() + ")"); return res; } }
4、Client端:
DemoRequest request = new DemoRequest(); request.setParam("hi, lucy."); String request_hex = ByteHexConverter.byte2hex(request.toHexByte()); System.out.println(request_hex); String url = "http://localhost:8080/xxl-hex-demo-server/hexServlet"; String response_hex = HttpUtil.sendHex(url, request_hex); System.out.println(response_hex); DemoResponse msg = (DemoResponse) DemoResponse.class.newInstance().fillHexByte(ByteHexConverter.hex2Byte(response_hex)); System.out.println(BeanUtils.describe(msg));
运行截图:
Server端:注册Handler
Client端:请求日志,log请求数据串;