一、线上 Debug
(一)日志记录
- 详细日志级别设置
- 在应用程序的配置文件(如
appsettings.json
)中,将日志级别设置为Debug
或Trace
,这样可以捕获更多详细的信息。例如,在一个ASP.NET Core 应用中,可以这样设置:
{ "Logging": { "LogLevel": { "Default": "Debug", "Microsoft": "Debug", "Microsoft.Hosting.Lifetime": "Debug" } } }
- 对于不同的日志框架(如
Serilog
、NLog
等),也有相应的配置方式来调整日志级别。以Serilog
为例,可以在配置文件中指定最小日志级别和输出目标:
{ "Serilog": { "MinimumLevel": { "Default": "Debug" }, "WriteTo": [ { "Name": "Console" } ] } }
- 添加自定义日志信息
- 在代码中,使用日志记录接口(如
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方法执行完毕"); } }
- 远程日志收集与分析
- 可以使用工具如
Elasticsearch
、Logstash
和Kibana
(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
,通过创建仪表板和搜索查询来分析日志,查找问题线索。
(二)远程调试
- 配置应用程序以允许远程调试
- 在开发环境中,确保应用程序是在调试模式下构建的。对于.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 } } } }
- 使用远程调试工具连接到服务器应用程序
- 在本地开发机器上,使用支持远程调试的工具(如 Visual Studio 或 Visual Studio Code)。
- 在 Visual Studio 中,通过 “调试”->“附加到进程” 菜单选项,在 “连接类型” 中选择 “远程(无身份验证)” 或 “远程(Windows 身份验证)”,并输入服务器的 IP 地址和端口号来建立连接。
- 在 Visual Studio Code 中,需要安装适当的调试扩展(如
.NET Core调试
扩展),然后在调试配置文件(.vscode/debug.json
)中设置远程调试参数,包括服务器的 IP 地址、端口号和应用程序的路径等信息。
二、Gateway 自定义路由规则
(一)在 Spring Cloud Gateway 中自定义路由规则
- 基于路径的路由规则
- 最简单的路由规则是基于路径的。在
application.yml
或application.properties
配置文件中,可以定义如下路由:
spring: cloud: gateway: routes: - id: my_route uri: http://backend-service-url predicates: - Path=/api/**
- 上述配置定义了一个名为
my_route
的路由,当请求路径以/api/
开头时,将请求转发到http://backend - service - url
。
- 基于请求头的路由规则
- 可以根据请求头中的信息来定义路由。例如,根据用户的身份(通过自定义的
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
- 基于请求参数的路由规则
- 如果请求包含特定的参数,也可以定义路由。例如,当请求中包含
version=v2
参数时,将请求路由到特定的服务版本:
spring: cloud: gateway: routes: - id: v2_route uri: http://v2 - backend - service - url predicates: - Query=version, v2
- 组合多种条件的路由规则
- 可以将路径、请求头、请求参数等多种条件组合起来定义复杂的路由规则。例如:
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)中自定义路由规则
- 使用 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/
开头时,将请求转发到关联的后端服务。
- 使用 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
。