当前位置: 首页 > news >正文

搭建网站是什么中国交通建设股份有限公司官网

搭建网站是什么,中国交通建设股份有限公司官网,个人网站 备案 类型,怎么在网上卖东西视频文章目录 前言Netty介绍Netty发展历程Netty核心组件实现HTTP服务器总结 前言 上文《BIO、NIO、IO多路复用模型详细介绍Java NIO 网络编程》介绍了几种IO模型以及Java NIO#xff0c;了解了在网络编程时使用哪种模型可以提高系统性能及效率。即使Java NIO可以帮助开发人员… 文章目录 前言Netty介绍Netty发展历程Netty核心组件实现HTTP服务器总结 前言 上文《BIO、NIO、IO多路复用模型详细介绍Java NIO 网络编程》介绍了几种IO模型以及Java NIO了解了在网络编程时使用哪种模型可以提高系统性能及效率。即使Java NIO可以帮助开发人员编写和维护网络应用程序但由于其复杂性以及bug问题还是诞生很多强大和流行的网络编程框架比如Netty、Undertow、Grizzly在平时的开发中大家更倾向于选择这些框架进行开发而在我们学习和理解网络编程的底层原理时使用Java NIO可以更加直接和深入地了解底层操作。本文对 Netty 进行简单介绍并通过 Netty 实现一个HTTP服务器。 Netty介绍 Netty是一个基于Java的高性能网络应用框架它封装了Java NIO的复杂性提供了简单而强大的网络编程API使得开发者能够更方便地构建高性能、可伸缩的网络应用程序。所以说学习Netty前先理解一下Java NIO是很有必要的不然云里雾里的。 使用Netty能有多强大呢包括但不限于以下几点 高性能的IO处理如果基于Java NIO开发一个成熟的应用要非常注意如ByteBuffer内存泄漏、Channel注册连接、线程管理等问题。而Netty能够更好地处理连接管理、线程模型和内存管理等方面的问题从而提供更高的吞吐量和更低的延迟。强大的功能扩展如果基于Java NIO写一个HTTP协议、Websocket协议那我们需要考虑格式、编解码问题而Netty提供提供了丰富的扩展点比如编解码器、处理器和拦截器等开发人员可以通过不同的配置搭建HTTP、WebSocket、TCP和UDP等协议也可以轻松地添加编解码器实现自定义协议。可靠性和稳定性Netty具有良好的容错能力和稳定性能够处理各种网络故障和异常情况并提供了多种容错和恢复机制如断线重连和心跳机制等。 总的来说在开发网络应用程序时使用Netty能够更专注于业务逻辑。下图为Netty所支持的功能 Netty发展历程 为了进一步了解Netty这里介绍一下Netty的前世今生。 2004年Netty的前身Jboss Netty项目在JBoss公司内部启动目标是提供一个可扩展的、易用的网络编程框架。2008年Netty项目在JBoss公司内部开源并发布了第一个公开版本Netty 3.0。该版本主要针对TCP和HTTP协议进行了支持。2011年Netty 3.2发布引入了更多的特性和改进包括更好的性能和更灵活的API设计。2012年Netty 4.0发布这是一个重大的里程碑版本。在这个版本中Netty进行了全面的重构和优化引入了新的API设计和更高级的特性。2013年Netty 4.0获得了广泛的认可和采用并成为了许多大型互联网公司和项目的首选网络编程框架。同年底发布了5.0.0.Alpha1目标是对Netty 4改进和优化。2015年Netty 5在开发过程中遇到了一些挑战和技术难题决定暂停Netty 5的开发并将重心转移到Netty 4的改进和维护上。2016年Netty 4.1发布基于4.0版本进一步改进和优化提供了更好的性能和更多的功能。 目前有很多知名的项目都选用了Netty作为网络通信的基础比如知名的RPC框架Dubbo、gRPC消息队列Kafka、RocketMQ搜索引擎Elasticsearch等所以当学习了解这些项目时Netty会作为一个加分项。 Netty核心组件 因为Netty是基于Java NIO封装的更加的抽象要使用Netty进行开发必须要熟悉Netty中的几个核心组件下面一一介绍 Channel通道与Java NIO中的SocketChannel一样可以进行数据的读取和写入。EventLoop事件循环EventLoop是Netty的事件处理机制它负责处理各种事件包括连接的建立与关闭、数据的读取与写入等。可以理解成Java NIO中的Selector监听socket得事件只不过Netty时多线程处理后面代码中有体现。ChannelHandler通道处理器用来处理Channel中的事件和数据的组件例如对数据编解码、业务逻辑处理等。Netty提供了许多内置的ChannelHandler用于处理网络连接和I/O操作。以下是一些常用的ChannelHandler ChannelInboundHandler用于处理入站事件例如连接建立、数据读取等。ChannelOutboundHandler用于处理出站事件例如数据写入、连接关闭等。SimpleChannelInboundHandler继承自ChannelInboundHandler简化了消息处理的逻辑。SimpleChannelOutboundHandler继承自ChannelOutboundHandler简化了消息发送的逻辑。HttpServerCodec它负责处理 HTTP 请求和响应的编解码。HttpObjectAggregator将 HTTP 请求的多个部分合并成一个完整的 FullHttpRequest。WebSocketServerProtocolHandler处理 WebSocket 协议的握手和帧的编解码。 ChannelPipeline通道管道ChannelPipeline是一个事件处理器链用于管理和执行ChannelHandler每个Channel都有一个对应的Pipeline当数据进入或离开Channel时会经过Pipeline中的一系列ChannelHandler进行处理。ByteBuf字节缓冲区ByteBuf是Netty中的字节容器用于高效地存储和传输字节数据。与Java NIO的ByteBuffer相比ByteBuf提供了更灵活的API和更高效的内存管理。Future异步操作结果Netty中的操作都是异步的Future用来获取操作的状态和结果。Bootstrap引导类Bootstrap是启动客户端的类负责配置和启动客户端的相关组件。ServerBootstrap服务器引导类ServerBootstrap是创建和启动服务器的类用于配置和管理服务器的各个组件。 实现HTTP服务器 下面以HTTP协议为例用Netty编写一个HTTP服务器。在这之前我们先用上篇文章的NIOServer接收一下浏览器的请求大概是这样的 GET / HTTP/1.1 Host: localhost:8888 Connection: keep-alive sec-ch-ua: Google Chrome;v111, Not(A:Brand;v8, Chromium;v111 sec-ch-ua-mobile: ?0 sec-ch-ua-platform: macOS Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q0.9可以看到接收到了一个HTTP请求的报文数据有请求行、请求头和请求主体这时候也能看到浏览器返回的响应是ERR_INVALID_HTTP_RESPONSE发送的响应无效。为什么这是因为NIOServer中的输出格式HTTP协议不认识。 所以如果使用Java NIO实现一个HTTP服务器需要处理很多的工作但是如果用Netty实现一个HTTP服务器非常简单直接上代码 import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.*; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import io.netty.util.CharsetUtil;import java.util.List; import java.util.Map;public class HttpServer {private final int port;public HttpServer(int port) {this.port port;}public void start() throws Exception {EventLoopGroup bossGroup new NioEventLoopGroup(1);EventLoopGroup workerGroup new NioEventLoopGroup();try {ServerBootstrap b new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChannelInitializerSocketChannel() {Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p ch.pipeline();//将原始的HTTP请求和响应数据进行编解码p.addLast(new HttpServerCodec());//将HTTP请求或响应的多个部分合并成一个完整的消息p.addLast(new HttpObjectAggregator(65536));p.addLast(new SimpleChannelInboundHandlerFullHttpRequest() {Overrideprotected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) {//查询URI中的参数QueryStringDecoder decoder new QueryStringDecoder(request.uri());MapString, ListString params decoder.parameters();System.out.println(params);ByteBuf content request.content();//请求主体中的参数String requestBody content.toString(CharsetUtil.UTF_8);System.out.println(requestBody);String responseContent 你好, Netty!;FullHttpResponse response new DefaultFullHttpResponse(request.protocolVersion(), HttpResponseStatus.OK, Unpooled.wrappedBuffer(responseContent.getBytes()));response.headers().set(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.TEXT_HTML ;charsetutf-8);response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);}});}});ChannelFuture f b.bind(port).sync();f.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}public static void main(String[] args) throws Exception {int port 8080;HttpServer server new HttpServer(port);System.out.println(Server started on port port);server.start();} }运行这个示例后你可以使用浏览器或者其他工具发送HTTP请求到 http://localhost:8080 一个HTTP服务器就诞生了非常简单。接下来对代码进行讲解 代码中的b.group(bossGroup, workerGroup)意思是有两个线程组会去处理服务器中的IO事件bossGroup只用一个线程来专门负责监听服务端的端口接收客户端连接请求并将连接分配给 workerGroup 中的 EventLoop 进行处理;workerGroup负责处理已接收的连接的 I/O 事件将请求解码、处理业务逻辑以及发送响应等操作都交给 EventLoop 来处理。这个是典型的主从Reactor模式通过将连接的接收和处理分离到不同的线程池中可以提高网络应用程序的性能模型如下。 NioServerSocketChannel是指定服务器的Channel类型还有NioDatagramChannel等类型取决于应用场景。 .handler(new LoggingHandler(LogLevel.INFO))是为bossGroup指定一个通道处理器记录进出 Channel 的数据流将相关信息打印到日志中便于排查。 .childHandler()则是为workerGroup中的EventLoop配置处理器比如请求解码、处理业务逻辑以及发送响应。ChannelPipeline就是添加具体的通道处理器代码中的HttpServerCodec、HttpObjectAggregator处理器都是用来处理HTTP请求的编解码SimpleChannelInboundHandler则是拿到经过多个处理器的数据流后进行业务逻辑及响应。 总结 Netty是一个非常优秀的、强大的、高性能的网络通信框架在这个互联网飞速发展的时代我们需要了解并且使用像这样的优秀的框架帮助我们快速开发应用在使用它的同时要知其原理也可以在业务中进行创新就像Dubbo、gRPC、Zookeeper一样采用Netty成为与其一样优秀的框架。
http://wiki.neutronadmin.com/news/253053/

