二级路径路由转发
实现本功能,主要是为了解决项目下面划分为多个微服务模块的需求。
wk-starter-gateway 是从 nutzcloud-perca 改造而来,其 NacosServerPrefixSelectorFilter.java 是前缀路由转发类,其中
ts.prefix = "/" + ts.name.substring(serviceNamePrefix.length());
这一行代码,实现了 /platform 转发到 xxxx.platform 服务功能,只需要简单改造即可实现 /platform/v1 转发到 xxxx.platform.v1 服务的功能,怎么实现呢?
加上 .replace(".","/")
即可,简单吧……
配置文件如下:
jetty:
contextPath: /platform/v1
nacos:
discovery:
server-addr: 192.168.198.19:8848
namespace: dev
naming:
service-name: xxxx.platform.v1
meta-data: "{'version':'budwk.platform.v1.7.0.0'}"
IP黑名单
在路由转发之前,可以拿到 HttpServletRequest clientRequest
对象,有了 request 那就OK了 ,获取IP然后判断IP是否在黑名单,然后返回 proxyResponse.sendError(403);
即可。
日志链路追踪
同上,拿到 request 后在 header
追加一串UUID,传递到微服务模块里,然后利用log4j MDC,实现日志的打印。
Websocket支持
因为 GatewayServletStarter 是继承了 AsyncMiddleManServlet 类,它是异步的,而 Websocket 是长连接需要同步连接,所以不能直接在 GatewayServletStarter 里实现Websocket代理,那么就另求他法吧。
在GitHub上找到一个实现 Websocket代理类,测试OK,然后进行简单的改造即可实现我的需求:
继承 WebSocketProxyServlet 类,然后从 nacos 找到配置的后台实例对应的地址即可:
Instance ins = nacosNamingService.selectOneHealthyInstance(serviceName, group);
if (ins != null) {
redirectUrl = "ws://" + ins.getIp() + ":" + ins.getPort() + url;
}