前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Gateway监控配置示例

Spring Cloud Gateway监控配置示例

原创
作者头像
堕落飞鸟
发布2023-04-11 10:51:35
1.2K0
发布2023-04-11 10:51:35
举报
文章被收录于专栏:飞鸟的专栏

下面是一个简单的Spring Cloud Gateway应用,包括路由配置、过滤器、监控等功能。该应用将请求转发到http://httpbin.org目标地址,并添加了Hystrix和RateLimiter过滤器,使用Prometheus和Grafana进行监控。

代码语言:javascript
复制
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/get")
                        .filters(f -> f.hystrix(config -> config.setName("hystrixFilter")))
                        .uri("http://httpbin.org"))
                .route(r -> r.path("/delay/**")
                        .filters(f -> f.requestRateLimiter(config -> config.setKeyResolver(new RemoteAddrKeyResolver()))
                                .hystrix(config -> config.setName("hystrixFilter")))
                        .uri("http://httpbin.org"))
                .build();
    }
}

在上面的代码中,使用@Bean注解定义了一个RouteLocator类型的bean,用于配置路由信息。使用RouteLocatorBuilder的routes()方法来定义路由规则,使用path()方法定义匹配规则,使用filters()方法添加过滤器,使用uri()方法定义目标地址。

在上面的代码中,第一个路由规则将请求路径为/get的请求转发到http://httpbin.org目标地址,并添加了名为"hystrixFilter"的Hystrix过滤器。第二个路由规则将请求路径为/delay/**的请求转发到http://httpbin.org目标地址,并添加了名为"hystrixFilter"和"rateLimiterFilter"的Hystrix和RateLimiter过滤器,其中RateLimiter过滤器使用RemoteAddrKeyResolver作为KeyResolver,用于限制相同IP地址的请求频率。

下面是Hystrix和RateLimiter过滤器的配置:

代码语言:javascript
复制
@Configuration
public class FilterConfig {
    @Bean
    public HystrixGatewayFilterFactory hystrixGatewayFilterFactory() {
        return new HystrixGatewayFilterFactory();
    }

    @Bean
    public RequestRateLimiterGatewayFilterFactory rateLimiterGatewayFilterFactory() {
        return new RequestRateLimiterGatewayFilterFactory();
    }
}

在上面的代码中,使用@Configuration注解定义了一个配置类,用于配置Hystrix和RateLimiter过滤器。使用@Bean注解定义了hystrixGatewayFilterFactory()和rateLimiterGatewayFilterFactory()方法,分别返回HystrixGatewayFilterFactory和RequestRateLimiterGatewayFilterFactory类型的bean,用于创建Hystrix和RateLimiter过滤器。

下面是Prometheus和Grafana的监控配置:

代码语言:javascript
复制
@Configuration
public class MonitoringConfig {
    @Bean
    MeterRegistryCustomizer<MeterRegistry> commonTags() {
        return registry -> registry.config()
                .commonTags("application", "gateway");
    }

    @Bean
    PrometheusMeterRegistry prometheusMeterRegistry() {
        return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
    }

    @Bean
    public MeterFilter renameStatusCodeTag() {
        return MeterFilter.renameTag("status", "http_status");
    }

    @Bean
    public MeterFilter renameUriTag() {
        return MeterFilter.renameTag("uri", "request_uri");
    }

    @Bean
    public GatewayMetrics gatewayMetrics(RouteLocator routeLocator,
                                         PrometheusMeterRegistry meterRegistry) {
        return new GatewayMetrics(routeLocator, meterRegistry, Arrays.asList(
                new DefaultRouteIdProvider(),
                new StaticRouteIdProvider("get_route", "/get"),
                new StaticRouteIdProvider("delay_route", "/delay/**")
        ));
    }
}

在上面的代码中,使用@Configuration注解定义了一个配置类,用于配置Prometheus和Grafana的监控。使用@Bean注解定义了commonTags()方法,用于设置公共标签,application为gateway。使用@Bean注解定义了prometheusMeterRegistry()方法,返回PrometheusMeterRegistry类型的bean,用于创建PrometheusMeterRegistry实例。使用@Bean注解定义了renameStatusCodeTag()和renameUriTag()方法,分别返回MeterFilter类型的bean,用于重命名标签。使用@Bean注解定义了gatewayMetrics()方法,返回GatewayMetrics类型的bean,用于创建GatewayMetrics实例,并设置路由规则和MeterRegistry。

下面是GatewayMetrics的代码:

代码语言:javascript
复制
public class GatewayMetrics extends RouteMatchingMeterFilter {

    public GatewayMetrics(RouteLocator routeLocator, MeterRegistry meterRegistry,
                          List<RouteIdProvider> routeIdProviders) {
        super(routeLocator, "gateway.requests", meterRegistry, routeIdProviders);
    }

    @Override
    protected Iterable<Tag> tags(Route route, URI uri) {
        return Tags.of(super.tags(route, uri),
                Tag.of("method", "unknown"),
                Tag.of("status", "unknown"),
                Tag.of("request_uri", uri.getPath()));
    }

    @Override
    protected Iterable<Tag> extraTags(HttpServletRequest request) {
        return Tags.of("method", request.getMethod());
    }

    @Override
    protected String tagValue(HttpServletRequest request, String key) {
        if (key.equals("status")) {
            Object status = request.getAttribute(ServerWebExchangeUtils.STATUS_CODE_ATTRIBUTE);
            if (status != null) {
                return status.toString();
            }
        }
        return super.tagValue(request, key);
    }
}

在上面的代码中,使用GatewayMetrics继承了RouteMatchingMeterFilter类,用于创建路由规则和MeterRegistry之间的映射关系。在tags()方法中,添加了method、status和request_uri标签。在extraTags()方法中,添加了method标签。在tagValue()方法中,根据ServerWebExchangeUtils.STATUS_CODE_ATTRIBUTE获取status标签的值。

最后,使用Prometheus和Grafana进行监控时,需要添加以下依赖:

代码语言:javascript
复制
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-core</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>

在使用Prometheus和Grafana进行监控之前,需要启动Prometheus服务器,并将Spring Cloud Gateway的监控数据暴露给Prometheus服务器。可以在application.yml文件中添加以下配置:

代码语言:javascript
复制
management:
  endpoints:
    web:
      exposure:
        include: prometheus
  endpoint:
    prometheus:
      enabled: true

这里,使用management.endpoints.web.exposure.include属性设置将/prometheus端点暴露给外部访问,使用management.endpoint.prometheus.enabled属性设置Prometheus监控启用。当应用程序启动时,Prometheus服务器将开始收集和显示应用程序的监控数据。可以使用Grafana可视化监控数据,例如显示请求响应时间、请求数量等。具体的操作可以参考Grafana的官方文档。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Prometheus 监控服务
Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档