Magician 从诞生的那天起,其定位就是一个网络编程包,他虽然属于应用层,但是又偏向于底层。在用户手里 一般是承担内核的角色,主要职责就是负责网络通信。
由于偏底层的特性,所以在使用的过程中 通常会出现这么一个问题,当我们创建好一个TCP服务之后
Magician.createTCPServer()
.handler("/", new DemoHandler())
.bind(8080);
如果需要增加handler,就不得不更改这部分代码,使其变成这样
Magician.createTCPServer()
.handler("/", new DemoHandler())
.handler("/test", new TestHandler())
.bind(8080);
如果需要websocket 又得改成这样
Magician.createTCPServer()
.handler("/", new DemoHandler())
.handler("/test", new TestHandler())
.webSocketHandler("/websocket", new DemoSocketHandler())
.bind(8080);
创建服务的步骤 和 创建handler的步骤 耦合的太紧,如果纯粹的使用这个项目 问题倒不大,但是如果把这个项目作为另一个项目的内核来使用,这个问题就会非常明显,因为这个场景下 创建服务的代码会单独封装掉,经常去改这个被封装掉的代码,会有一定的安全隐患。
所以在1.1.16中 我们解决了这个问题。
我们采用了注解来定义一个handler
在创建服务的时候,只需要指定一个扫描范围
Magician.createTCPServer()
.scan("handler所在的包名")// 指定扫描范围
.bind(8080);
这样如果需要新增handler 就不需要再动这块的代码了
比如新增一个TCPHandler
@TCPHandler(path="/")// 只需要加个注解即可
public class DemoHandler implements TCPBaseHandler<MagicianRequest> {
@Override
public void request(MagicianRequest magicianRequest) {
// response data
magicianRequest.getResponse()
.sendJson(200, "{'status':'ok'}");
}
}
新增一个WebSocketHandler
@WebSocketHandler(path = "/websocket")
public class DemoSocketHandler implements WebSocketBaseHandler {
@Override
public void onOpen(WebSocketSession webSocketSession) {
}
@Override
public void onClose(WebSocketSession webSocketSession) {
}
@Override
public void onMessage(String message, WebSocketSession webSocketSession) {
}
}
这么做 就彻底的解耦了,创建服务就是纯粹的创建服务,创建handler就是纯粹的创建handler,两者之间没有很强的联系。
跟Magician一起升级的还有
Magician-Web组件,Martian组件。这两个组件的升级点,主要是配合Magician的改动而改动。而且给Martian带来了一个新特性:可以很方便的支持WebSocket了。
Magician的性能测试
TFB测试结果 达到了每秒可以完成15万次请求。
项目官网:magician-io.com
Magician IO,Magician开源项目的官方公众平台,会第一时间推送Magician的动态,同时也会不定期的发布业内资讯,技术文章等