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

环保部建设项目影响登记网站以太坊网站开发

环保部建设项目影响登记网站,以太坊网站开发,淘金网站建设推广,中国家具网一#xff0e;Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架#xff0c;Netty 在互联网领域、大数据分布式计算…一Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。 2.为什么要用netty 原生 NIO 存在问题: 1.NIO 的类库和 API 繁杂 2.需要熟悉 Java 多线程编程因为 NIO 编程涉及到 Reactor 模式必须对多线程和网络编程非常熟悉 才能编写出高质量的 NIO 程序 3.开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常  流的处理等等处理起来难度会比较大。 4.JDK NIO 的 Bug例如臭名昭著的 Epoll Bug它会导致 Selector 空轮询最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在没有被根本解决。 3.Netty的优点 Netty 对 JDK 自带的 NIO 的 API 进行了封装解决了上述问题。 1.设计优雅适用于各种传输类型的统一 API 阻塞和非阻塞 Socket基于灵活且可扩展的事件模型可以清晰地分离关注点高度可定制的线程模型 - 单线程一个或多个线程池. 2.使用方便详细记录的 Javadoc用户指南和示例没有其他依赖项JDK 5Netty 3.x或 6Netty 4.x就足够了。 3.高性能、吞吐量更高延迟更低减少资源消耗最小化不必要的内存复制。 4.安全完整的 SSL/TLS 和 StartTLS 支持。 5.社区活跃、不断更新社区活跃版本迭代周期短发现的 Bug 可以被及时修复同时更多的新功能会被加入 二Reactor三种线程模型 1.现有的三种线程模型 不同的线程模式对程序的性能有很大影响目前存在的线程模型有 ①.传统阻塞 I/O 服务模型 ②Reactor 模式 Reactor 模式又有 3 种典型的实现 单 Reactor 单线程 单 Reactor 多线程 主从 Reactor 多线程 Netty 的线程模型是主要是基于主从 Reactor 多线程模型改成了主从 Reactor 多线程模型有多个 Reactor模式 2.传统阻塞 I/O 服务模型介绍 特点 采用阻塞IO模式获取输入的数据 每个连接都需要创建单独的线程完成数据的输入业务处理和数据的返回 缺点 当并发数很大就会创建大量的线程占用很大系统资源在线程开销和上下文切换上降低处理性能 当连接创建后如果当前线程暂时没有数据可读该线程会阻塞在read 操作造成线程资源的浪费。 黄色的框表示对象 蓝色的框表示线程 白色的框表示方法(API) 3. Reactor 模式 针对传统阻塞 I/O 服务模型的 2 个缺点解决方案 I/O 复用模型多个连接共用一个阻塞对象应用程序只需要在一个阻塞对象上等待无需阻塞等待所有连接。当某个连接有新的数据可以处理时操作系统通知应用程序线程从阻塞状态返回开始进行业务处理。 Reactor 对应的叫法: 1. 反应器模式 2. 分发者模式(Dispatcher) 3. 通知者模式(notifier) 基于线程池复用线程资源模式不必再为每个连接创建线程将连接完成后的业务处理任务分配给线程进行处理一个线程可以处理多个连接的业务。 I/O 复用结合线程池就是 Reactor 模式基本设计思想 Reactor 模式通过一个或多个输入同时传递给服务处理器的模式,(基于事件驱动) 服务器端程序处理传入的多个请求,并将它们同步分派到相应的处理线程 因此Reactor模式也叫 Dispatcher模式 Reactor 模式使用IO复用监听事件, 收到事件后分发给某个线程(进程), 这点就是网络服务器高并发处理关键 4.单 Reactor 单线程 1.工作原理 ①Select 是前面 I/O 复用模型介绍的标准网络编程 API可以实现应用程序通过一个阻塞对象监听多路连接请求 ②Reactor 对象通过 Select 监控客户端请求事件收到事件后通过 Dispatch 进行分发 ③如果是建立连接请求事件则由 Acceptor 通过 Accept 处理连接请求然后创建一个 Handler 对象处理连接完成后的后续业务处理 ④如果不是建立连接事件则 Reactor 会分发调用连接对应的 Handler 来响应 ⑤Handler 会完成 Read→业务处理→Send 的完整业务流程 2.优点 模型简单没有多线程、进程通信、竞争的问题全部都在一个线程中完成 3.缺点 ①性能问题只有一个线程无法完全发挥多核 CPU 的性能。 ②可靠性问题线程意外终止或者进入死循环会导致整个系统通信模块不可用不能接收和处理外部消息造成节点故障 ③服务器端用一个线程通过多路复用搞定所有的 IO 操作包括连接读、写等编码简单清晰明了但是如果客户端连接数量较多时当对应多个读时还是会出现阻塞现象当这种情况发生时将无法支撑高并发的场景。 4.应用场景 客户端的数量有限业务处理非常快速(比如 Redis在业务处理的时间复杂度 O(1) 的情况) 5.单Reactor多线程 1.工作原理 ①Reactor 对象通过select 监控客户端请求事件, 收到事件后通过dispatch进行分发 ②如果是建立连接请求, 则由Acceptor 通过accept 处理连接请求, 然后创建一个Handler对象处理完成连接后的各种事件 ③如果不是连接请求则由Reactor分发调用连接对应的handler 来处理 ④handler 只负责响应事件不做具体的业务处理, 通过read 读取数据后会分发给后面的worker线程池的某个线程处理业务。 ⑤worker 线程池会分配独立线程完成真正的业务并将结果返回给handler,handler收到响应后通过send 将结果返回给client. 2.优点 可以充分的利用多核cpu 的处理能力 3.缺点 多线程数据共享和访问比较复杂,Reactor处理所有的事件的监听和响应在单线程运行时在高并发场景容易出现性能瓶颈. 6.主从 Reactor 多线程 1.工作原理 ①Reactor主线程 MainReactor 对象通过select 监听连接事件, 收到事件后通过Acceptor 处理连接事件 ②当 Acceptor  处理连接事件后MainReactor 将连接分配给SubReactor ③subReactor 将连接加入到连接队列进行监听,并创建handler进行各种事件处理 ④当有新事件发生时 subreactor 就会调用对应的handler处理 ⑤handler 通过read 读取数据分发给后面的worker 线程处理 ⑥worker 线程池分配独立的worker 线程进行业务处理并返回结果 ⑦handler 收到响应的结果后再通过send 将结果返回给client ⑧Reactor 主线程可以对应多个Reactor 子线程, 即MainRecator 可以关联多个SubReactor 三Netty线程模型 1.工作原理 Netty抽象出两组线程池 BossGroup 专门负责接收客户端的连接, WorkerGroup 专门负责网络的读写 BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup NioEventLoopGroup 相当于一个事件循环组, 这个组中含有多个事件循环 每一个事件循环是 NioEventLoop NioEventLoop 表示一个不断循环的执行处理任务的线程 每个NioEventLoop 都有一个selector , 用于监听绑定在该通道上的socket的网络通讯 NioEventLoopGroup 可以有多个线程, 即可以含有多个NioEventLoop 每个Boss NioEventLoop 循环执行的步骤有3步 轮询accept 事件 处理accept 事件 , 与client端建立连接 , 生成NioScocketChannel , 并将其注册到某个worker NIOEventLoop 上的 selector 上 处理任务队列的任务  即 runAllTasks 每个 Worker NIOEventLoop 循环执行的步骤 轮询read, write 事件 处理i/o事件 即read , write 事件在对应NioScocketChannel 处理 处理任务队列的任务  即 runAllTasks 每个Worker NIOEventLoop  处理业务时会使用pipeline(管道), pipeline 中包含了boss group上NioEventLoop注册到worker 的selector 的channel , 即通过pipeline 可以获取到对应通道, 管道中维护了很多的处理器 四Netty入门 1.引入java包 dependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion4.1.20.Final/version /dependency 2.hello world 编写 入门的编写一共需要4个类 netty server netty server handler netty client netty client handler 2.1.netty server 端编写 package com.zpb.netty.netty.helloWorld;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoop; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;/*** dec : netty入门* Date: 2019/11/24* Auther: pengbo.zhao* version: 1.0* demand:** {link #main(String[] args)}**/ public class NettyServer {public static void main(String[] args) throws Exception{//1.创建BossGroup 和 WorkerGroup//1.1 创建2个线程组//bossGroup只处理连接请求//workerGroup 处理客户端的业务逻辑//2个都是无限循环EventLoopGroup bossGroup new NioEventLoopGroup();EventLoopGroup workerGroup new NioEventLoopGroup();//2.创建服务端的启动对象,可以为服务端启动配置一些服务参数ServerBootstrap bootStrap new ServerBootstrap();//2.1使用链式编程来配置服务参数bootStrap.group(bossGroup,workerGroup) //设置2个线程组.channel(NioServerSocketChannel.class) //使用NioServerSocketChannel作为服务器的通道.option(ChannelOption.SO_BACKLOG,128) //设置线程等待的连接个数.childOption(ChannelOption.SO_KEEPALIVE,Boolean.TRUE) //设置保持活动连接状态.childHandler(new ChannelInitializerSocketChannel() {//给PipeLine设置处理器Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {//通过socketChannel得到pipeLine然后向pipeLine中添加处理的handlesocketChannel.pipeline().addLast(new NettyServerHandle());}}); //给workerGroup 的EventLoop对应的管道设置处理器(可以自定义/也可使用netty的)System.err.println(server is ready......);//启动服务器并绑定1个端口且同步生成一个ChannelFuture 对象ChannelFuture channelFuture bootStrap.bind(8888).sync();//对关闭通道进行监听(netty异步模型)//当通道进行关闭时才会触发这个关闭动作channelFuture.channel().closeFuture().sync();} } 2.2.netty server handler编写 package com.zpb.netty.netty.helloWorld;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelPipeline; import io.netty.util.CharsetUtil;/*** dec :* Date: 2019/11/24* Auther: pengbo.zhao* version: 1.0* demand:*/ public class NettyServerHandle extends ChannelInboundHandlerAdapter {/*** 读取数据** param: 1.ChannelHandlerContext ctx:上下文对象, 含有 管道 pipeline , 通道 channel, 地址* param: 2. Object msg: 就是客户端发送的数据 默认 Object*/Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.err.println(服务器读取线程 Thread.currentThread().getName());System.out.println(server ctx ctx);System.out.println(看看 channel 和 pipeline 的关系);Channel channel ctx.channel();ChannelPipeline pipeline ctx.pipeline(); //本质是一个双向链接, 出站入站//将 msg 转成一个 ByteBuf,ByteBuf 是 Netty 提供的不是 NIO 的 ByteBuffer.ByteBuf buf (ByteBuf) msg;System.out.println(客户端发送消息是: buf.toString(CharsetUtil.UTF_8));System.out.println(客户端地址: channel.remoteAddress());}/*** 读取数据完成后** param:* return:* auther:* date:*/Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {//writeAndFlush 是 write flush//将数据写入到缓存并刷新//一般讲我们对这个发送的数据进行编码ctx.writeAndFlush(Unpooled.copiedBuffer(hello, 客户端~(^ω^)喵, CharsetUtil.UTF_8));}//处理异常, 一般是需要关闭通道Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();} } 2.3.netty client端编写 package com.zpb.netty.netty.helloWorld;import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;/*** dec :* Date: 2019/11/24* Auther: pengbo.zhao* version: 1.0* demand:*/ public class NettyClient {public static void main(String[] args) throws Exception {//1.客户端定义一个循环事件组EventLoopGroup group new NioEventLoopGroup();try {//2.创建客户端启动对象Bootstrap bootstrap new Bootstrap();bootstrap.group(group) //设置线程组.channel(NioSocketChannel.class) //设置客户端通道实现类.handler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {socketChannel.pipeline().addLast(new NettyClientHandle());}});System.err.println(client is ready......);//3.启动客户端去连接服务端ChannelFuture channelFuture bootstrap.connect(127.0.0.1, 8888).sync();//4.设置通道关闭监听(当监听到通道关闭时关闭client)channelFuture.channel().closeFuture().sync();} finally {group.shutdownGracefully();}} } 2.4.netty client handler端编写 package com.zpb.netty.netty.helloWorld;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.CharsetUtil;/*** dec :* Date: 2019/11/24* Auther: pengbo.zhao* version: 1.0* demand:*/ public class NettyClientHandle extends ChannelInboundHandlerAdapter{//如果client 端服务启动完成后Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.err.println(client ctx);ctx.writeAndFlush(Unpooled.copiedBuffer(hello,netty server...,CharsetUtil.UTF_8));}//当通道有读事件时Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf byteBuf (ByteBuf) msg;System.err.println(服务器端回复消息byteBuf.toString(CharsetUtil.UTF_8));System.err.println(服务器端地址是ctx.channel().remoteAddress());}//当通道有异常时Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();} } 五Netty三种任务队列的使用 当我们在处理的handle中如果出现了阻塞的情况或者处理业务逻辑比较耗时我们不能让程序处于阻塞 当有客户端请求时我们想让程序定时的去执行业务逻辑 当需要对一些用户需要进行推送活动时根据用户标识找到对应的 Channel 引用向该用户推送特定消息时 可以采用以下三种任务队列 1.提交到execute(Runnable command)中时 ctx.channel().eventLoop().execute(new Runnable() { })业务逻辑交给线程去处理,线程不会阻塞在这里而是直接返回直到有数据才返回给客户端如果有多个线程runnable需要处理那么只能等上一个处理完才会处理下一个(假如第1个任务需要10S,第2个需要20s,执行完共需30S) 2.提交到 scheduledTaskQueue中 schedule(Runnable command, long delay, TimeUnit unit)①Runnable command执行业务逻辑处理的线程② long delay定时时长③TimeUnit unit定时类型业务逻辑交给定时线程去处理。 3.通过传输的内容的标识 在解码客户端发送的内容中读取到客户端的特殊标识利用这个标识来进行推送消息处理这个在粘包、拆包中进行说明
http://www.sczhlp.com/news/157355/

