spring cloud gateway 之zuul通过filter配置接口请求的时间耗时记录到日志

zuul中的Filter的配置,zuul中提供了三种类型的Filter,preFilter,routeFilter和postFilter,分别对应请求中的不同的阶段,针对同一个请求,有一个RequestContext对象,在三个阶段的Filter中进行共享

假设我们要开发一个统计请求时间的功能,需要在preFilter里边记录开始时间,并将整个开始时间放在RequestContext中,在postFilter里边拿到开始时间,用当前的时间减去开始时间,就是请求执行的时间

定义一个preFilter:

package com.jiaoyiping.springcloud.zuul.filter;

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;

/**
 * Created with Intellij IDEA
 *
 * @author: 
 * Mail: 
 * Date: 
 * Time: 
 * To change this template use File | Settings | Editor | File and Code Templates
 */

public class TimeCostPreFilter extends ZuulFilter {
    public static final String START_TIME_KEY = "start_time";
    private Logger logger = LoggerFactory.getLogger(TimeCostPreFilter.class);

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

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

    /**
     * 判断是否要拦截的逻辑
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        long startTime = System.currentTimeMillis();
        RequestContext.getCurrentContext().set(START_TIME_KEY, startTime);
        return null;
    }
}

定义以postFilter:

package com.jiaoyiping.springcloud.zuul.filter;

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;

/**
 * Created with Intellij IDEA
 *
 * @author: 
 * Mail: 
 * Date: 
 * Time: 
 * To change this template use File | Settings | Editor | File and Code Templates
 */

public class TimeCostPostFilter extends ZuulFilter {
    private static final String START_TIME_KE = "start_time";
    private Logger logger = LoggerFactory.getLogger(TimeCostPostFilter.class);

    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }

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

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

    @Override
    public Object run() throws ZuulException {
        long startTime = (long) RequestContext.getCurrentContext().get(START_TIME_KE);
        logger.info("请求完成,耗时{}秒", (System.currentTimeMillis() - startTime) / 1000);
        return null;
    }
}

在一个配置类中将这两个Filter注入:

package com.jiaoyiping.springcloud.zuul.config;

import com.jiaoyiping.springcloud.zuul.filter.PDSFilter;
import com.jiaoyiping.springcloud.zuul.filter.TimeCostPostFilter;
import com.jiaoyiping.springcloud.zuul.filter.TimeCostPreFilter;
import com.netflix.zuul.ZuulFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created with Intellij IDEA
 *
 * @author: 
 * Mail: 
 * Date: 
 * Time:
 * To change this template use File | Settings | Editor | File and Code Templates
 */
@Configuration
public class FilterConfig {

    @Bean
    public ZuulFilter timeCostPreFilter() {
        return new TimeCostPreFilter();
    }

    @Bean
    public ZuulFilter timeCostPostFilter() {
        return new TimeCostPostFilter();
    }


    @Bean
    public ZuulFilter pdsFilter() {
        return new PDSFilter();
    }
}

启动项目,可以发现,zuul网关已经注册到了eureka上:

请求provide对应的地址,发现,zuul可以成功地调用eureka上对应的服务,并将结果正确返回:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud Zuul是一个基于Netflix Zuul的微服务网关,它提供了动态路由、监控、弹性、安全等功能。在使用Spring Cloud Zuul时,需要进行一些配置,包括路由配置、过滤器配置、负载均衡配置等。具体配置可以参考Spring Cloud官方文档。 ### 回答2: Spring Cloud Zuul是基于Netflix Zuul的一种微服务网关解决方案。它提供了一种动态路由、监控、弹性、安全性、负载均衡等功能,可以向外暴露API,以及将请求转发给底层的微服务。 Zuul可以进行横向扩展,只需添加更多的Zuul实例即可轻松实现。ZuulSpring Cloud配合使用,可以提供了完整的微服务架构解决方案。 在配置Zuul时,需要注意以下几个方面: 1.创建Zuul应用程序: 可以通过使用Spring Initializr轻松创建新的Zuul应用程序。在创建过程中,只需选择相关选项即可。例如,在创建Spring Boot应用程序时,可以勾选Zuul选项,即可为您创建一个包含Zuul配置的应用程序。 2.配置Zuul路由: 要配置路由,需要编辑application.yml文件。在该文件中,可以为每个服务配置一个路由规则。例如,如果要将请求转发到特定的微服务,则可以配置以下路由规则: ``` zuul: routes: users: /myusers/** ``` 在这个例子中,我们设置了名为“users”的服务,它使用“/myusers/**”作为前缀路径。这意味着所有以“/myusers”开头的请求都将转发到名为“users”的服务。 3.配置Zuul过滤器: Zuul还提供了过滤器,可以用来进行请求和响应处理。使用Zuul过滤器可以实现以下功能: 认证和安全性 审计和日志记录 传输压缩 动态路由 在Zuul中,过滤器是完全可配置的,可以使用Java代码来实现自定义过滤器。 4.配置Zuul负载均衡: Zuul还提供了负载均衡的功能,它可以将请求分发到多个可用的服务实例中。Zuul可以与Spring Cloud中的Eureka服务发现和注册系统结合使用,从而可以找到运行在各个地方的服务的实例。通过使用Eureka,Zuul可以轻松地访问可用的服务,并使用负载均衡算法将请求分发到不同的实例中。 综上所述,Zuul是一种强大的微服务网关解决方案,可以通过动态路由、监控、弹性、安全性、负载均衡等功能提供API以及代理到底层微服务。要配置Zuul,需要创建应用程序、配置路由、配置过滤器和配置负载均衡等。 ### 回答3: Spring Cloud ZuulSpring Cloud微服务架构中的一个API网关服务,主要用于统一管理服务路由和访问控制。下面我将介绍如何进行Spring Cloud Zuul配置。 1. 添加依赖 在pom.xml中添加如下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> ``` 2. 配置Zuul路由规则 在配置文件中添加如下配置: ```yaml zuul: routes: app1: path: /app1/** serviceId: service1 app2: path: /app2/** serviceId: service2 ``` 上述配置表示,以`/app1`开头的请求将路由到名为`service1`的微服务,以`/app2`开头的请求将路由到名为`service2`的微服务。 3. 配置Zuul过滤器 在配置文件中添加如下配置: ```yaml zuul: routes: app1: path: /app1/** serviceId: service1 app2: path: /app2/** serviceId: service2 filters: pre-filter: pre: add-header-filter: name: X-Header-Param value: zuul-proxy ``` 上述配置表示,添加一个名为`pre-filter`的前置过滤器,在请求被路由之前将在请求头中添加一个名为X-Header-Param的参数,并赋值为`zuul-proxy`。 4. 集成Ribbon负载均衡 在配置文件中添加如下配置: ```yaml service1: ribbon: listOfServers: http://localhost:8081, http://localhost:8082 service2: ribbon: eureka: enabled: true ``` 上述配置表示,对于名为`service1`的微服务,采用指定的服务器列表进行负载均衡;对于名为`service2`的微服务,则启用Eureka进行负载均衡。 在完成以上配置之后,就可以通过Zuul来进行微服务的路由和访问控制了,通过配置过滤器和负载均衡,可以对请求进行更加灵活和高效的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值