首页
学习
活动
专区
圈层
工具
发布
34 篇文章
1
Spring Cloud Gateway的概念和背景
2
Spring Cloud Gateway的基本原理和特性
3
Spring Cloud Gateway 的架构和核心组件(一)
4
Spring Cloud Gateway 的架构和核心组件(二)
5
Spring Cloud Gateway环境搭建和配置(一)
6
Spring Cloud Gateway环境搭建和配置(二)
7
Spring Cloud Gateway路由的基本概念
8
Spring Cloud Gateway配置路由规则(一)
9
Spring Cloud Gateway配置路由规则(二)
10
Spring Cloud Gateway配置路由规则(三)
11
Spring Cloud Gateway路由规则的匹配和优先级(一)
12
Spring Cloud Gateway路由规则的匹配和优先级(二)
13
Spring Cloud Gateway过滤器配置
14
Spring Cloud Gateway过滤器配置-示例
15
Spring Cloud Gateway 过滤器的作用(一)
16
Spring Cloud Gateway 过滤器的作用(二)
17
Spring Cloud Gateway 过滤器的分类
18
Spring Cloud Gateway过滤器的执行顺序
19
Spring Cloud Gateway负载均衡(一)
20
Spring Cloud Gateway负载均衡-随机策略
21
Spring Cloud Gateway负载均衡-加权轮询策略
22
Spring Cloud Gateway负载均衡-加权随机策略
23
Spring Cloud Gateway限流(一)
24
Spring Cloud Gateway限流(二)
25
Spring Cloud Gateway高可用的实现
26
Spring Cloud Gateway网关安全性的保障(一)
27
Spring Cloud Gateway网关安全性的保障(二)
28
Spring Cloud Gateway 网关与微服务架构的整合(一)
29
微服务架构的基本概念和组件
30
Spring Cloud Gateway 的监控(一)
31
Spring Cloud Gateway 的监控(二)
32
Spring Cloud Gateway监控配置示例
33
Spring Cloud Gateway 的调试
34
使用 Spring Cloud Gateway 进行微服务架构的 API 网关实践

Spring Cloud Gateway监控配置示例

下面是一个简单的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的官方文档。

下一篇
举报
领券