.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的问题了