问题背景
最近的项目中需要用到WebSocket的微服务,直接使用了Spring Cloud的Zuul来做路由。然而,Zuul对WebSocket的支持不是那么友好,需要配置一下。
@Component
public class WebSocketFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String upgradeHeader = request.getHeader("Upgrade");
if (null == upgradeHeader) {
upgradeHeader = request.getHeader("upgrade");
}
if (null != upgradeHeader && "websocket".equalsIgnoreCase(upgradeHeader)) {
context.addZuulRequestHeader("connection", "Upgrade");
}
return null;
}
}
另外,Spring WebSockets心跳时间默认是25s,为了能适应业务系统的需求,我们需要在Zuul中设置合理的超时时间。
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 60000 #设置API网关中路由转发请求的HystrixCommand执行超时时间
ribbon:
ConnectTimeout: 3000 #设置路由转发请求的时候,创建请求连接的超时时间
ReadTimeout: 60000 #用来设置路由转发请求的超时时间