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

帮别人建设网站需要什么资质国内重大新闻事件2024

帮别人建设网站需要什么资质,国内重大新闻事件2024,网络营销推广论文,wordpress 中介网站一、为什么选择Netty#xff1a;API使用简单#xff0c;开发门槛低#xff0c;屏蔽了NIO通信的底层细节。功能强大#xff0c;预制了很多种编解码功能#xff0c;支持主流协议。定制能力强#xff0c;可以通过ChannelHandler对通信框架进行灵活地拓展。性能高、成熟、稳定…一、为什么选择NettyAPI使用简单开发门槛低屏蔽了NIO通信的底层细节。功能强大预制了很多种编解码功能支持主流协议。定制能力强可以通过ChannelHandler对通信框架进行灵活地拓展。性能高、成熟、稳定Netty修复了已经发现的所有Java NIO BUG。社区活跃、版本迭代周期短。经历了大规模的商业应用考研质量得到验证。二、Netty基础知识Netty的主要应用场景RPC框架的基础网络通信框架主要用于分布式节点之间的通信和数据交换。例如Dubbo、RocketMQ、Hadoop的基础通信和序列化框架Avro。私有协议的基础通信框架例如Thrift协议、Dubbo协议等。公有协议的基础通信框架例如HTTP协议、SMPP协议等。Netty服务端创建需要必备的知识熟悉JDK NIO主要类库的使用例如ByteBuffer、Selector、ServerSocketChannel、SelectionKey等。熟悉JDK的多线程编程。了解Reactor模式。Netty服务端的作用服务端需要监听客户端链接、处理客户端链接的读写。Netty中典型的网络事件链路注册、链路激活、链路断开、接受到请求消息、请求消息接受并处理完毕、发送应当消息、链路发送异常、发送用户自定义事件Netty提供的ChannelHeader系统编解码框架ByteToMessageCodec通用基于长度的半包编解码LengthFieldBassedFrameDecoder码流日志打印HandlerLoggingHandlerSSL安全认证HandlerSslHandler链路空闲检查HandlerIDLEStateHandler流量整形HandlerChannelTrafficShapingHandlerBase64编解码Base64Decoder和Base64EncoderNetty提供的主要TCP参数SO_TIMEOUTtimeout控制读取操作将阻塞多少毫秒。如果返回值为0计时器就被禁止了该线程将无限期阻塞。SO_SNDBUFsnd buf套接字使用的发送缓冲区大小。SO_RCVBUFrcv buf套接字使用的接收缓冲区大小。SO_REUSEADDRresuse addr用于决定如果网络上仍然有数据向旧的ServerSocket传输数据是否允许新的ServerSocket绑定到与旧的ServerSocket同样的端口上。SO_REUSEADDR选项的默认值与操作系统有关在某些操作系统中允许重用端口而在某些操作系统中不允许重用端口。CONNECT_TIMEOUT_MILLIS客户端连接超时时间由于NIO原生的客户端并不提供设置连接超时的接口因此Ntty采用的是自定义连接超时定时器负责检测和超时控制。TCP_NODELAY激活或禁止TCP_NODELAY套接字选项它决定是否使用Nagle算法。如果是时延敏感型的应用建议关闭Nagle算法。三、Netty代码相关(一) ByteBuf和相关辅助类1. JDK ByteBuffer的缺点ByteBuffer固定长度一旦分配完成不能动态调整。ByteBuffer只有一个标识位置的指针position读写时需要手工调用flip()【作用读写切换】和rewind()【将position0、mark-1、limit的值不变】。ByteBuffer的API功能有限一些高级和使用的特性它不支持。2. ByteBuf的基本功能ByteBuf依然是一个Byte数组的缓冲区他的基本功能与ByteBuffer一直主要如下7种Java基础类型、byte数组、ByteBufferByteBuf等的读写。缓冲区自身的copy和slice等。设置网络字节序。 -网络字节序采用高端字节序的表示方法构造缓冲区实例。操作位置指针等方法。3. ByteBuf功能介绍顺序读操作read它类似于ByteBuffer的get操作方法名称以readXXX开头。顺序写操作write它类似于ByteBuffer的put操作方法名称以writeXXX开头。readerIndex和writerIndexNetty提供两个指针变量用于支持顺序读取和写入操作readerIndex用于标识读取索引、writerIndex用于标识写入索引。Discardable bytes缓冲区的分配和释放都是一个耗时的操作我需要尽量重用他们。DiscardableBytes会清除已经读取的缓冲区将可读取的字节数组复制到原理已经读取的缓冲区上。但是频繁的内存复制会牺牲性能。Readabke bytes和Writable bytes可读空间段是数据实际存储的区域以read或skip开头的任何操作都将会从readerIndex开始读取或者跳过指定的数据操作完成之后readerIndex增加了读取或跳过字节数长度。可写空间段是尚未被使用可以填充的空闲空间任何以write开头的操作都会从writerIndex开始向空闲空间写入字节操作完成之后writerIndex增加写入的字节数量长度。Clear操作将readerIndex和writerIndex还原成初始分配值。Mark 和Rest对缓冲区进行读操作时需要对之前操作进行回滚。读操作并不会改变缓冲区的内容回滚操作主要就是重新设置索引信息。ByteBuff调用mark操作会将当前位置的指针备份到mark变量中调用rest操作之后在复原。Netty也有类型的mark和rest接口因为ByteBuf有读写索引因此它总共有4个相关方法markReaderIndex将当前的readerIndex备份到MarkReaderIndex中restReaderIndex将当前readerIndex设置成MarkReaderIndexmarkWriterIndex将当前的writerIndex备份到MarkWriterIndex中restWriterIndex将当前writerIndex设置成MarkWriterIndex查找操作它提供了多种查找方法用于满足不同的应用场景indexOf、bytesBefore等等Derived Buffers类似于数据库的视图ByteBuf提供多个接口用于创建某个ByteBuf视图或者复制ByteBuf。具体方法有duplicate、cope等。转换成标准的ByteBuffer随机读写set和get随机读写是指可以指定读写的索引位置。4. ByteBuf内存分配角度分类堆内存字节缓冲区HeapByteBuf特点内存分配和回收速度快可以被JVM自动回收缺点如果进行IO读写需要额外一次内存复制IO读写速度慢一些。直接内存缓冲区DirectByteBuf特点堆外分配内存减少一次内存复制IO读写速度快一些缺点内存分配和回收慢一些。5. ByteBuf内存回收的角度分类基于对象池的ByteBuf与普通的ByteBuf基于对象池ByteBuf的特点可以重用ByteBuf对象循环利用提升内存的使用效率降低高负载导致的频繁GC。6. UnpooledHeapByteBuf堆内存特点它基于堆内存进行分配的字节缓冲区并且没有基于对象池技术实现所以每次IO的读写都会创建一个新对象。缺点频繁进行大块内存的分配和回收对性能会造成一定影响但是相对于堆外内存的申请和释放它的成本还是会低一些。7. PooledByteBuf内存池见《Netty的内存池》8. PooledDirectByteBuf基于内存池与UnPooledDirectByteBuf不基于内存池9. ByteBuf相关辅助类的功能ByteBufHolder它是ByteBuf的容器。ByteBufHolder对象包含了一个ByteBuf另外还提供了一些其他的实用方法使用者继承ByteBufHolder接口后可以按需求封装自己的实现。ByteBufAllocator它是字节缓冲区分配器按照Netty的缓冲区实现不同有两种分配器PoolByteBufAllocator基于内存池的、UnPoolByteBufAllocator普通的、Composite ByteBuf它允许将多个ByteBuf的实例组装到一起形成一个统一的视图。ByteBufUtil工具类。(二) Channel与Unsafe1. 概念io.netty.channel.Channel是Netty网络的抽象类主要包括网络的读、写、客户端发起链接、主动关闭、链路关闭、获取通讯双方的网络地址等它还包含了Netty框架的一些功能包括获取该Channel的EvenLoop、获取缓冲分配器和Pipeline等。2. 设计理念它的设计原理比较简单但是功能却比较繁杂主要的设计理念如下在Channel接口层采用Facade模式进行统一封装将网络I/O操作、网络I/O相关联的其他操作封装起来统一对外提供。Channel接口的定义尽量大而全为SocketChannel和ServerSocketChannel提供统一的视图由不同子类实现不同的功能公共功能在抽象父类中实现最大程度地实现功能和接口的重用。具体实现采用聚合而非包含的方式将相关的功能类聚合在Channel中由Channel统一负责分配和调度功能实现更加灵活。3. 主要功能介绍网络IO操作Channel read():ChannelFuture write(Object msg)write操作只是将消息存入到信息发送的环形数组中并没有真正发送只用调用flush操作才被写入Channel中发送给对方。ChannelFuture write(Object msg,ChannelPromise promise)与上述类似就是多携带了ChannelPromise参数负责设置写入操作的结果。Channel flush()将之前写入到发送环形数组中的消息全部写入到目标Channel中发送给通讯对方。ChannelFuture writeAndFlush(Object msg,ChannelPromise promise)等价于writeflush操作ChannelFuture writeAndFlush(Object msg)ChannelFuture close(ChannelPromise promise)主动关闭当前链接ChannelFuture disconnect(ChannelPromise promise)请求断开与远程通信对端的链接并使用ChannelPromise来获取操作结果的通知。ChannelFuture connect(SocketAddress remoteAddress)客户端使用指定的服务端地址发起链接请求。ChannelFuture connect(SocketAddress remoteAddress,ChannelPromise promise)ChannelFuture connect(SocketAddress remoteAddress,SocketAddress localAddress,ChannelPromise promise)多了绑定本地地址ChannelFuture bind(SocketAddress localAddress)绑定指定的本地地址ChannelFuture bind(SocketAddress localAddress,ChannelPromise promise)ChannelConfig config()获取当前Channel的配置信息例如CONNECT_TIMEOUT_MILLISboolean isOpen()判断当前Channel是否已经打开。boolean isRegistered()判断当前Channel是否已经注册到EventLoop上。boolean isActive()判断当前Channel是否已经处于激活状态。.... ... 其他常用API功能eventLoop()获取到Channel注册的EventLoop()metedate()获取当前Channel的元数据描述parent()对于服务端Channel而言它的父Channel为空对于客户端Channel它的父Channel就是创建它的ServerSocketChannel。id()获取Channel的标识id... ...4. Channel主要的基础关系类图5. Channel生命周期4种状态channelUnregisteredChannel已创建还未注册到一个EventLoop上。channelRegisteredChannel已创建已经注册到一个EventLoop上。channelActiveChannel处于活跃状态已经连接到远端可以接受和收发数据。channelInactive: Channel未连接到远端。Channel正常的生命周期如下图。随着状态发生变化产生相应的事件。这些事件被转发到ChannelPipeline中的ChannelHandler来触发相应的操作。6. Unsafe概念Unsafe接口实际是Channel接口的辅助接口它不应该被用户代码直接调用。实际的IO读写操作都是由Unsafe接口负责完成的。7. Unsafe继承关系(三) ChannelPipeline与ChannelHandler1. 两者相关概念Netty的ChannelPipeline与ChannelHandler机制类似于Servlet和Filter过滤器这类拦截器实际上是职责链模式的一种变形主要是为了方便事件的拦截和用户业务逻辑的指定。Netty将Channel的数据管道抽象为ChannelPipeline消息在ChannelPipeline中流动和传递。ChannelPipeline持有IO事件拦截器ChannelHandler的链表由ChannelHandler对IO事件进行拦截和处理可以方便通过新增和删除ChannelHandler来实现不同的业务逻辑定制不需要对现有ChannelHandler进行修改进而能够实现对修改封闭和对拓展的支持。2. ChannelPipeline的结构ChannelPipeline是ChannelHandler的容器它负责ChannelHandler的管理事件拦截与调用。它与Map等容器的实现非常类似。ChannelPipeline底层使用了一个双向链表来存储ChannelHandler但并不是直接存储的ChannelHandler而是ChannelHandlerContext在ChannelHandlerContext可以直接获取到与之对应的ChannelHandler、ChannelPipeline、Channel。3. ChannelPipeline的主要特性ChannelPipeline支持运行态动态的添加或删除ChannelHandler例如当业务高峰期需要对系统做拥塞保护时可以根据系统时间进行判断如果处于业务高峰期则动态地将系统拥塞保护ChannelHandler添加到当前的ChannelPipeline中当高峰期过去之后就可以动态删除拥塞保护ChannelHandler。ChannelPipeline是线程安全ChannelHandler却不是线程安全ChannelPipeline线程安全表示N个业务线程可以并发地操作ChannelPipeline而不存在多线程并发问题。ChannelHandler需要自己保证ChannelHandler的线程安全。4. ChannelPipeline的事件处理4.1 消息的读取和发送处理全流程描述如下底层的 SocketChannel read() 读取ByteBuf触发ChannelRead事件由IO线程 NioEventLoop 调用 ChannelPipeline 的fireChannelRead(Object msg) 将消息ByteBuf传输到ChannelPipeline中。消息依次被 HeadHandler、ChannelHandler1 … TailHandler从头到尾的Handler拦截和处理在这个过程中任何ChannelHandler都可以中断当前的流程结束消息的传递。用户在调用 ChannelHandlerContext 的 write() 发送消息消息从TailHandler、ChannelHandlerN … HeadHandler从尾到头的Handler最终被添加到消息发送缓冲区中等待刷新和发送在此过程中可以中断消息的传递例如当编码失败时就需要中断流程构造异常的Future返回。4.2 Inbound入站事件对应图17-1的左半部分它通常由IO线程触发例如TCP链路建立事件、链路关闭事件、读事件、异常通知事件等。Pipeline中以fireXXX命名的方法都是从IO线程流向用户业务Handler的inbound事件。触发Inbound事件方法如下ChannelHandlerContext.fireChannelRegistered()Channel注册事件。ChannelHandlerContext.fireChannelActive()TCP链路建立成功Channel激活事件。ChannelHandlerContext.fireChannelRead(Object)读事件。ChannelHandlerContext.fireChannelReadComplete()读操作完成通知事件。ChannelHandlerContext.fireExceptionCaught(Throwable)异常通知事件。ChannelHandlerContext.fireUserEventTriggered(Object)用户自定义事件。ChannelHandlerContext.fireChannelWritabilityChanged()Channel的可写状态变化通知事件。ChannelHandlerContext.fireChannellnactive()TCP链路关闭链路不可用通知事件。4.3 Outbound出站事件对应图17-1的右半部分它通常是由用户主动发起的网络I/O操作例如用户发起的连接操作、绑定操作、消息发送等操作。触发outbound事件的方法如下ChannelHandlerContext.bind(SocketAddress,ChannelPromise)绑定本地地址事件。ChannelHandlerContext.connect(SocketAddress,SocketAddress,ChannelPromise)连接服务端事件。ChannelHandlerContext.write(Object,ChannelPromise)发送事件。ChannelHandlerContext.flush()刷新事件。ChannelHandlerContext.writeAndFlush(Object msg)发送并刷新事件。ChannelHandlerContext.writeAndFlush(Object msg, ChannelPromise promise)发送并刷新事件。ChannelHandlerContext.read()读事件。ChannelHandlerContext.disconnect(ChannelPromise)断开连接事件。ChannelHandlerContext.close(ChannelPromise)关闭当前Channel事件。5. ChannelPipeline类的继承关系图6. 如何构建ChannelPipeline用户不用自己创建ChannelPipeline使用ServerBootstrap或Bootstrap启动时Netty会为每个Channel链接创建一个独立的pipeline对应使用者而言只需要将自定义拦截器加入到pipeline即可。7. 如何自定义拦截器ChannelHandler通常只需继承ChannelHandlerAdapter类覆盖自己关心的方法即可。8. ChannelHandler概念ChannelHandler类似于Servlet的Filter过滤器负责对IO事件或者IO操作进行拦截和处理它可以选择性地拦截和处理自己感兴趣的事件也可以透传和终止事件的传递。ChannelHandler支持注解目前支持两种注解Sharable多个ChannelPipeline共用一个ChannelHandlerSkip被Skip注解的方法不会调用直接被忽略。9. Netty框架自己实现的ChannelHandlerChannelHandlerAdapter绝大多数的ChannelHandler会选择性的拦截和处理某一个或者某些事件其他事件忽略由下一个ChannelHandler进行拦截和处理但是用户实现ChannelHandler接口就必须实现所有的方法会导致代码冗余和臃肿。所以Netty提供了ChannelHandlerAdapter基类它对所有接口实现都是事件透传。主要方法*isSharable()是否可共享此Handler是否可以添加到不同的ChannelPipeline中handlerAdded(ChannelHandlerContext ctx)添加HandlerhandlerRemoved(ChannelHandlerContext ctx)移除HandlerexceptionCaught(ChannelHandlerContext ctx, Throwable cause)发生异常时调用此方法。该方法用ctx.fireExceptionCaught(cause)会将异常发送给ChannelPipeline中的下一个ChannelHandler Tips以下的方法都类似channelRegistered(ChannelHandlerContext ctx)Channel注册时调用此方法。channelActive(ChannelHandlerContext ctx)TCP链路建立成功时调用此方法。channelInactive(ChannelHandlerContext ctx)TCP链路关闭时调用此方法。channelRead(ChannelHandlerContext ctx, Object msg)服务端返回应答信息时该方法被调用。即读事件开始。channelReadComplete(ChannelHandlerContext ctx)读取完本次socket中的数据时该方法被调用。TipsTCP拆包粘包的问题业务上数据完整性与Socket中完整性不同可能一次完整的业务数据触发多次channelReadComplete()。userEventTriggered(ChannelHandlerContext ctx, Object evt)触发用户自定义事件时调用此方法。channelWritabilityChanged(ChannelHandlerContext ctx)Channel的可写状态变化时调用此方法。--- --- ---- ---- bind(ChannelHandlerContext ctx, SocketAddress localAddress, ChannelPromise promise)绑定本地地址时调用此方法。connect( ChannelHandlerContext ctx, SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise)连接服务端时调用此方法。disconnect(ChannelHandlerContext ctx, ChannelPromise promise)断开连接时调用此方法。close(ChannelHandlerContext ctx, ChannelPromise promise)关闭当前Channel时调用此方法。read(ChannelHandlerContext ctx)触发读事件时调用此方法。write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)触发写事件时调用此方法。flush(ChannelHandlerContext ctx)触发刷新时调用此方法。ByteToMessageDecoder为了方便将ByteBuf解码成业务POJO对象Netty提供了ByteToMessageDecoder抽象工具解码类。用户的解码器继承该类实现void decode()方法即可完成ByteBuf到POJO。但是它没有考虑TCP粘包和组包的等场景读半包需要用户解码器自己负责处理。MessageToMessageDecoder它是Netty的二次解码器将一个对象二次解码为其他对象。LengthFieldBasedFrameDecoder如果消息是通过长度进行区分的LengthFieldBasedFrameDecoder都可以自动处理粘包和半包问题。原理在消息头中包含一个长度字段。并使用四个参数组合进行解码lengthFieldOffset、lengthFieldLength、lengthAdjustment、initialBytesToStripMessageToByteEncoder将POJO对象编码成ByteBuf用户的编码器继承该类实现void encode()方法。Tips在Netty中编码器是一个Outbound出站处理器。MessageToMessageEncoder将一个POJO对象编码成另一个对象。LengthFieldPrepender如果协议中的第一个字段为长度字段Netty提供了LengthFieldPrepender编码器它可以计算当前待发送消息的二进制字节长度将该长度添加到ByteBuf缓冲区头中。10. ChannelHandler的类继承关系图11. ChannelHandler中相关联的事件Channel新连接建立相关事件handlerAdded - channelRegistered - channelActiveEventLoop监听Channel read事件channelRead - channelReadCompleteChannel关闭channelInactive - channelUnregistered - handlerRemovedChannel读取信息异常exceptionCaught
http://www.hkea.cn/news/14279613/

