【发布时间】:2017-01-20 08:06:00
【问题描述】:
我正在使用 ASP.NET Core Web api 创建一个微服务架构。所有的服务都是相互解耦的,可以部署在不同的环境中。每个服务都有自己的日志记录。当请求流经这些服务时,任何服务都可能失败,我们需要一种将一系列事件追溯到源头的方法,即使这意味着要遍历多个服务。
因此,为了处理这个问题,发起请求的服务会创建一个 CorrelationId 并将其传递给下一个服务。第二服务将其传递给第三服务,依此类推。如果发生异常,相应的服务会将异常消息与 CorrelationId 一起记录。
我想知道服务调用者传递相关 ID 的最佳位置是什么?
调用者应该在 HttpHeader 中传递相关 ID 还是应该将其作为部分方法参数传递,如下所示
这是被调用的服务
public class RequestDTO
{
public string CorrelationId {get;set;}
public string SomeOtherData {get;set;}
}
public Service2Controller:Controller
{
public Task<in> DoSomething(RequestDTO request)
{
// add the correlationid in current request Items collection
// So global exception handling can access it and log it
// along with the exception
HttpContext.Items.Add("CorrelationId", request.CorrelationId);
}
}
在上述方法中,如果在调用此方法之前出现异常,则 CorrelationId 将无法用于全局异常处理程序进行日志记录。
有什么建议吗?或替代方法
【问题讨论】:
-
自定义标头很常见,因为它在反序列化等过程中绕过了问题。但是,为什么不也将它也传递到有效负载中。没有理由不能两者兼得。
-
@TomRedfern 是
typical将自定义数据添加到 http 标头吗? -
@TomRedfern 每个服务都可以部署到不同类型的环境中。我担心将自定义数据添加到 http 标头中可能会被主机服务器拒绝。托管服务器通常会检查未知标头吗?
-
我还没有遇到无法处理自定义标头的 http 服务器。我们在我们的解决方案中使用自定义标头,其中包含用 java 和 .net 编写的服务,中间带有 jboss fuse。
标签: microservices asp.net-core-webapi