相关文章:

  • 网站名称如何设置招聘网站设计师要求
  • 网站索引量怎么做网站小图标
  • 关于公司网站开发的事项网站怎么在移动端推广
  • 宁波哪家做网站好一流的高密网站建设
  • 金泉网做网站多少钱ftp上传网站之后怎么做
  • 新手做网站怎么上传系统微网站免
  • 广州营销型企业网站建设网站推广服务网站连锁
  • 做暖dnf动态ufo网站网站点击量在哪里看
  • 标准网站建设合同模板网站
  • 行业推广做哪个网站好口岸地区网站建设内容
  • 整站优化网站报价旅游景区网站建设策划书
  • 国内建站 wordpress温州营销网站制作报价
  • 做企业网站用什么程序潍坊科技学院
  • wordpress sora 公开版网站内部优化方法
  • 最好的设计师网站网站怎么集成支付宝
  • 易县做网站公司想建个网站
  • 有做自由行包车的网站网站建设管理和维护
  • 模板网站好还是自助建站好宠物网站页面设计ps
  • 福州网站制作维护企业邮箱怎么注册域名
  • 建e网站宣武网站建设服务
  • 大连网站开发选领超科技app开发定制公司
  • html5好的网站模板seo搜索引擎优化原理
  • 淄博网站建设找李光明制作网站建设
  • 重庆万州网站建设找谁wordpress用户注册插件
  • 口碑好的五屏网站建设分销网络建设
  • 南阳seo网站排名网页制作公司有哪些职位
  • dw制作wap网站怎么做企业解决方案模板
  • iis网站批量导入济南网页设计
  • 网络编程就是做网站么网站留言发送到qq邮箱
  • 网站竞争案例天津网站搜索排名优化