C++项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一、项目介绍

本项目是在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环境

  1. 安装Json开发库

  2. 安装boost + muduo网络库、cmake编译开发环境,

  3. 安装redis环境

  4. 安装mysql数据库

  5. 安装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第三方库

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值