SpringCloud-Zuul自定义过滤器控制路由切换

已知应用 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-serviceb-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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值