linkis是一个连接执行引擎与上层应用之间的大数据组件。其中防火墙模块按照Gateway的多WebSocket请求转发实现来重写的。
对此进行了剖析,看它是如何利用scala语言重写了多websocket转发。
SpringCloudGatewayConfiguration.scala定义了配置文件,其中加载了两个GlobalFilter,一个为GatewayAuthorizationFilter,一个为SpringCloudGatewayWebsocketFilter。
还有定义了路由转发RouteLocator 。
根据上面的定义,可以深入去理解SpringCloudGatewayWebsocketFilter,来找到其实现多websocket转发的解决方案。
一、搭建eureka注册服务中心
首先运行,com.webank.wedatasphere.linkis.eureka.SpringCloudEurekaApplication
搭建eureka注册服务中心。linkis设置的端口为:20303
二、启动gateway-ujes-support模块
配置的main class为:com.webank.wedatasphere.linkis.DataWorkCloudApplication
模块为:linkis-gateway-ujes-support.
修改配置文件中:application.yml的eureka服务地址
eureka:
client:
serviceUrl:
# defaultZone: http://localhost:port/eureka/
defaultZone: http://localhost:20303/eureka/
registry-fetch-interval-seconds: 5
instance:
metadata-map:
test: wedatasphere
然后启动。
三、gateway的谓语predicates分析
1、配置文件中的application.yml,定义了几个基本的路由
比方/dws/ /dws/vg/ /dws/easyide/
server:
port: 9001
spring:
application:
name: DataWorkCloud-Gateway
cloud:
gateway:
routes:
- id: dws
uri: http://localhost:port/
predicates:
- Path=/dws/
- id: dws/vg
uri: http://localhost:port/
predicates:
- Path=/dws/vg/
- id: dws/easyide
uri: http://localhost:port/
predicates:
- Path=/dws/easyide/
2、com.webank.wedatasphere.linkis.gateway.springcloud.SpringCloudGatewayConfiguration#createRouteLocator定义的route
有:/api /dws /ws /ws_http
其中websocket路由为:lb:ws://
微服务路由为:lb://
具体的要看其它微服务怎么去调用来实现
四、gateway统一进行的登录验证:com.webank.wedatasphere.linkis.gateway.springcloud.SpringCloudGatewayConfiguration#authorizationFilter
其中调用了该方法:com.webank.wedatasphere.linkis.gateway.springcloud.http.GatewayAuthorizationFilter#filter
最终验证方法为:com.webank.wedatasphere.linkis.gateway.security.SecurityFilter#doFilter
如果失败,则在response里面修改了context,从而得到显示的数据:
{
method: "/dws",
status: -1,
message: "You are not logged in, please login first(您尚未登录,请先登录)!",
data: { },
}
五、注释权限验证,再次请求
com.webank.wedatasphere.linkis.gateway.springcloud.http.GatewayAuthorizationFilter#gatewayDeal
将SecurityFilter.doFilter注释
// if(!SecurityFilter.doFilter(gatewayContext)) {
// return gatewayHttpResponse.getResponseMono();
// } else
if(gatewayContext.isWebSocketRequest()) {
return chain.filter(exchange);
}
再次请求http://192.168.88.102:9001/api
追踪到处理该请求的为:com.webank.wedatasphere.linkis.gateway.parser.DefaultGatewayParser#parse
返回 sendErrorResponse(s"Cannot find a service to deal $path, ignore it.", gatewayContext)
{
method: "/api",
status: 1,
message: "Cannot find a service to deal /api, ignore it.",
data: { },
}
最本质的是该parse方法:com.webank.wedatasphere.linkis.gateway.parser.DefaultGatewayParser
看还有这些定义好的接口:/api/rest.... /dws
private val COMMON_REGEX = "/api/rest_[a-zA-Z]+/(v\\d+)/([^/]+)/.+".r
private val CLIENT_HEARTBEAT_REGEX = s"/api/rest_[a-zA-Z]+/(v\\d+)/${AbstractGatewayParser.GATEWAY_HEART_BEAT_URL.mkString("/")}".r
再次参考官方文档:http接入文档
发现了确实是这样过滤请求的。接下来就是发现服务,转发服务。现在需要搭建其它的模块了
参考:芋道 Spring Cloud 网关 Spring Cloud Gateway 入门