C++服务开发入门指南
  • 序言
  • 前言
  • 一、一个简单的服务
    • 1 什么是服务
    • 2 服务可以用来做什么
    • 3 简单服务框架
  • 二、网络通信服务框架
    • 1 网络服务的基本概念
    • 2 增加监听端口
    • 3 处理客户端会话
    • 小结
  • 三、添加基础模块
    • 1 日志模块
    • 2 定时器
    • 3 事件机制
    • 4 线程池
    • 5 线程安全
    • 小结
  • 四、一个聊天服务
    • 1 需求描述及分析
    • 2 概要设计
    • 3 创建服务项目
    • 4 ClientUser实现
    • 5 RoomMgr实现
    • 6 ChatRoom实现
    • 7 RoomIDMgr实现
    • 小结
  • 五、测试、迭代及重构
    • 1 测试
    • 2 迭代
    • 3 重构
    • 4 版本号
  • 六、架构设计
    • 1 单点服务
    • 2 分布式服务
  • 七、部署及发布
    • 1 部署环境
    • 2 编译环境
    • 3 部署服务
    • 4 发布服务
  • 八、线上问题处理
    • 1 线上问题
    • 2 问题处理
  • 九、程序员的职业规划
    • 职业规划
Powered by GitBook
On this page
  • 1、拷贝文件
  • 2、执行程序
  • 3、打开端口
  • 4、后台运行
  • 5、注册服务
  1. 七、部署及发布

3 部署服务

1、拷贝文件

在服务器建立一个目录,规划所有服务将运行在/data/service目录下,聊天室可以新建目录charservice

通过ssh连接到服务器,先跳转到根目录,执行

mkdir data
cd data
mkdir service
# 提升目录权限,否则会报Permission denied
chmod 777 service 
cd service

开发机另起一个终端,执行scp命令将ChatService文件拷贝到服务端的/data/service 目录下

 scp /users/用户名/ChatService root@192.168.0.120:/data/service

根据提示输入密码

ChatService                 100% 2104KB   7.2MB/s   00:00

在ssh连接的终端上执行ls命令,查看文件

[root@rocky service]# ls
ChatService

新建chatservice目录,并将ChatService文件移到目录下

[root@rocky service]mkdir chatservice
[root@rocky service]mv ChatService chatservice/
[root@rocky service]cd chatservice
[root@rocky chatservice]ls
ChatService

修改ChatService权限,使其成为可执行文件

chmod 777 ChatService

再次执行ls命令,可以看到ChatService文件名字变为绿色。

2、执行程序

输入命令执行程序

[root@rocky chatservice]# ./ChatService 
Asio server construct, listen port 21100

可以看到服务已经运行,并且监听21100端口。

启动测试客户端,尝试连接,

Start testclient...
exec exception:connect: Connection refused

提示连接被拒绝,这是因为服务端防火墙未开放端口。

3、打开端口

先检查防火墙状态

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor>
     Active: active (running) since Wed 2023-01-11 02:27:09 EST; 1 day 1h ago
       Docs: man:firewalld(1)
   Main PID: 899 (firewalld)
      Tasks: 2 (limit: 48148)
     Memory: 45.6M
        CPU: 478ms
     CGroup: /system.slice/firewalld.service
             └─899 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

防火墙firewalld正在运行,查看端口开放状态

# firewall-cmd --list-ports

显示空行,没有开放自定义端口。

增加端口21100,支持TCP连接

# firewall-cmd --zone=public --add-port=21100/tcp --permanent
success

重启防火墙,再查看端口状态,可以看到端口21100已经开放

# systemctl restart firewalld
# firewall-cmd --list-ports
21100/tcp

重启ChatService,再使用测试客户端尝试连接。

$ ./TestClient 
Start testclient...

1
send msg len 8, length 0
recv msg 22
recv msg len:14 ,ori:2001, type:32869
recv msg RequestSessionID {"sesID":"1"}

please input cmd 
2
send msg len 8, length 0
recv msg 40
recv msg len:32 ,ori:2001, type:32870
recv msg Create Room {"status":"0", "roomid":100000}

please input cmd 
3
send msg len 26, length 18
recv msg 38
recv msg len:30 ,ori:2001, type:32871
recv msg Join Room {"status":0, "roomID":100000}

尝试请求SessionID,创建和加入房间,都能得到正确响应。

使用cat命令查看服务端日志

# cat ChatService.log 
01/12/23 03:53:35 D4ADA1C0 [Info]
01/12/23 03:53:35 D4ADA1C0 [Info]ServiceBase Start ...
01/12/23 03:53:35 D4ADA1C0 [Info]ServiceBase Run 
01/12/23 03:53:35 CB7FE640 [Info]Service Listen Port 21100
01/12/23 03:54:13 CB7FE640 [Trace]Service accept a new session
01/12/23 03:54:19 CB7FE640 [Info]create a ClientUser 
01/12/23 03:54:19 CB7FE640 [Info]ClientUser::OnRequestSessionID: 1
01/12/23 03:55:03 CB7FE640 [Info]ClientUser::OnCreateRoom: 1, room 100000
01/12/23 03:55:07 CB7FE640 [Info]ClientUser::OnJoinRoom 1, {"roomID":100000}

服务已经正常运行了。

4、后台运行

