天津储鑫盛钢材现货供应商 发表于 2024-10-22 15:41:12

线上debug&gateway自界说路由规则


[*]如何举行线上debug。
[*]如何在gateway自界说路由规则去举行请求分发,让请求打到集群模式下我们想要的节点。
https://img2024.cnblogs.com/blog/1537140/202410/1537140-20241022150611327-2071593339.png1.配置remote debug

1.在启动参数配置参数:
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6364https://img2024.cnblogs.com/blog/1537140/202410/1537140-20241022121145247-51679585.png2.新建remote
https://img2024.cnblogs.com/blog/1537140/202410/1537140-20241022145701452-1689666113.png
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=13.nacos配置

1.正常的节点配置
-Dspring.application.name=ims2.debug的节点配置
-Dspring.application.name=ims-debug本质上ims和ims-debug是同一服务,只是服务名不同,区分开是为了方便路由
4.其他题目


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 线上debug&gateway自界说路由规则