已知应用 a-service:context-path=/a-service,接口请求地址 10.118.1.2/a-service/testA
已知应用 b-service:context-path=/b-service,接口请求地址 10.118.1.3/b-service/testB
Zuul 映射如下,IP:10.118.1.1
zuul:
#省略无关配置
routes:
a-service:
path: /a-service/**
serviceId: a-service
stripPrefix: false
b-service:
path: /b-service/**
serviceId: b-service
stripPrefix: false
通过 zuul 网关访问 10.118.1.1/a-service/testA 映射至 10.118.1.2/a-service/testA
通过 zuul 网关访问 10.118.1.1/b-service/testB 映射至 10.118.1.3/b-service/testB
目前希望将 a-service 与 b-service 整合,故需要迁移 b-service 的代码 至 a-service 中,迁移过程中,为了不影响原有的 b-service 接口访问,故需要 自定义 ZuulFilter 来实现
1、b-service 代码 迁移至 a-service 后 ,增加 前缀 /b,完整访问路径 10.118.1.2/a-service/b/testB
2、通过 zuul 网关访问 10.118.1.1/b-service/testB ,转向至 10.118.1.2/a-service/b/testB
@Component
public class ServicePathFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(ServicePathFilter.class);
private static final String B_SERVICE_ID = "b-service";
private static final String A_SERVICE_ID = "a-service";
private static final String A_URI_PREFIX = "/a-service";
@Override
public String filterType() {
//这里重要,必须是route。过滤类型有四种:pre/route/post/error
return "route";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
String url = ctx.getRequest().getRequestURI();
String FILTER_REQUEST_URI = (String) ctx.get(FilterConstants.REQUEST_URI_KEY);
String FILTER_SERVICE_ID = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);
if(StringUtils.isNotEmpty(FILTER_REQUEST_URI) && StringUtils.isNotEmpty(FILTER_SERVICE_ID)){
logger.info("ServicePathFilter zuul in , url = {}",url);
logger.info("FilterConstants.REQUEST_URI_KEY = {}", FILTER_REQUEST_URI);
logger.info("FilterConstants.SERVICE_ID_KEY = {}", FILTER_SERVICE_ID);
if(FILTER_REQUEST_URI.indexOf(B_SERVICE_ID) >= 0) {
//1.设置覆盖转发的 目标service的Controller的路径 /a-service/b/xxxxxxx
ctx.put(FilterConstants.REQUEST_URI_KEY,A_URI_PREFIX+FILTER_REQUEST_URI.replace(B_SERVICE_ID,"b"));
//2.设置覆盖转发的 service的serviceId
ctx.put(FilterConstants.SERVICE_ID_KEY, A_SERVICE_ID);
}
}
return null;
}
}