我在haproxy后面有两个socketio服务器,为了粘性,我在haproxy插入cookie,以识别响应来自的服务器。现在问题是,当我使用下面的代码时,我的连接没有升级到'websocket',我试图调试问题并意识到'transport'事件只在engineio socket类中的'setTransport'方法中发出,而不是'createTransport'方法,(在调用'transport'事件期间不会发出,导致websocket握手请求在不同的socketio服务器上进行,而不是客户端已经使用xhrpol连接)。
我想知道是否还有其他工作围绕这个问题,或者问题是真的。 Plz帮帮忙。提前谢谢。
链接到 - issue with code that i have tried
final StringBuffer buf = new StringBuffer();
socket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() {
@Override
public void call(Object... args) {
final Transport transport = (Transport)args[0];
if(transport.name.equalsIgnoreCase(WebSocket.NAME)){
transport.once(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() {
@Override
public void call(Object... args) {
@SuppressWarnings("unchecked")
Map<String, String> headers = (Map<String, String>)args[0];
if(buf.length()!=0){
headers.put("Cookie", buf.toString());
}
}
});
}
if(transport.name.equalsIgnoreCase(PollingXHR.NAME)){
transport.once(Transport.EVENT_RESPONSE_HEADERS,
new Emitter.Listener() {
@Override
public void call(Object... args) {
@SuppressWarnings("unchecked")
Map<String, String> headers = (Map<String, String>) args[0];
String cookie = null;
if (headers.containsKey("Set-Cookie") && headers.get("Set-Cookie").contains("SERVERID")) {
cookie = headers.get("Set-Cookie").split(";")[0];
}
if (cookie != null) {
final String stickyCookie = cookie;
if(buf.length()==0){
buf.append(stickyCookie);
}
transport.on(
Transport.EVENT_REQUEST_HEADERS,
new Emitter.Listener() {
@Override
public void call(Object... args) {
@SuppressWarnings("unchecked")
Map<String, String> headers = (Map<String, String>) args[0];
// set header
headers.put("Cookie", stickyCookie);
}
});
}
}
});
}
}
});
答案 0 :(得分:0)
我现在找到解决方法,因为haproxy提供了另一种平衡算法&#39; source&#39;哪些直接请求来自同一个&#39; ip&#39;到同一个服务器...因为它在请求的源上散列。这样我就不必使用上面的所有代码..(即我不必在运输事件上做任何事情)。 haproxy负责一切...... :)