文档章节

Okra框架(三) 搭建HTTP服务器

T
 TinyZzh
发布于 2016/04/19 12:29
字数 726
阅读 47
收藏 0

Okra通过封装成熟高效的框架以简化应用程序服务器构建的过程。上一篇介绍了使用Okra快速搭建Socket服务器。 本篇承接上一篇,介绍快速搭建简单高性能的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通过封装,简化了服务器搭建过程。

© 著作权归作者所有

共有 人打赏支持
T
粉丝 1
博文 4
码字总数 2327
作品 0
杭州
高级程序员
私信 提问
OSChina 技术周刊第十一期

每周技术抢先看,总有你想要的! 前端开发 【软件】Chartist.js —— 基于 SVG 的响应式图表库 【博客】node.js构建http服务器(一) 【博客】AngularJS SEO 简易教程 【资讯】Semantic UI 1...

OSC编辑部
2014/11/30
0
0
OSChina 技术周刊第十一期 —— 每周技术抢先看

每周技术抢先看,总有你想要的! 前端开发 【软件】Chartist.js —— 基于 SVG 的响应式图表库 【博客】node.js构建http服务器(一) 【博客】AngularJS SEO 简易教程 【资讯】Semantic UI 1...

OSC编辑部
2014/11/30
2.9K
0
golang web编程

golang web编程 go语言web框架beego的helloword示例 //安装beego模块 //E:>set GOPATH=E:resourceprojectweb_crawler //E:>go get github.com/… golang web编程五:提交url抓取页面内容并且......

d_watson
2016/05/27
47
0
Linux搭建Python web环境(nginx + flask + uwsgi)

去年的时候,就曾使用Nginx+Flask+uwsgi搭建过python的web环境。但在最近搭建的时候,又去网上找了一遍教程,所以打算写一篇笔记做下记录。 在搭建之前,有必要了解下发送一个请求的整个流程...

liuchungui
05/14
0
0
Net分布式系统之一:系统整体框架介绍

原文出处:Andon 一、设计目的   从事.Net平台开发系统已有8年多了,一直思考搭建.Net分布式系统架构。基于window平台搭建的大型分布式系统不多,之前了解过myspace、stackoverflow等大型网...

Andon
2016/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
3
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
1
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
3
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
3
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部