相关文章:

  • 网站建设合理流程福泉市自己的网站
  • 做外包的网站有哪些flashfxp 上传网站
  • 变更网站做推广需要备案适合大学生创业的网站建设类型
  • 苏州正规制作网站公司山东中恒建设集团网站
  • 郑州做设计公司网站专业网站设计公司排行榜
  • 优化网站排名茂名厂商网站开发工资山东
  • 网站建设兼职薪酬怎么样山东省企业年报网上申报入口
  • php网站开发专业介绍给别人做网站在那里接单
  • 南京网站关键词优化专业的营销型网站制作
  • 网站建设的技术阶段郑州妇科医院排行
  • 防伪网站怎么做新中国风装修
  • 网站交互主要做什么wordpress讨论吧
  • 本地的上海网站建设公建设网站的十个步骤
  • 阿坝县建设局网站厦门做手机网站公司
  • 给图像做标注的网站网站建设的步骤教程视频
  • 手机和pc网站深圳市招投标交易中心
  • wordpress 读取pdf百度关键词优化大
  • 中国企业500强榜单发布石家庄全网seo
  • 建材网站设计oa系统定制
  • 怎么可以找到做公益的网站北京响应式网站建设公司
  • 英语_阅读_Always-on world_待读
  • 2025减速机厂家 TOP 企业品牌推荐排行榜,谐波,行星,直角换向器,中空旋转平台,双曲面,RV,伺服,重载,步进减速机推荐这十家公司!
  • 自动生成网站地图的工具百度关键词搜索排名
  • 网站开发属于什么费用网络营销的方式
  • 网站怎么做扫码微信支付接口网站加速服务
  • 邢台网站建设费用网站源码
  • 网站logo设计在线生成工业设计公司产品外观
  • 中山网站建设制作 超凡科技企业网站优化服务
  • 网站3d展示怎么做的网站推广网
  • 海西州建设局网站长沙百度贴吧