现在执行ChatService的方式是在一个终端上直接执行程序,终端关闭后,程序也会终止。

4.1 nohup运行

想在后台执行的话,需要使用nohup命令:

nohup ./ChatService &

查看进程信息

# ps aux|grep ChatService
root       75976  0.1  0.1 305072  9424 pts/1    Sl   04:06   0:00 ./ChatService

中止程序可以使用kill命令,杀掉程序的进程号

# kill -9 75976
# ps aux|grep ChatService

4.2 创建启动脚本

使用nano命令,如果文件不存在,可以创建一个文件

[root@rocky eric]# cd /data/service/chatservice/
[root@rocky chatservice]# ls
ChatService
[root@rocky chatservice]# nano start.sh

输入启动命令

#!/bin/sh
nohup /data/service/chatservice/ChatService &

编辑完成后按Ctrl+x,提示保存已修改,输入“Y”,提示要保存的文件名,直接回车确认。

修改脚本权限

[root@rocky chatservice]# chmod 777 start.sh

尝试运行脚本

[root@rocky chatservice]# ./start.sh
[root@rocky chatservice]# nohup: 把输出追加到 'nohup.out'

[root@rocky chatservice]# ps aux | grep ChatService
root        2296  0.1  0.1 305072  9072 pts/0    Sl   05:36   0:00 ./ChatService

说明服务正常运行,先kill掉进程2296,下面配置服务。

5、注册服务

我们可以将ChatService注册为服务,程序就可以开机自动启动服务了。

5.1 创建service文件

[root@rocky eric]# cd /usr/lib/systemd/system
[root@rocky eric]# nano chatsvr.service 

编辑内容

[Unit]
Description=ChatRoom Service
After=network.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/data/service/chatservice/chatservice
WorkingDirectory=/data/service/chatservice
Restart=on-failure

[Install]
WantedBy=multi-user.target

Unit中After=network.target表示本服务在network服务启动后再运行。

保存退出后执行cat chatsvr.service 可以查看已经修改的文件。

提升可执行权限

chmod 777 chatsvr.service

5.2 启动服务

daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载。

#提升工作目录权限
[root@rocky system]# chmod -R 777 /data/service/chatservice/
[root@rocky system]# systemctl enable chatsvr.service #将服务加入到开机启动
Created symlink /etc/systemd/system/multi-user.target.wants/chatsvr.service → /usr/lib/systemd/system/chatsvr.service.
[root@rocky system]# systemctl daemon-reload
[root@rocky system]# systemctl start chatsvr.service
[root@rocky system]# systemctl status chatsvr.service

发现服务启动失败,报错信息为

code=exited, status=203/EXEC

查看日志发现是SELinux阻止

[root@rocky system]# tail -f /var/log/messages

修改文件标记,并使其生效

[root@rocky system]# ls -Z /data/service/chatservice/ChatService
unconfined_u:object_r:default_t:s0 /data/service/chatservice/ChatService
[root@rocky system]# semanage fcontext -a -t bin_t /data/service/chatservice/ChatService
[root@rocky system]# ls -Z /data/service/chatservice/ChatService
unconfined_u:object_r:default_t:s0 /data/service/chatservice/ChatService
[root@rocky system]# restorecon -v /data/service/chatservice/ChatService
Relabeled /data/service/chatservice/ChatService from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:bin_t:s0
[root@rocky system]# ls -Z /data/service/chatservice/ChatService
unconfined_u:object_r:bin_t:s0 /data/service/chatservice/ChatService

运行服务

[root@rocky system]# systemctl start chatsvr.service
[root@rocky system]# systemctl status chatsvr.service
● chatsvr.service - ChatRoom Service
     Loaded: loaded (/usr/lib/systemd/system/chatsvr.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2023-01-13 08:02:41 EST; 29s ago
   Main PID: 2378 (ChatService)
      Tasks: 7 (limit: 48162)
     Memory: 6.3M
        CPU: 65ms
     CGroup: /system.slice/chatsvr.service
             └─2378 /data/service/chatservice/ChatService

查看服务进程

[root@rocky system]# ps aux | grep ChatService
root        2529  0.1  0.0 239536  7272 ?        Ssl  08:05   0:00 /data/service/chatservice/ChatService

查看服务日志

[root@rocky system]# cat /data/service/chatservice/ChatService.log
01/13/23 08:05:46 CF1511C0 [Info]
01/13/23 08:05:46 CF1511C0 [Info]ServiceBase Start ...
01/13/23 08:05:46 CF1511C0 [Info]ServiceBase Run
01/13/23 08:05:46 C5120640 [Info]Service Listen Port 21100

执行reboot命令,重新启动服务器,查看情况

[root@rocky eric]# systemctl status chatsvr.service
● chatsvr.service - ChatRoom Service
     Loaded: loaded (/usr/lib/systemd/system/chatsvr.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2023-01-13 08:11:15 EST; 56s ago
   Main PID: 995 (ChatService)
      Tasks: 10 (limit: 48162)
     Memory: 6.9M
        CPU: 105ms
     CGroup: /system.slice/chatsvr.service
             └─995 /data/service/chatservice/ChatService

ChatService服务随服务器开机自行启动。

Previous2 编译环境Next4 发布服务

Last updated 2 years ago