開放平臺對外的接口,都須要有特定的規則,因此在接口路徑設計上,有別於項目中的默認路由規則,因此有對路由進行特殊處理的需求;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); } } }