线上debug&gateway自定义路由规则

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【10月更文挑战第20天】本文介绍了线上调试和网关自定义路由规则的配置方法。线上调试部分涵盖日志记录、远程调试等内容,包括如何设置详细的日志级别、添加自定义日志信息以及使用ELK堆栈进行日志分析。网关自定义路由规则部分则讲解了Spring Cloud Gateway和Kong中基于路径、请求头、请求参数等条件的路由配置方法。

一、线上 Debug


(一)日志记录


  1. 详细日志级别设置
  • 在应用程序的配置文件(如appsettings.json)中,将日志级别设置为DebugTrace,这样可以捕获更多详细的信息。例如,在一个ASP.NET Core 应用中,可以这样设置:


{
       "Logging": {
           "LogLevel": {
               "Default": "Debug",
               "Microsoft": "Debug",
               "Microsoft.Hosting.Lifetime": "Debug"
           }
       }
   }


  • 对于不同的日志框架(如SerilogNLog等),也有相应的配置方式来调整日志级别。以Serilog为例,可以在配置文件中指定最小日志级别和输出目标:


{
       "Serilog": {
           "MinimumLevel": {
               "Default": "Debug"
           },
           "WriteTo": [
               {
                   "Name": "Console"
               }
           ]
       }
   }


  1. 添加自定义日志信息
  • 在代码中,使用日志记录接口(如ILogger接口)添加自定义的日志消息。例如,在一个服务类中:


using Microsoft.Extensions.Logging;
   public class MyService
   {
       private readonly ILogger<MyService> _logger;
       public MyService(ILogger<MyService> logger)
       {
           _logger = logger;
       }
       public void DoSomething()
       {
           _logger.LogDebug("开始执行DoSomething方法");
           // 业务逻辑代码
           _logger.LogDebug("DoSomething方法执行完毕");
       }
   }


  1. 远程日志收集与分析
  • 可以使用工具如ElasticsearchLogstashKibana(ELK)组合来收集和分析日志。
  • 首先,在服务器上安装和配置Logstash,将其配置为从应用程序的日志文件或日志输出流中收集日志。例如,配置Logstash输入插件来读取本地日志文件:


input {
       file {
           path => "/var/log/myapp.log"
           start_position => "beginning"
       }
   }


  • 然后,将收集到的日志发送到Elasticsearch进行存储和索引。Logstash输出插件配置示例:


output {
       elasticsearch {
           hosts => ["http://localhost:9200"]
           index => "myapp - %{+YYYY.MM.dd}"
       }
   }


  • 最后,使用Kibana连接到Elasticsearch,通过创建仪表板和搜索查询来分析日志,查找问题线索。


(二)远程调试


  1. 配置应用程序以允许远程调试
  • 在开发环境中,确保应用程序是在调试模式下构建的。对于.NET 应用程序,在项目属性的 “调试” 选项卡中,启用调试选项。
  • 在服务器上,打开必要的防火墙端口(通常是4022用于.NET 远程调试),并配置应用程序以允许远程调试。在ASP.NET Core 应用中,可以在launchSettings.json文件中添加远程调试配置。例如:


{
       "profiles": {
           "MyApp": {
               "commandName": "Project",
               "dotnetRunMessages": "true",
               "launchBrowser": true,
               "applicationUrl": "http://localhost:5000",
               "environmentVariables": {
                   "ASPNETCORE_ENVIRONMENT": "Development"
               },
               "inspectUri": "http://localhost:5000/debug"
               // 添加远程调试相关设置
               "remoteDebugging": {
                   "enabled": true,
                   "port": 4022
               }
           }
       }
   }


  1. 使用远程调试工具连接到服务器应用程序
  • 在本地开发机器上,使用支持远程调试的工具(如 Visual Studio 或 Visual Studio Code)。
  • 在 Visual Studio 中,通过 “调试”->“附加到进程” 菜单选项,在 “连接类型” 中选择 “远程(无身份验证)” 或 “远程(Windows 身份验证)”,并输入服务器的 IP 地址和端口号来建立连接。
  • 在 Visual Studio Code 中,需要安装适当的调试扩展(如.NET Core调试扩展),然后在调试配置文件(.vscode/debug.json)中设置远程调试参数,包括服务器的 IP 地址、端口号和应用程序的路径等信息。


二、Gateway 自定义路由规则


(一)在 Spring Cloud Gateway 中自定义路由规则


  1. 基于路径的路由规则
  • 最简单的路由规则是基于路径的。在application.ymlapplication.properties配置文件中,可以定义如下路由:


