标签:
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请求数据串;

标签:
原文地址:http://www.cnblogs.com/xuxueli/p/5003305.html