GateWay 转发请求
五、Gateway 转发请求
使用到的特性
- 路由
负载均衡(需要用到注册中心)- 统一鉴权
跨域- 统一业务处理(缓存)
- 访问控制
发布控制- 流量染色
接口保护- 限制请求
- 信息脱敏
- 降级(熔断)
- 限流:学习令牌桶算法、学习漏桶算法,学习一下 RedisLimitHandler
- 超时时间
- 统一日志
统一文档
业务逻辑
- 用户发送请求到 API 网关
- 请求日志
- (黑白名单)
- 用户鉴权(判断 accessKey, secretKey 是否合法)
- 请求的模拟接口是否存在
- 请求转发,调用模拟接口
- 响应日志
- 调用成功,次数 + 1
- 调用失败,返回一个规范的错误码
具体实现
1.请求转发
所有路径为: /api/** 的请求进行转发,转发到 http://localhost:8123/api/**
比如请求网关: http://localhost:8090/api/name/get/?name=mofeng
转发到:http://localhost:8123/api/name/get/?name=mofeng
配置文件添加内容, application.yml
1 | spring: |
2.编写业务逻辑
使用了 GlobalFilter (编程式),全局请求拦截处理(类似 AOP)
因为网关项目没引入 MyBatis 等操作数据库的类库,如果该操作较为复杂,可以有 backend 增删改查项目提供接口,直接调用,不需要重复写逻辑。
- HTTP 请求(HTTPClient、 用 RestTemplate、 Feign)
- RPC(Dubbo)
存在的问题
预期等模拟接口调用完成,才记录响应日志、统计调用次数
但现实是 chain.filter 方法立即返回了,知道 filter 过滤器 return 后才调用模拟接口
原因是:chain.filter 是一个异步操作,理解为前端的 promise
解决方案:利用 response 装饰者,增强原有 response 的处理能力
参考博客:https://blog.csdn.net/qq_19636353/article/details/126759522
其他参考:
https://blog.csdn.net/zx156955/article/details/121670681
https://blog.csdn.net/weixin_43933728/article/details/121359727?spm=1001.2014.3001.5501
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 墨枫个人博客!
评论