.NET Core API网关Ocelot(十四)【转换Claims,日志,跟踪】

Ocelot允许用户访问claims并把它们转换到头部,请求字符串参数和其他claims中.这仅在用户通过身份验证后才可用。

用户通过身份验证之后,我们运行claims转换中间件.这个中间件允许在授权中间件调用之前转换claims.当用户身份验证之后,首先会调用claims转换到头的中间件,然后调用claims转换到查询字符串的中间件,最后调用claims转换到downstream路径中间件.

执行转换的语法对于每个处理都是相同的。在Route配置中,使用特定名称AddClaimsToRequestAddHeadersToRequestAddQueriesToRequest添加一个json字典。

注意,我不是一个编程专家,所以不知道这个语法是否好…

在词典中,这些条目指定了Ocelot应该如何转换! 字典的键将成为claim,header,query parameter的键。对于ChangeDownstreamPathTemplate,还必须在DownstreamPathTemplate中指定key,以便进行转换。

条目的值将被解析成转换的逻辑.首先指定了一个字典访问器,例如Claims[CustomerId].意思是我们想访问claims并获取键为CustomerIdclaim类型.然后一个大于号(>)用于分隔.下一个条目是值或带索引器的值.如果指定了单个值,Ocelot将取该值并将其添加到变换中。如果该值有一个索引器,Ocelot将查找在另一个大于符号后面提供的分隔符。 然后,Ocelot会使用分隔符将值分开,并将所需的索引添加到转换中。

ClaimsClaims转换

下面是一个Claims到Claims转换的例子

"AddClaimsToRequest": {
    "UserType": "Claims[sub] > value[0] > |",
    "UserId": "Claims[sub] > value[1] > |"
}

这显示了Ocelot查看用户的sub声明并将其转换为UserTypeUserId声明的转换。 假设sub声明看起来像这样“usertypevalue | useridvalue”。

Claims到header的转换

下面是一个Claims到头转换的例子

"AddHeadersToRequest": {
    "CustomerId": "Claims[sub] > value[1] > |"
}

这显示了Ocelot查看用户的sub声明并将其转换为CustomerId头的转换。 假设sub声明看起来像这样“usertypevalue | useridvalue”。

Claims 到查询字符串参数的转换

下面是一个Claims到查询字符串参数转换的例子

"AddQueriesToRequest": {
    "LocationId": "Claims[LocationId] > value",
}

这显示了Ocelot查看用户的LocationId声明并将其作为发往下游服务的查询字符串参数LocationId的转换。

Claims 到Downstream路径转换

以下是将claims转换为下游路径自定义占位符的示例配置

"UpstreamPathTemplate": "/api/users/me/{everything}",
"DownstreamPathTemplate": "/api/users/{userId}/{everything}",
"ChangeDownstreamPathTemplate": {
    "userId": "Claims[sub] > value[1] > |",
}

这显示了一个转换,其中Ocelot着眼于用户userId声明,并将该值替换为DownstreamPathTemplate中指定的“ {userId}”占位符。 考虑到ChangeDownstreamPathTemplate中指定的密钥必须与DownstreamPathTemplate中指定的占位符相同。

注意:如果ChangeDownstreamPathTemplate中指定的键在DownstreamPathTemplate中不作为占位符存在,则它将在运行时失败,并在响应中返回错误。


日志

目前,Ocelot使用标准的日志记录接口ILoggerFactory / ILogger<T> 。 在IOcelotLogger / IOcelotLoggerFactory中提供了标准的asp.net core日志记录的一个实现。 因为Ocelot在日志中添加了一些额外的信息,如请求ID(如果已配置的话)。

这有个全局的错误处理程序,可以捕获所有异常并作为错误记录他们。

最后,如果日志记录设置为跟踪级别,Ocelot将记录开始,结束和任何抛出异常的中间件,这些异常可能非常有用。

不是使用标准框架的日志记录的原因是,我无法覆盖将IncludeScopes设置为true时记录的请求标识。

警告
如果您记录日志到控制台,您将获得糟糕的性能。 我遇到过很多关于Ocelot性能的问题,它始终记录调试级别的日志,并记录到控制台 😃 所以请确保您生产中记录了正确的东西 : )


跟踪

本页详细介绍如何使用Ocelot执行分布式跟踪。

OpenTracing

Ocelot提供程序从出色的OpenTracing C#项目中跟踪功能。 Ocelot集成的代码可以在这里找到。

下面的示例使用Jaeger C#客户端提供Ocelot中使用的跟踪程序。

services.AddSingleton<ITracer>(sp =>
{
    var loggerFactory = sp.GetService<ILoggerFactory>();
    Configuration config = new Configuration(context.HostingEnvironment.ApplicationName, loggerFactory);

    var tracer = config.GetTracer();
    GlobalTracer.Register(tracer);
    return tracer;
});

services
    .AddOcelot()
    .AddOpenTracing();

然后在您的ocelot.json中将以下内容添加到要跟踪的路由中。

"HttpHandlerOptions": {
      "UseTracing": true
  },

现在,当调用此路由时,Ocelot将向Jaeger发送跟踪信息。

Butterfly

Ocelot提供商从出色的Butterfly项目中跟踪功能。 Ocelot集成的代码可以在这里找到。

为了使用跟踪,请阅读Butterfly文档。

如果要跟踪路线,则在ocelot中需要执行以下操作。

Install-Package Ocelot.Tracing.Butterfly

在您的ConfigureServices方法中

services
    .AddOcelot()
    // this comes from Ocelot.Tracing.Butterfly package
    .AddButterfly(option =>
    {
        //this is the url that the butterfly collector server is running on...
        option.CollectorUrl = "http://localhost:9618";
        option.Service = "Ocelot";
    });

然后在ocelot.json文件中,添加如下配置到你想要跟随的Route中。

"HttpHandlerOptions": {
      "UseTracing": true
  },

现在,当这个Route被调用的时候,Ocelot会发送跟踪信息到Butterfly

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值