.net core统一认证学习笔记(一)ocelot分析

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组件,于是可以跟踪到ClientRateLimitMiddlewareInvoke方发中。
看到组件的限流基本识别特定客户端,然后从内存中统计一定时间内的请求次数

编译版本问题

在下载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的问题了

posted @ 2020-03-31 21:00  mosakashaka  阅读(302)  评论(0编辑  收藏  举报