.net core统一认证学习笔记(一)ocelot分析
这一节分析了ocelot的源码,并从功能角度分析这个组件实现了哪些功能,哪些功能没有。
根据文章所述,授权、限流、缓存都没有做好,不过这些功能对于刚刚接触这些的我来说,其实斌不怎么了解。
关于ocelot的代码分析,我也把代码下了下来。
组件注册
代码入口依然是UseOcelot函数,沿着函数可以比较容易的找到BuildOcelotPipeline调用,也就是构造这个组件的pipeline。
这个组件注册自身的时候,并没有调用下一个组件:
builder.Use(async (context, task) =>
{
var downstreamContext = new DownstreamContext(context);
await firstDelegate.Invoke(downstreamContext);
});
这里task是下一个组件,而这个组件直接将其短路,或许这也是路由的作用吧,只做转发,在之后不应该有其他功能?
组件入口
看一下组件入口的firstDelegate是什么:
var pipelineBuilder = new OcelotPipelineBuilder(builder.ApplicationServices);
pipelineBuilder.BuildOcelotPipeline(pipelineConfiguration);
var firstDelegate = pipelineBuilder.Build();
而pipelineBuilder.Build();又是:
public OcelotRequestDelegate Build()
{
OcelotRequestDelegate app = context =>
{
context.HttpContext.Response.StatusCode = 404;
return Task.CompletedTask;
};
foreach (var component in _middlewares.Reverse())
{
app = component(app);
}
return app;
}
这里的_middlewares就是之前pipelineBuilder.BuildOcelotPipeline(pipelineConfiguration);时,添加的各种中间件。
最后返回的app,是将所有组件倒序叠加,返回的一个正序的delegate链,链的第一个处理函数就是第一个注册的中间件,最后一个也就是这个Build函数中定义的返回404的函数。
这个做法似乎也与.net core的流水线构造方式类似。
ocelot的pipeline
pipeline的搭建在BuildOcelotPipeline中,代码不粘贴了,是以UseXXX格式搭建的一个个组件。
这篇教程中,单独介绍的是流量控制UseRateLimiting组件,于是可以跟踪到ClientRateLimitMiddleware的Invoke方发中。
看到组件的限流基本识别特定客户端,然后从内存中统计一定时间内的请求次数
编译版本问题
在下载ocelot代码编译时,发现我的vs2019编译失败,找不到.net的sdk。
我明明安装了dotnet 2.2,但是在这个Ocelot的项目配置中,只能选择到.netstandard1.6(也就是1.0的dotnet)。
折腾了半天,后来重装了.net的SDK,还是不行。
接着把ocelot .csproj文件的TargetFramework属性手工改成dotnetapp2.2(好像是这个),这时ocelot的主项目可以编译了。
不过其他项目的csproj文件,还是依赖.netstandard2.0(这也是奇怪的一个地方,targetframework可以指定.netstandard,也可以指定.net core SDK)
我发现全部都修改似乎也不应该是正确的方发
最后我将主csproj又改回了.netstandard2.0,这时vs终于能识别到了。
至此算是解决。
不过不清楚是不是vs 2019 preview的问题了

浙公网安备 33010602011771号