前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Zuul的性能优化-过滤器链缓存

Zuul的性能优化-过滤器链缓存

原创
作者头像
堕落飞鸟
发布2023-04-10 07:05:19
2750
发布2023-04-10 07:05:19
举报
文章被收录于专栏:飞鸟的专栏

过滤器链缓存

Zuul中的过滤器链在每次请求时都会被执行,这样会增加系统的开销。Zuul提供了过滤器链缓存的功能,可以将过滤器链的执行结果缓存起来,下次相同请求时直接使用缓存的结果。

以下是使用过滤器链缓存的示例代码:

代码语言:javascript
复制
public class CustomFilter extends ZuulFilter {

    private CacheManager cacheManager;

    public CustomFilter(CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }

    @Override
    public String filterType() {
        return "pre";
    }

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

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

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String key = request.getRequestURI();
        Cache cache = cacheManager.getCache("filterChainCache");
        ValueWrapper wrapper = cache.get(key);
        if (wrapper != null) {
            ctx.set("filterChainCacheResult", wrapper.get());
            return null;
        }
        return doFilter(ctx, key, cache);
    }

    private Object doFilter(RequestContext ctx, String key, Cache cache) {
        FilterLoader filterLoader = FilterLoader.getInstance();
        List<ZuulFilter> preFilters = filterLoader.getFiltersByType("pre");
        List<ZuulFilter> routeFilters = filterLoader.getFiltersByType("route");
        List<ZuulFilter> postFilters = filterLoader.getFiltersByType("post");
        List<ZuulFilter> errorFilters = filterLoader.getFiltersByType("error");
        List<ZuulFilter> filters = new ArrayList<>();
        filters.addAll(preFilters);
        filters.addAll(routeFilters);
        filters.addAll(postFilters);
        filters.addAll(errorFilters);
        List<FilterProcessor.FilterType> filterTypes = new ArrayList<>();
        filterTypes.add(FilterProcessor.FilterType.PRE);
        filterTypes.add(FilterProcessor.FilterType.ROUTE);
        filterTypes.add(FilterProcessor.FilterType.POST);
        filterTypes.add(FilterProcessor.FilterType.ERROR);
        FilterProcessor filterProcessor = FilterProcessor.getInstance();
        FilterChainResult result = filterProcessor.runFilters(filterTypes, filters);
        if (result.getStatus() == FilterChainResultStatus.FAILED) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(result.getException().getStatusCode());
            ctx.setResponseBody(result.getException().getMessage());
            ctx.getResponse().setContentType("application/json;charset=UTF-8");
            return null;
        }
        cache.putIfAbsent(key, result.getResponseDataStream());
        ctx.setResponseBody(result.getResponseDataStream());
        return null;
    }
}

在以上代码中,我们通过缓存管理器获取缓存对象,并根据请求URI作为缓存的key进行缓存。如果缓存中已经存在该key的缓存,直接将缓存中的结果设置到Zuul的响应中返回。如果缓存中不存在该key的缓存,则执行过滤器链,将执行结果缓存起来,并将结果设置到Zuul的响应中返回。

通过使用过滤器链缓存,可以减少过滤器链的执行次数,从而提高系统的性能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 过滤器链缓存
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档