Spring Cloud Gateway Socketio框架搭建
一、项目背景
项目需要,在微服务架构上,前后端通信采用socketio,中间架设一个网关。架构图如下:
暂未实现socketio服务端之间session共享。
文章最后附源码链接。
二、项目难点
2.网关对socket请求做负载均衡
三、解决过程
(一)构建spring cloud微服务工程
1.新建cp-cloud-parent父工程 maven project,pom文件如下:主要是定义spring cloud依赖和spring boot依赖
2.创建注册中心工程
新建cp-cloud-eureka maven module,工程的pom文件如下,注意对spring-cloud-starter-netflix-eureka-server的依赖,注册中心依赖eureka-server,而其他微服务依赖eureka-client
启动类如下
application.yml配置文件如下:
3.创建socketio工程
引入netty-socketio,pom文件:
Socketio消息实体类:
Socketio消息处理类:
Socketio启动类,也是Spring boot启动类。注意socketio的启动端口从服务实例元数据获取:
application.yml配置文件:
注意eureka.instance.metadata-map:socketio-port为socketio的启动端口,将该端口注册到eureka注册中心,网关负载均衡需要使用。
src/main/resources/static目录下创建socket.html前端socket请求文件。socketio地址与端口为网关地址和端口,网关引入将在后面介绍。
1.新建cp-cloud-gateway 网关服务 maven module,pom文件如下:
2.网关applicaiton.yml配置如下:
1.- id为路由的标识符。
3.predicates: - Path为拦截请求路径。
4.filters: -StripPrefix表示去除路径前缀,此处为0表示不去除,如果请求为/socket.io/p2/path/method,StripPrefix=2,则目标路径为http://localhost:10003/path/method,把前面2个即/socket.io/p2/都去除了。
(三)在网关上实现socket服务的负载均衡
结合LoadBalancerClientFilter与Eureka Metadata实现socket.io服务的负载均衡。过程如下:
2.创建SocketioLoadBalancerClientFilter继承LoadBalancerClientFilter,使用Eureka Metadata
3.使用Filter
socket客户端统一访问网关。
第一组socket客户端:
第二组socket客户端:
源代码: