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

  • 相关阅读:
    NSURLSession 网络请求
    NSData 数据
    NSStream文件流
    NSFileManager文件管理
    NSCache 缓存
    NSUserDefaults数据存储
    NSKeyedArchiver数据归档
    子线程定时器的创建
    NSEnumerator迭代器
    NSDate 时间
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/12608288.html
Copyright © 2020-2023  润新知