Leo Technology Stack Leo Technology Stack
首页
  • Android
  • Web
  • SpringBoot
  • 数据库
  • Docker
  • Netty
  • KubeSphere
  • Linux
  • Android Framework
  • 开源库
思维
  • 面试
  • 投资理财
  • 杂事记录
  • 索引

    • 分类
    • 标签
    • 归档
  • 开源项目

    • Advance Markdown
    • AnLibrary (opens new window)

Leo

不知名的架构师
首页
  • Android
  • Web
  • SpringBoot
  • 数据库
  • Docker
  • Netty
  • KubeSphere
  • Linux
  • Android Framework
  • 开源库
思维
  • 面试
  • 投资理财
  • 杂事记录
  • 索引

    • 分类
    • 标签
    • 归档
  • 开源项目

    • Advance Markdown
    • AnLibrary (opens new window)
  • 目录页

  • 前端

  • 后端

    • Spring

    • 数据库

    • Docker

    • NetWork

      • 网络编程基础
      • Netty
        • 介绍
        • 应用场景
        • I/O模型
          • BIO(同步阻塞)
          • NIO(同步非阻塞)
      • http/https
    • k8s

  • Linux

  • thinking

  • interview

  • notes
  • 后端
  • NetWork
2021-04-13

Netty

# Netty

# 介绍

  • Netty是由JBOSS提供的一个Java开源框架
  • Netty是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络IO程序
  • Netty主要针对在TCP协议下,面向Clients端的高并发应用,或者peer-to-peer场景下的大量数据持续传输的应用
  • Netty本质上是一个NIO框架,适用于服务器通讯相关的多种应用场景

# 应用场景

  • 互联网行业,Dubbo,RPC框架
  • 游戏行业,手游、网络服务、地图服务器
  • 大数据领域,Hadoop

# I/O模型

Java支持3种网络编程模型

  • BIO: 同步并阻塞(blocking I/O)
    BIO适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,jdk1.4之前唯一的选择
    
    1
  • NIO: 同步非阻塞(non-blocking I/O)
    NIO适用于连接数目多且连接比较短(轻操作)的架构,如聊天服务器、弹幕系统、服务器间通讯,jdk1.4开始支持
    
    1
  • AIO: 异步非阻塞(Asynchronous I/O)
    AIO适用于连接数目多且连接比较长(重操作)的架构,如相册服务器、充分调用OS参与并发操作,jdk1.7开始支持
    
    1

# BIO(同步阻塞)

  1. 传统java io编程 相关代码在java.io
  2. 适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高
undefined

# BIO编程流程

1.服务端启动一个ServerSocket
2.客户端启动Socket对服务器进行通信,默认情况下服务器需要对每个客户建立一个线程与之通讯
3.客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待或者被拒绝
4.如果有响应,客户端线程会等待请求结束后,在继续执行

# BIO弊端

  • 每个请求都需要创建独立线程,与对应的客户端进行数据读写、业务处理
  • 当并发量比较大时,需要创建大量线程来处理连接,系统资源占用比较大
  • 连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在read操作上,造成线程资源浪费

# NIO(同步非阻塞)

相关代码带java.nio下,并对愿java.io包中的很多类进行改写

NIO是面向缓冲区、或者面向块的编程,数据读到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络

NIO可以做到一个线程来处理多个操作

tip: HTTP2.0使用了多路复用技术,做到了同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级

# NIO三大核心

  • Channel(通道)
  • Buffer(缓冲区)
  • Seletor(选择器)

关系

  • 每个channel都会对应一个buffer
  • selector对应一个线程,一个线程对应多个selector
  • Selector会根据不同的事件,在各个通道上切换
  • Buffer就是个内存块,底层是一个数组
  • 数据的读写是通过Buffer,NIO的Buffer是可以读写,需要flip方法切换
  • channel是双向的,可以返回底层操作系统的情况,比如linux,底层的操作系统通道是双向的
undefined

Buffer

Channel

Selector

=======

编辑此页 (opens new window)
#Netty
上次更新: 2022-04-28, 11:21:32
网络编程基础
http/https

← 网络编程基础 http/https→

Theme by Leo | Copyright © 2016-2022 Leo | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式