项目地址:https://github.com/zzw6776/http-forward-filter
项目已通过线上实际验证
为什么会有这个项目
翻遍全文都没有找到能将ServletRequest进行自定义转发的方法,只能自己参照HTTP-Proxy-Servlet重新写一套,至于为什么我要将ServletRequest进行转发,可以参照实战分栏
这项目能做什么?
-
可以自定义转发目标uri
-
可以自定义是否需要转发
-
可以在转发时添加header
项目实战
目的
实现spring-cloud自定义灰度方案
背景
大家都知道spring-cloud是可以通过Ribbon进行负载均衡,Ribbon本身乃至他的各种衍生物如Discovery都是很优秀的现成的灰度解决方案,但是这些方案都有一个问题,都得其他项目/团队配合进行修改,在项目上游链路不清楚的情况下,这条路成本和风险非常高
在此基础下,一个最简单的灰度方案就是在不动上游业务链路调用的情况下进行自身项目一个转发,如图所示
项目A,项目B,项目C,项目D都为上游业务,通过feign的ribbon进行随机负载均衡,版本A为灰度版本,版本B为master版本,版本A可以通过判断条件来确定是否转发至版本B,如果版本A配置的90%的流量转发,那么实际打到版本A并且被处理的流量只有50%*10%=5%,实现新项目上线5%的灰度方案
通过filter对ServletRequest做代理转发,实现类似于反向代理的功能,ServletRequest to HttpRequest