相关文章:

  • 做网站需要买空间么 服务器外贸网站自建站
  • 西宁微网站建设遵义本地网络平台
  • 有建设网站的公司吗和平网站制作
  • 白城学做网站电子商务如何做网站销售
  • 制作网站的成本google play官网
  • 辽宁省朝阳市做网站网站建设的项目说明书
  • 网站做二级目录跟二级域名的区别不能访问子目录的网站
  • wordpress 分类 输出手机网站优化公司
  • 购物车功能网站怎么做的呼和浩特做网站
  • 哪类网站赚钱 优帮云石家庄网站改版
  • 网站建设项目进展情况视频点播网站建设
  • 网站文件上传wordpress修改宁波正规seo推广
  • 济南网站微信开发软件app需要具备的知识
  • html网站地图制作公司网站建设的改进的建议
  • 网站建设工作室赚钱吗聚合搜索引擎接口
  • 深圳竞价网站商务网站的建设步骤
  • 长沙银狐做网站营销型网站建设公司推荐
  • 杭州知名的企业网站建设策划外贸自建站平台排名
  • 用DW做的网站生成链接淄博做网站小程序的公司
  • 苏州网站建设方案外包南通网站建设优化
  • 汕头建站程序自助下单网站怎么做
  • 建设网站需要有什么特色wordpress清除无用的数据库表
  • 哪个网上购物网站好大连甘井子区房价
  • 企业网站seo方案东莞百度seo哪里强
  • 丰镇网站建设建了一个网站 如何找到放图片的文件夹
  • 邯郸论坛网站建设公司名字参考大全
  • 成都个人兼职做网站photoshop网站模板下载
  • 网站建设与管理常用如何在网站上做免费代理
  • 城乡住房和城乡建设厅网站成都锦江规划建设局网站
  • 渭南商铺网站建设wordpress恋月