Skip to content
包子 edited this page Sep 17, 2019 · 16 revisions

业务背景

推送中心的目标是为了满足全公司的后端推送业务的,从功能上需要满足多个项目同时接入,同时项目与项目之间数据要完全隔离,不能电商项目的广播消息被理财项目给接收到了。为了说明推送中心的功能需要,请看下图。

  1. 推送中心要支持支持广播,组播,单播接口。例如电商项目可以支持给所有客户端发送消息(广播),也可以指定给所有地点为上海的客户端发送消息(多播),也可以指定给用户1发送消息(单播)。
  2. 推送中心要有鉴权功能,客户端连接推送中心时推送中心要能校验客户端是否合法。
  3. 推送中心要灵活管理连接,实时查看客户端连接情况,主动断开与某个客户端的连接等功能。
  4. 推送中心要有黑白名单功能,能防御恶意连接,能防御DDOS攻击。
  5. 推送中心要高可用,支持高并发连接。

调用流程

客户端-推送中心-服务端调用关系如下

客户端使用

客户端传入projectIdtoken获得SocketOpts对象,通过该对象你可以灵活订阅主题,监听event。

SocketOpts opts = new SocketOpts("http://mock.dfocus.com", "your projectId", "your token");
SocketIOFactory factory = new SocketIOFactory(opts);
SocketIoClientBiz biz = new SocketIoClientBiz(factory);

biz.connect(new Finish() {
    @Override
    public void onFinished(String msg) {
        if ("".equals(msg)) {
            System.out.println("Connection established");
        } else {
            System.out.println("Failed to connect to server: " + msg);
        }

    }
});

biz.subscribe("your topic", "your event", new EventCallback() {
    @Override
    public void onFire(final EventMessage message) {
        @Override
        public void run() {
            System.out.println("Message from server: " + message.getPayload());
        }
    }
});

biz.onStateChange(new StateChangeCallback() {
    @Override
    public void onChange(final ClientState s) {
        System.out.println("State Changed: " + s);
    }
});

服务端使用

服务端构造如下对象,传入MQ,或者调用推送中心接口(单体下)即可完成消息推送。

public class WsMessage {

	/**
	 * 项目ID
	 */
	@ApiModelProperty(value = "项目ID", example = "/fm")
	private String projectId;

	/**
	 * 订阅主题
	 */
	@ApiModelProperty(value = "订阅主题", example = "group_1")
	private String topic;

	/**
	 * 订阅事件
	 */
	@ApiModelProperty(value = "订阅事件", example = "event_1")
	private String event;

	/**
	 * 内容 <br>
	 * 和客户端约定好的json数据
	 */
	@ApiModelProperty(value = "内容", example = "{\"content\":\"解析我,做你想做的事情\"}")
	private String payload;

}
Clone this wiki locally