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

电子商务网站实例安徽哪些地方封城了

电子商务网站实例,安徽哪些地方封城了,网站建设公司巨头,网站建设公司的服务定位文章目录 概述JDK 原生 NIO 程序的问题Why Netty使用场景Related ProjectsNetty 高性能设计I/O 模型【阻塞 I/O】#xff1a;【I/O 复用模型】【基于 Buffer】 线程模型事件驱动模型Reactor 线程模型Netty的线程模型异步处理 Netty框架的架构设计功能特性模块组件Bootstrap、S… 文章目录 概述JDK 原生 NIO 程序的问题Why Netty使用场景Related ProjectsNetty 高性能设计I/O 模型【阻塞 I/O】【I/O 复用模型】【基于 Buffer】 线程模型事件驱动模型Reactor 线程模型Netty的线程模型异步处理 Netty框架的架构设计功能特性模块组件Bootstrap、ServerBootstrapFuture、ChannelFutureChannelSelectorNioEventLoopNioEventLoopGroupChannelHandlerChannelHandlerContextChannelPipline Netty框架的工作原理服务端 Netty 的工作架构图Boss NioEventLoopWorker NioEventLoop任务队列中的3 种典型Task使用场景用户程序自定义的普通任务非当前 Reactor 线程调用 Channel 的各种方法用户自定义定时任务 概述 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架用于快速开发可维护的高性能协议服务器和客户端。 基于 Netty 4.1 展开介绍相关理论模型使用场景基本组件、整体架构。 JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API但是存在一系列问题主要如下 1NIO 的类库和 API 繁杂使用麻烦你需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 2需要具备其他的额外技能做铺垫例如熟悉 Java 多线程编程因为 NIO 编程涉及到 Reactor 模式你必须对多线程和网路编程非常熟悉才能编写出高质量的 NIO 程序。 3可靠性能力补齐开发工作量和难度都非常大例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等等。NIO 编程的特点是功能开发相对容易但是可靠性能力补齐工作量和难度都非常大。 4JDK NIO 的 Bug例如臭名昭著的 Epoll Bug它会导致 Selector 空轮询最终导致 CPU 100%。官方声称在 JDK 1.6 版本的 update 18 修复了该问题但是直到 JDK 1.7 版本该问题仍旧存在只不过该 Bug 发生概率降低了一些而已它并没有被根本解决。 Why Netty Netty 对 JDK 自带的 NIO 的 API 进行了封装解决了上述问题。 Netty的主要特点有 1设计优雅适用于各种传输类型的统一 API 阻塞和非阻塞 Socket基于灵活且可扩展的事件模型可以清晰地分离关注点高度可定制的线程模型; 单线程一个或多个线程池真正的无连接数据报套接字支持自 3.1 起。 2使用方便详细记录的 Javadoc用户指南和示例没有其他依赖项JDK 5Netty 3.x或 6Netty 4.x就足够了。 3高性能、吞吐量更高延迟更低减少资源消耗最小化不必要的内存复制。 4安全完整的 SSL/TLS 和 StartTLS 支持。 5社区活跃、不断更新社区活跃版本迭代周期短发现的 Bug 可以被及时修复同时更多的新功能会被加入。 使用场景 1互联网行业在分布式系统中各个节点之间需要远程服务调用高性能的 RPC 框架必不可少Netty 作为异步高性能的通信框架往往作为基础通信组件被这些 RPC 框架使用。典型的应用有阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信Dubbo 协议默认使用 Netty 作为基础通信组件用于实现各进程节点之间的内部通信。 2游戏行业无论是手游服务端还是大型的网络游戏Java 语言得到了越来越广泛的应用。Netty 作为高性能的基础通信组件它本身提供了 TCP/UDP 和 HTTP 协议栈。非常方便定制和开发私有协议栈账号登录服务器地图服务器之间可以方便的通过 Netty 进行高性能的通信。 3大数据领域经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架默认采用 Netty 进行跨界点通信它的 Netty Service 基于 Netty 框架二次封装实现。 Related Projects https://netty.io/wiki/related-projects.html Netty 高性能设计 Netty 作为异步事件驱动的网络高性能之处主要来自于其 I/O 模型和线程处理模型 前者决定如何收发数据后者决定如何处理数据。 I/O 模型 用什么样的通道将数据发送给对方BIO、NIO 或者 AIOI/O 模型在很大程度上决定了框架的性能。 【阻塞 I/O】 传统阻塞型 I/O(BIO)可以用下图表示 特点如下 每个请求都需要独立的线程完成数据 Read业务处理数据 Write 的完整操作问题。 当并发数较大时需要创建大量线程来处理连接系统资源占用较大。 连接建立后如果当前线程暂时没有数据可读则线程就阻塞在 Read 操作上造成线程资源浪费。 【I/O 复用模型】 在 I/O 复用模型中会用到 Select这个函数也会使进程阻塞但是和阻塞 I/O 所不同的是这两个函数可以同时阻塞多个 I/O 操作。 而且可以同时对多个读操作多个写操作的 I/O 函数进行检测直到有数据可读或可写时才真正调用 I/O 操作函数。 Netty 的非阻塞 I/O 的实现关键是基于 I/O 复用模型这里用 Selector 对象表示 Netty 的 IO 线程 NioEventLoop 由于聚合了多路复用器 Selector可以同时并发处理成百上千个客户端连接。 当线程从某客户端 Socket 通道进行读写数据时若没有数据可用时该线程可以进行其他任务。 线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作所以单独的线程可以管理多个输入和输出通道。 由于读写操作都是非阻塞的这就可以充分提升 IO 线程的运行效率避免由于频繁 I/O 阻塞导致的线程挂起。 一个 I/O 线程可以并发处理 N 个客户端连接和读写操作这从根本上解决了传统同步阻塞 I/O 一连接一线程模型架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 【基于 Buffer】 传统的 I/O 是面向字节流或字符流的以流式的方式顺序地从一个 Stream 中读取一个或多个字节, 因此也就不能随意改变读取指针的位置。 在 NIO 中抛弃了传统的 I/O 流而是引入了 Channel 和 Buffer 的概念。在 NIO 中只能从 Channel 中读取数据到 Buffer 中或将数据从 Buffer 中写入到 Channel。 基于 Buffer 操作不像传统 IO 的顺序操作NIO 中可以随意地读取任意位置的数据。 线程模型 数据报如何读取读取之后的编解码在哪个线程进行编解码后的消息如何派发线程模型的不同对性能的影响也非常大。 事件驱动模型 通常我们设计一个事件处理模型的程序有两种思路 1轮询方式线程不断轮询访问相关事件发生源有没有发生事件有发生事件就调用事件处理逻辑2事件驱动方式发生事件主线程把事件放入事件队列在另外线程不断循环消费事件列表中的事件调用事件对应的处理逻辑处理事件。事件驱动方式也被称为消息通知方式其实是设计模式中观察者模式的思路。 以 GUI 的逻辑处理为例说明两种逻辑的不同 1轮询方式线程不断轮询是否发生按钮点击事件如果发生调用处理逻辑。 2事件驱动方式发生点击事件把事件放入事件队列在另外线程消费的事件列表中的事件根据事件类型调用相关事件处理逻辑。 这里借用 O’Reilly 大神关于事件驱动模型解释图 主要包括 4 个基本组件 1事件队列event queue接收事件的入口存储待处理事件2分发器event mediator将不同的事件分发到不同的业务逻辑单元3事件通道event channel分发器与处理器之间的联系渠道4事件处理器event processor实现业务逻辑处理完成后会发出事件触发下一步操作。 可以看出相对传统轮询模式事件驱动有如下优点 1可扩展性好分布式的异步架构事件处理器之间高度解耦可以方便扩展事件处理逻辑2高性能基于队列暂存事件能方便并行异步处理事件。 Reactor 线程模型 Reactor 是反应堆的意思Reactor 模型是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。 服务端程序处理传入多路请求并将它们同步分派给请求对应的处理线程Reactor 模式也叫 Dispatcher 模式即 I/O 多了复用统一监听事件收到事件后分发(Dispatch 给某进程)是编写高性能网络服务器的必备技术之一。 Reactor 模型中有 2 个关键组成 1ReactorReactor 在一个单独的线程中运行负责监听和分发事件分发给适当的处理程序来对 IO 事件做出反应。它就像公司的电话接线员它接听来自客户的电话并将线路转移到适当的联系人2Handlers处理程序执行 I/O 事件要完成的实际事件类似于客户想要与之交谈的公司中的实际官员。Reactor 通过调度适当的处理程序来响应 I/O 事件处理程序执行非阻塞操作。 取决于 Reactor 的数量和 Hanndler 线程数量的不同Reactor 模型有 3 个变种 1单 Reactor 单线程2单 Reactor 多线程3主从 Reactor 多线程。 可以这样理解Reactor 就是一个执行 while (true) { selector.select(); …} 循环的线程会源源不断的产生新的事件称作反应堆很贴切。 更都参考我的另外两篇文章 高性能网络编程 - 解读5种I/O模型 高性能网络编程 - 解读3种线程模型 Netty的线程模型 Netty 主要基于主从 Reactors 多线程模型如下图做了一定的修改其中主从 Reactor 多线程模型有多个 Reactor 1MainReactor 负责客户端的连接请求并将请求转交给 SubReactor2SubReactor 负责相应通道的 IO 读写请求3非 IO 请求具体逻辑处理的任务则会直接写入队列等待 worker threads 进行处理 这里引用 Doug Lee 大神的 Reactor 介绍——Scalable IO in Java 里面关于主从 Reactor 多线程模型的图 特别说明的是虽然 Netty 的线程模型基于主从 Reactor 多线程借用了 MainReactor 和 SubReactor 的结构。但是实际实现上 SubReactor 和 Worker 线程在同一个线程池中 EventLoopGroup bossGroup new NioEventLoopGroup();EventLoopGroup workerGroup new NioEventLoopGroup();ServerBootstrap serverBootstrap new ServerBootstrap();serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class);上面代码中的 bossGroup 和 workerGroup 是 Bootstrap 构造方法中传入的两个对象这两个 group 均是线程池 1bossGroup 线程池则只是在 Bind 某个端口后获得其中一个线程作为 MainReactor专门处理端口的 Accept 事件每个端口对应一个 Boss 线程2workerGroup 线程池会被各个 SubReactor 和 Worker 线程充分利用。 异步处理 异步的概念和同步相对。当一个异步过程调用发出后调用者不能立刻得到结果。实际处理这个调用的部件在完成后通过状态、通知和回调来通知调用者。 Netty 中的 I/O 操作是异步的包括 Bind、Write、Connect 等操作会简单的返回一个 ChannelFuture。 调用者并不能立刻获得结果而是通过 Future-Listener 机制用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。 当 Future 对象刚刚创建时处于非完成状态调用者可以通过返回的 ChannelFuture 来获取操作执行的状态注册监听函数来执行完成后的操作。 常见有如下操作 1通过 isDone 方法来判断当前操作是否完成2通过 isSuccess 方法来判断已完成的当前操作是否成功3通过 getCause 方法来获取已完成的当前操作失败的原因4通过 isCancelled 方法来判断已完成的当前操作是否被取消5通过 addListener 方法来注册监听器当操作已完成(isDone 方法返回完成)将会通知指定的监听器如果 Future 对象已完成则理解通知指定的监听器。 例如下面的代码中绑定端口是异步操作当绑定操作处理完将会调用相应的监听器处理逻辑 serverBootstrap.bind(port).addListener(future - {if (future.isSuccess()) {System.out.println(端口 port 绑定成功);} else {System.out.println(端口 port 绑定失败);}});相比传统阻塞 I/O执行 I/O 操作后线程会被阻塞住, 直到操作完成异步处理的好处是不会造成线程阻塞线程在 I/O 操作期间可以执行别的程序在高并发情形下会更稳定和更高的吞吐量。 Netty框架的架构设计 前面介绍完 Netty 相关一些理论下面从功能特性、模块组件、运作过程来介绍 Netty 的架构设计。 功能特性 Netty 功能特性如下 1传输服务支持 BIO 和 NIO2容器集成支持 OSGI、JBossMC、Spring、Guice 容器3协议支持HTTP、Protobuf、二进制、文本、WebSocket 等一系列常见协议都支持。还支持通过实行编码解码逻辑来实现自定义协议4Core 核心可扩展事件模型、通用通信 API、支持零拷贝的 ByteBuf 缓冲对象。 模块组件 Bootstrap、ServerBootstrap Bootstrap 意思是引导一个 Netty 应用通常由一个 Bootstrap 开始主要作用是配置整个 Netty 程序串联各个组件Netty 中 Bootstrap 类是客户端程序的启动引导类ServerBootstrap 是服务端启动引导类。 Future、ChannelFuture 正如前面介绍在 Netty 中所有的 IO 操作都是异步的不能立刻得知消息是否被正确处理。 但是可以过一会等它执行完成或者直接注册一个监听具体的实现就是通过 Future 和 ChannelFutures他们可以注册一个监听当操作执行成功或失败时监听会自动触发注册的监听事件。 Channel Netty 网络通信的组件能够用于执行网络 I/O 操作。 Channel 为用户提供 1当前网络连接的通道的状态例如是否打开是否已连接2网络连接的配置参数 例如接收缓冲区大小3提供异步的网络 I/O 操作(如建立连接读写绑定端口)异步调用意味着任何 I/O 调用都将立即返回并且不保证在调用结束时所请求的 I/O 操作已完成。4调用立即返回一个 ChannelFuture 实例通过注册监听器到 ChannelFuture 上可以 I/O 操作成功、失败或取消时回调通知调用方。5支持关联 I/O 操作与对应的处理程序。 不同协议、不同的阻塞类型的连接都有不同的 Channel 类型与之对应。 下面是一些常用的 Channel 类型 NioSocketChannel异步的客户端 TCP Socket 连接。NioServerSocketChannel异步的服务器端 TCP Socket 连接。NioDatagramChannel异步的 UDP 连接。NioSctpChannel异步的客户端 Sctp 连接。NioSctpServerChannel异步的 Sctp 服务器端连接这些通道涵盖了 UDP 和 TCP 网络 IO 以及文件 IO。 Selector Netty 基于 Selector 对象实现 I/O 多路复用通过 Selector 一个线程可以监听多个连接的 Channel 事件。 当向一个 Selector 中注册 Channel 后Selector 内部的机制就可以自动不断地查询(Select) 这些注册的 Channel 是否有已就绪的 I/O 事件例如可读可写网络连接完成等这样程序就可以很简单地使用一个线程高效地管理多个 Channel 。 NioEventLoop NioEventLoop 中维护了一个线程和任务队列支持异步提交执行任务线程启动时会调用 NioEventLoop 的 run 方法执行 I/O 任务和非 I/O 任务 I/O 任务即 selectionKey 中 ready 的事件如 accept、connect、read、write 等由 processSelectedKeys 方法触发。非 IO 任务添加到 taskQueue 中的任务如 register0、bind0 等任务由 runAllTasks 方法触发。 两种任务的执行时间比由变量 ioRatio 控制默认为 50则表示允许非 IO 任务执行的时间与 IO 任务的执行时间相等。 NioEventLoopGroup NioEventLoopGroup主要管理 eventLoop 的生命周期可以理解为一个线程池内部维护了一组线程每个线程(NioEventLoop)负责处理多个 Channel 上的事件而一个 Channel 只对应于一个线程。 ChannelHandler ChannelHandler 是一个接口处理 I/O 事件或拦截 I/O 操作并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序。 ChannelHandler 本身并没有提供很多方法因为这个接口有许多的方法需要实现方便使用期间可以继承它的子类 ChannelInboundHandler 用于处理入站 I/O 事件。ChannelOutboundHandler 用于处理出站 I/O 操作。 或者使用以下适配器类 ChannelInboundHandlerAdapter 用于处理入站 I/O 事件。ChannelOutboundHandlerAdapter 用于处理出站 I/O 操作。ChannelDuplexHandler 用于处理入站和出站事件。 ChannelHandlerContext 保存 Channel 相关的所有上下文信息同时关联一个 ChannelHandler 对象。 ChannelPipline 保存 ChannelHandler 的 List用于处理或拦截 Channel 的入站事件和出站操作。 ChannelPipeline 实现了一种高级形式的拦截过滤器模式使用户可以完全控制事件的处理方式以及 Channel 中各个的 ChannelHandler 如何相互交互。 下图引用 Netty 的 Javadoc 4.1 中 ChannelPipeline 的说明描述了 ChannelPipeline 中 ChannelHandler 通常如何处理 I/O 事件。 I/O 事件由 ChannelInboundHandler 或 ChannelOutboundHandler 处理并通过调用 ChannelHandlerContext 中定义的事件传播方法。 例如ChannelHandlerContext.fireChannelReadObject和 ChannelOutboundInvoker.writeObject转发到其最近的处理程序。 入站事件由自下而上方向的入站处理程序处理如图左侧所示。入站 Handler 处理程序通常处理由图底部的 I/O 线程生成的入站数据。 通常通过实际输入操作例如 SocketChannel.readByteBuffer从远程读取入站数据。 出站事件由上下方向处理如图右侧所示。出站 Handler 处理程序通常会生成或转换出站传输例如 write 请求。 I/O 线程通常执行实际的输出操作例如 SocketChannel.writeByteBuffer。 在 Netty 中每个 Channel 都有且仅有一个 ChannelPipeline 与之对应它们的组成关系如下 一个 Channel 包含了一个 ChannelPipeline而 ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler。 入站事件和出站事件在一个双向链表中入站事件会从链表 head 往后传递到最后一个入站的 handler出站事件会从链表 tail 往前传递到最前一个出站的 handler两种类型的 handler 互不干扰。 Netty框架的工作原理 典型的初始化并启动 Netty 服务端的过程代码如下 public static void main(String[] args) {// 创建mainReactorNioEventLoopGroup boosGroup new NioEventLoopGroup();// 创建工作线程组NioEventLoopGroup workerGroup new NioEventLoopGroup();final ServerBootstrap serverBootstrap new ServerBootstrap();serverBootstrap// 组装NioEventLoopGroup .group(boosGroup, workerGroup)// 设置channel类型为NIO类型.channel(NioServerSocketChannel.class)// 设置连接配置参数.option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE, true).childOption(ChannelOption.TCP_NODELAY, true)// 配置入站、出站事件handler.childHandler(new ChannelInitializerNioSocketChannel() {Overrideprotected void initChannel(NioSocketChannel ch) {// 配置入站、出站事件channelch.pipeline().addLast(...);ch.pipeline().addLast(...);}});// 绑定端口int port 8080;serverBootstrap.bind(port).addListener(future - {if (future.isSuccess()) {System.out.println(new Date() : 端口[ port ]绑定成功!);} else {System.err.println(端口[ port ]绑定失败!);}});}基本过程描述如下 1 初始化创建 2 个 NioEventLoopGroup其中 boosGroup 用于 Accetpt 连接建立事件并分发请求workerGroup 用于处理 I/O 读写事件和业务逻辑。2 基于 ServerBootstrap(服务端启动引导类)配置 EventLoopGroup、Channel 类型连接参数、配置入站、出站事件 handler。3 绑定端口开始工作。 服务端 Netty 的工作架构图 结合上面介绍的 Netty Reactor 模型介绍服务端 Netty 的工作架构图 Server 端包含 1 个 Boss NioEventLoopGroup 和 1 个 Worker NioEventLoopGroup。 NioEventLoopGroup 相当于 1 个事件循环组这个组里包含多个事件循环 NioEventLoop每个 NioEventLoop 包含 1 个 Selector 和 1 个事件循环线程。 Boss NioEventLoop 每个 Boss NioEventLoop 循环执行的任务包含 3 步 1轮询 Accept 事件2处理 Accept I/O 事件与 Client 建立连接生成 NioSocketChannel并将 NioSocketChannel 注册到某个 Worker NioEventLoop 的 Selector 上3处理任务队列中的任务runAllTasks。任务队列中的任务包括用户调用 eventloop.execute 或 schedule 执行的任务或者其他线程提交到该 eventloop 的任务。 Worker NioEventLoop 每个 Worker NioEventLoop 循环执行的任务包含 3 步 1轮询 Read、Write 事件2处理 I/O 事件即 Read、Write 事件在 NioSocketChannel 可读、可写事件发生时进行处理3处理任务队列中的任务runAllTasks。 任务队列中的3 种典型Task使用场景 其中任务队列中的 Task 有 3 种典型使用场景 用户程序自定义的普通任务 ctx.channel().eventLoop().execute(new Runnable() {Overridepublic void run() {//...} });非当前 Reactor 线程调用 Channel 的各种方法 例如在推送系统的业务线程里面根据用户的标识找到对应的 Channel 引用然后调用 Write 类方法向该用户推送消息就会进入到这种场景。最终的 Write 会提交到任务队列中后被异步消费。 用户自定义定时任务 ctx.channel().eventLoop().schedule(new Runnable() {Overridepublic void run() {} }, 60, TimeUnit.SECONDS);
http://www.hkea.cn/news/14462153/

