首页 > 极客资料 博客日记
线上debug&gateway自定义路由规则
2024-10-22 17:00:04极客资料围观18次
文章线上debug&gateway自定义路由规则分享给大家,欢迎收藏极客之家,专注分享技术知识
- 如何进行线上debug。
- 如何在gateway自定义路由规则去进行请求分发,让请求打到集群模式下我们想要的节点。
1.配置remote debug
1.在启动参数配置参数:
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6364
2.新建remote
3.启动remote
2.gateway改造
我个人的需求是把某个用户的请求,打到我想要的节点(开启了debug模式的节点),避免因为集群节点的负载导致请求打到其他节点,也避免影响其他用户的正常请求流程。
我的做法是拦截请求投中的Authorization=xxx进行判断,因此参考了gateway的路由策略:
gateway 路由匹配策略
而gateway自带的路由策略是通过regix(正则匹配)来实现的,因此我做了以下改造:
1.新增HeaderValueRoutePredicateFactory
public class HeaderValueRoutePredicateFactory extends AbstractRoutePredicateFactory<HeaderValueRoutePredicateFactory.Config> {
private static final String KEY_1 = "headerName";
private static final String KEY_2 = "headerValue";
public HeaderValueRoutePredicateFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList(KEY_1, KEY_2);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return new GatewayPredicate() {
@Override
public boolean test(ServerWebExchange exchange) {
List<String> values = exchange.getRequest().getHeaders().getOrDefault(config.getHeaderName(),
Collections.emptyList());
if (values.isEmpty()) {
return false;
}
boolean match = values.stream().allMatch(item -> item.equals(config.getHeaderValue()));
if (match) {
log.info("debug模式route策略已触发");
}
return match;
}
@Override
public Object getConfig() {
return config;
}
@Override
public String toString() {
return String.format("HeaderName: %s headerValue=%s", config.getHeaderName(), config.getHeaderValue());
}
};
}
public static class Config {
private String headerName;
private String headerValue;
public String getHeaderName() {
return headerName;
}
public Config setHeaderName(String headerName) {
this.headerName = headerName;
return this;
}
public String getHeaderValue() {
return headerValue;
}
public Config setHeaderValue(String headerValue) {
this.headerValue = headerValue;
return this;
}
}
}
代码笔记:
- 获取系统缓存路由策略(可以看网关中配置的全部策略)
org.springframework.cloud.gateway.route.CachingRouteLocator#getRoutes - 获取路由策略(根据请求条件匹配)
org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping#getHandlerInternal - 获取路由策略(根据请求条件匹配)
org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping#lookupRoute
2.配置类
@Configuration
public class Config {
@Bean
public HeaderValueRoutePredicateFactory headerValueRoutePredicateFactory() {
return new HeaderValueRoutePredicateFactory();
}
}
3.修改gateway配置
spring:
cloud:
gateway:
routes:
# 当请求头中带有Authorization=ff4a4ce5-5276-4263-b817-34d1ce553421切路径为/ims/**会被该规则路由
- id: ims
uri: lb://ims
predicates:
- Path=/ims/**
filters:
- StripPrefix=1
# 当请求头中带有Authorization=ff4a4ce5-5276-4263-b817-34d1ce553421切路径为/ims/**会被该规则路由
- id: ims-debug
uri: lb://ims-debug
# 配置-1是为了让该路由策略在id: ims 前面进行判断,否则会触发id=ims的路由策略,不会触发id=ims-debug的路由策略
order: -1
predicates:
- Path=/ims/**
- HeaderValue=Authorization,ff4a4ce5-5276-4263-b817-34d1ce553421
filters:
- StripPrefix=1
3.nacos配置
1.正常的节点配置
-Dspring.application.name=ims
2.debug的节点配置
-Dspring.application.name=ims-debug
本质上ims和ims-debug是同一服务,只是服务名不同,区分开是为了方便路由
4.其他问题
- 正常情况下,如果是生产环境,ims-debug服务即使开启了debug模式,但会因为网络问题导致办公网的本地无法进行连接。这种情况我们可以让运维申请跳板机、VPN来对接专用网络,另外debug的对外端口也要申请好。
- 我在网上还看到其他的线上debug方式 点击跳转他人链接,因此我这种方式未必适合所有人(但是都没有考虑集群下请求如果不进入当前节点的问题),本人只是折中。
- 即使你学会了也没什么用,正常情况下不会让开发者进行线上debug。作者本人也只是心血来潮。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”