teamtalk实现即时通讯

article/2025/8/30 4:50:44

即时通讯技术应用非常广泛,涉及教育、电商、金融、泛娱乐、生活服务、医疗健康、政企服务、游戏聊天、在线客服等等行业,不是大家认为仅仅是qq、微信那样。

即时通讯架构

先给张图
在这里插入图片描述
客户端与服务器端进行网络通信、收发消息连接层为客户端收发消息提供出入口。主要的任务:保持海量用户连接;解析协议,对传输内容进行编码;维护session;推送消息。
核心业务层负责IM系统各项功能的核心逻辑实现。
数据层负责IM系统相关数据的持久化存储,包括消息内容、账号信息等。

分层架构

在这里插入图片描述
接入层的作用:连接整流、通信安全、报文解压缩、初步防攻击。一个接入层对应多个客户端。

逻辑层主要处理以下几个逻辑:

  • 用户逻辑:用户登录、用户退出、用户信息查询、用户更新签名、用户分组创建等
  • 好友逻辑:添加好友、删除好友、拉取好友列表、好友添加备注等
  • 群组逻辑:创建群、加入群、删除群、删除成员等
  • 消息逻辑:单聊文字消息、单聊语音消息、群聊文字消息、群聊语音消息、拉取离线消息等
  • 其他,比如文件传输、图片传输等

逻辑层的设计需要注意,要具备扩展性。
在这里插入图片描述
可以水平扩展各个逻辑模块,也可以无缝添加新的逻辑服务,比如文件传输。负荷高的模块还可以再细分。

数据层功能:对上游屏蔽存储引擎、对上游屏蔽cache层、对上游提供友好接口。
注意数据层也要设计扩展性。

路由层功能:

  • 路由消息:消息投递
  • 内存存储:用户临时数据,比如用户状态信息(在线/离线)

这些模块通常都部署在同一个机房。

teamtalk

在这里插入图片描述
teamtalk是用cpp实现的即时通讯组件,可以用作小型公司当作内部im办公交流。
简单介绍一下各个模块的功能:

  • Android/iOS/PC:各种客户端。
  • LoginServer: 主要负责负载均衡的作用,当收到客户端的请求时,分配一个负载最小的MsgServer给客户端。
  • MsgServer: TT的主要服务端,负责维护各个客户端的链接,消息转发等功能。
  • RouteServer: 负责消息路由的功能,当msg_server发现某个用户不在本服务器内,而又有消息需要发给他,就会将消息转发给route_server,route_server会将消息发给相应的msg_server,由此可知,route_server也维护了一定的用户状态。
  • DBProxy: 在TT中负责了主要的业务逻辑,主要与存储层打交道,提供mysql以及redis的访问服务,屏蔽其他服务器与mysql与redis的直接交互。
  • FileServer: 文件服务器,提供客户端之间得文件传输服务,支持在线以及离线文件传输
  • MsfsServer: 图片存储服务器,提供头像,图片传输中的图片存储服务。
  • PushServer: 负责Android、IOS客户端提醒消息的推送,类似微信的锁屏提醒消息。
  • Webserver:简单的管理功能。

以后还会详细介绍,这里先介绍怎么配置,先跑起来再说。

配置

这里介绍每一步应该干什么,还有踩过的坑。

安装常用组件

安装mysql、nginx、redis、php等常⽤组件。由于前三者之前已有介绍,这里不重复,只提示一下,记得先安装依赖。作为补充,介绍一下php的安装,以php7.2为例,7.4等版本注意修改版本号。
安装PHP7以及常⽤扩展

sudo apt-get -y install php7.2-fpm php7.2-mysql php7.2-common php7.2-mbstring php7.2-gd php7.2-json php7.2-cli php7.2-curl

启动php7.2-fpm进程

sudo systemctl start php7.2-fpm

查看php7.2-fpm运⾏状态

systemctl status php7.2-fpm
# 或者是
/etc/init.d/php7.2-fpm status

查看php版本号,测试php是否安装成功

php -v
# 或者是
php --version

修改php配置⽂件www.conf

sudo vim /etc/php/7.2/fpm/pool.d/www.conf

做如下操作

; 注释掉下两行(47 48行)
;listen.owner = www-data
;listen.group = www-data; 将mode值修改为0666
listen.mode = 0666