相关文章:

  • 旅游网站设计与建设论文商品推销
  • 企业网站建设的一般要素群网站建设合同
  • 温州建设小学网站互联网营销行业前景
  • 虞城县住房和城乡建设局网站徐州机票网站开发
  • 网站建设公司长春自媒体发布软件app
  • 广州魔站建站南阳网站托管
  • 网站建设合同制人员招聘邢台短视频推广
  • 淘宝网站制作教程营销培训生
  • 社保网站哪里做转入一个空间建多个网站的方法
  • 双柏县住房和城乡建设局网站成品短视频app下载有哪些
  • 如何提高网站关键词的排名个人做论坛网站要什么证件
  • html 网站开发软件安徽软件开发公司
  • 在linux系统上用什么做网站做平面设计必知的网站
  • 成都高端建设网站协会门户网站建设
  • 2018年怎样做淘宝客网站网站搭建价格表
  • 高中生做网站网页wordpress电影主题会员
  • 易语言可以做网站么做动画 的 网站有哪些软件下载
  • 建设银行企业网银网站无法打开wordpress怎么爆出版本
  • 深圳网站建设哪家专业ps加dw做网站视频
  • 网站logo替换网站背投广告代码
  • 西昌市建设工程管理局网站建设银行网站登录首页
  • 自己做的视频可以传别的网站去吗一般网站建设需求有哪些
  • 做网站网站推广赚佣金福田庆三
  • 广州网站建设找新际广东省医院建设协会网站首页
  • 沈阳专业网站制作公司精准信息预测
  • 网站流量站怎么做专业开发小程序的公司排名
  • 江苏外贸网站建设推广有哪些可以做网站的企业
  • 广告公司可以开网站建设费吗Wordpress怎么给图片加注引
  • 海南的网站建设公司哪家好做网站的学校有哪些
  • 外贸企业的网站建设没有备案的网站会怎么样