基于neety的推送服务

王智勇 2e0fc1b260 feat:websocket支持 4 years ago
dim-client c1be399aa9 feat:websocket支持 4 years ago
dim-common c1be399aa9 feat:websocket支持 4 years ago
dim-service 2e0fc1b260 feat:websocket支持 4 years ago
.gitignore 4c58f6d714 feat: v1.0.0 4 years ago
README.md 2e0fc1b260 feat:websocket支持 4 years ago
pom.xml 2c0b581d08 refactor:调整框架 4 years ago

README.md

What's Dim?


基于 netty 的服务中间件

核心功能

实现客户端和服务端的tcp长链接通信 完成数据交换

基础功能

  • 动态调整服务端设置提高性能
  • 心跳检测
  • 闲时检测 清除或处理长时间无响应客户端
  • 自动编/解码
  • 自定义数据包编码 实现 256 种操作的解析(可拓展)
  • 支持任意类型数据的发送,配合操作解析
  • 基于JWT 的登录认证
  • 授权检查,清除未授权客户端
  • 消息确认ACK
  • 非主动下线的断线检测与重连
  • 支持客户端查询与下线等操作
  • 微服务化 支持其他服务动态调用
  • 支持websocket
  • 支持多种序列化方式(现暂json)
  • ssl 通道加密 保证数据安全
  • data数据加密 保证数据安全
  • ID 规则设计 便于后期分布式拓展
  • session信息持久化或缓存
  • 异常监控 便于错误发现
  • 日志 便于错误处理
  • 线程池 提高执行效率 缓解通道压力
  • 数据压缩 提高传输效率

拓展功能

RPC IM

客户端 socket 对接指南

  1. ip:xx.xx.xx.xx port:0000
  2. 定时心跳包的发送
  3. 使用common包中的通讯协议
  4. 自行补充main方法放入对应线程
  5. 登录传的token为平台统一 access_token
  6. 消息推送接收后自行补充对应业务逻辑
  7. 异常重连机制和连接类似
  8. 通过SessionUtil管理服务端信息和消息发送

web端 websocket 对接

  1. websocket连接成功后首先发送登录请求 然后 判断返回判断登录状态
  2. 根据类别判断要处理的消息类型进行展示
  3. 数据请求和返回都为字符串需用json进行解析
  4. 补充断线重连机制
登录请求:
字段 类型 说明 示例 是否必填
command string 命令 LOGIN_REQUEST
data string token 登录接口获取access_token
登录返回:
字段 类型 说明 示例 是否必填
command int 命令 2(登录返回)
success boolean 是否成功 true
reason string 原因 token错误,连接失败
消息返回:
字段 类型 说明 示例 是否必填
command int 命令 91(消息推送)
data 泛型 根据命令的数据
id string 消息id
消息确认请求:
字段 类型 说明 示例 是否必填
command string 命令 CONFIRM
data string message_id 消息体id

请求示例:

{
    "command":"LOGIN_REQUEST",
    "data":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI1NTk1NDY5MDMsInVzZXJfbmFtZSI6ImpnemgwMSIsImF1dGhvcml0aWVzIjpbIlJPTEVfT1BFUkFUT1IiXSwianRpIjoiZjA2NmQxMGMtZWVmMy00Mzk4LTg0NjctOTNiNGYwNWRiMTEwIiwiY2xpZW50X2lkIjoiYW5waW4tb3BzLXBjIiwic2NvcGUiOlsic2VsZWN0Il19.frUrkTEJaIwo-ZeMbs3L9UNmxr26WHOi52TGQWnSu00"
}

{
    "command":"CONFIRM",
    "data":"59232dfc59d24eb2868e740afc7074ae"
}

返回示例:

{
    "command": 2,
    "session": {
        "platform": "1",
        "sessionId": "ec89a6f9a8cc4d8291bffe0f3aa187e6",
        "userId": "jgzh01"
    },
    "success": true
}
{
    "command": 30,
    "data": {
        "A": 1,
        "B": "vvv"
    },
    "id": "999c2f55176c4136ba6a4b9ac28f9fc4"
}

代码示例:


<html><head><title>Web Socket Test</title></head>
<body>
<script type="text/javascript">
var socket;
if (!window.WebSocket) {
  window.WebSocket = window.MozWebSocket;
}
if (window.WebSocket) {
  socket = new WebSocket("ws://127.0.0.1:9010/websocket");
  socket.onmessage = function(event) {
    var ta = document.getElementById('responseText');
    ta.value = ta.value + '\n' + event.data
  };
  socket.onopen = function(event) {
    var ta = document.getElementById('responseText');
    ta.value = "Web Socket opened!";
  };
  socket.onclose = function(event) {
    var ta = document.getElementById('responseText');
    ta.value = ta.value + "Web Socket closed"; 
  };
} else {
  alert("Your browser does not support Web Socket.");
}

function send(message) {
  if (!window.WebSocket) { return; }
  if (socket.readyState == WebSocket.OPEN) {
    socket.send(message);
  } else {
    alert("The socket is not open.");
  }
}
</script>
<form onsubmit="return false;">
<input type="text" name="message" value="Hello, World!"/><input type="button" value="Send Web Socket Data"
       onclick="send(this.form.message.value)" />
<h3>Output</h3>
<textarea id="responseText" style="width:500px;height:300px;"></textarea>
</form>
</body>
</html>