在SpringCloud Zuul中使用WebSockets

综合编程 Webfuse (源链)

近期的项目中需要用到WebSocket,因为使用的是微服务架构,所以又直接使用了Spring Cloud的Zuul。然而,Zuul对WebSocket的支持不是那么友好,具体可以参考: https://github.com/spring-cloud/spring-cloud-netflix/issues/163。

Spring已经给我们提供了一套 WebSockets的解决方案
。我们需要用到的有:Sock.js、STOMP、Spring Messaging以及Spring Integration。

Sock.js

Sock.js
是一个JavaScript代码库,提供WebSocket-like对象、跨浏览器的JavaScript的API。它在浏览器和web服务器之间创建了一个低延迟、全双工、跨域通信通道。在低版本的浏览器不支持WebSocket时,它可以使用其他协议来处理。

STOMP

STOMP
是一种简单的(或流媒体)的消息传递协议。在多种语言、平台和代理之间提供简单和广泛的消息互操作性。

Spring组件

我们在项目中大量使用Spring组件,在这里我们使用到了Spring Messaging和Spring Integration。

Spring Messaging和Spring Integration具体与SockJs、STOMP组合使用可以参考:

https://spring.io/guides/gs/messaging-stomp-websocket/

http://assets.spring.io/wp/WebSocketBlogPost.html

Zuul中的处理

在使用Zuul作为网关的时候,因为我们使用的是Sock.js,所以它可以算得上是支持了。但是为了能够更保险些,需要写一个Filter:

@Component
public class WebSocketFilterextends 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  #用来设置路由转发请求的超时时间

以上,基本上是完成了Zuul与WebSockets之间的代理了。

参考:

https://jmnarloch.wordpress.com/2015/11/11/spring-cloud-sock-js-stomp-zuul-no-websockets/

您可能感兴趣的

Adventure – Simple WebSocket Client Adventure http://npmjs.com/package/@braind/adventure https://codeclimate.com/github/braind/adventure Simple WebSocket Client Features ...
Websocket in more pages How to force Chrome to prerender more pages? I'm learning about Chrome and Native Client. Basically i want to increase number of...
Turning web traffic into a Super Computer Full disclaimer: The subject matter of this post is controversial as it discusses extracting computing resources from the visitors of a website. The...
iOS WebSocket(STOMP协议)使用对接 本片我们说下WebSocket,之前项目中有几个轮询的情况,使用基于http协议的接口,每隔几秒调用一下,感觉有点浪费资源。Http默认是短连接,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接客户端主动请求,请求过后关闭,这样每隔几秒钟都要去进行三次握手,请求打...
web 开发相关笔记 #04# WebSocket 本文的主要内容: WebSocket 的客户端实现(JavaScript) WebSocket 的服务端实现(Java & apache WebSocketAPI) HTTP VS. WebSocket 简单来讲, WebSocket 就是一种...
责编内容来自:Webfuse (源链) | 更多关于

阅读提示:酷辣虫无法对本内容的真实性提供任何保证,请自行验证并承担相关的风险与后果!
本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 在SpringCloud Zuul中使用WebSockets



专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录