今天开始想更新一个C++项目,实现一个支持跨服务器通信、支持负载均衡的集群聊天服务器项目。项目会应用muduo网络库、CMake编译、MySQL数据库、JSon序列化与反序列化、Redis消息订阅模式以及Nginx负载均衡功能。
有兴趣的宝可以跟我一起实操起来,巩固自己的C++学习吧~
一、项目介绍
本项目是在Linux环境下开发,使用CMake编译构建的基于muduo网络库开发的集群聊天服务器,通过muduo的TcpServer和TCpClient类设计服务端、客户端,使用 muduo 注册消息事件到来的回调函数,并根据得到的MSGID定位到不同的功能处理函数中,主要实现用户注册、用户登录、添加好友、添加群组、群组聊天以及保持离线消息等功能,用户数据存放于MySQL数据库中进行增删改查。
Json实现通信数据的序列化与反序列化,使用第三方库 json.hpp实现
为提高服务器的并发处理能力,可以采用升级服务器性能或增加服务器数量,考虑到机器性能总是有限的,引入Nginx的负责均衡功能将客户端请求分发到不同的服务器上分担压力。
由于采用集群服务器,有多个服务器维护用户,某一业务服务器聊天对象在自己服务器用户表发现离线,可能在别的服务器上在线,本应发送在线消息却发送离线消息,为实现跨服务器通信,服务器直接互联带宽压力大,资源占用庞大,因此引入中间件消息队列Redis,通过Redis的发布订阅消息通信模式,提高服务器的响应能力。
二、项目需求
1. 客户端新用户注册
2. 客户端用户登录
3. 添加好友和添加群组
4. 好友聊天
5. 群组聊天
6. 离线消息
7. nginx配置tcp负载均衡
8. 集群聊天系统支持客户端跨服务器通信
三、技术栈
1、Json序列化和反序列化
2、muduo网络库开发
3、nginx源码编译安装和环境部署
4、nginx的tcp负载均衡器配置
5、redis缓存服务器编程实践
6、基于发布-订阅的服务器中间件redis消息队列编程实践
7、MySQL数据库编程CMake构建编译环境
了解了项目需求与技术栈后,现在让我们一起来搭建所需环境吧~
四、环境搭建
搭建需求:
1.ubuntu linux环境
2. 安装Json开发库
3. 安装boost + muduo网络库、cmake编译开发环境,
4. 安装redis环境
5. 安装mysql数据库
6. 安装nginx
4.1 操作系统
我使用的系统为ubuntu操作系统,版本为20.04,大家可以使用命令查看自己系统的版本信息
查看命令:
(1)命令:
lsb_release -a
(2)命令:
cat /proc/version
(3)命令:
uname -a
当然,centos及其他系统也可以,大家根据自己实际情况使用对应命令搭建即可!
4.2 muduo网络库的安装
由于muduo网络库是基于Boost网络库,所以先安装Boost库
4.2.1 Boost库安装
(1)下载Boost库
(2)解压
tar xzvf boost_1_69_0.tar.gz
(3)解压完毕后,进入目录中
cd /boost_1_69_0/
(4)获取所需的库,主要的是boost::regex支持的icu
sudo apt-get update
sudo apt-get install build-essential g++ python-dev autotools-dev libicu-dev build-essential libbz2-dev libboost-all-dev
(5)Boost引导程序设置
./bootstrap.sh --prefix=/usr/
执行
./b2
安装
sudo ./b2 install
(6)测试是否安装成功
#include <iostream> #include <boost/bind.hpp> #include <string> using namespace std; class Hello{ public: void say(string name) { cout << name << "Nice to meet you!" << endl; } }; int main() { Hello h; auto func=boost::bind(&Hello::say,&h,"Hey boy "); func(); return 0; }
如果打印结果:
代表安装成功!
4.2.2 muduo库安装
muduo库是一个基于reactor反应堆模型的多线程C++网络库,基于Boost开发的。
(1)解压muduo压缩文件
unzip muduo-master.zip
(2)进入解压目录
cd muduo-master
(3)vi编辑CMakeLists.txt文件,注释第十三option行,保存退出
(4)运行build.sh源码编译构建程序,muduo是用cmake来构建的,需要安装cmake
命令:
sudo apt-get install cmake
编译:
./build.sh
编译完成,安装muduo库
./build.sh install
(5)拷贝头文件和库文件路径
把inlcude(头文件)和lib(库文件)目录下的文件拷贝到系统目录下
cd build/release-install-cpp11/include/
mv muduo/ /usr/include/
cd../lib/
mv * /usr/local/lib/
(6)编写测试代码,测试muduo是否能正常使用
#include <muduo/net/TcpServer.h> #include <muduo/base/Logging.h> #include <boost/bind.hpp> #include <muduo/net/EventLoop.h> // 使用muduo开发回显服务器 class EchoServer { public: EchoServer(muduo::net::EventLoop* loop, const muduo::net::InetAddress& listenAddr); void start(); private: void onConnection(const muduo::net::TcpConnectionPtr& conn); void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp time); muduo::net::TcpServer server_; }; EchoServer::EchoServer(muduo::net::EventLoop* loop, const muduo::net::InetAddress& listenAddr) : server_(loop, listenAddr, "EchoServer") { server_.setConnectionCallback(boost::bind(&EchoServer::onConnection, this, _1)); server_.setMessageCallback(boost::bind(&EchoServer::onMessage, this, _1, _2, _3)); } void EchoServer::start() { server_.start(); } void EchoServer::onConnection(const muduo::net::TcpConnectionPtr& conn) { LOG_INFO << "EchoServer - " << conn->peerAddress().toIpPort() << " -> " << conn->localAddress().toIpPort() << " is " << (conn->connected() ? "UP" : "DOWN"); } void EchoServer::onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer*buf, muduo::Timestamp time) { // 接收到所有的消息,然后回显 muduo::string msg(buf->retrieveAllAsString()); LOG_INFO << conn->name() << " echo " << msg.size() << " bytes, " << "data received at " << time.toString(); conn->send(msg); } int main() { LOG_INFO << "pid = " << getpid(); muduo::net::EventLoop loop; muduo::net::InetAddress listenAddr(8888); EchoServer server(&loop, listenAddr); server.start(); loop.loop(); }
终端执行命令:
g++ Muduo_text.cpp -lmuduo_net -lmuduo_base -lpthread -std=c++11
执行./a.out文件,程序开始运行,再开启一个终端,输入
echo "Hello world"|nc localhost 8888
终端回显Hello world,且服务器端打印日志信息,证明muduo库安装成功!
4.3 Json第三方库
使用json.hpp第三方库
JSON for Modern C++ 是一个由德国大牛 nlohmann 编写的在 C++ 下使用的 JSON 库。
#include "json.hpp" using json = nlohmann::json;
4.4 安装Redis环境
安装Redis可参考这篇博主的文章:Ubuntu中安装mysql和redis并配置远程连接_ubuntu redis远程访问-CSDN博客
4.5 安装Mysql环境
sudo apt-get install mysql-server =》 安装最新版MySQL服务器 sudo apt-get install libmysqlclient-dev =》 安装开发包
最后只要能使用
mysql -u root -p
登录,密码是123456即可
使用命令:
netstat -tanp
查看是否安装成功
如果看到有mysqld与redis-server服务开启即可
4.7 nginx环境可后续再安装
4.8 配置远程开发环境
我选用的开发方式是:windows+vscode配置远程Linux开发环境
注意注意注意!这里vscode要用管理员方式打开
(1)linux系统运行sshd服务
见上图开启mysqld与redis-server服务,可以看到开启sshd服务
(2)在vscode上安装Remote Development插件,其依赖插件会自动安装
当然,还要下载C/C++、Code Runner和CMake等插件,见下图,大家自行安装
(3)配置远程linux主机的信息
左边的小图标,有个远程电脑样式
点击SSH右边的小齿轮,打开SHH配置文件
选择第一个config文件
IP地址可用
ifconfig
命令查看
(4)在vscode上开发远程连接linux
点击在当前窗口连接,输入密码即可登陆成功
至此,环境配置成功!
需特别注意:vscode管理员身份运行、.ssh权限问题以及ssh扩展设置问题
大家可以先按照上述步骤搭建环境,搭建成功后进行接下来的项目研究!
如果有问题,还请及时联系我,感谢~
参考文章:
在Ubuntu上安装Boost的五种方法(全网最全,建议收藏)_ubuntu安装boost-CSDN博客