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. Ubuntu Firefox浏览器播放视频报错,提示“需要安装所需的视频编码器”——解决方法:安装视频解码器

    给电脑重新做了一个Ubuntu的系统,安装系统的时候没有选择安装第三方软件,结果开机进系统打开firefox浏览器看个电影报错,提示"需要安装所需的视频编码器",效果如下: 解决方 ...

  2. 【转载】python的魔法方法———A Guide to Python's Magic Methods

    原文地址: https://rszalski.github.io/magicmethods/ ===================================================== ...

  3. .NET静态代码编织——肉夹馍(Rougamo)4.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件.相比动态代理AOP需要在应用启动时进行初始化,编译时完成代码编织的肉夹馍减少 ...

  4. Kruskal和Prim模板

    例题:P3366 [模板]最小生成树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Kruskal #include <bits/stdc++.h> #define d ...

  5. java_类方法&对象方法

    int new; 类方法 不能写入和访问其中的对象属性 可以直接通过类调用 通过类调用类方法,没有具体的对象, 所以 不可以访问对象属性, 但是可以访问类属性 public static void d ...

  6. Feign 动态设定服务器名称 与 调用接口

    1. 新增编码器(由于使用了动态的Feign,所以不能像正常使用Feign一样指定configuration配置编码器) import feign.RequestTemplate; import fe ...

  7. 性能、成本与 POSIX 兼容性比较: JuiceFS vs EFS vs FSx for Lustre

    JuiceFS 是一款为云环境设计的分布式高性能文件系统.Amazon EFS 易于使用且可伸缩,适用于多种应用.Amazon FSx for Lustre 则是面向处理快速和大规模数据工作负载的高性 ...

  8. k8s 知识

    命令 Pod 管理 kubectl get pods 查看pod在哪个node上 kubectl get pods -o wide kubectl describe pod pod_name 创建新的 ...

  9. sicp每日一题[1.42]

    Exercise 1.42 Let f and g be two one-argument functions. The composition f after g is defined to be ...

  10. wxpython开发gui界面基础

    wxpython 开发gui 基础知识 一 .前言 记录使用wxpython开发gui工具吧.gui界面主要就是先布局,每个模块都是一个对象. 二.基础知识 import wx class MyFra ...