Spring Cloud Zuul 获取当前请求的路由信息和路由后端的服务节点信息
基本思路
参考spring-cloud-zuul-ratelimit开源项目,在过滤器中根据当前的请求路径,判断当前的路由信息,当取得路由信息后,可以对服务的调用次数做统计等操作。
具体实现
创建一个AbstractRouteFilter
public abstract class AbstractRouteFilter extends ZuulFilter {
private final RouteLocator routeLocator;
private final UrlPathHelper urlPathHelper;
AbstractRouteFilter(RouteLocator routeLocator,UrlPathHelper urlPathHelper){
this.routeLocator = routeLocator;
this.urlPathHelper = urlPathHelper;
}
//核心逻辑,获取请求路径,利用RouteLocator返回路由信息
protected Route route(HttpServletRequest request){
String requestURI = urlPathHelper.getPathWithinApplication(request);
return routeLocator.getMatchingRoute(requestURI);
}
}
使用时,继承AbstractRouteFilter即可,下面演示一个服务调用次数的过滤器示例
示例
public class RouteTimesFilter extends AbstractRouteFilter {
public RouteTimesFilter(RouteLocator routeLocator, UrlPathHelper urlPathHelper) {
super(routeLocator,urlPathHelper);
}
@Override
public String filterType() {
//可以根据业务要求,修改过滤器类型
return "post";
}
@Override
public int filterOrder() {
//过滤器顺序
return 0;
}
@Override
public boolean shouldFilter() {
//可以根据业务要求,过滤相关路由
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
Route route = route(ctx.getRequest());
//获取到路由信息,就可以做想要做的事了
System.out.println(route);
return null;
}
}
配置过滤器
@Component
public class ZuulFilterConfig {
@Bean
public ZuulFilter routeTimesFilter(RouteLocator routeLocator){
return new RouteTimesFilter(routeLocator,new UrlPathHelper());
}
}
路由到后端的服务节点信息
/**
* 打印目标节点地址
* @param logMap
* @param ctx
*/
private void printTargetUri(Map<String, Object> logMap,RequestContext ctx) {
//打印targetUri
if((Boolean) ctx.get("isSuccess")){
RibbonHttpResponse ribbonHttpResponse = (RibbonHttpResponse)ctx.get("zuulResponse");
URI uri=null;
try {
//反射获取私有成员变量
RibbonApacheHttpResponse ribbonApacheHttpResponse = (RibbonApacheHttpResponse)ReflectionUtils.
getPrivateField(ribbonHttpResponse,"response");
uri = ribbonApacheHttpResponse.getRequestedURI();
logger.info("targetUri:"+uri);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}catch (IllegalAccessException ie){
ie.printStackTrace();
}
}
}
Spring Cloud Zuul 获取当前请求的路由信息和路由后端的服务节点信息的更多相关文章
- 服务网关Spring Cloud Zuul
Spring Cloud Zuul 开发环境 idea 2019.1.2 jdk1.8.0_201 Spring Boot 2.1.9.RELEASE Spring Cloud Greenwich S ...
- Spring Cloud Zuul API服务网关之请求路由
目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 通过前几篇文章的介绍,我们了解了Spring Cloud ...
- Spring Cloud Zuul路由规则动态更新
背景 Spring Cloud Zuul 作为微服务的网关,请求经过zuul路由到内部的各个service,由于存在着新增/修改/删除服务的路由规则的需求,zuul的路由规则的动态变更功能 提供了 ...
- spring cloud: zuul: 微网关-简单使用与路由配置
spring cloud: zuul: 微网关-简单使用与路由配置 首先引入依赖 <dependency> <groupId>org.springframework.cloud ...
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- 笔记:Spring Cloud Zuul 快速入门
Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...
- Spring Cloud Zuul 限流详解(附源码)(转)
在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...
- Spring Cloud Zuul 中文文件上传乱码
原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...
- Spring Cloud Zuul 快速入门
Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...
- Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
前面已经介绍了很多zuul的功能,本篇继续介绍它的另一大功能.在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选 ...
随机推荐
- vue3中mixins的使用
vue3-mixins 在开发的过程中我们会遇见相同或者相似的逻辑代码. 可以通过vue的 mixin 功能抽离公共的业务逻辑, 然后通过impor再组件中引入.通过mixins注册进来. 这样我们就 ...
- IConfigurationSectionHandler 接口的用法
今天终于花了点时间了解一下IConfigurationSectionHandler 接口的用法 ,引以入门.首先建立一 RobsunConfigSectionHandler 专案,代码如下 : nam ...
- 21.11 Python 使用CRC图片去重
使用CRC32还可实现图片去重功能,如下FindRepeatFile函数,运行后通过对所有文件做crc校验并将校验值存储至CatalogueDict字典内,接着依次提取CRC特征值并将其存储至Cata ...
- MySQL 之高级命令(精简笔记)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...
- dropzone基本使用
dropzone是一个实现拖拽上传文件的一个插件. 生成拖拽区域 1 <div style="width: 1078px;margin: 0 auto;border: 2px ligh ...
- ABC 317 A - G
ABC 317 A - G 代码去 Atcoder 全部提交搜索 Std_Code 查看代码 懒人专用 A $ p_i $ 升序,找最小的 $ i $ 满足 $ p_i + h \ge x $ 直接枚 ...
- mysql 索引优化 explain,复合索引,联合索引,优化 user_base 和 log_login 实战
本节是关于MySQL的复合索引相关的知识,两个或更多个列上的索引被称作复合索引,本文主要介绍了mysql 联合索引生效的条件及失效的条件 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可 ...
- 关于 javax.validation.constraints 的测试,以后用到的 会继续补充
参见:https://www.cnblogs.com/xiaogangfan/p/5987659.html 1.@Size注解测试:
- raise的研究发现,弄懂,try except 一定要raise 否则非常不利于调试。
现在很多人 都反应 下载订单后 提示下载成功,但是 软件中却没有这个订单,经过研究发现 原因是我用了 try except end; 这个结构导致的,当订单下载过程中 遇到错误的 时候,程序 没有 ...
- IIS的基本安装和配置
实验介绍:IIS的作用 IIS是web服务器中常见的一种.当客户端想访问某个域名时,向web服务器发出请求.web服务器返回网页的代码做出回应.客户端解析代码生成网页. 一:安装IIS 1.打开一台w ...