在SpringCloud Zuul中使用WebSockets

近期的项目中需要用到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:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

 

@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中设置比较长的超时时间。

 

1

2

3

4

5

6

7

8

9

10

11

 

hystrix:

command:

default:

execution:

isolation:

thread:

timeoutInMilliseconds: 60000 #设置API网关中路由转发请求的HystrixCommand执行超时时间

ribbon:

ConnectTimeout: 3000 #设置路由转发请求的时候,创建请求连接的超时时间

ReadTimeout: 60000 #用来设置路由转发请求的超时时间

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Cloud Zuul是一个基于Netflix Zuul构建的微服务网关框架。它可以用来处理服务之间的路由、负载均衡、安全验证等问题。下面是一个简单的使用示例: 1. 首先,在pom.xml文件添加Spring Cloud Zuul依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> ``` 2. 在启动类添加`@EnableZuulProxy`注解,启用Zuul代理功能: ```java @SpringBootApplication @EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } } ``` 3. 创建一个过滤器类来实现自定义的过滤逻辑。可以继承`ZuulFilter`类并实现其的方法: ```java @Component public class MyFilter extends ZuulFilter { @Override public String filterType() { return "pre"; // 定义过滤器类型为“pre”,表示在请求路由之前执行过滤逻辑 } @Override public int filterOrder() { return 0; // 设置过滤器的执行顺序,数字越小越先执行 } @Override public boolean shouldFilter() { return true; // 是否启用该过滤器,返回true表示启用 } @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); // 自定义过滤逻辑,比如添加请求头、进行身份验证等 return null; } } ``` 4. 在配置文件配置Zuul的路由规则。比如,可以将请求 `/api/**` 转发到名为 `service-a` 的服务: ```yaml zuul: routes: service-a: path: /api/** serviceId: service-a ``` 注意:需要在配置文件配置服务注册心的地址,并且保证 `service-a` 这个服务已经注册到了服务注册心。 以上就是一个简单的Spring Cloud Zuul使用示例。通过配置路由规则和自定义过滤器,可以实现灵活的微服务网关功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值