开放平台对外的接口,都须要有特定的规则,因此在接口路径设计上,有别于项目中的默认路由规则,因此有对路由进行特殊处理的需求;java
例如: - 默认路由规则 /userApi/** --> userService 的服务(https:/xxxx:7777/user) eg: (网关)https://xxxx:8888/userApi/user/getUser?id=xxx ---> (userService)https://xxxx:7777/user/getUser?id=xxx 要实现的对外接口路由规则: (网关)https://xxxx:8888/openApi/base/getUser?id=xxx ---> (userService)https://xxxx:7777/user/getUser?id=xxx
路由规则添加 : /openApi/** -> userService
spring
添加 网关路由拦截器 :ide
该拦截器在服务进行路由以前执行,因此修改this
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String url = request.getRequestURI();
requestURI参数,就能够达到指定服务的路由地址修改;url
package cn.crongl.gateway.filter.route; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; [@Component](https://my.oschina.net/u/3907912) public class OpenApiRouteFilter extends ZuulFilter { private final Logger logger = LoggerFactory.getLogger("OpenApiRouteFilter") ; private static String OPEN_API_PRE = "openApi"; [@Override](https://my.oschina.net/u/1162528) public boolean shouldFilter() { return true; } [@Override](https://my.oschina.net/u/1162528) public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String url = request.getRequestURI(); //开放平台接口请求路径转换 if(url.contains(OPEN_API_PRE)){ this.logger.info("开放接口地址路径:{}",url); url=url.replaceFirst(OPEN_API_PRE, "customer");// 根据配置好的去将url替换掉,这里能够写本身的转换url的规则 ctx.put(FilterConstants.REQUEST_URI_KEY, url); // 将替换掉的url set进去,在对应的转发请求的url就会使用这个url this.logger.info("开放接口路径转换为:{}",url); } return null; } [@Override](https://my.oschina.net/u/1162528) public String filterType() { return FilterConstants.ROUTE_TYPE; } [@Override](https://my.oschina.net/u/1162528) public int filterOrder() { // TODO Auto-generated method stub return 10; } public static void main(String[] args) { String url = "http://123.123.123.123:8888/openApi/base/token?aaa=xxxx"; if(url.contains(OPEN_API_PRE)){ url=url.replaceFirst(OPEN_API_PRE, OPEN_API_PRE.concat("/customer"));// 根据配置好的去将url替换掉,这里能够写本身的转换url的规则 System.out.println(url); } } }