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

唐山网站公司建站阿里巴巴网站做推广效果怎么样

唐山网站公司建站,阿里巴巴网站做推广效果怎么样,买了域名之后怎么做网站,下载一个手机apptypora-copy-images-to: imgs Netty 是什么呢#xff1f;Netty 用于做什么呢#xff1f; 答#xff1a; Netty 是一个 NIO 客户服务端框架#xff0c;可以快速开发网络应用程序#xff0c;如协议服务端和客户端#xff0c;极大简化了网络编程#xff0c;如 TCP 和 UDP … typora-copy-images-to: imgs Netty 是什么呢Netty 用于做什么呢 答 Netty 是一个 NIO 客户服务端框架可以快速开发网络应用程序如协议服务端和客户端极大简化了网络编程如 TCP 和 UDP 套接字服务来自官网 热门开源项目如 Dubbo、RocketMQ 底层都是用了 Netty Netty怎么实现高性能设计 答 Netty 高性能的三个方面 传输用什么样的通道将数据发送给对方BIO、NIO 或者 AIOIO 模型在很大程度上决定了框架的性能。IO模型的选择协议采用什么样的通信协议HTTP 或者内部私有协议。协议的选择不同性能模型也不同。相比于公有协议内部私有协议的性能通常可以被设计的更优。协议的选择线程数据报如何读取读取之后的编解码在哪个线程进行编解码后的消息如何派发Reactor 线程模型的不同对性能的影响也非常大。线程模型的选择 介绍一下 AIO、BIO 和 NIO 答 AIO 从 Java.1.7 开始Java 提供了 AIO异步IOJava 的 AIO 也被称为 “NIO.2” Java AIO 采用订阅-通知模式应用程序向操作系统注册 IO 监听之后继续做自己的事情当操作系统发生 IO 事件并且已经准备好数据时主动通知应用程序应用程序再进行相关处理 Linux 平台没有这种异步 IO 技术而是使用 epoll 对异步 IO 进行模拟 BIO BIO 即同步阻塞 IO服务端实现模式为一个连接对应一个线程即客户端有连接请求时服务器端就需要启动一个线程进行处理 BIO简单工作流程 服务器端启动一个 ServerSocket客户端启动 Socket 对服务器进行通信默认情况下服务器端需要对每个客户端建立一个线程与之通讯客户端发出请求后, 先咨询服务器是否有线程响应如果没有则会等待或者被拒绝如果有响应客户端线程会等待请求结束后再继续执行 BIO存在问题 当并发量较大时需要创建大量线程来处理连接比较占用系统资源连接建立之后如果当前线程暂时没有数据可读则线程会阻塞在 Read 操作上造成线程资源浪费 NIO 从 Java1.4 开始Java 提供了 NIONIO 即 “Non-blocking IO”同步非阻塞IO NIO 的几个核心概念 Channel、BufferBIO是基于字节流或者字符流的进行操作而NIO 是基于缓冲区和通道进行操作的数据总是从通道读取到缓冲区中或者从缓冲区写入到通道中 Selector选择器用于监听多个通道的事件如连接打开数据到达因此单个线程可以监听多个数据通道极大提升了单机的并发能力 当 Channel 上的 IO 事件未到达时线程会在 select 方法被挂起让出 CPU 资源直到监听到 Channel 有 IO 事件发生才会进行相应的处理 NIO和BIO有什么区别 NIO是以块的方式处理数据BIO是以字节流或者字符流的形式去处理数据。NIO是通过缓存区和通道的方式处理数据BIO是通过InputStream和OutputStream流的方式处理数据。NIO的通道是双向的BIO流的方向只能是单向的。NIO采用的多路复用的同步非阻塞IO模型BIO采用的是普通的同步阻塞IO模型。NIO的效率比BIO要高NIO适用于网络IOBIO适用于文件IO。 NIO如何实现了同步非阻塞 通过 Selector 和 Channel 来进行实现一个线程使用一个 Selector 监听多个 Channel 上的 IO 事件通过配置监听的通道Channel为非阻塞那么当Channel上的IO事件还未到达时线程会在select方法被挂起让出CPU资源。直到监听到Channel有IO事件发生时才会进行相应的响应和处理。 介绍一下 Netty 使用的线程模型 答 Netty 主要基于主从 Reactor 多线程模型其中主从 Reactor 多线程模型将 Reactor 分为两部分 mainReactor监听 Server Socket用来处理网络 IO 连接建立操作将建立的 SocketChannel 指定注册给 subReactorsubReactor和建立起来的 socket 做数据交互和业务处理操作 因为客户端的连接数量相对来说比较少而数据的读和写会比较多一点使用 mainReactor 只接受客户端连接由其他线程 subReactor 负责读和写将业务处理剥离出让线程池来处理降低了 Reactor 的性能开销 扩展单 Reactor 单线程模型、单 Reactor 多线程模型 单 Reactor 单线程模型 通过 1 个线程负责客户端连接、网络数据的读写、业务处理 缓存 Redis 就是单 Reactor 单线程模型 单 Reactor 多线程模型 通过 1 个线程负责客户端的连接、网络数据的读写将业务处理剥离出去通过线程池来进行处理 三种 Reactor 模型的优缺点 单 Reactor 单线程模型是单线程进行业务处理当负载过重时处理速度将会变慢影响系统性能因此引出单 Reactor 多线程模型单 Reactor 多线程模型时多个线程处理业务业务处理速度上来了但是单 Reactor 承担了所有时间的监听和响应可能存在性能问题。当有数百万客户端进行连接或者服务端需要对客户端握手进行安全认证认证本身非常消耗性能因此出现了主从 Reactor 多线程模型主从 Reactor 多线程模型中 1 个主 Reactor 只用来处理网络 IO 的连接建立操作而对于接入认证、IP 黑白名单过滤、握手等操作由从 Reactor 进行处理这样进一步提升性能在主从 Reactor 多线程模型中从 Reactor 有多个可以与 CPU 个数相同 TCP 粘包、拆包是什么如何解决 答 TCP本身的机制决定了一定会有粘包、拆包因为 TCP 传输协议时基于数据流传输的而流化的数据没有界限因此 TCP 作为传输层协议并不了解上层业务数据的具体含义会根据 TCP 缓冲区的实际情况进行数据包的划分所以业务上认为的一个完整的包可能被 TCP 拆成多个包或者把多个小的包封装成一个大的包进行发送。 产生原因 粘包客户端发送的包的大小比socket的缓存小或者接收方读取socket缓存不及时因此多个包一起发送了拆包客户端发送的包的大小比socket的缓存大或者发送的数据大于协议的MTU最大传输单元必须拆包那么这个包就被拆分成了多个包进行发送 解决方法 有三种方式 通过指定分隔符来进行分割通过指定固定长度来进行分割上边两种方式灵活性不好因此常用的是通过指定接收数据的长度来解决也就是LengthFieldBasedFrameDecoder()这个类 Netty 中常用组件? 答 ChannelNetty 网络操作抽象类包括了基本的 IO 操作如 bind、connect、read、write 等等EventLoop主要是配合 Channel 处理 IO 操作用来处理连接的生命周期中所发生的事件ChannelFutureNetty 中的所有 IO 操作都是异步的我们通过 ChannelFuture 的 addListener() 注册一个 ChannelFutureListener 监听事件当操作执行完毕后监听就会返回结果ChannelHandler作为处理器用于处理入站和出战的数据ChannelHandlerContext用于包裹 ChannelHandler维护了 pipeline 这个双向链表中的 pre 和 next 指针这样可以方便的找到与其相邻的 ChannelHandler并且过滤出一些符合执行条件的 ChannelHandlerNetty 的异步事件在 pipeline 中传播就是依靠 ChannelHandlerContextChannelPipeline每一个 Channel 都会分配一个 ChannelPipelinepipeline 是一个双向链表的结构Netty 中产生的 IO 异步事件都会在这个 pipeline 中传播 Netty 如何发送消息 答 有两种发送消息的方式 直接写入 Channel消息从 ChannelPipeline 的尾节点开始向前传播至头节点代码channelHandlerContext.write()使 write 事件从当前 ChannelHandler 开始沿着 pipeline 向前传播代码channelHandlerContext.channel().write() 这里解释一下上边发送消息为什么是向前传播 在 Netty 中IO 异步事件基本上分为两类inbound入站 事件、outbound出站 事件那么入站事件是沿着 pipeline 的头结点一直向后传播因此出站事件就是沿着 pipeline 的尾结点一直向前传播而上边发送消息也就是出站事件因此是沿着 pipeline 从后向前进行传播 直接内存比堆内存快在了哪里 答 首先直接内存不是 Java 虚拟机中的内存是直接向系统内存申请的空间来源于 NIO通过 Java 堆中的 DirectByteBuffer 来进行操作。 直接内存相比于堆内存避免了数据的二次拷贝。 我们先来分析不使用直接内存的情况我们发送数据需要将数据先写入 Socket 的缓冲区内那么如果数据存储在 JVM 的堆内存中的话会先将堆内存中的数据复制一份到直接内存中再将直接内存中的数据写入到 Socket 缓冲区中之后进行数据的发送 为什么不能直接将 JVM 堆内存中的数据写入 Socket 缓冲区中呢 在 JVM 堆内存中有 GC 机制GC 后可能会导致堆内存中数据位置发生变化那么如果直接将 JVM 堆内存中的数据写入 Socket 缓冲区中如果写入过程中发生 GC导致我们需要写入的数据位置发生变化就会将错误的数据写入 Socket 缓冲区 那么如果使用直接内存的时候我们将数据直接存放在直接内存中在堆内存中只存放了对直接内存中数据的引用这样在发送数据时直接将数据从直接内存取出放入 Socket 缓冲区中即可减少了一次堆内存到直接内存的拷贝 ​ 什么是 Netty 的零拷贝什么是 TCP 缓冲区 答 Netty 的零拷贝主要包含三个方面 Netty 的接收和发送使用堆外直接内存进行 Socket 读写不需要进行字节缓冲区的二次拷贝。 Netty 提供 CompositeByteBuf 组合缓冲区类可以将多个 ByteBuf合并为一个逻辑上的ByteBufer避免了各个ByteBufer之间的拷贝将几个小buffer合并成一个大buffer的繁琐操作。 Netty 的文件传输使用了 FileChannel 的 transferTo 方法该方法底层使用了 sendfile 函数实现了 cpu 零拷贝。 sendfile 函数通过网络发送数据的流程为 磁盘 ----DMA拷贝----文件读取缓冲区 ----CPU拷贝---- 套接字发送缓冲区(SO_SNDBUF) ----DMA拷贝---- 网络设备缓冲区(网卡) 图片流程如下3次拷贝、2次上下文切换这里上下文切换是在用户空间发起write操作此时用户态切换为内核态write调用完毕后又会从内核态切换回用户态 什么是TCP 缓冲区 每个 TCP 的 Socket 的内核中都有一个发送缓冲区SO_SNDBUF和一个接收缓冲区SO_RECVBUF在通过 TCP 需要进行网络数据传输时数据都是会写入 Socket 的缓冲区中的之后再通过网络协议发送出去 了解 Netty 中的 ByteBuf 类吗 答 在 Java NIO 编程中Java 提供了 ByteBuffer 作为字节缓冲区类型缓冲区可以理解为一段内存区域来表示一个连续的字节序列。 Netty 中并没有使用 Java 的 ByteBuffer而是使用了新的缓冲类型 ByteBuf特性如下 允许自定义缓冲类型 复合缓冲类型中内置的透明的零拷贝实现 开箱即用的动态缓冲类型具有像 StringBuffer 一样的动态缓冲能力 不再需要调用 flip() 方法 Java 的 ByteBuffer 类中需要使用 flip() 来进行读写两种模式的切换 正常情况下具有比 ByteBuffer 更快的响应速度 Java 中的 ByteBuffer 主要需要注意有 3 个属性position、limit、capacity capacity当前数组的容量大小position写入模式的可写入数据的下标读取模式的可读取数据下标limit写入模式的可写入数组大小读取模式的最多可以读取数据的下标 假如说数组容量是 10那么三个值初始值为 position 0 limit 10 capacity 10假如写入 4 个字节的数据此时三个值如下 position 4 limit 10 capacity 10如果切换到读取数据模式使用 flip()会改变上边的三个值会从 position 的位置开始读取数据到 limit 的位置 position 0 limit 4 capacity 10Netty 中的 ByteBuf ByteBuf 主要使用两个指针来完成缓冲区的读写操作分别是 readIndex 和 writeIndex 当写入数据时writeIndex 会增加当读取数据时readIndex 会增加但不会超过 writeIndex ByteBuf 的使用 public static void main(String[] args) {ByteBuf buffer Unpooled.buffer(10);System.out.println(----------初始化ByteBuf----------);printByteBuffer(buffer);System.out.println(----------ByteBuf写入数据----------);String str hello world!;buffer.writeBytes(str.getBytes());printByteBuffer(buffer);System.out.println(----------ByteBuf读取数据----------);while (buffer.isReadable()) {System.out.print((char)buffer.readByte());}System.out.println();printByteBuffer(buffer);System.out.println(----------ByteBuf释放无用空间----------);buffer.discardReadBytes();printByteBuffer(buffer);System.out.println(----------ByteBuf清空----------);buffer.clear();printByteBuffer(buffer); } private static void printByteBuffer(ByteBuf buffer) {System.out.println(readerIndex: buffer.readerIndex());System.out.println(writerIndex: buffer.writerIndex());System.out.println(capacity: buffer.capacity()); } /**输出**/ ----------初始化ByteBuf---------- readerIndex:0 writerIndex:0 capacity:10 ----------ByteBuf写入数据---------- readerIndex:0 writerIndex:12 capacity:64 ----------ByteBuf读取数据---------- hello world! readerIndex:12 writerIndex:12 capacity:64 ----------ByteBuf释放无用空间---------- readerIndex:0 writerIndex:0 capacity:64 ----------ByteBuf清空---------- readerIndex:0 writerIndex:0 capacity:64ByteBuf 的 3 种使用模式 ByteBuf 共有 3 种使用模式 堆缓冲区模式Heap Buffer 堆缓冲区模式又称为 “支撑数据”其数据存放在 JVM 的堆空间 优点 数据在 JVM 堆中存储可以快速创建和释放并且提供了数组直接快速访问的方法 缺点 每次数据与 IO 进行传输时都需要将数据复制到直接缓冲区这里为什么要将数据复制到直接缓冲区的原因在上边的 直接内存比堆内存快在了哪里 问题中已经讲过 创建代码 ByteBuf buffer Unpooled.buffer(10);直接缓冲区模式Direct Buffer 直接缓冲区模式属于堆外分配的直接内存不占用堆的容量 优点 使用 socket 传输数据时性能很好避免了数据从 JVM 堆内存复制到直接缓冲区 缺点 相比于堆缓冲区直接缓冲区分配内存空间和释放更为昂贵 创建代码 ByteBuf buffer Unpooled.directBuffer(10);复合缓冲区模式Composite Buffer 本质上类似于提供一个或多个 ByteBuf 的组合视图 优点 提供一种方式让使用者自由组合多个 ByteBuf避免了复制和分配新的缓冲区 缺点 不支持访问其支撑数据如果要访问需要先将内容复制到堆内存再进行访问 创建代码 public static void main(String[] args) { // AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(Test.class);// 创建一个堆缓冲区ByteBuf heapBuf Unpooled.buffer(2);String str1 hi;heapBuf.writeBytes(str1.getBytes());// 创建一个直接缓冲区ByteBuf directBuf Unpooled.directBuffer(5);String str2 nihao;directBuf.writeBytes(str2.getBytes());// 创建一个复合缓冲区CompositeByteBuf compositeByteBuf Unpooled.compositeBuffer(10);compositeByteBuf.addComponents(heapBuf, directBuf);// 检查是否支持支撑数组发现并不支持if (!compositeByteBuf.hasArray()) {for (ByteBuf buf : compositeByteBuf) {// 第一个字节偏移量int offset buf.readerIndex();// 总共数据长度int length buf.readableBytes();byte[] bytes new byte[length];// 不支持访问支撑数组需要将内容复制到堆内存中即 bytes 数组中才可以进行访问buf.getBytes(offset, bytes);printByteBuffer(bytes, offset, length);}} }private static void printByteBuffer(byte[] array, int offset, int length) {System.out.println(array: array);System.out.println(array-String: new String(array));System.out.println(offset: offset);System.out.println(len: length); } /**输出**/ array:[B4f8e5cde array-String:hi offset:0 len:2 array:[B504bae78 array-String:nihao offset:0 len:5​ Netty 中 ByteBuf 如何分配有池化的操作吗 答 ByteBuf 的分配接口定义在了 ByteBufAllocator 中他的直接抽象类是 AbstracByteBufAllocator而 AbstractByteBufAllocator 有两种实现PooledByteBufAllocator 和 UnpooledByteBufAllocator PooledByteBufAllocator 提供了池化的操作将 ByteBuf 实例放入池中提升了性能将内存碎片化减到了最小UnpooledByteBufAllocator。这个实现采用了一种内存分配的高效策略成为 jemalloc已经被好几种现代操作系统所采用UnpooledByteBufAllocator 在每次创建缓冲区时都会返回一个新的 ByteBuf 实例这些实例由 JVM 负责 gc 回收 NioEventLoopGroup 默认启动了多少线程 答 NioEventLoopGroup 是一个多线程的事件循环器默认启动了电脑可用线程数的两倍在调用 NioEventLoopGroup 的构造方法之后如果不传入线程数最后启动的默认线程数的计算公式为 Netty 如何解决 Selector 空轮询 Bug 的策略 答 空轮询 Bug 也就是网络上发生了唤醒 Selector 的事件但是 Selector 去取事件取不到就一直去取发生了空轮询导致 CPU 使用率达到 100% Netty解决机制 判断如果发生了 N默认是512次 次空轮询就新建一个Selector把原来Selector事件都迁移过来 为什么没有使用 Netty 5 答 Netty版本分别是netty3.x、netty4.x、netty5.x Netty5出现重大bug已经被官网废弃目前推荐使用Netty4.x稳定版本
http://www.hkea.cn/news/14345225/

