bingtaoli / chatserver

基于muduo网络库Reactor模型的集群聊天源码

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

项目介绍

采用 muduo 处理网络连接请求及事件回调,在单机环境中模拟启动两个客户端,通过NginxTCP长连接负载均衡器将连接均衡至两台启动的服务器中(详见下方/usr/local/nginx/conf/nginx.conf配置选项),Redis发布订阅对服务器之间的消息进行转发。

服务器示例

两台服务器启动,分别绑定60006002端口

客户端示例

两台客户端连接nginx负载均衡器监听的8000端口,并进行通信

功能

  • 用户登录
  • 用户注销
  • 注册用户
  • 单人聊天
  • 添加好友
  • 创建群组
  • 加入群组
  • 群组聊天

编译

进入目录执行./build.sh即可编译完成。

开发环境

muduo配置

muduo 编译依赖gcccmakeboost

# 安装cmake
sudo apt-get install cmake

# 安装boost
sudo apt-get install libboost-dev libboost-test-dev

# 三个非必须依赖库:curl、c-ares DNS、Google Protobuf
sudo apt-get install libcurl4-openssl-dev libc-ares-dev
sudo apt-get install protobuf-compiler libprotobuf-dev

muduo 依赖安装完毕,编译./build.sh,若仍然缺少依赖,尝试:

sudo apt-get update
sudo apt-get install -y build-essential

编译完毕后执行 muduo 编译安装,生成release-install-cpp11文件:

./build.sh install

release-install-cpp11文件夹下有两个文件夹includelib,先把编译生成include下的muduo文件夹移动至/usr/include/中,再把lib下四个库libmuduo_base.a libmuduo_http.a libmuduo_inspect.a libmuduo_net.a移动至/usr/local/lib/中:

mv muduo/ /usr/include/     # 把release-install-cpp11/include/*移动到/usr/include/
mv * /usr/local/lib/        # 把release-install-cpp libmuduo_base.a  libmuduo_http.a  libmuduo_inspect.a  libmuduo_net.a四个库拷贝到/usr/local/lib/

MySQL配置

安装mysql 5.7及开发包:

apt-get update
apt-get install mysql-server  # 安装最新版MySQL服务器
apt-get install libmysqlclient-dev  # 安装开发包
  • MySQL连接账号密码设置见chatserver/src/server/db/db.cpp
  • 数据库操作细节参考:link
  • 出现登录错误参考:link

Redis配置

安装Redis服务器:

apt-get install redis-server
  • Redis初始化及服务启动操作可参考:link

Redis发布订阅客户端配置

Redis支持多种不同的客户端编程语言,如Java对应jedisphp对应phpredisC++对应 hiredis。下面是安装hiredis的步骤,编译前先切换至root用户:

git clone https://github.com/redis/hiredis
cd hiredis
make
make install
ldconfig /usr/local/lib  # 拷贝生成的动态库至/usr/local/lib

NginxTCP负载均衡配置

编译nginx前,需安装依赖环境pcrezlibopensslPCRE库支持正则表达式。若在配置文件nginx.conf中使用了正则表达式,在编译nginx时就必须把PCRE库编译进nginx。安装PCRE

sudo apt-get install libpcre3 libpcre3-dev  

zlib库用于对HTTP包的内容做gzip格式的压缩,若在nginx.conf中配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量,则在编译时就必须把zlib编译进nginx。安装zlib

sudo apt-get install zlib1g-dev

若服务器不只是要支持HTTP,还需要在更安全的SSL协议上传输HTTP,则需有OpenSSL。另外,若想使用MD5SHA1等散列函数,则也需要安装它。安装OpenSSL

sudo apt-get install openssl libssl-dev 

安装上述依赖环境pcrezlibopenssl后,将details内的 nginx-1.12.2.tar.gz 在指定目录解压:

tar -axvf nginx-1.12.2.tar.gz

在服务器快速集群环境搭建中,需要一个能拿来即用的负载均衡器,nginx1.9版本之前,只支 持HTTP协议web服务器的负载均衡,从1.9版本开始后,nginx开始支持TCP的长连接负载均衡,但nginx默认并没有编译TCP负载均衡模块,编写它时,需要加入--with-stream参数来激活这个模块。接下来编译需向系统路径拷贝,切换至root编译:

cd nginx-1.12.2/
./configure --with-stream
make && make install

编译完成后,默认安装在了/usr/local/nginx目录。

启动nginx服务:

cd /usr/local/nginx/sbin
./nginx

停止nginx服务:

cd /usr/local/nginx/sbin
./nginx -s stop

配置配置文件nginx.conf(配置文件所在路径:/usr/local/nginx/conf/nginx.conf),配置如下:

# nginx tcp loadbalance config
stream {
        # MyServer负载均衡模块
        upstream MyServer {
                server 127.0.0.1:6000 weight=1 max_fails=3 fail_timeout=30s;
                server 127.0.0.1:6002 weight=1 max_fails=3 fail_timeout=30s;
        }
        server {
                proxy_connect_timeout 1s;
                # proxy_timeout 3s;
                listen 8000;
                proxy_pass MyServer;    # 指定8000端口连入后发送至MyServer负载均衡模块中
                tcp_nodelay on;
        }
}

配置完成后,./nginx -s reload平滑重启。

About

基于muduo网络库Reactor模型的集群聊天源码


Languages

Language:C++ 99.8%Language:CMake 0.2%Language:Shell 0.0%