Okra框架(三) 搭建HTTP服务器
2016-04-19 11:09
483 查看
Okra通过封装成熟高效的框架以简化应用程序服务器构建的过程。上一篇介绍了使用Okra快速搭建Socket服务器。
本篇承接上一篇,介绍快速搭建简单高性能的Http服务器。
这里需要说明一下Okra框架不适用于web服务器。Okra的通信是基于Netty框架的,而Netty本身不提供强有力的web相关功能支持。
但是作为app或者是网页游戏的短连接服务器,Okra还是绰绰有余的。
Okra提供了封装好的Disruptor桥用于Netty结合Disruptor。Okra通过Executor工厂让用户可以便捷灵活的定制特殊的处理者.
继承DisruptorAdapterBy41xHandler(依赖于Netty4.1.x)或者DisruptorAdapterHandler(依赖于Netty4.0.x)实现创建HttpRequestExecutor的Executor工厂。
普通Java程序:
只需要简短的两行代码就可以启动服务器了。
本文介绍了使用Okra快速搭建高可用,高性能,可扩展,高并发服务器的示例。Okra通过封装,简化了服务器搭建过程。
本篇承接上一篇,介绍快速搭建简单高性能的Http服务器。
这里需要说明一下Okra框架不适用于web服务器。Okra的通信是基于Netty框架的,而Netty本身不提供强有力的web相关功能支持。
但是作为app或者是网页游戏的短连接服务器,Okra还是绰绰有余的。
1. 创建Executor
和Socket服务器搭建流程类似。首先实现一个简单的HttpRequestExecutor,用于处理Http请求:public class HttpRequestExecutor implements Executor { private static final Logger LOG = LogManager.getLogger(HttpRequestExecutor.class); protected Session session; protected FullHttpRequest request; public HttpRequestExecutor(Session session, FullHttpRequest request) { this.session = session; this.request = request; } @Override public void onExecute() { if (null == request) { throw new NullPointerException("request"); } try { QueryStringDecoder decoder = new QueryStringDecoder(request.getUri()); switch (decoder.path()) { case "/test": response(session.ctx(), "{state:0}"); return; case "/favicon.ico": break; } simple(session.ctx().channel(), HttpResponseStatus.FORBIDDEN); } catch (Exception e) { session.ctx().close(); LOG.info("HTTP Api throw exception : ", e); } } private static void simple(Channel channel, HttpResponseStatus status) { ChannelFuture channelFuture = channel.writeAndFlush(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, status)); channelFuture.addListener(ChannelFutureListener.CLOSE); } private static void response(ChannelHandlerContext ctx, String msg) { HttpResponse response; if (msg != null) { ByteBuf byteBuf = Unpooled.wrappedBuffer(msg.getBytes()); response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, byteBuf); } else { response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); } ChannelFuture channelFuture = ctx.channel().writeAndFlush(response); channelFuture.addListener(ChannelFutureListener.CLOSE); } @Override public void release() { this.session = null; this.request = null; } }
Okra提供了封装好的Disruptor桥用于Netty结合Disruptor。Okra通过Executor工厂让用户可以便捷灵活的定制特殊的处理者.
继承DisruptorAdapterBy41xHandler(依赖于Netty4.1.x)或者DisruptorAdapterHandler(依赖于Netty4.0.x)实现创建HttpRequestExecutor的Executor工厂。
public class ExampleApiHandler extends DisruptorAdapterBy41xHandler<FullHttpRequest> { @Override protected Executor newExecutor(Session session, FullHttpRequest msg) { return new HttpRequestExecutor(session, msg); } }
2. 创建Server
然后创建一个Server继承TcpProtocolServer实现自己的服务器类. 增加Handler处理public class HttpServer extends TcpProtocolServer { public HttpServer(int port) { setPort(port); } @Override protected ChannelHandler newChannelInitializer() { return new ChannelInitializer<NioSocketChannel>() { @Override protected void initChannel(NioSocketChannel ch) throws Exception { ChannelPipeline cp = ch.pipeline(); cp.addLast("decoder", new HttpRequestDecoder()); cp.addLast("encoder", new HttpResponseEncoder()); cp.addLast("aggregator", new HttpObjectAggregator(1048576)); cp.addLast("handler", new ExampleApiHandler()); } }; } }
3. 启动服务器
假如你的项目中使用了Spring框架,那么只需要在配置如下bean就可以启动:<!-- Http protocol server --> <bean id="httpServer" class="org.ogcs.okra.example.http.HttpServer" init-method="start" destroy-method="stop"> <constructor-arg name="port" value="${http.port}"/> </bean>
普通Java程序:
HttpServer server = new HttpServer(9005); server.start();
只需要简短的两行代码就可以启动服务器了。
4. 总结
和搭建Socket服务器基本类似。更换了处理协议的Handler和处理并发任务的Executor。基本结构并无太大变更(感谢Netty框架,呦吼!)本文介绍了使用Okra快速搭建高可用,高性能,可扩展,高并发服务器的示例。Okra通过封装,简化了服务器搭建过程。
相关文章推荐
- 服务器返回的HTTP状态码和与之关联的消息
- Java 之NIO(五) - 非阻塞式网络通信
- DWR全面详细解析--转载http://www.tuicool.com/articles/2eUVbm
- tcpdump
- Linux下网络工具
- JavaEE NetBeans HTTP Status 404 - Not Found
- wireshark 抓包分析 TCPIP协议的握手
- TCP/IP、Http、Socket的区别
- http与https与socket tcp/IP与UDP 协议等
- python用httplib模块发送get和post请求
- VirtualBox虚拟机网络设置
- springmvc maven项目不识别HttpServletRequest
- response.sendRedirect("http://www.cnblogs.com/");
- Web Api 请求调用——httpclient
- 网络根基的协议------基础中的基础
- 用JDBC编程的运行时错误及其解决大全--转载http://www.th7.cn/Program/java/201409/274583.shtml
- httpclient传json字符串raw形式,调post
- BEA-WEBLOGIC ---http://www.beansoft.biz/weblogic/docs92/index.html
- TCP客户端服务器
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较