返回介绍

6.6 构建接收关联 ID 的后置过滤器

发布于 2025-04-22 21:54:08 字数 2163 浏览 0 评论 0 收藏

记住,Zuul 代表服务客户端执行实际的 HTTP 调用。Zuul 有机会从目标服务调用中检查响应,然后修改响应或以额外的信息装饰它。当与以前置过滤器捕获数据相结合时,Zuul 后置过滤器是收集指标并完成与用户事务相关联的日志记录的理想场所。我们将利用这一点,通过将已经传递给微服务的关联 ID 注入回用户。

我们将使用 Zuul 后置过滤器将关联 ID 注入 HTTP 响应首部中,该 HTTP 响应首部传回给服务调用者。这样,就可以将关联 ID 传回给调用者,而无需接触消息体。代码清单 6-13 展示了构建后置过滤器的代码。这段代码可以在 zuulsvr/src/main/java/com/thoughtmechanix/zuulsvr/filters/ResponseFilter.java 中找到。

代码清单 6-13 将关联 ID 注入 HTTP 响应中

package com.thoughtmechanix.zuulsvr.filters;

// 为了简洁,省略了 import 语句

@Component
public class ResponseFilter extends ZuulFilter {
    private static final int FILTER_ORDER = 1;
    private static final boolean SHOULD_FILTER = true;
    private static final Logger logger =
    →  LoggerFactory.getLogger(ResponseFilter.class);

    @Autowired
    FilterUtils filterUtils;

    @Override
    public String filterType() {  ⇽--- 要构建一个后置过滤器,需要设置过滤器的类型为 POST_FILTER_TYPE
        return FilterUtils.POST_FILTER_TYPE;
    }

    @Override
    public int filterOrder() {
        return FILTER_ORDER;
    }

    @Override
    public boolean shouldFilter() {
        return SHOULD_FILTER;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();

        logger.debug("Adding the correlation id to the outbound headers. {}",
        →  filterUtils.getCorrelationId());

        ctx.getResponse().addHeader(  ⇽--- 获取原始 HTTP 请求中传入的关联 ID,并将它注入响应中
        →  FilterUtils.CORRELATION_ID,
        →  filterUtils.getCorrelationId());

        logger.debug("Completing outgoing request for {}.",  ⇽--- 记录传出的请求 URI,这样就有了“书挡”,它将显示进入 Zuul 的用户请求的传入和传出条目
        →  ctx.getRequest().getRequestURI());

        return null;
    }
}

实现完 ResponseFilter 之后,就可以启动 Zuul 服务,并通过它调用 EagleEye 许可证服务。服务完成后,就可以在调用的 HTTP 响应首部上看到一个 tmx-correlation-id 。图 6-14 展示了从调用中发回的 tmx-correlation-id

图 6-14 tmx-correlation-id 已被添加到发送回服务客户端的响应首部中

到目前为止,我们所有的过滤器示例都是在路由到目的地之前或之后对服务客户端调用进行操作。对于最后一个过滤器示例,让我们看看如何动态地更改用户要到达的目标路径。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。