【Netty基础】Java原生网络编程

发布于:2025-07-09 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、网络编程核心概念

  1. Socket本质
    • 应用层与TCP/IP协议族通信的中间抽象层,提供网络通信接口。
  2. 连接类型
    类型 特点 适用场景
    短连接 请求-响应后立即断开 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网络编程模型

  1. BIO (Blocking I/O)

    • 特点:1请求 = 1线程,线程阻塞等待I/O完成。
    • 缺陷:高并发时线程资源耗尽(C10K问题)。
    • 应用:早期RPC框架(如Dubbo默认使用Netty NIO替代)。
  2. NIO (Non-blocking I/O)

    • 核心组件
      • Channel:双向数据传输通道(ServerSocketChannel/SocketChannel)。
      • Buffer:数据容器(ByteBuffer),含position/limit/capacity属性。
      • Selector:监听多个Channel事件(SelectionKey.OP_ACCEPT/OP_READ)。
    • 模式:Reactor模式(单线程处理多连接)。

五、RPC框架原理与实现

  1. RPC核心价值

    • 解耦服务:跨进程调用像本地方法(订单服务 → 库存服务)。
    • 性能对比HTTP:TCP二进制传输效率高于HTTP文本协议。
  2. RPC实现关键问题

    问题 解决方案 技术工具
    代理问题 动态代理隐藏远程调用细节 JDK Proxy/CGLib
    序列化 对象↔二进制转换(高效、跨语言) Protobuf/Hessian/JSON
    通信传输 网络数据传输协议 TCP/HTTP2/Netty
    服务实例化 反射调用目标方法 Java Reflection
  3. RPC调用流程

    客户端
    动态代理
    序列化
    网络传输
    服务端
    反序列化
    反射调用
    返回结果

六、主流RPC框架对比

框架 协议 特点 适用场景
Dubbo TCP 高性能、服务治理完善 微服务架构
gRPC HTTP/2 多语言支持、流式处理 跨语言系统
Spring Cloud HTTP 生态丰富、与Spring集成度高 云原生应用

Dubbo核心组件

  • Provider(服务提供者)、Consumer(消费者)、Registry(注册中心)、Monitor(监控)。

七、面试重点总结

  1. I/O模型
    • 阻塞 vs 非阻塞 vs 异步的本质区别。
    • epoll 为何高效?(红黑树管理fd、事件回调)。
  2. RPC核心问题
    • 动态代理作用、序列化选型(Protobuf为何高效)。
  3. BIO/NIO对比
    • BIO的C10K问题,NIO的Reactor模式如何解决。
  4. Dubbo vs Spring Cloud
    • TCP长连接 vs HTTP短连接的性能差异。

文档内容覆盖网络编程核心知识体系,掌握后可应对90%的Java中高级面试考点。