重启php-fpm服务

sudo /etc/init.d/php7.2-fpm restart

编译teamtalk

找一版源码进行下载,地址就不贴了。
解压后进入tt目录,在/server/src目录下
下载编译protocol buffer库

sudo ./make_protobuf.sh

编译日志log4

sudo ./make_log4cxx.sh

聪明一点的会发现,以上两步其实还是准备工作,真正的编译是下面的

# 参数给的是自己定义的版本号
sudo ./build_ubuntu.sh version 1.0

以上三步的脚本就不贴了,可以结合这个安装过程一起看脚本。
编译完成后,会在/server目录下多了im-server-1.0.tar.gz压缩包,将im-server-1.0.tar.gz拷⻉到/auto_setup/im_server

cp im-server-1.0.tar.gz ../auto_setup/im_server/

修改配置

修改数据库配置

这里修改配置文件,使得配置文件中的密码与mysql密码一致,这里登录用的是root用户,如果用的不是mysql的root,进脚本修改。

cd auto_setup/mysql
vim setup.sh

修改后执行脚本,其实就是在mysql创建一系列表,也可以进conf里面看这个.sql文件到底干了什么。

sudo ./setup.sh install

执行完成后,会输出创建数据库成功的语句。
可以在mysql中查看

sudo mysql -u root -p
show databases;

可以看到数据库有teamtalk

配置各模块

这里介绍单机配置的过程。单机配置最为简单,先跑起来是王道,后期要改也容易。
主要是修改msgserver.conf、dbproxyserver.conf和loginserver.conf
先进入配置文件目录

cd auto_setup/im_server

各个模块的配置都在conf目录下。

修改msgserver.conf

vim conf/msgserver.conf

将FileServerIP改成FileServer所在的服务器的外⽹地址。

FileServerIP1=192.168.0.5
# 端口不要瞎改
FileServerPort1=8601

将28⾏的IpAddr1和IpAddr2改为本机IP外⽹地址

# msg_server本身的ip地址
IpAddr1=192.168.0.5 #电信IP
IpAddr2=192.168.0.5 #⽹通IP

如果配置多台机器,需要修改DBServerIP1、LoginServerIP1等地址。后面的配置就不强调这一点了。

修改dbproxyserver.conf

vim conf/dbproxyserver.conf

主要是修改配置文件里面的数据库用户和密码,注意主从两个库都要修改

teamtalk_master_username=root
teamtalk_master_password=123456teamtalk_slave_username=root
teamtalk_slave_password=123456

修改loginserver.conf

vim conf/loginserver.conf

主要是修改msfs对应的ip

msfs=http://192.168.0.5:8700/

如果msfs的地址不对,则不能传输图⽚。

修改fileserver.conf

修改为外⽹ip地址,供客户端可以访问。注意ClientListenIp和MsgServerListenIp都要改成外网地址。

ClientListenIp=192.168.0.5
ClientListenPort=8600MsgServerListenIp=192.168.0.5
MsgServerListenPort=8601

启动服务器

终于配置完了,运行脚本

sudo ./setup.sh install

看一下有没有启动成功

ps aux | grep _server
ps aux | grep msfs

如果大家都在,说明启动成功。但是不要高兴得太早,可能后面还有坑。
如果某个模块启动失败,可以单独重启某个服务模块

sudo auto_setup/im_server/im-server-1.0/restart.sh login_server

可以进⼊到/auto_setup/im_server/im-server-1.0⽬录中去看各个模块的日志,分析失败原因

tail -n 30 -f msg_server/log/default.log

部署web管理后台

回到项目最开始的目录,将php拷⻉⼀份为tt压缩后拷⻉到/auto_setup/im_web

# tt 这个名不要动
cp -ar php tt
zip -r tt.zip tt
cp tt.zip auto_setup/im_web/

修改web的配置⽂件

主要是ip地址和数据库⽤户名和密码以及nginx的配置。
进入到im_web目录

cd auto_setup/im_web

修改ip地址

vim conf/config.php

把ip地址修改为⾃⼰的外⽹地址

$config['msfs_url'] = 'http://192.168.221.130:8700/';
$config['http_url'] = 'http://192.168.221.130:8400';

修改数据库配置

vim conf/database.php

主要是修改用户名密码

