1. 如何进行线上debug。
  2. 如何在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.其他问题

  1. 正常情况下,如果是生产环境,ims-debug服务即使开启了debug模式,但会因为网络问题导致办公网的本地无法进行连接。这种情况我们可以让运维申请跳板机、VPN来对接专用网络,另外debug的对外端口也要申请好。
  2. 我在网上还看到其他的线上debug方式 点击跳转他人链接,因此我这种方式未必适合所有人(但是都没有考虑集群下请求如果不进入当前节点的问题),本人只是折中。
  3. 即使你学会了也没什么用,正常情况下不会让开发者进行线上debug。作者本人也只是心血来潮。

线上debug&gateway自定义路由规则的更多相关文章

  1. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  2. 网关服务自定义路由规则(springcloud+nacos)

    1. 场景描述 需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了 ...

  3. CI 框架中的自定义路由规则

    在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...

  4. Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂

    在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...

  5. vs2017 mvc 自定义路由规则 出现 404.0 错误代码 0x80070002

    自定义: WebApiConfig  里面最后增加 config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttp ...

  6. zuul 自定义路由规则

    1,zuul的maven配置 <!--spring cloud 相关包--><parent> <groupId>org.springframework.boot&l ...

  7. MVC 自定义路由规则

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...

  8. MVC之路由规则 (自定义,约束,debug)

    自定义路由规则的要求,小范围写在前,大范围写在后.路由规则可以注册多条,路由规则的名称不能重复路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后.路由规则可以设置约束 即正则表达式路 ...

  9. 微服务实战系列(八)-网关springcloud gateway自定义规则

    1. 场景描述 先说明下项目中使用的网关是:springcloud gateway, 因需要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路 ...

  10. ASP.NET MVC路由规则

    1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Defau ...

随机推荐

  1. 【转载】 推荐算法之Thompson(汤普森)采样

    原文地址: https://www.cnblogs.com/gczr/p/11220187.html ------------------------------------------------- ...

  2. 9组-Alpha冲刺-6/6

    一.基本情况 队名:不行就摆了吧 组长博客: https://www.cnblogs.com/Microsoft-hc/p/15546711.html 小组人数: 8 二.冲刺概况汇报 张伟鹏 过去两 ...

  3. 【问题解决】git status中文文件名乱码

    问题复现 解决办法 在git bash中直接执行如下命令 git config --global core.quotepath false 原因 通过 git config --help 可以查看到以 ...

  4. SMU Summer 2023 Contest Round 4

    SMU Summer 2023 Contest Round 4 A. Telephone Number 满足第一个8后面存在10个字符即可 #include <bits/stdc++.h> ...

  5. PHP转Go系列 | ThinkPHP与Gin框架之打造基于WebSocket技术的消息推送中心

    大家好,我是码农先森. 在早些年前客户端想要实时获取到最新消息,都是使用定时长轮询的方式,不断的从服务器上获取数据,这种粗暴的骚操作实属不雅.不过现如今我也还见有人还在一些场景下使用,比如在 PC 端 ...

  6. 微服务开发手册之GRPC 荐

    GRPC是一个高性能.通用的开源RPC框架,基于HTTP/2协议标准和Protobuf序列化协议开发,支持众多的开发语言. @[TOC] 1 简介 在GRPC框架中,客户端可以像调用本地对象一样直接调 ...

  7. springcloud经验

    >  码云地址:https://gitee.com/lpxs/lp-springcloud.git >  有问题可以多沟通:136358344@qq.com. 架构演化的步骤 在确定使用S ...

  8. Microsoft Build 2023 After Party (Placeholder)

    一年过去了,微软BUILD又回来了! https://build.microsoft.com/en-US/home This is a placeholder page for Microsoft B ...

  9. Axure 0基础实战入门 模拟一个app页面

    Axure 0基础实战入门 模拟一个app页面 第一次接触axure9,尝试模拟一个app页面与交互 页面原型 我选择了一个免费的日程app,下载rp文件后导入到axure 模拟实现登录页面 新建两个 ...

  10. 【测试平台开发】——02Vue前端框架实战—router路由设计(登录页面)

    一.安装vue-cli Mac系统: sudo npm install -g vue-cli 检查是否安装好: vue -V 二.创建新项目 1.打开Vue项目管理器 输入命令: vue ui 但是没 ...