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

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

一、网络编程核心概念

  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数组1024O(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框架对比

框架协议特点适用场景
DubboTCP高性能、服务治理完善微服务架构
gRPCHTTP/2多语言支持、流式处理跨语言系统
Spring CloudHTTP生态丰富、与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中高级面试考点。

http://www.dtcms.com/a/269224.html

相关文章:

  • 洛谷刷题7.7
  • Java源码的前端编译
  • tomcat部署多个端口以及制定路径部署-vue3
  • Java创建型模式---原型模式
  • docker进入启动失败的容器
  • 图像处理中的边缘填充:原理与实践
  • AJAX vs axios vs fetch
  • [java: Cleaner]-一文述之
  • Python与Mongo数据库:下载安装mongodb与CompassGUI、python中安装monggo模块、如何在Mongo中插入一条数据
  • 10.5 实战ChatGLM3私有数据微调之提示工程:批量生成数据稳定性秘籍
  • HarmonyOS从入门到精通:自定义组件开发指南(二):组件属性与参数传递
  • Python实现MCP Server的完整Demo
  • 《声音的变形记:Web Audio API的实时特效法则》
  • Web 前端安全防护:防范常见攻击与漏洞的策略
  • SKUA-GOCAD入门教程-第八节 线的创建与编辑7和8
  • 特别放送:关于一个无法修复的系统级Bug
  • Eslint基础使用
  • 插入数据优化
  • 镜头OIS系统方案全面解析:从基础原理到前沿应用
  • 【ElasticSearch实用篇-01】需求分析和数据制造
  • Spring Cloud Config(微服务配置中心详解)
  • 七牛云Java开发面试题及参考答案(60道面试题汇总)
  • 华为OD机试 2025B卷 - 最小循环子数组(C++PythonJAVAJSC语言)
  • 【论文笔记】World Models for Autonomous Driving: An Initial Survey
  • 【C++读取输入空格到CHAR数组】2022-7-19
  • 在vue3+ts项目中引入element-plus及其图标
  • 【读代码】深度解析TEN VAD:实时语音活动检测的高性能开源解决方案
  • 从被动救火到主动预测!碧桂园服务以图谱技术重塑IT运维底座
  • 开放端口,开通数据库连接权限,无法连接远程数据库 解决方案
  • Debian 11 Bullseye 在线安装docker