Web 应用中的Netty

作者: 逗逼程序员 | 来源:发表于2020-01-14 18:37 被阅读0次

背景

Spring Boot 给开发者带来了极大的便利,以至于我们开发一个项目的时候,首先想到的就是 它,然后服务器也不加死锁的使用了它默认内置 Tomcat,甚至都不会去考虑下 是否需要切换 jetty ?

高并发、大流量的今天,我们是否还有其他的 服务端处理并发请求的选择的?

答案当然是肯定的,本节 我们就先来搭建一个 Web Netty 的demo,后面再细细研究,这也符合我们学习一个新技术的思路:先学会怎么用,再去慢慢debug 。

概述

netty 官网:

https://netty.io/

netty 是什么?

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

Netty是异步事件驱动的网络应用程序框架 用于快速开发可维护的高性能协议服务器和客户端。

最新版本:

Netty 4.1.45.Final released on 2020.01.30

搭建项目步骤:

1、idea 创建一个Maven 项目,并加入 最新版的 netty 版本依赖

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.45.Final</version>
</dependency>

netty-all 表示引入netty 所有相关依赖

2、编写服务端处理类

TestServer.class

public class TestServer {

    public static void main(String[] args) throws Exception {

        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new TestServerInitializer());
            ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
            channelFuture.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

TestServerInitializer.class

public class TestServerInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline();

        pipeline.addLast("httpServerCodec", new HttpServerCodec());
        pipeline.addLast("testHttpServerHandler", new TestHttpServerHandler());
    }
}

TestHttpServerHandler.class

public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception {

        if (httpObject instanceof HttpRequest) {

            HttpRequest request = (HttpRequest) httpObject;

            System.out.println(request.uri());
            System.out.println(request.method());

            ByteBuf content = Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8);

            FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,
                    content);
            response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");
            response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());

            channelHandlerContext.writeAndFlush(response);
        }
    }
}

启动 TestServer 主服务类~~~

客户端发起 GET 请求

$ curl localhost:8899/

可以看到控制台打印的日志~~~~~

是不是很惊喜,一个简单的 DEMO 运行起来。对于发起请求方来说,后端的服务毫无感知。

实际上,Netty 的范式编程 主要步骤也是如上。

后面我们再深入一步的再分析~~~~~~~

欢迎一起共同学习~~

相关文章

  • Web 应用中的Netty

    背景 Spring Boot 给开发者带来了极大的便利,以至于我们开发一个项目的时候,首先想到的就是 它,然后服务...

  • netty相关问题

    Netty 是什么? 为什么要用 Netty? Netty 应用场景了解么?解决的问题1、http协议或者web ...

  • Essential Netty in Action学习(二)

    Netty中必须清楚了解的几个组件: bootstrap Netty应用程序是以bootstrap开始,所以他是入...

  • 使用Netty搭建Dubbo

    前言 Dubbo是基于Netty搭建的RPC框架,为了更好地理解Netty在Dubbo中的应用,仿照Dubbo搭建...

  • 基于Netty实现HttpServer和WebSocketSer

    flyingboot 项目介绍 基于Netty的轻量级web快速开发框架。使用netty+completeable...

  • java-netty

    netty常用API学习 netty简介 Netty是基于Java NIO的网络应用框架. Netty是一个NIO...

  • netty 相关问题

    概览: Netty 是什么?为什么要用 Netty?Netty 应用场景了解么?Netty 核心组件有哪些?分别有...

  • netty

    netty起步 netty简介 1、Netty是基于Java NIO的网络应用框架。2、Netty是一个NIO c...

  • netty启动流程分析1

    在编写一个基于netty的网络应用中,代码的整体结构都一样,不管是写一个基于nio的还是Oio的netty应用,但...

  • Netty入门到实现聊天

    刚毕业,本来学的java,做web应用,结果,去了游戏公司做射击游戏,app端,服务器用的Netty写的,写服务器...

网友评论

    本文标题:Web 应用中的Netty

    本文链接:https://www.haomeiwen.com/subject/tbbaactx.html