业务场景: canal 监听 mysql binlog 日志 并将其推送到 kafka 中 由于部门大部分是php 作为后台开发 ,而 kafka官方不支持对 php 的 客户端支持 需要第三方组件。
解决方案: 使用 Java 作为消费者 并使用 Netty-socketio 将数据实时推送给 php
核心代码如下:
public class SocketIoService {
static SocketIOServer server;
static Map
public void startServer() throws InterruptedException {
server = new SocketIOServer(PropertiesConf.nettySocketConf());
//添加客户端连接事件
server.addConnectListener(client -> {
String sa = client.getRemoteAddress().toString();
client.getSessionId().toString();
String clientIp = sa.substring(1, sa.indexOf(":"));//获取设备ip
Map params = client.getHandshakeData().getUrlParams();
//获取客户端连接的uuid参数
Object object = params.get("uuid");
String uuid = "";
if (object != null) {
uuid = ((List
//将uuid和连接客户端对象进行绑定
clientsMap.put(uuid, client);
}
});
server.start();
}
/**
* 给所有连接客户端推送消息
*
* @param eventType 推送的事件类型
* @param message 推送的内容
*/
public void sendMessageToAllClient(String eventType, String message) {
Collection
for (SocketIOClient client : clients) {
client.sendEvent(eventType, message);
}
}
/**
* 停止服务
*/
public void stopServer() {
if (server != null) {
server.stop();
server = null;
}
}
public static SocketIOServer getServer() {
return server;
}
服务端推送数据代码:
ioService.sendMessageToAllClient("push_qa", "实时推送数据");
前端调用 :
var socket = io.connect('http://your_host:port');
socket.on('push_qa',function(data){
var personInfo = JSON.parse(data);
console.log(personInfo);
});