天天消息!Spring Cloud Gateway監(jiān)控配置示例

時間:2023-04-15 08:26:38 來源: 騰訊云


下面是一個簡單的Spring Cloud Gateway應(yīng)用,包括路由配置、過濾器、監(jiān)控等功能。該應(yīng)用將請求轉(zhuǎn)發(fā)到http://httpbin.org目標地址,并添加了Hystrix和RateLimiter過濾器,使用Prometheus和Grafana進行監(jiān)控。


(相關(guān)資料圖)

@SpringBootApplicationpublic 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()方法來定義路由規(guī)則,使用path()方法定義匹配規(guī)則,使用filters()方法添加過濾器,使用uri()方法定義目標地址。

在上面的代碼中,第一個路由規(guī)則將請求路徑為/get的請求轉(zhuǎn)發(fā)到http://httpbin.org目標地址,并添加了名為"hystrixFilter"的Hystrix過濾器。第二個路由規(guī)則將請求路徑為/delay/**的請求轉(zhuǎn)發(fā)到http://httpbin.org目標地址,并添加了名為"hystrixFilter"和"rateLimiterFilter"的Hystrix和RateLimiter過濾器,其中RateLimiter過濾器使用RemoteAddrKeyResolver作為KeyResolver,用于限制相同IP地址的請求頻率。

下面是Hystrix和RateLimiter過濾器的配置:

@Configurationpublic 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,用于創(chuàng)建Hystrix和RateLimiter過濾器。

下面是Prometheus和Grafana的監(jiān)控配置:

@Configurationpublic class MonitoringConfig {    @Bean    MeterRegistryCustomizer 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的監(jiān)控。使用@Bean注解定義了commonTags()方法,用于設(shè)置公共標簽,application為gateway。使用@Bean注解定義了prometheusMeterRegistry()方法,返回PrometheusMeterRegistry類型的bean,用于創(chuàng)建PrometheusMeterRegistry實例。使用@Bean注解定義了renameStatusCodeTag()和renameUriTag()方法,分別返回MeterFilter類型的bean,用于重命名標簽。使用@Bean注解定義了gatewayMetrics()方法,返回GatewayMetrics類型的bean,用于創(chuàng)建GatewayMetrics實例,并設(shè)置路由規(guī)則和MeterRegistry。

下面是GatewayMetrics的代碼:

public class GatewayMetrics extends RouteMatchingMeterFilter {    public GatewayMetrics(RouteLocator routeLocator, MeterRegistry meterRegistry,                          List routeIdProviders) {        super(routeLocator, "gateway.requests", meterRegistry, routeIdProviders);    }    @Override    protected Iterable 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 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類,用于創(chuàng)建路由規(guī)則和MeterRegistry之間的映射關(guān)系。在tags()方法中,添加了method、status和request_uri標簽。在extraTags()方法中,添加了method標簽。在tagValue()方法中,根據(jù)ServerWebExchangeUtils.STATUS_CODE_ATTRIBUTE獲取status標簽的值。

最后,使用Prometheus和Grafana進行監(jiān)控時,需要添加以下依賴:

    io.micrometer    micrometer-core    io.micrometer    micrometer-registry-prometheus

在使用Prometheus和Grafana進行監(jiān)控之前,需要啟動Prometheus服務(wù)器,并將Spring Cloud Gateway的監(jiān)控數(shù)據(jù)暴露給Prometheus服務(wù)器。可以在application.yml文件中添加以下配置:

management:  endpoints:    web:      exposure:        include: prometheus  endpoint:    prometheus:      enabled: true

這里,使用management.endpoints.web.exposure.include屬性設(shè)置將/prometheus端點暴露給外部訪問,使用management.endpoint.prometheus.enabled屬性設(shè)置Prometheus監(jiān)控啟用。當應(yīng)用程序啟動時,Prometheus服務(wù)器將開始收集和顯示應(yīng)用程序的監(jiān)控數(shù)據(jù)。可以使用Grafana可視化監(jiān)控數(shù)據(jù),例如顯示請求響應(yīng)時間、請求數(shù)量等。具體的操作可以參考Grafana的官方文檔。

關(guān)鍵詞:


閱讀排行

關(guān)于我們 加入我們 廣告服務(wù) 網(wǎng)站地圖

All Rights Reserved, Copyright 2004-2022 www.lun7777.cn

如有意見請與我們聯(lián)系 郵箱:317 493 128 @qq.com

粵ICP備2022077823號-5    信息網(wǎng) 版權(quán)所有