muduo概述
正常的socket只能阻塞的连接一个请求
轮询查询的非阻塞socket
epoll去管理各种连接fd组成的reactor和preactor模型,以及更高效的io_uring
网络库原理基本就是开一个epoll去监听各种网络连接fd的消息,然后去调用异步或者同步的程序去处理,以此循环
常见的网络库有:c++的muduo,c++的tinywebserver,c++的boost中asio,java的netty
网络库和框架的区别?常见的框架有哪些
一般单机或者是多机的框架是以http+json为主的,如果是分布式则以rpc+protobuf为主。框架相比较网络库而言,里面会多一些开发组件,例如配置模块,相关开源组件的操作api,例如mysql,redis等,以提升业务开发效率为主
常见的框架:
c++的workflow(里面还有业务编排,算一个框架了)
c++的游戏skyet
java spring boot
python flask,django,fastapi等
平常网络库怎么用呢
一般都不会自己写网络库,而且也不会用网络库,都是用基于网络库之上封装的框架,如果是非分布式是http,就用flask等,分布式就用grpc和brpc.当你选型的时候,需要根据框架中网络库的具体实现来评估性能和场景是否适合你
muduo原理分析
main_loop绑定了accept的监听句柄放到loop中的epoll里面。然后监听如果有数据过来,就找到一个子的loop,然后把网络fd连接好传进去。然后判断线程时候和当前loop保持一致,一致的话就建立连接,不一致就wakeup通知一下,放入队列中,等线程和loop一致的时候再建立。建立完成后,如果有读事件,就调用读事件,读取数据,然后调用业务给的回调函数,处理完之后触发发送事件,发送事件先将数据写入内存缓冲区,然后开启写入事件,写入事件触发后将数据写入给调用方。