接上文,距离立flag的时间已经过去了一个月了,目前编写的即时通讯系统(Dean)已经有了一个基本雏形,已经实现了的功能,包括:
1、用户的添加、删除、查看、修改接口。
2、一对一文本消息传送、群组文本消息传送。(之后逐步的实现表情、图片、语音、视频、文件等富文本消息)
3、群组创建、查询、修改、删除、退出、销毁、详情查看,以及群成员的添加、踢出等接口。
4、实现了消息发送、回执、离线消息拉取。已阅回执以及消息回撤(正在实现中)。
5、基于etcd的注册以及服务发现。
6、节点内消息路由、节点间的消息路由。
7、客户端心跳检测、基于JWT的鉴权等逻辑。
8、实现了基于redis的异步消息存储入库、热点数据缓存等相关逻辑。
9、实现了布隆过滤器,用于下次ID的首轮验证。(目前还未使用)
10、实现了服务的http/https的切换配置。
11、实现了同账号互踢功能。(后者踢出前者)
12、集成了grpc,用于集群节点间消息路由。
13、简单的实现了前台调试界面(只能叫做调试界面了,太简陋了,前端一点不会,正在一点一点琢磨中)
开发环境
LiteIDE + TextPad(简单的前端编写,之后如果使用vue的话会考虑更换为webstorm)
开发语言:go + 前端
项目架构
客户端与服务端之间采用http/https+websocket的方式进行交互。
网络框架使用Gin框架,日志使用logrus。
ETCD:主要负责集群管理,包括集群节点注册、服务发现。
Redis:主要负责集群数据缓存。
Nginx:主要负责集群节点间的负载均衡。(其实这块一直没有想好,先暂时使用Nginx吧,之后有精力的话,也可仿照etcd的proxy模式实现自己的负载均衡。目前在集群节点扩容时,还需要对应的修改Nginx的配置文件。)
Dean集群:负责业务逻辑实现,之间通过grpc进行通信。
数据库方面使用了gorm,比写sql语句相对省事一些(Ps:学习它使用也费了不少的力气)。
中间遇到的坑
1、ClientV3与grpc冲突的问题
2、跨域问题
解决方案:后台可以通过编写gin插件实现。具体方法不说了,网上很容易搜到。
总结
通过这个这个项目将之前很多的理论内容进行了实践,实践才是检验真理的唯一标准。不亲自写写代码、部署调试,还真不知道这么多事情在里面啊,程序员真是学无止境啊。
每次想写些内容,写之前总感觉自己有好多要写的内容,可是真的开始写的时候,却发现提笔忘词啊。哎。以后慢慢更新吧。
至于源码之后会逐步的开源到github上(至于怎么上传还没有研究呢。一步一步来吧)
之后工作重点
还是把前端搞搞吧,不然太简陋了,实在拿不出手。