Dispatcher -- 负责-NIO网络事件Selector引擎的管理,对Selector引擎负载均衡
IoAdaptor -- 网络事件的处理,服务器与客户端共用,负责读写,消息分包组包等
Session -- 代表网络链接,可以读写消息
这三个角色大部分场景下,需要个性化处理的就只有IoAdaptor,也就是业务逻辑。
服务器、客户端工具,Server\Client等都是辅助上述三个核心角色而产生的。Http模块实现了HTTP协议的编解码与客户端,代码极少,整个zbus.NET ~ 50K,但是其功能很强大,扩展性灵活多变。(proxy模块就是例子,甚至整个zbus项目都是NET模块的应用)
1. 先热个身,写个服务器。不是Hello World,是具有生产高性能特性的服务器代码框架。
第一步,要做的事情很简单,你到底想做啥业务,直接切入主题,个性化一个IoAdaptor
为了能快速演示,并能通过浏览看到效果,我们实现一个HTTP服务,http://localhost/hello 调用返回hello.
MessageAdaptor是扩展了IoAdaptor,完成Http编解码的一个适配基础类。我们只需要在这个基础类之上衍生出一个业务应用即可。
public class MyServerAdaptor extends MessageAdaptor{ public MyServerAdaptor(){ uri("/hello", new MessageProcessor() { @Override public Message process(Message request) { request.setBody("hello"); return request; } }); } }
第二步,让这个IoAdaptor跑在zbus.NET引擎之上。
那么创建这个引擎(多个Server可共享一个引擎,所以设计上分离了)
final Dispatcher dispatcher = new Dispatcher();
final Server server = new Server(dispatcher);
把第一步的IoAdaptor注册到这个引擎(Server控制)之上,可以方便侦听多端口(cool?)
IoAdaptor ioAdaptor = new MyServerAdaptor();
server.registerAdaptor(80, ioAdaptor);
server.registerAdaptor(8080, ioAdaptor);
第三步,让我们把这个引擎(Server控制)跑起来
server.start();
这个时候你就可以通过浏览器直接访问了,当然也可以通过Client访问。
Simple?压力测试看看吧,一般i7box可以上5w+的QPS。
不妨先看看源码吧,
示例全部源码(可进入zbus项目test目录下玩更多示例) package org.zbus.net; import org.zbus.net.core.Dispatcher; import org.zbus.net.core.IoAdaptor; import org.zbus.net.http.Message; import org.zbus.net.http.Message.MessageProcessor; import org.zbus.net.http.MessageAdaptor; public class MyServerAdaptor extends MessageAdaptor{ public MyServerAdaptor(){ uri("/hello", new MessageProcessor() { @Override public Message process(Message request) { request.setBody("hello"); return request; } }); } @SuppressWarnings("resource") public static void main(String[] args) throws Exception { final Dispatcher dispatcher = new Dispatcher(); final Server server = new Server(dispatcher); //相同的业务处理逻辑可以便捷的侦听多个地址 IoAdaptor ioAdaptor = new MyServerAdaptor(); server.registerAdaptor(80, ioAdaptor); server.registerAdaptor(8080, ioAdaptor); server.start(); } }