【Netty基础】Java原生网络编程
一、网络编程核心概念
- Socket本质
- 应用层与TCP/IP协议族通信的中间抽象层,提供网络通信接口。
- 连接类型
类型 特点 适用场景 短连接 请求-响应后立即断开 HTTP/1.0、简单查询 长连接 保持连接复用,减少握手开销 数据库连接池、RPC调用
二、Linux I/O模型详解(面试重点)
模型 | 特点 | 关键机制 | 性能对比 |
---|---|---|---|
阻塞I/O | 进程阻塞直到数据拷贝完成 | read() /write() | 简单,但并发差 |
非阻塞I/O | 进程轮询检查数据就绪状态(多次系统调用) | fcntl(O_NONBLOCK) | CPU占用高 |
I/O多路复用 | 单线程监听多个Socket事件(核心模型) | select /poll /epoll | 高并发首选 |
信号驱动I/O | 内核数据就绪时发送SIGIO信号,进程异步处理 | sigaction | 实时性要求高场景 |
异步I/O (AIO) | 数据从内核到用户空间拷贝完成后才通知进程 | io_submit | 真异步,性能最优 |
关键区别:
- 同步 vs 异步:数据就绪后是否需进程主动拷贝(同步需主动
read
,异步由内核完成)。- 阻塞 vs 非阻塞:等待数据就绪时进程是否挂起。
三、I/O多路复用技术对比(必考)
机制 | 底层结构 | 最大连接数 | 效率 | 触发方式 |
---|---|---|---|---|
select | 数组 | 1024 | O(n)线性扫描 | 水平触发(LT) |
poll | 链表 | 无上限 | O(n)线性扫描 | 水平触发(LT) |
epoll | 红黑树+链表 | 无上限 | O(1)事件通知 | 支持LT/边缘触发(ET) |
边缘触发(ET):仅状态变化时通知一次,需一次性处理完数据(减少系统调用)。
四、Java网络编程模型
-
BIO (Blocking I/O)
- 特点:1请求 = 1线程,线程阻塞等待I/O完成。
- 缺陷:高并发时线程资源耗尽(C10K问题)。
- 应用:早期RPC框架(如Dubbo默认使用Netty NIO替代)。
-
NIO (Non-blocking I/O)
- 核心组件:
- Channel:双向数据传输通道(
ServerSocketChannel
/SocketChannel
)。 - Buffer:数据容器(
ByteBuffer
),含position
/limit
/capacity
属性。 - Selector:监听多个Channel事件(
SelectionKey.OP_ACCEPT
/OP_READ
)。
- Channel:双向数据传输通道(
- 模式:Reactor模式(单线程处理多连接)。
- 核心组件:
五、RPC框架原理与实现
-
RPC核心价值
- 解耦服务:跨进程调用像本地方法(订单服务 → 库存服务)。
- 性能对比HTTP:TCP二进制传输效率高于HTTP文本协议。
-
RPC实现关键问题
问题 解决方案 技术工具 代理问题 动态代理隐藏远程调用细节 JDK Proxy/CGLib 序列化 对象↔二进制转换(高效、跨语言) Protobuf/Hessian/JSON 通信传输 网络数据传输协议 TCP/HTTP2/Netty 服务实例化 反射调用目标方法 Java Reflection -
RPC调用流程
六、主流RPC框架对比
框架 | 协议 | 特点 | 适用场景 |
---|---|---|---|
Dubbo | TCP | 高性能、服务治理完善 | 微服务架构 |
gRPC | HTTP/2 | 多语言支持、流式处理 | 跨语言系统 |
Spring Cloud | HTTP | 生态丰富、与Spring集成度高 | 云原生应用 |
Dubbo核心组件:
- Provider(服务提供者)、Consumer(消费者)、Registry(注册中心)、Monitor(监控)。
七、面试重点总结
- I/O模型
- 阻塞 vs 非阻塞 vs 异步的本质区别。
epoll
为何高效?(红黑树管理fd、事件回调)。
- RPC核心问题
- 动态代理作用、序列化选型(Protobuf为何高效)。
- BIO/NIO对比
- BIO的C10K问题,NIO的Reactor模式如何解决。
- Dubbo vs Spring Cloud
- TCP长连接 vs HTTP短连接的性能差异。
文档内容覆盖网络编程核心知识体系,掌握后可应对90%的Java中高级面试考点。