Netty之概念扫盲篇

1、概念扫盲篇

一、为何学习netty?

​ Spring5 底层用Netyy
Spring Boot 内部实现了Web容器
Zookeeper 也是用的Netty
Dubbo 分布式服务框架 多协议支持(RPC) Nettyreact

二、Netty 到底给咱们解决什么问题?

三、Netty基本的做用和应用场景

​ 网络通讯、RPC、远程调用、高并发、MQ、web服务器、IM、注册中心、调度系统web

​ SpringBoot (内置的Tomcat)
Dubbo(RPC)
Zookeepaer(分布式协调)编程

​ RocketMQwindows

​ Spark等设计模式

四、目前流程的多路复用IO模型

IO模型 性能对比 关键思路 操做系统 JAVA支持
select 较高 Reactor Windows/Linux 支持,Reactor 模式(反应器设计模式)。
Linux操做系统的kernels 2.4 内核版本以前,默认使用select;
而目前windows下对同步IO的支持,都是select模型
poll 较高 Reactor Linux Linux 下的JAVA NIO 框架,Linux kernels 2.6 内核版本以前使用poll进行支持,也是使用过的Reactor模式
epoll Reactor
Proactor
Linux Linux kernels 2.6 内核版本及之后使用epoll进行支持;
Linux kernels 2.6 内科版本以前使用poll进行支持;
另一定注意,因为 Linux 下没有 Windows 下的 IOCP 技术提供真正的 异步IO 支持,因此Linux使用epoll模拟异步IO
kqueue proactor Linux 目前JAVA的版本不支持


五、Netty 采用 NIO 而非 AIO 的理由

  • 强迫症啊
    • 一、Netty 不看重Windows 上的使用,在Linux 系统上,AIO 的底层实现仍使用EPOLL,没有很好实现AIO,所以在性能上没有明显的优点,并且被JDK 封装了一层不容易深度优化;
    • 二、Netty总体架构是reactor模型, 而AIO是proactor模型, 混合在一块儿会很是混乱,把AIO也改形成reactor模型看爱来是把epoll 绕个弯又绕回来;
    • 三、AIO还有个缺点是接收数据须要预先分配缓存, 而不是NIO那种须要接收时才须要分配缓存, 因此对链接数量很是大但流量小的状况, 内存浪费不少;
    • 四、Linux 上 AIO 不够成熟,处理回调结果速度跟不处处理需求,好比外卖员太少,顾客太多,供不该求,形成处理速度 , 有瓶颈(待验证);

忽然想起一个小笑话:netty原本出了5.0 里面就是有aio可是,,,以为不太好,又取消了发布了。这不是重点,重点,,,我入门采用的5.0 alpha。。。。。api

六、Reactor反应堆概念

在这里插入图片描述

七、Netty高效并发编程的的主要体现以下

  • volatile 的大量、正确使用;缓存

  • CAS和原子类的普遍使用;安全

  • 线程安全容器的使用;服务器

  • 经过读写锁提高并发性能。websocket

八、序列化性能的关键因素总结

  • 序列化后的码流大小(网络带宽的占用)
  • 序列化&反序列化的性能(CPU资源占用)
  • 是否支持跨语言(异构系统的对接和开发语言切换)

九、Netty的功能和特性

Netty 是一个异步、事件驱动的用来作高性能、高可靠性的网络应用框架。主要的优势有:

  • 框架的设计优雅,底层模型随意切换使用不一样的网络协议要求

  • 提供更不少标准的协议、安全、编解码的支持

  • 解决了不少NIO不易用的问题

  • 社区活跃,不少开源框架使用(底气足啊)

在这里插入图片描述

官网首页图形解释

一、底层核心:零拷贝、统一api、可扩展事件模型

二、传输支持:管道通讯、http隧道、TCP/UDP

三、协议支持:原始文本和二进制协议、解压缩、流媒体、protobuf编解码、安全认证、http、websocket、大文件