专栏首页Linyb极客之路如何使zuul支持websocket

如何使zuul支持websocket

前言

公司要把以前一个老的项目通过zuul来路由装发(ps:老项目作为微服务中的一个子服务),而这个老项目里面有用到websocket消息推送,然而不幸的是zuul1对websocket的支持并不友好。百度了一些案例,本来开开心心以为可以得到解决方案,可惜到头来是一场梦。百度出来的例子大多数通过自定义zuul过滤器并设置超时时间来支持webscoket,于是照猫画虎,终究没使老项目的websocket通过zuul来代理推送。

追溯其原因老项目的websocket并没用sock.js或者是通过spring集成的webscoket。下边我分享下几种可能可以通过zuul支持websocket的方案,并在文末附送上,最后我怎么使老项目既能通过zuul路由代理,并也使老项目的websocket消息推送生效的方案

通过zuul支持webscoket

1、方案一:自定义zuul过滤器

核心代码片段

@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;
    }

具体可以参考

https://www.colabug.com/1894128.html

方案二:通过引入spring-cloud-netflix-zuul-websocket这个jar来实现

ps:这是一个老外写的,这种方案比较适用于项目中原来就没有使用websocket的项目,或者有魄力去把原先的已经有过的websocket的代码重构掉,重构前最好写个demo验证下,不然就坑爹了。。。

具体示例可以通过如下地址查看。

https://github.com/mthizo247/spring-cloud-netflix-zuul-websocket

方案三:坐等zuul2开源

zuul2是支持websocket,只是目前还没开源

方案四:把zuul改成spring-cloud-gateway

这种方案适用于刚开始技术选型,定网关的的时候采用。spring-cloud-gataway是支持webscoket

如果老项目既想通过zuul路由代理,又想使webscoket生效,该如何做

原理是websocket推送的ws链接依然通过老项目A的ip:port,而非zuul代理的路由链接。不过这边有个问题点是老项目(A,B,C,D...)到时候也是集群化,当老项目通过zuul路由时,webscoket要如何获取本项目A的ip:port,而不能获取到其他项目的(B、C、D)的ip:port?

注:A、B、C、D代表都是同个老项目,只是部署的ip:port不一样

此时可以用loadBalancerClient.choose(“注册在服务中心的服务名称”)来使用

核心代码

private LoadBalancerClient loadBalancerClient = SpringContextHolder.getBean(LoadBalancerClient.class);

    private Environment env = SpringContextHolder.getBean(Environment.class);

    public String getServiceInstanceUrl() {
        String serverName = env.getProperty("spring.application.name");
        ServiceInstance serviceInstance = loadBalancerClient.choose(serverName);
        if (serviceInstance != null) {
            String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
            return url;
        }

        return null;

    }

本文分享自微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何破解springboot/springcloud上传中文文件名乱码魔咒

    如果以上三种方案都没办法解决,接下来就要思考下文件的上传流程,比如是否有通过网关之类的。接下来介绍当通过zuul来进行路由上传,文件中文名乱码问题的解决方式。

    lyb-geek
  • Spring Boot配置特定属性spring.profiles

    lyb-geek
  • 面试官:你有过一线的MySQL实战经验,能给我详细聊聊吗?

    本文来自一线的实战经验,主要针对DBA和后端开发人员,总是在灾难发生后,才想起容灾的重要性;总是在吃过亏后,才记得曾经有人提醒过。

    lyb-geek
  • Docker(二)基础使用

    MiChong
  • Spring Boot(十七):使用 Spring Boot 上传文件

    上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个 Spring Boot 上传文件的小案例。

    纯洁的微笑
  • 廖剑:机器学习平台对 AI 普适化的推动

    12月15日,由腾讯云主办的首届“腾讯云+社区开发者大会”在北京举行。本届大会以“新趋势•新技术•新应用”为主题,汇聚了超40位技术专家,共同探索人工智能、大数...

    云加社区技术沙龙
  • vue -- 跨域cookie 丢失的问题

    小蔚
  • 揭秘47万微信群和2亿微信用户背后的数字规律

    微信群已经进入到我们的日常生活中,成为社交关系的主要纽带。但微信群有自己的规律,长期群能存活很长的时间,临时群则转瞬即逝。来自清华大学、康奈尔大学、腾讯公司和香...

    华章科技
  • 【揭秘】47万微信群和2亿微信用户背后的数字规律

    导读 这是一篇来自清华大学、康奈尔大学、腾讯公司和香港科技大学的研究人员采用“机器学习算法”,分析了47万+微信群、2亿+微信用户、6亿+好友关系和200万+邀...

    灯塔大数据
  • 【独家揭秘】机器学习分析 47 万微信群,发现 9 大规律

    【新智元导读】微信群已经进入到我们的日常生活中,成为社交关系的主要纽带。但微信群有自己的规律,长期群能存活很长的时间,临时群则转瞬即逝。来自清华大学、康奈尔大学...

    新智元

扫码关注云+社区

领取腾讯云代金券