BudWk V7 从零开始搭建微服务开发框架 - 04 网关组件

原创
2021/05/28 17:37
阅读数 477

wk-starter-gateway

二级路径路由转发

实现本功能,主要是为了解决项目下面划分为多个微服务模块的需求。

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黑名单

GatewayServletStarter

在路由转发之前,可以拿到 HttpServletRequest clientRequest 对象,有了 request 那就OK了 ,获取IP然后判断IP是否在黑名单,然后返回 proxyResponse.sendError(403); 即可。

日志链路追踪

同上,拿到 request 后在 header 追加一串UUID,传递到微服务模块里,然后利用log4j MDC,实现日志的打印。

Websocket支持

因为 GatewayServletStarter 是继承了 AsyncMiddleManServlet 类,它是异步的,而 Websocket 是长连接需要同步连接,所以不能直接在 GatewayServletStarter 里实现Websocket代理,那么就另求他法吧。

在GitHub上找到一个实现 Websocket代理类,测试OK,然后进行简单的改造即可实现我的需求:

WebSocketProxyServlet

继承 WebSocketProxyServlet 类,然后从 nacos 找到配置的后台实例对应的地址即可:

Instance ins = nacosNamingService.selectOneHealthyInstance(serviceName, group);
if (ins != null) {
	redirectUrl = "ws://" + ins.getIp() + ":" + ins.getPort() + url;
}
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部