- 基于vscode远程连接centos7实现;
- 部署nginx、tcp负载均衡环境中的集群通信服务器和客户端源码, 基于muduo开源库实现,数据库包括有redis,mysql;
- 1、使用 muduo 库作为网络核心模块、提高高并发网络 I/O 服务,解耦网络和业务模块代码。
- 2、调用 jsoncpp, 基于json序列化和反序列化消息作为私有通信协议。
- 3、配置nginx基于tcp的负载均衡,实现集群服务器的集群功能,提高后端服务的并发能力。
- 4、基于redis的发布-订阅功能,实现跨服务器的消息通信。redis除了缓存,还可以用来作为消息队列,实现 publish, subscribe, notify, 类似于观察者模式。
- 5、使用 mysql 数据库实现项目数据的持久化-增删改查。
- 6、使用连接池提高数据库的数据存取能力。
- cd /usr/local/nginx/sbin/
- 启动 ./nginx
- conf配置文件:/usr/local/nginx/conf/nginx.conf
- service mysql start
- 启动服务端,"redis-server",然后命令查询"netstat -tanp"发现在6379端口
- 启动两个客户端,"redis-cli";
- 举例,在一个客户端订阅13通道的消息,subscribe 13,这个客户端已经阻塞,需要另外起一个
- 另一个客户端,发布关于13通道的消息,publish 13 "hello"
- C++对应的是hiredis
- git clone 从github
- cd hiredis
- make 编译
- sudo make install 拷贝生成的动态库到/usr/local/lib目录下
- 高性能:muduo库采用了epoll+多线程的设计,可以充分发挥多核处理器的性能,提高服务器的并发处理能力;
- 异步编程模型:muduo库使用了事件驱动的异步编程模型,可以有效地处理大量的并发连接,提高服务器的吞吐量;
muduo由陈硕大佬开发,是一个基于非阻塞IO和事件驱动的C++高并发TCP网络库,使用的线程模型是one loop per thread,所谓one loop per thread指的是:
- 一个线程只能有一个事件循环(EventLoop)
- 一个文件描述符(file descriptor,通常简称fd)只能由一个线程进行读写,换句话说就是一个- TCP连接必须归属于某个EventLoop管理。但返过来不一样,一个线程却可以管理多个fd。 为什么要选择one loop per thread模型:(P62,3.3.1节)
- socket被意外关闭。A线程要从socket中读/写消息,但是该socket被B线程给close了,更糟的情况是,B close后,新的连接的socket刚好使用的是B关闭的socket,那A线程再次进行读/写早已经不是原来的那个连接了(这种现象叫串话)
- 不考虑关闭,只考虑读写也有问题。比如A、B线程同时对一个TCP连接进行读操作,如果两个线程几乎同时各自收到一部分消息,那如何把数据拼接成完整的消息,如何知道哪部分数据先到达。如果同时写一个socket,每个线程只发送半条消息,接收方又该怎么处理,如果加锁,那还不如直接就让一个线程处理算了。
- 线程数目基本固定,不用频繁创建或者销毁线程;
- 可以很方便的在各个线程之间进行负载调配;
- IO事件发生的线程基本是固定不变的,不必考虑TCP连接事件的并发(即fd读写都是在同一个线程进行的,不是A线程处理写事件B线程处理读事件);