相关文章:

  • 有关做粪污处理设备的企业网站腊肉网站的建设前景
  • 网站白名单查询网站怎么获得流量
  • 商丘高端网站建设怎样进行seo
  • 开通网站主机网站设计说明范文
  • 局域网wordpress建站网络推广项目代理
  • 电商公司建设网站网站广告网络推广价格低
  • 南昌做网站建设哪家好欧美风格网站模版
  • 一站式做网站企业网页版qq登录入口官网手机
  • 厦门网站建设制作北京建筑设计院排名推荐
  • 中山企业门户网站建设让别人做网站注意事项
  • 企业网站虚假宣称iso9001的处罚案例相城高端网站建设
  • 网站域名免费挪威网站后缀
  • 带状疱疹的预防措施短视频seo公司
  • 简述一个商务网站建设的步骤wordpress不能上传
  • 装修公司做网站推广能接到活吗500个免费视频素材
  • wordpress 批量友情链接宁波seo哪家好
  • 朔州网站设计公司外卖平台做网站
  • 中国建设工程网官方网站设计师网址导航sdc
  • 杭州做产地证去哪个网站网站建站目标
  • 使用oss做静态网站自己的网站怎么赚钱
  • 中国空间站的意义局机关网站建设改进措施
  • 企业全屏网站南昌百度推广公司
  • 淘宝做导航网站有哪些广州做网站哪家公司好
  • 婚庆网站制作公司app开发公司账务处理
  • 中国林业工程建设协会网站北京市网站开发公司
  • 怎么做卖车网站优化绿松石什么意思
  • 网站设计技术文章做网站优化公司排行
  • php电子商务网站模板深圳二维码网站建设
  • 装修设计网站排行榜百度爱采购竞价推广
  • 0基础如何做网站企业网站排名提升软件智能优化