流水不争先,争的是滔滔不绝

分布式高并发IM服务器从零架构思想 (一)

即时通讯软件开发 云聊IM 1756℃

写在前面:我写本系列博客的目的是自己打算研发一款基于JAVA的IM服务器,文章用来记录自己平时领悟到的一些设计思想,防止到开发的时候遗忘, 如对大家有帮助,同样欢迎留言探讨

综述:目前我的总体设计思路已经有大体轮廓,初步迭代版本打算只实现文本聊天,后续实现图片语音聊天,规划支持的客户端包括Android端、IOS端、Web端WebSocket协议支持、QT支持win和linux桌面端

1 大体分为四层服务外加多个数据存储和集群协调中心节点 ;

2 连接方式采用长短混合的模式 短连接使用HTTP,主要用于单点登录验证、用户好友关系获取等接口 ;长连接采用TCP+自定义协议;基于Netty的Linux epoll实现单节点高连接数 。

3 应用层协议方面打算采用自定义协议,固定消息头+protobuf消息体的方式

主要四大层:连接器集群–消息路由业务逻辑集群–缓存集群–DB持久层集群

  1. 连接器主要用来负责维持和客户端的TCP连接
  2. 业务逻辑层主要负责消息的转发路由、离线消息存储、日志记录等
  3. 缓存层缓存临时数据、加快读速度
  4. DB存储用户信息、聊天记录等

配套中心节点:单点登录节点、在线状态保存和检索中心节点、集群IP注册和分配中心节点

  1. 单点登录节点负责用户身份校验、加密令牌的发放、令牌签名合法性校验等接口和功能
  2. 在线状态节点负责统一保存所有用户的在线离线状态、保存用户所连接的连接器、给业务集群提供检索接口
  3. 集群IP注册和分配中心节点提供集群负载均衡支持

下面是本篇的关注点:主要讲解连接器层的传输层信道安全、应用层身份校验相关的设计思想,(仅为我的初步思路,感觉应该符合安全需求)

(一) 传输层安全设计: 为防止第三方进行重放攻击非法访问,防止第三方开发李鬼客户端非法访问服务器,考虑在传输层至上增加双向认证加密,但不使用https,去机构申请证书不现实,自签名证书也算了 ,打算自己实现加密设计,要点如下

1 客户端执行登录,向单点登录服务器申请令牌,客户端还要保存一份事先从服务方授权获取的非对称密钥对

2 客户端建立和服务端的TCP层连接,建立后客户端用本地私钥加密一个随机数连同公钥发送给服务端,服务端先验证公钥是不是授权的合法公钥,然后用公钥解密随机数、解密成功则客户端身份校验完成;服务端像客户端发送公钥;客户端用收到的公钥加密一个DES对称密钥传输给服务端,服务端私钥解密出对称密钥并保存,到此安全握手完成,下一步用对称密钥加密应用层协议数据包进行业务层通讯

3 应用层身份验证步骤:

# 客户端向服务端发送从单点登录服务器申请到的令牌;

# 服务端收到令牌后先进行本地令牌解密验签,然后向单点登录服务器进行远程令牌验证,验证通过后将返回的用户信息和令牌绑定到当前的传输层连接信道的状态中去,为了支持一个传输层连接支持多个用户登录(QQ手机app可以接收多个用户的消息,好像就是这样的),一个连接可以绑定多个用户;

# 服务端向在线状态保存和检索中心节点发送用户登录相关信息来更新状态

# 只要连接未断,后续客户端发送的应用层数据包可选继续携带令牌,但服务端无需再向单点登录中心进行令牌验证,连接断开后重连,需要重新验证令牌

写原创文章真累,先到这  — 孔令宽 2018年7月28日 上午 天气晴

本文作者

作者:孔令宽 ,2012年毕业于山科 从事Android原生/混合开发、前端VUE富客户端开发、JAVA后台开发等相关领域,目前专注于基于Netty的JAVA高并发后台的研究

原文:https://blog.csdn.net/w1857518575/article/details/81257213

版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。
点击这里给我发消息