环球信息:Spring Cloud Gateway监控配置示例

2023-04-15 10:07:17 来源:腾讯云

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

@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()方法来定义路由规则,使用path()方法定义匹配规则,使用filters()方法添加过滤器,使用uri()方法定义目标地址。


(资料图)

在上面的代码中,第一个路由规则将请求路径为/get的请求转发到http://httpbin.org目标地址,并添加了名为"hystrixFilter"的Hystrix过滤器。第二个路由规则将请求路径为/delay/**的请求转发到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,用于创建Hystrix和RateLimiter过滤器。

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

@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的监控。使用@Bean注解定义了commonTags()方法,用于设置公共标签,application为gateway。使用@Bean注解定义了prometheusMeterRegistry()方法,返回PrometheusMeterRegistry类型的bean,用于创建PrometheusMeterRegistry实例。使用@Bean注解定义了renameStatusCodeTag()和renameUriTag()方法,分别返回MeterFilter类型的bean,用于重命名标签。使用@Bean注解定义了gatewayMetrics()方法,返回GatewayMetrics类型的bean,用于创建GatewayMetrics实例,并设置路由规则和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类,用于创建路由规则和MeterRegistry之间的映射关系。在tags()方法中,添加了method、status和request_uri标签。在extraTags()方法中,添加了method标签。在tagValue()方法中,根据ServerWebExchangeUtils.STATUS_CODE_ATTRIBUTE获取status标签的值。

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

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

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

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

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

标签

大米等库存充足!宁波生活必需品市场供应总体平稳有序

宁波市商务局9月14日晚间发布的重点生活必需品市场供应情况保障工作日报显示,我市大米、蔬菜、副食、粮...

2022-09-15 17:27:29

全国新能源汽车下乡活动在昆山启动 将发放500万元“红包”

6月17日,由中国汽车工业协会、省工信厅、省农业农村厅、省商务厅、省发改委、苏州市政府、新华日报社、...

2022-06-20 16:48:35

安阳本土确诊病例上升至26例

  中新网安阳1月10日电 (杨大勇)10日,河南省安阳市召开新冠肺炎疫情防控工作第二场新闻发布会通报称...

2022-01-10 15:22:56

3次推迟婚期 满洲里抗疫民警兑现承诺:“我回来娶你了!”

  (抗击新冠肺炎)3次推迟婚期 满洲里抗疫民警兑现承诺:“我回来娶你了!”  中新网呼伦贝尔1月10...

2022-01-10 15:22:56

上海公安民警在岗位上迎接2022年“中国人民警察节”

  中新网上海1月10日电(记者 李姝徵)“我志愿成为中华人民共和国人民警察,献身于崇高的人民公安事业...

2022-01-10 15:22:55

郑州核酸检测为中小学生开辟“绿色通道”

  (抗击新冠肺炎)郑州核酸检测为中小学生开辟“绿色通道”  中新网郑州1月10日电(杨大勇)“学生不用...

2022-01-10 15:22:55

反扒便衣警察“小曹”:藏在人海中的隐形“守护者”

  小曹说,他现在理解了师父当年如何历练出一副“火眼”,碰见的贼多了,案子经手的多了,自然就有了...

2022-01-10 15:22:54

哥哥移植肾脏给病重弟弟 已在上海顺利康复

  中新社上海1月10日电 (陈静 王根华)在上海武警服役的弟弟被尿毒症击倒,哥哥义无反顾地捐献出自...

2022-01-10 15:22:54

网友与人裸聊被敲诈10万余元 被告人获刑5年

  中新网长春1月10日电 (谭伟旗)当下,新型网络诈骗案件已较为普遍,由于网络上身份的不确定性、语言...

2022-01-10 15:22:53

1月10日起天津市暂停开展旅行社旅游业务活动

  中新网1月10日电 据天津市文旅局官网消息,天津市文化和旅游局10日发布紧急通知称,即日起,天津市...

2022-01-10 15:22:53
x 广告
x 广告

Copyright  2015-2022 人人粮油网版权所有  备案号:粤ICP备18023326号-36   联系邮箱:8557298@qq.com