线上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。作者本人也只是心血来潮。
线上debug&gateway自定义路由规则的更多相关文章
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- 网关服务自定义路由规则(springcloud+nacos)
1. 场景描述 需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了 ...
- CI 框架中的自定义路由规则
在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...
- Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...
- vs2017 mvc 自定义路由规则 出现 404.0 错误代码 0x80070002
自定义: WebApiConfig 里面最后增加 config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttp ...
- zuul 自定义路由规则
1,zuul的maven配置 <!--spring cloud 相关包--><parent> <groupId>org.springframework.boot&l ...
- MVC 自定义路由规则
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...
- MVC之路由规则 (自定义,约束,debug)
自定义路由规则的要求,小范围写在前,大范围写在后.路由规则可以注册多条,路由规则的名称不能重复路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后.路由规则可以设置约束 即正则表达式路 ...
- 微服务实战系列(八)-网关springcloud gateway自定义规则
1. 场景描述 先说明下项目中使用的网关是:springcloud gateway, 因需要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路 ...
- ASP.NET MVC路由规则
1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Defau ...
随机推荐
- 为什么我要弃用华为的软件产品——mindspore从入门到放弃之感想
从本博主前段时间的博文就可以看到博主写了好多关于华为软件mindspore的入门资料和编译方法以及一些bug的修复,但是无奈之下发现这些简单而且显而易见的bug不仅长期存在与软件中而且在提交PR后而一 ...
- boulanni / theano-hf
https://github.com/boulanni/theano-hf https://people.duke.edu/~hpgavin/ExperimentalSystems/lm.pdf ht ...
- 如何在WSL2中安装可执行编译.cu文件的cuda环境
参考nvidia官方文档: https://docs.nvidia.com/cuda/wsl-user-guide/index.html#installing-insider-preview-buil ...
- 从数据到洞察:DataOps加速AI模型开发的秘密实践大公开!
作者 | 代立冬,白鲸开源科技联合创始人&CTO 引言 在AI驱动的商业世界中,DataOps作为连接数据与洞察的桥梁,正迅速成为企业数据战略的核心. 在WOT全球技术创新大会2024·北京站 ...
- 社区6月月报 | Apache SeaTunnel重要更新与优化记录
各位热爱Apache SeaTunnel的小伙伴们,社区6月份月报来啦!这里将记录Apache SeaTunnel社区每月的重要更新,欢迎关注. 月度Merge Stars 感谢以下小伙伴上个月为Ap ...
- Floyd判联通(传递闭包) & poj1049 sorting it all out
Floyd判联通(传递闭包) Floyd传递闭包顾名思义就是把判最短路的代码替换成了判是否连通的代码,它可以用来判断图中两点是否连通.板子大概是这个样的: for(int k=1; k<=n; ...
- CANopen学习笔记(一)CANopen入门
CANOpen入门 定位:小网络,控制信号的实时通讯 确保实时性采取的措施 ID域:11bit(CAN标准帧格式) 控制报文采用数据最小字节数 采用生产消费模型(数据无需应答) 需要应答时,采用快 ...
- 防止npm被墙的小技巧
方法一: 全局安装中国服务器的包管理工具 npm i cnpm --global 下载包的时候用cnpm取代npm 方法二: 在小黑板输入:npm config set registry https: ...
- 合合信息旗下启信宝与鹏城实验室达成数据托管合作,“AI靶场”让数据管理更精准
合合信息旗下启信宝与鹏城实验室达成数据托管合作,"AI靶场"让数据管理更精准 数字经济时代,数据已成为新型生产要素.通过"数据托管"等形式对数据进行集中管理 ...
- 合合信息亮相新加坡科技周——Big Data & AI World Expo展示AI驱动文档数字化的前沿能力
合合信息亮相新加坡科技周--Big Data & AI World Expo展示AI驱动文档数字化的前沿能力 展会规模背景: 2023年10月11日-12日,合合信息在TECH WEEK ...