spring:
     cloud:
       gateway:
         routes:
           - id: my_route
             uri: http://backend-service-url
             predicates:
               - Path=/api/**


  • 上述配置定义了一个名为my_route的路由,当请求路径以/api/开头时,将请求转发到http://backend - service - url


  1. 基于请求头的路由规则
  • 可以根据请求头中的信息来定义路由。例如,根据用户的身份(通过自定义的User - Role请求头)来路由到不同的后端服务:


spring:
     cloud:
       gateway:
         routes:
           - id: admin_route
             uri: http://admin - backend - service - url
             predicates:
               - Header=User - Role, admin
           - id: user_route
             uri: http://user - backend - service - url
             predicates:
               - Header=User - Role, user


  1. 基于请求参数的路由规则
  • 如果请求包含特定的参数,也可以定义路由。例如,当请求中包含version=v2参数时,将请求路由到特定的服务版本:


spring:
     cloud:
       gateway:
         routes:
           - id: v2_route
             uri: http://v2 - backend - service - url
             predicates:
               - Query=version, v2


  1. 组合多种条件的路由规则
  • 可以将路径、请求头、请求参数等多种条件组合起来定义复杂的路由规则。例如:


spring:
     cloud:
       gateway:
         routes:
           - id: complex_route
             uri: http://complex - backend - service - url
             predicates:
               - Path=/api/complex/**
               - Header=Authorization, Bearer.*
               - Query=feature, enabled


  • 上述路由规则要求请求路径以/api/complex/开头、请求头包含Authorization且值以Bearer开头、请求参数包含feature且值为enabled时才会将请求转发到http://complex - backend - service - url


(二)在其他网关(如 Kong)中自定义路由规则


  1. 使用 Kong 的 API 进行路由配置
  • Kong 是一个流行的开源 API 网关。可以通过 Kong 的管理 API 来配置路由。首先,需要安装和启动 Kong,并配置好与后端服务的连接。
  • 假设已经有一个后端服务在http://backend - service - url,可以通过以下 API 调用创建一个路由:


curl -X POST http://kong - host:8001/services/ \
       -d "name=my - service" \
       -d "url=http://backend - service - url"
   curl -X POST http://kong - host:8001/services/my - service/routes/ \
       -d "paths[]=/api/*"


  • 上述命令首先创建了一个名为my - service的服务,将其与后端服务http://backend - service - url关联,然后为该服务创建了一个路由,当请求路径以/api/开头时,将请求转发到关联的后端服务。


  1. 使用 Kong 的插件来增强路由规则
  • Kong 提供了多种插件来增强路由功能。例如,request - transformer插件可以用于修改请求头、请求体或请求参数。
  • 假设要在路由请求时添加一个自定义请求头,可以通过以下步骤配置:
  • 安装request - transformer插件:


curl -X POST http://kong - host:8001/services/my - service/plugins/ \
       -d "name=request - transformer" \
       -d "config.add.headers=My - Custom - Header: custom - value"


  • 这样,当请求通过该路由转发时,会添加一个名为My - Custom - Header的请求头,其值为custom - value
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
5月前
|
Java Spring
Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂RoutePredicateFactory
Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂RoutePredicateFactory
85 0
|
3月前
|
Java 微服务 Spring
SpringCloud gateway自定义请求的 httpClient
SpringCloud gateway自定义请求的 httpClient
156 3
|
5月前
|
JSON 安全 关系型数据库
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
|
Java Spring
springcloud gateway sential 限流 自定义参数限流执行顺序问题
springcloud gateway sential 限流 自定义参数限流执行顺序问题
148 1
|
JSON Java 数据格式
Spring Cloud Gateway-自定义异常处理
我们平时在用SpringMVC的时候,只要是经过DispatcherServlet处理的请求,可以通过@ControllerAdvice和@ExceptionHandler自定义不同类型异常的处理逻辑,具体可以参考ResponseEntityExceptionHandler和DefaultHandlerExceptionResolver,底层原理很简单,就是发生异常的时候搜索容器中已经存在的异常处理器并且匹配对应的异常类型,匹配成功之后使用该指定的异常处理器返回结果进行Response的渲染,如果找不到默认的异常处理器则用默认的进行兜底。
731 0
Spring Cloud Gateway-自定义异常处理
|
缓存 JSON Java
【Java】SpringCloud Gateway自定义过滤器中获取ServerHttpRequest的body中的数据为NULL的问题
【Java】SpringCloud Gateway自定义过滤器中获取ServerHttpRequest的body中的数据为NULL的问题
539 0
SpringCloud学习(十七):Gateway网关的自定义全局GlobalFilter
虽然官方为Gateway提供了很多filter,但其实并不使用,我们更多的还是使用自己的配置。 在9527网关模块中新建一个filter包,在里面写一个类来实现自定义filter
218 0
SpringCloud学习(十七):Gateway网关的自定义全局GlobalFilter
|
负载均衡 Java Nacos
Gateway 自定义路由断言|学习笔记
快速学习 Gateway 自定义路由断言
269 0
|
JSON Java API
Gateway整合sentineI限流返回自定义提示|学习笔记
快速学习Gateway整合sentineI限流返回自定义提示
|
网络协议 应用服务中间件 nginx
浏览器debug 调试一打开 Nginx 就 504 Gateway Time-out
浏览器debug 调试一打开 Nginx 就 504 Gateway Time-out
296 0
浏览器debug 调试一打开 Nginx 就 504 Gateway Time-out