下面是一个简单的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的官方文档。
- 环球关注:Spring Cloud Gateway监控配置示例
- 热点评!王府井2022年度实现营收108亿元
- 倚澜科技与特步集团达成战略合作 科技赋能品牌实现跨越式发展
- 东北老工业基地吉林市为企业“解题” 提振发展信心|动态焦点
- 中泰证券:一季度净利同比增长424%
- 芭田股份:一季度净利预增176.22%—314.33%_当前速讯
- 印尼爪哇岛发生7.1级地震,震源深度600千米 天天速读
- 协鑫能科:一季度净利预增52.69%-93.79%
- 高端家电gorenje将参展AWE,宣布Philippe Starck2023中国行计划
- 每日速递:“社银合作”优服务 为民解忧办实事
- 每日资讯:爱普生SureLab D580 全新发布,照片打印新惊喜
- 焦点精选!王者归来,风靡全球的雀巢珍致猫营养主食罐首登中国
- 客如云出席“数智助企,乘浪前行”大会,携手联通为中小企业数智化赋能 报道
- 世界微资讯!蛋蛋被别人整个抓住怎么办啊_阳茎
- 如何找出隐藏的文件夹_怎么取消隐藏文件夹 天天信息
- 每日热文:tnt游戏还有吗_tnt游戏为什么玩不
- 焦点播报:山东高速:2022年年度业绩说明会定于2023年4月13日举行
- 车险保费或迎调整 车均保费下降空间不大 车险行业市场前景分析2023
- 焦点热讯:RCEP成员国积极参展第三届消博会 共享中国大市场机遇
- 18~19日福州有明显降水过程 气温前升后降|今日关注
- 追新看点|超全“追泪”攻略!福州人必备!_天天视点
- 流感出现新流行高峰 流感咳嗽难消试试连花清咳片_天天要闻
- 高顿教育、唯你科技与南通大学三方联动,共育智能财经新人才
- 2023年京东服饰春夏出游季即将开启 大容量、多功能、轻便好推行李箱受追捧
- 艾声听力连锁直营部2022年终总结会圆满成功!势不可挡,共创未来
- 北方华创、中芯国际等20股获特大单资金净流入超2亿元
- 6股获基金调研 开立医疗最受关注 天天热消息
- 俄外交部:若障碍不除 俄将不再延长黑海港口农产品外运协议
- 播报:央行货币政策委员会召开2023年第一季度例会
- 【环球速看料】央行:重点发力支持和带动基础设施建设,促进政府投资带动民间投资