网关功能实现的几种方式
试想一下,让你实现一个功能
对请求进行预处理,状态校验,参数改写
部分请求转发到后台的服务(类似网关的转发功能)
清晰完整的记录各个请求的request、response、耗时
面对这个需求,你的方案是什么?
1、可参考的方案
- filter拦截请求,改写后通过http请求后端服务,然后复制response到请求流中
- springboot网关插件zuul
- 重写 HttpServletRequestWrapper、HttpServletResponseWrapper改写resquest、response
2、可行性分析
方案 | 优点 | 备注 |
---|---|---|
zuul | springboot插件,功能应该是可靠的 | 对接可能有点麻烦 |
http请求 复制response流 | 中规中矩,能实现 | 不是很优雅 |
重写HttpServletRequestWrapper、HttpServletResponseWrapper | 转发到内部服务貌似不行,可改写请求体和内部接口 | 限制在服务内 |
3、重点说明
- response的流正常只能读取一次,所以需要打印日志的话,需要重写把stream复制出来,简单的做法是重写HttpServletResponseWrapper
- filter中不能改写url到服务之外,会报404
正文到此结束