$db['default']['username'] = 'root';
$db['default']['password'] = '123456';

配置nginx

# 这个名字有点迷惑性,其实就是nginx.conf来的
vim conf/im.com.conf

将server_name改为⾃⼰的ip地址,以及将php改成对应的版本号,这里是7.2

server{listen       80;server_name 0.0.0.0;  # 这里改成0.0.0.0了index index.html index.htm index.php default.html default.htm default.php;root         /var/www/html/tt;location ~ \.php($|/) {fastcgi_pass   unix:run/php/php7.2-fpm.socket  # 对应版本号fastcgi_index  index.php;fastcgi_split_path_info ^(.+\.php)(.*)$;fastcgi_param   PATH_INFO $fastcgi_path_info;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;include        fastcgi_params;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${expires      30d;}location ~ .*\.(js|css)?${expires      12h;}if (!-e $request_filename) {rewrite ^/(.*)$ /index.php/$1 last;break;}}

使用浏览器查看,最好使⽤⾕歌浏览器(其他浏览器可能有兼容性问题)打开服务器的ip地址,然后登录,⽤户名和密码都为admin
在这里插入图片描述
登录进去后则可以配置部⻔和成员,先配置部门,再配置成员,具体操作就略掉了。

客户端登录

终于都配好了,用客户端登录试一试。
windows端打开/win-client/bin/teamtalk/Release/teamtalk.exe
注意配置成⾃⼰msg_server的IP地址。
如果一切设置正常,这时就登录成功了,然后就可以使用即时通讯的各种功能。
当然,一般来说这个过程不会这么顺利,如果出现问题,先考虑是不是配置出了问题,尤其是ip地址的设置,此外还要多查看日志来分析。

docker部署

为了提高部署可移植性,可以把teamtalk各模块部署到docker上。这里就以login_server为例。

移植依赖文件

使用ldd,获取到所有依赖的动态库⽂件之后,将可执⾏⽂件、库⽂件⼀起打包即可移植到其他电脑运⾏,当然还需要指定程序运⾏时查找动态库的路径。(ubuntu系统下查找路径常为:/lib .usr/lib /usr/local/lib) 可以修改环境变量的⽅式将库⽂件路径加⼊到环境变量中,告诉系统在程序运⾏时到哪⾥去找依赖库,因此我们可以写一个运⾏脚本

# 使⽤脚本pack_lib.sh提取依赖⽂件
#!/bin/bashfunction useage()
{cat << EOUUseage: bash $0 <path to the binary> <path to copy the dependencies>EOUexit 1
}#Validate the inputs
[[ $# < 2 ]] && useage#Check if the paths are vaild
[[ ! -e $1 ]] && echo "Not a vaild input $1" && exit 1
[[ -d $2 ]] || echo "No such directory $2 creating..."&& mkdir -p "$2"#Get the library dependencies
echo "Collecting the shared library dependencies for $1..."
deps=$(ldd $1 | awk 'BEGIN{ORS=" "}$1\
~/^\//{print $1}$3~/^\//{print $3}'\
| sed 's/,$/\n/')
echo "Copying the dependencies to $2"#Copy the deps
for dep in $deps
doecho "Copying $dep to $2"cp "$dep" "$2"
done
echo "Done!"

执行.sh即可把对应的so拷⻉到当前⽬录

# login_server要执行的文件
# . 依赖文件要拷贝到的目录
./pack_lib.sh login_server .

加装到docker内

编写Dockerfile

# This is dockerfile for login_server
# base image
FROM ubuntu:16.04  # 这个login_server是在ubuntu16.04上编译的
# author
MAINTAINER s
CMD "mkdir /home/login_server"
# 添加到home⽬录
COPY ./login_server /home/login_server
EXPOSE 8008
EXPOSE 8080
EXPOSE 8100
WORKDIR "/home/login_server"
CMD ["./login_server"]

制作镜像

docker build -t login_server .

查看镜像

docker image ls

如果制作成功会有记录。

启动和映射端⼝

内部端⼝是固定的,我们启动docker的时候可以重新做映射。

docker run -d -p 8008:8008 -p 8080:8080 -p 8100:8100 login_server

这样就能运行成功了,可以通过docker ps -all查看运行起来的容器,也可以直接ps aux | grep file_server查看。

传入参数

扩展一下,如果要用docker启动多个login_server,这里由于配置的ip和port都是写死了的,那就不能启动多个镜像。这里需要传入ip等参数。
Dockerfile要改一下

ENV HOST=""
ENV PORT=""
ENV NAME=""
ENV PWSSD=""
ENV KEY=""
CMD ["./login_server $HOST"]

启动时通过-e传入参数

docker run -d -p 8008:8008 -p 8080:8080 -p 8100:8100 -e HOST="192.168.0.5" login_server

特别要注意login_server源码也要修改,要让ip等参数接到argv[]的值。


http://chatgpt.dhexx.cn/article/454ZySHC.shtml

相关文章

通识哈夫曼树及其应用,一起来构造属于自己的哈夫曼树

1.哈夫曼树的背景 哈夫曼&#xff08;霍夫曼、赫夫曼&#xff09;David Albert Huffman(August9,1925-October7,1999)。计算机科学的先驱&#xff0c;以他的哈夫曼编码闻名&#xff0c;在他的一生中&#xff0c;对于有限状态自动机&#xff0c;开关电路&#xff0c;异步过程和信…

哈佛结构冯·诺依曼结构

哈佛结构是一种将程序指令存储和 数据存储分开的存储器结构。哈佛结构是 一种并行体系结构&#xff0c;它的主要特点是将程序和数据存储在不同的存储空间中&#xff0c;即程序存储器和数据存储器是两个独立的存储器&#xff0c;每个存储器独立编址、独立访问。 冯诺依曼结构也…

微型计算机之哈佛架构是什么?

“哈佛体系结构”指的是什么&#xff1f; 微型计算机处理命令和数据&#xff0c;但是在很久以前的微型计算机中&#xff0c;用命令和数据共享了一条总线。在这种情况下&#xff0c;CPU在读取指令时使用总线&#xff0c;因此无法访问数据&#xff0c;并且在读取指令结束后访问数…

冯诺依曼结构、哈佛结构、改进型哈佛结构

冯诺依曼结构 冯诺依曼结构&#xff0c;又称为普林斯顿体系结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。取指令和取操作数都在同一总线上&#xff0c;通过分时复用的方式进行&#xff1b;缺点是在高速运行时&#xff0c;不能达到同时取指令和…

高级数据结构之赫夫曼树

思考两个问题 电报发送&#xff1a;二战的时候大家都知道那时候普遍会应用电报&#xff0c;如果让你来设计一个电报的发送编码你该如何设计呢&#xff1f; 电报加密后越短越好&#xff0c;发送快。破解难解码容易换加密树也要快可逆的 压缩算法&#xff1a;给你10000个字符&am…

ARM到底是冯诺依曼结构还是哈佛结构?

问题 嵌入式的学习中ARM处理器是主题&#xff0c;这些年产业界除了PC和服务器市场外&#xff0c;以手机、pad、家电控制等为代表的嵌入式领域都被ARM几乎垄断了。所以学习嵌入式处理器&#xff0c;其实等同于学习ARM。&#xff08;当然了&#xff0c;近两年RISC-V架构横空出世在…

冯诺依曼结构和哈佛结构的区别

冯诺依曼结构和哈佛结构的区别 1. 冯诺依曼结构&#xff1a; 说明&#xff1a; 一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置&#xff0c;因此程序指令和数据的宽度相同。 冯诺依曼的计算机必须…

冯诺依曼与哈佛结构的区别

cortex M3,M4主要采用哈弗结构 个人理解&#xff1a;最主要的区别在于程序空间和数据空间是否是一体的&#xff0c;冯诺依曼结构数据空间和地址空间是不分开的&#xff0c;而哈佛结构数据空间和地址空间是分开的 哈弗结构的优势&#xff1a;如果采用流水线设计&#xff0…

冯氏结构、哈佛结构、超级哈佛结构之间的异同

冯.诺伊曼结构 1945年&#xff0c;冯.诺伊曼首先提出了“存储程序”的概念和二进制原理&#xff0c;后来&#xff0c;人们把利用这种概念和原理设计的电子计算机系统统称为“冯.诺伊曼型结构”计算机。冯.诺伊曼结构的处理器使用同一个存储器&#xff0c;经由同一个总线传输…

哈佛结构

数字信号处理一般需要较大的运算量和较高的运算速度&#xff0c;为了提高数据吞吐量&#xff0c;在数字信号处理器中大多采用哈佛结构&#xff0c;如下图所示 图 哈佛结构 与冯.诺曼结构处理器比较&#xff0c;哈佛结构处理器有两个明显的特点&#xff1a; 使用两个独立的存储…

冯诺依曼体系结构、哈佛体系结构与改进型哈佛结构之间的区别

1、冯诺依曼结构  冯诺依曼结构又称作普林斯顿体系结构&#xff08;Princetionarchitecture&#xff09;。  1945年&#xff0c;冯诺依曼首先提出了“存储程序”的概念和二进制原理&#xff0c;后来&#xff0c;人们把利用这种概念和原理设计的电子计算机系统统称为“冯诺依…

哈佛结构与冯诺依曼结构(含STM32系统结构解析)

存储器是微控制器的重要组成部分&#xff0c;不同类型的微控制器其采用的存储结构与容量不尽相同&#xff0c;但存储器的用途是相同的&#xff0c;用于存放程序和数据。微控制器中的存储结构有两种基本构成形式。 冯诺依曼结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一…

STM32属于哈佛结构还是冯诺依曼结构?

目录 01、冯诺依曼体系 02、哈佛体系 03、arm和哈佛、冯诺依曼的关系 04、实际芯片制造 现代的CPU基本上归为冯诺伊曼结构&#xff08;也成普林斯顿结构&#xff09;和哈佛结构。 冯洛伊曼结构就是我们所说的X86架构&#xff0c;而哈佛结构就是ARM架构。一个广泛用于桌面端…

哈佛体系结构

哈佛机&#xff1a;为数据和程序提供了格子独立的存储器。 程序计数器只指向程序存储器&#xff0c;而不指向数据存储器&#xff0c;这样的的后果是很难再哈佛机上编写出一个自修改的程序。独立的程序存储器和数据存储器为数字信号处理提供了较高的性能。结构如下图所示&#x…

哈佛结构和冯诺依曼结构?STM32属于哈佛结构还是冯诺依曼结构?

现代的CPU基本上归为冯诺伊曼结构&#xff08;也成普林斯顿结构&#xff09;和哈佛结构。 冯诺依曼体系 冯诺依曼体系结构图如下 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数据与指令都存储在同一存储区中&…

什么是冯诺依曼结构、哈佛结构、改进型哈佛结构?

冯诺依曼结构 冯诺依曼结构&#xff0c;又称为普林斯顿体系结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。取指令和取操作数都在同一总线上&#xff0c;通过分时复用的方式进行&#xff1b;缺点是在高速运行时&#xff0c;不能达到同时取指令和取…

哈佛结构和冯诺依曼结构

已剪辑自: https://zhuanlan.zhihu.com/p/136748306 1946年&#xff0c;第一台计算机ENIAC诞生&#xff0c;人类进入计算机时代&#xff0c;后来&#xff0c;美籍匈牙利数学家&#xff1a;冯.诺依曼提出了计算机“存储程序”的计算机设计理念&#xff0c;即将计算机指令进行编码…

冯·诺依曼、哈佛、改进型哈佛体系结构解析

在如今的CPU中&#xff0c;由于Catch的存在&#xff0c;这些概念已经被模糊了。个人认为去区分他们并没有什么意义&#xff0c;仅作为知识点。 哈佛结构设计复杂&#xff0c;但效率高。冯诺依曼结构则比较简单&#xff0c;但也比较慢。CPU厂商为了提高处理速度&#xff0c;在C…

哈佛结构和冯·诺依曼结构

目录 一、哈佛结构 二、冯诺伊曼结构 三、哈佛结构和冯诺伊曼结构对比 一、哈佛结构 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。哈佛结构是一种并行体系结构&#xff0c;它的主要特点是将程序和数据存储在不同的存储空间中&#xff0c;即程序存储器和数据存…

哈佛架构和冯诺依曼架构

一、两种架构的介绍 1.哈佛结构是一种将程序指令的存储与数据的存储分开的存储器结构。首先&#xff0c;CPU在程序指令存储器中读取程序指令内容&#xff0c;解码后获得数据地址&#xff0c;然后在相应的数据存储器中读取数据&#xff0c;并进行下一步操作。指令存储和数据存储…