介绍
上周接到一个需求,部门希望开发出一个对于数据库单表查询的零代码的一个API工具,我接到这个需求的第一时间,就想到了通过网关注册的方式,来实现接口的转发,通过一系列的注册到网关的虚拟路径来实现API的管理
选择
spring-cloud开源的网关有很多,由于对servlet比较熟悉,所以选择了zuul来最为本次开发的网关产品
源码分析
我们既然要对网关进行开发,免不了要对网关的源码进行一个分析,这里呢就关于zuul是如何实现路由转发的先进行一个分析
从zuul的自动配置入手
org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration
我们找主干,发现在这个注入了一个拦截器,RibbonRoutingFilter
org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter
,主要的逻辑在在run方法上@Override public Object run() { RequestContext context = RequestContext.getCurrentContext(); this.helper.addIgnoredHeaders(); try { //对将要发送的请求进行一个封装 RibbonCommandContext commandContext = buildCommandContext(context); //发送请求 ClientHttpResponse response = forward(commandContext); setResponse(response); return response; } catch (ZuulException ex) { throw new ZuulRuntimeException(ex); } catch (Exception ex) { throw new ZuulRuntimeException(ex); } }
- 这里的主要又是调用了2个内部方法
buildCommandContext
和forward
org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter#buildCommandContext
protected RibbonCommandContext buildCommandContext(RequestContext context) { HttpServletRequest request = context.getRequest(); //获得请求头 MultiValueMap<String, String>