【Zuul】Route Filter 修改路由规则

背景

开放平台对外的接口,都须要有特定的规则,因此在接口路径设计上,有别于项目中的默认路由规则,因此有对路由进行特殊处理的需求;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

实现方式

  1. 路由规则添加 : /openApi/** -> userServicespring

  2. 添加 网关路由拦截器 :ide

    该拦截器在服务进行路由以前执行,因此修改this

    RequestContext ctx = RequestContext.getCurrentContext();
    	HttpServletRequest request = ctx.getRequest();
    	String url = request.getRequestURI();

    requestURI参数,就能够达到指定服务的路由地址修改;url

OpenApiRouteFilter

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);
		}
	}

}
相关文章
相关标签/搜索