
网络IO
文章平均质量分 78
BIO NIO Netty相关
coffee_babe
让学习成为一种享受,
脑图、设计图请见https://www.processon.com/u/60e12f2b637689510d6cdc81
github主页:https://github.com/2over
展开
-
手写百万并发连接的RPC框架之Netty篇
前言前面我们已经介绍了,使用JDK原生自带的Socket门面模式手写了注册中心、远程客户端、远程服务端三个模块来构成一个RPC框架,但是性能不是很高,远远无法支撑起大型的分布式系统之间的调用,于是我们今天来分享下如何用Netty来手写RPC框架,并用它来支撑起百万并发,为了便于理解,暂时先不实现注册中心。在该项目中还跟Spring进行了整合。结构示意图核心组件LengthFieldBasedFrameDecoder:解决网络传输中的粘包半包问题KryoEncoder/Decoder:负责网络数原创 2024-02-05 17:49:39 · 580 阅读 · 0 评论 -
手写RPC框架
1.我们在当前项目中的序列化框架选择是JDK自带的序列化,注意,你这个时候不能给上面提到的实体类添加唯一的serialId,否则通信过程中则将视为不一样的对象,导致序列化失败,还有就是要注意自己的目录结构,因为如果客户端和服务端中的实体类目录结构不一样,也是不行的,在实际业务中,往往会抽成一个公共的服务来使用,这里为了简洁2.网络通信模型采用的也是JDK自带的Socket模式,它是阻塞式的,它式无法支撑高并发的网络连接的如果需要这个项目源码的,可以在下方评论。原创 2024-02-03 20:14:00 · 912 阅读 · 2 评论 -
Java在网络通信中应该如何选择合适的序列化框架?
说到网络通信就会牵涉到数据的序列化与反序列化,现如今序列化框架也是层出不穷,比如FST、Kryo、ProtoBuffer、Thrift、Hessian、Avro、MsgPack等等,有的人可能会有疑问,为什么市面上有这么多框架,JDK不是已经有自带的Serializable序列化接口吗?很遗憾地说出这个事实,作为JDK自带地序列化机制,无论是在时间还是空间上的性能不尽人意,但凡时间或者空间上性能优越一点,也不至于让人诟病这么久。原创 2024-01-31 17:18:13 · 1370 阅读 · 0 评论 -
Proto文件如何生成JavaProto对象?
首先安装好Protocol Buffer的编译器Protocol Buffer:version:2.6.1link: 链接直达根据电脑环境进行下载,Widnwos 32/64位就选择win32是没问题的,楼主亲测1.proto文件编写Person.protopublic class Person { String name; int id; String email;}syntax = "proto2";option java_outer_classname原创 2024-01-30 18:23:13 · 1724 阅读 · 0 评论 -
NIO通信代码示例
先启动server再启动client。原创 2024-01-09 17:39:57 · 882 阅读 · 0 评论 -
BIO通信代码示例
一个客户端请求就需要创建一个线程来处理,对于操作系统来说,线程是一种昂贵的资源,线程的创建和销毁都需要CPU的调度,这会给操作系统带来一定的压力,即便机器配置很高,但会把服务器的资源吃的很满,这个时候我们可以用线程池来做,避免线程的频繁创建与销毁,我们再来改良一下。有人可能会说一个线程处理一个客户端请求,这样一个线程发生阻塞时,不影响其他的客户端处理,于是乎又在上面代码进行改良。感兴趣的朋友,可以关注我下期的NIO。原创 2024-01-05 17:42:31 · 377 阅读 · 0 评论 -
Linux五种IO模型
select会监听所有注册好的IO,如果所有被监听的IO需要的数据都没有准备好,那么select调用进程会阻塞。当任意一个IO所需要的数据准备好之后,select调用就会返回,然后进程通过recvfrom实现数据复制。阻塞IO模型,非阻塞IO模型,IO复用模型和信号驱动IO模型都是同步的IO模型,因为无论哪种模型。就会阻塞,知道内核准备好数据,recvfrom完成数据报的复制工作,应用进程才能结束阻塞状态。当内核收到aio_read后会立刻返回,然后开始等待数据准备,数据准备好之后,直接把。原创 2023-12-31 13:51:43 · 449 阅读 · 2 评论 -
IO多路复用之epoll模型
epoll是Linux在2.6内核版本中提出的,是之前select和poll的增强版本.相对于select和poll来说,epoll做了更细致的分解,包含了三个方法,使用上更加灵活分别为epoll_ctlepoll_wait。原创 2023-12-29 21:53:21 · 907 阅读 · 1 评论 -
Linux中的IO进程阻塞原理
当进程A执行到创建socket的语句时,操作系统会创建一个由文件系统管理的socket对象,recv是一个阻塞方法,当程序运行到recv时,它会一直等待,直到接收到数据才往下执行。当程序执行到recv时,操作系统会将进程A从工作队列移动到该socket的等待队列中。由于工作队列只剩下了进程B和C,依据进程调度,CPU会轮流执行这两个进程的程序,该进程变成运行状态,继续执行代码,也由于socket的接收缓冲区已经有了数据,正在执行代码的状态,等待状态是阻塞状态,比如上面代码运行到recv时,原创 2024-01-03 17:59:12 · 449 阅读 · 0 评论 -
Linux中内核是如何接收网卡数据的?
当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动,网络驱动会以DMA。优先级很高,CPU理应中断掉正在执行的程序,去做出响应;当网卡把数据写入到内存后,网卡向CPU发出一个中断信号,操作系统便能得知。和硬中断不同的是,硬中断是通过给CPU物理引脚施加电压变化,而软中断是。网卡的中断处理函数并不做过多工作,发出软中断请求,然后尽快释放CPU.当设备上有数据到达的时候,会给CPU的相关引脚上触发一个电压变化,第二,当CPU收到中断请求后,回去调用网络驱动注册的中断处理函数。所谓中断,可以理解为,原创 2024-01-03 17:11:27 · 594 阅读 · 0 评论