.NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

前言    

  最近一直在忙公司和私下的兼职,白天十个小时,晚上四个小时,感觉每天都是打了鸡血似的,精神满满的,连自己那已经学打酱油的娃都很少关心,也有很长一段时间没有更新博客了,特别抱歉,小伙伴们都等得想取关了吧!哈哈,开个玩笑,这里十分感谢小伙伴们一直以来的关注和支持。

  还有不到半个月的时间,猪年就要到来,在这里先提前祝大家猪年吉祥,愿君身体健康,福寿绵长,吉祥如意,财源滚滚,心想事成,万事顺利,新年快乐,好运平安!

640?wx_fmt=png

 

  你看这小猪多可爱,有点像麦兜!甜品先到这儿,我们一起来看本节(也是第三部分的主要思想)重点。你可能会问,怎么突然一下画风全变了,而且还多了这么多的框框和一些看不懂的图标,不急,本来笔者想直接就中间那一部分单独拎出来讲解,但确实无法让部分朋友理解,索性直接将整个微服务架构全部展现了出来。640?wx_fmt=png

 

什么是网关?

  上一篇我们通过DotNetty构建的远程RPC框架,已经实现了远程客户端的调用,使用的体验是:跟在本地调用接口一样没有任何的区别。但是,这调用是没有任何限制的,任何人、任何客户端、只要知道了服务节点地址,并通过TCP实现RPC调用,便可大大方方的、肆无惮忌的调用这些服务节点,如果就这样部署在生产环境上,是非常危险的。因此,我们需要引入“网关”这样的中间服务,来限制和管理流入的请求合法性和合规性。

  当然,这里我们提到的网关,并非物理机上的实体网关交换机(如下图所示):

640?wx_fmt=jpeg

  而是将一台服务器的部分组件,通过软件技术,实现网络管理,比如网卡(笔者曾见过一台DELL服务器上装了11块网卡),通过OSI模型进行管理,实现比如流量限制,路由转发、验证、签权等等一些列功能,所以,我们一般称之为API网关。我们看看网上的统一解释:

  API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 --百度

  通常情况下, API 网关要做很多工作,它作为一个系统的后端总入口,承载着所有服务的组合路由转换等工作,除此之外,我们一般也会把安全,限流,缓存,日志,监控,重试,熔断等放到 API 网关来做,那么可以试想在高并发的情况下,这里可能会出现一个性能瓶颈。

  另外,如果没有开源项目的支撑前提下,自己来做这样一套东西,是非常大的一个工作量,而且还要做 API 网关本身的高可用等,如果一旦做不好,有可能最先挂掉的不是你的服务节点,而就是这个API网关。

  这个时候,通常我们会去找一些开源的 API 网关项目,目前社区关于 API Gataway 的项目有以下这些:

  • Tyk:Tyk是一个开放源码的API网关,它是快速、可扩展和现代的。Tyk提供了一个API管理平台,其中包括API网关、API分析、开发人员门户和API管理面板。Try 是一个基于Go实现的网关服务。

  • Kong:Kong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行,通过插件扩展,它提供了超越核心平台的额外功能和服务。

  • Orange:和Kong类似也是基于OpenResty的一个API网关程序,是由国人开发的,学姐也是贡献者之一。

  • Netflix zuul:Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

  • apiaxle: Nodejs 实现的一个 API 网关。

  • api-umbrella: Ruby 实现的一个 API 网关。

  • ocelot: .Net平台下实现的一个API网关,其中我们的张队(张善友)也参与了此项目的开发。

本系列单从Net Core入手,所以我们只讨论Ocelot网关的作用和使用。

 

什么是Ocelot:

Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Consul集成,并且这些功能都只需要简单的配置即可完成        。

640?wx_fmt=jpeg

 

  简单的说,Ocelot是一堆的asp.net middleware组成的一个管道。当有收到请求后会用一个RequestBuilder去创建一个HttpRequestMessage发送(或请求)到下游服务器,等下游服务器返回Response后再由一个Middleware将HttpRequestMessage映射到当前请求Context中的Response上,并返回给请求者。

  这里从张队这边借用一张图,如想了解更多有关Ocelot的原理剖析,可在张队的博客中了解到更多:https://www.cnblogs.com/shanyou/p/7787183.html。当然,笔者也推荐查看官方原始API文档:https://ocelot.readthedocs.io

 

          640?wx_fmt=gif

 

Ocelot的使用结构图:

  用一台web api来作为Ocelot的宿主,在这里有一个json配置文件,里面设置了所有对当前这个网关的配置。它会接收所有的客户端请求,并路由到对应的下游服务器进行处理,再将请求结果返回。而这个上下游请求的对应关系也被称之为路由。

一起来看看官方给出的基础结构图:

640?wx_fmt=png

  在公共网络上,无论是客户端a还是客户端b,还是其他任何智能设备,通过http/https进行访问,都将经过Ocelot进行一次过滤,而这些过滤将通过Ocelot的配置文件及其简单的配置便可实现下游路由转发,然后,在通过指定的下游路由配置,请求到映射的指定服务节点上。当然,这是最只是Ocelot基础的路由转发。

 

结合IdentityServer:

  

640?wx_fmt=png

  私有网络中,不做验证的畅通访问是极不可取的、非常危险的,因此,Ocelot为我们提供了私有网络身份验证解决方案,我们可以通过跟IdentityServer进行结合,实现私有网络身份验证,当网关需要认证信息的时候会与IdentityServer服务器进行交互来完成。

 

网关的集群:

640?wx_fmt=png

 

  只有一个网关是很非常危险的,也就是我们通常所讲的单点,一旦只要它挂了,所有的服务全部挂掉,这显然无法达到高可用的目的,所以我们也可以部署多台网关,当然,这个时候在多台网关前,你还需要一台负载均衡器,用于平衡请求到网关的负载的平衡。

 

Consul服务发现:

640?wx_fmt=png

 

  在Ocelot已经支持简单的负载功能,也就是当下游服务存在多个结点的时候,Ocelot能够承担起负载均衡的作用。但是它不提供健康检查,服务的注册也只能通过手动在配置文件里面添加完成,这不够灵活并且在一定程度下会有风险,这个时候,我们就可以用Consul来做服务发现,它能与Ocelot完美的结合。

 

Ocelot的使用:

在ASP.NET Core中集成Ocelot网关

  既然Ocelot是通过Asp.net中间件进行网关管理,那么我们肯定就需要一个Asp.net作为宿主,为了演示DEMO,笔者建立了三个模板为Web API的Asp.net core项目,在其中一个asp.net core里通过nuget即可完成安装和集成Ocelot,或者命令行dotnet add package Ocelot以及通过vs2017 package manager添加Ocelot nuget引用都可以,甚至你还可以跟笔者一样喜欢全家桶系列(VS固然非常强大,甚至宇宙第一,但笔者更喜欢三大平台都一模一样的Jetbrains全家桶),用Rider的Nuget管理来安装Ocelot也可以。

640?wx_fmt=png

        

  我们把这个网关项目取名为ApiGatway,然后在这个项目的Startup中添加依赖注入和中间件,即可完成Ocelot安装和注入

640?wx_fmt=png

添加配置

  我们需要添加一个.json的文件用来添加Ocelot的配置,以下是最基本的配置信息。

640?wx_fmt=png

要特别注意一下BaseUrl是我们外部暴露的Url,比如我们的Ocelot运行在http://127.0.0.1的一个地址上(或一个端口上),但是前面有一个Nginx绑定了域名https://api.mybusiness.com,那这里我们的BaseUrl就应该是 https://api.mybusiness.com。 

将配置文件加入ASP.NET Core Configuration

  我们需要通过IWebHostBuilder将我们添加的json文件添加进Asp.net Core中

640?wx_fmt=png

Ocelot的功能配置介绍

  通过配置文件可以完成对Ocelot的功能配置:路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递等。在配置文件中包含两个根节点:ReRoutes和GlobalConfiguration。ReRoutes是一个数组,其中的每一个元素代表了一个路由,我们可以针对每一个路由进行以上功能配置。下面是一个较完整的配置文件,根据笔者的理解,并加上了详细的注释,方便初学者理解。官方路径戳这儿:https://ocelot.readthedocs.io/en/latest/features/configuration.html

{

  "ReRoutes": [

    // 路由规则配置节点,数组形式

    // 可配置多个路由协议和规则,实现路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递等

    {

      /*

       下游服务配置配置,网关出口,具体指向的服务器

       /api/values - 使用限定规则的方式配置下游PATH规则

       /{url} - 使用泛型(万用)规则方式配置下游PATH规则

       */

      "DownstreamPathTemplate": "/{url}",

      "DownstreamScheme": "http",

      "DownstreamHostAndPorts": [

        /*

        下游主机信息

        可以配置多个主机信息,已提供Ocelot路由负载均衡模式,需配合LoadBalancer节点进行路由负载均衡。

        */

        {

          "Host": "127.0.0.1",

          "Port": 5000

        },

        {

          "Host": "127.0.0.1",

          "Port": 5001

        }

      ],

      /*

       上游服务配置配置,请求和网关的入口。

       /api/values - 使用限定规则的方式配置上游PATH规则

       /{url} - 使用泛型(万用)规则方式配置上游PATH规则

       */

      "UpstreamPathTemplate": "/{url}",

      // 上游支持的http请求方法

      "UpstreamHttpMethod": [

        "Get",

        "Post",

        "Delete",

        "Update"

      ],

      // 上游域名主机

      // "UpstreamHost": "domain.com",

      // 当前路由节点的优先级

      "Priority": 99,

      /*

       路由负载均衡:

       LeastConnection – 将请求发往最空闲的那个服务器

       RoundRobin – 轮流发送

       NoLoadBalance – 总是发往第一个请求或者是服务发现

       */

      "LoadBalancer": "LeastConnection",

      "Key": "Route1",

    }

  ],

  // 限流配置(请求限流)

  // 对请求进行限流可以防止下游服务器因为访问过载而崩溃

  "RateLimitOptions": {

    // ClientWhitelist - 白名单列表

    "ClientWhitelist": [],

    // EnableRateLimiting - 是否启用限流

    "EnableRateLimiting": true,

    // Period - 统计时间段 1s, 5m, 1h, 1d

    "Period": "1s",

    // PeriodTimespan - 多少秒之后客户端可以重试

    "PeriodTimespan": 1,

    // Limit - 在统计时间段内允许的最大请求数量

    "Limit": 1,

    // Http头 X-Rate-Limit 和 Retry-After 是否禁用

    // X-Rate-Limit: 为防止滥用,你应该考虑对您的 API 限流。 例如,您可以限制每个用户 10 分钟内最多调用 API 100 次。

    // Retry-After: 响应的 HTTP 报头指示所述用户代理应该多长时间使一个后续请求之前等待

    "DisableRateLimitHeaders": false,

    // QuotaExceededMessage - 当请求过载被截断时返回的消息

    "QuotaExceededMessage": "Customize Tips!",

    // HttpStatusCode - 当请求过载被截断时返回的http status

    "HttpStatusCode": 999,

    // ClientIdHeader - 用来识别客户端的请求头,默认是 ClientId

    "ClientIdHeader": "Test"

  },

  // 熔断的意思是停止将请求转发到下游服务。

  // 当下游服务已经出现故障的时候再请求也是无功而返,并且增加下游服务器和API网关的负担。

  // 这个功能是用的Pollly来实现的,我们只需要为路由做一些简单配置即可

  "QoSOptions": {

    // ExceptionsAllowedBeforeBreaking - 允许多少个异常请求

    "ExceptionsAllowedBeforeBreaking": 3,

    // DurationOfBreak - 熔断的时间,单位为秒

    "DurationOfBreak": 5,

    // TimeoutValue - 如果下游请求的处理时间超过多少则自如将请求设置为超时

    "TimeoutValue": 5000

  },

  // 本地配置

  // 可配置多个路由协议和规则,实现服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递等

  "GlobalConfiguration": {

    // 全局基础路径

    "BaseUrl": "http://127.0.0.1:8080"

  }

}

  • Downstream:是下游服务配置

  • UpStream:是上游服务配置

  • Aggregates:服务聚合配置

  • ServiceName, LoadBalancer, UseServiceDiscovery:配置服务发现

  • AuthenticationOptions:配置服务认证

  • RouteClaimsRequirement:配置Claims鉴权

  • RateLimitOptions:为限流配置

  • FileCacheOptions:缓存配置

  • QosOptions:服务质量与熔断

  • DownstreamHeaderTransform:头信息转发

 

路由:

  ocelot的主要功能是接收传入的HTTP请求并将其转发到下游服务,不过目前只支持HTTP请求的形式(将来可能是任何传输机制,暗中窃喜,默默关注和等待吧)。ocelot将一个请求路由到另一个请求描述为路由,为了让任何请求在ocelot中工作,我们需要在配置中设置一个路由。

{    "ReRoutes": []
}

  下面这个配置信息就是将用户的请求 /post/1 转发到 localhost/api/post/1

640?wx_fmt=png

  • DownstreamPathTemplate:下游服务的路径模板,支持RESTful模板路径。

  • DownstreamScheme:下游服务协议,支持http和https。

  • DownstreamHostAndPorts:下游服务的地址和集合,用于定义要将请求转发到的任何下游服务的主机和端口,通常,这只包含一个条目,但有时您可能希望向下游服务加载负载均衡。

  • UpstreamPathTemplate: 上游也就是用户输入的请求Url模板,支持RESTful模板路径,或者设置一个空列表以允许其中任何一个方法。

  • UpstreamHttpMethod: 上游请求http方法,可使用数组。

 

捕获所有(通用模板):

  通用模板即所有请求全部转发,UpstreamPathTemplate与DownstreamPathTemplate设置为 “/{url}”

640?wx_fmt=png

万能模板的优先级最低,只要有其它的路由模板,其它的路由模板则会优先生效。 

上游Host:

  上游Host也是路由用来判断的条件之一,由客户端访问时的Host来进行区别。比如当a.jessetalk.cn/users/{userid}和b.jessetalk.cn/users/{userid}两个请求的时候都可以进行区别对待。

640?wx_fmt=png

优先级:

  对多个产生冲突的路由设置优化级,可通过priority属性来定义我们希望路由与上游HttpRequest的匹配顺序。

640?wx_fmt=png

比如你有同样两个路由,当请求/goods/delete的时候,则下面那个会生效,也就是说Prority数值越大的会被优先匹配。 

请求聚合:

  ocelot允许我们指定组成多个正常路由的聚合的重路由,并将它们的响应映射到一个下游对象中,通常情况下,当你有一个客户机向一个服务器发出多个请求时,它可能只是一个服务器,这个特性允许您使用ocelot开始实现前端类型体系结构到后端,还可以减少对后端服务节点的重复处理负载。

{

    "ReRoutes": [

        {

            "DownstreamPathTemplate": "/",

            "UpstreamPathTemplate": "/laura",

            "UpstreamHttpMethod": [

                "Get"

            ],

            "DownstreamScheme": "http",

            "DownstreamHostAndPorts": [

                {

                    "Host": "localhost",

                    "Port": 51881

                }

            ],

            "Key": "Laura"

        },

        {

            "DownstreamPathTemplate": "/",

            "UpstreamPathTemplate": "/tom",

            "UpstreamHttpMethod": [

                "Get"

            ],

            "DownstreamScheme": "http",

            "DownstreamHostAndPorts": [

                {

                    "Host": "localhost",

                    "Port": 51882

                }

            ],

            "Key": "Tom"

        }

    ],

    "Aggregates": [

        {

            "ReRouteKeys": [

                "Tom",

                "Laura"

            ],

            "UpstreamPathTemplate": "/",

            "Aggregator": "FakeDefinedAggregator"

        }

    ]

}

在Startup中添加AddSingletonDefinedAggregator<FakeDefinedAggregator>来统一处理该路由聚合服务。

services.AddOcelot().AddTransientDefinedAggregator<FakeDefinedAggregator>();

  而FakeDefinedAggregator需要继承于IDefinedAggregator,这样下游服务的统一处理将经过该Aggreage后返回到Response中。

640?wx_fmt=png

有了这个特性,您几乎可以做任何您想做的事情,因为下游响应包含内容、头和状态代码,请注意,如果httpclient在向聚合中的重新路由发出请求时抛出异常,那么您将不会得到它的下游响应,但会得到任何成功的响应,如果它确实引发了异常,则会记录此异常。

  如果我们设置  /tom 和 /laura 控制器下的返回值分别是  {“Age”: 19} 和 {“Age”: 25},那么我们请求端将收到如下一个Response信息

{"Tom":{"Age": 19},"Laura":{"Age": 25}}

  需要注意的是:

  • 聚合服务目前只支持返回json

  • 目前只支持Get方式请求下游服务

  • 任何下游的response header并会被丢弃

  • 如果下游服务返回404,聚合服务只是这个key的value为空,它不会返回404

  • 做一些像 GraphQL的处理对下游服务返回结果进行处理

  关于GraphQL的功能支持,Ocelot并无原生自带GraphQL动态API查询语句,如果需要集成GraphQL,Ocelot官方有自带示例:https://github.com/ThreeMammals/Ocelot/tree/develop/samples/OcelotGraphQL 

路由负载均衡

  当下游服务有多个结点的时候,我们可以在DownstreamHostAndPorts中进行配置。

640?wx_fmt=png

 LoadBalancer将决定负载均衡的算法

  • LeastConnection – 将请求发往最空闲的那个服务器

  • RoundRobin – 轮流发送

  • NoLoadBalance – 总是发往第一个请求或者是服务发现 

限流

  对请求进行限流可以防止下游服务器因为访问过载而崩溃,这个功能就是我们的张队添加进去的,Ocelot支持上游请求的速率限制,这样您的下游服务就不会过载。

640?wx_fmt=png

  • ClientWihteList 白名单

  • EnableRateLimiting 是否启用限流

  • Period 统计时间段:1s, 5m, 1h, 1d

  • PeroidTimeSpan 多少秒之后客户端可以重试

  • Limit 在统计时间段内允许的最大请求数量

  在 GlobalConfiguration下我们还可以进行以下配置

640?wx_fmt=png

  • Http头  X-Rate-Limit 和 Retry-After 是否禁用

  • QuotaExceedMessage 当请求过载被截断时返回的消息

  • HttpStatusCode 当请求过载被截断时返回的http status

  • ClientIdHeader 用来识别客户端的请求头,默认是 ClientId

 

服务质量和熔断

  熔断的意思是停止将请求转发到下游服务。当下游服务已经出现故障的时候再请求也是功而返,并且增加下游服务器和API网关的负担。这个功能是用的Pollly来实现的,我们只需要为路由做一些简单配置即可。关于Polly的使用,我会在下一个章节中介绍。

640?wx_fmt=png

  • ExceptionsAllowedBeforeBreaking 允许多少个异常请求

  • DurationOfBreak 熔断的时间,单位为秒

  • TimeoutValue 如果下游请求的处理时间超过多少则自如将请求设置为超时 

缓存

  Ocelot支持一些非常基本的缓存功能,他是基于CacheManager实现的,当然,我们在使用的过程中,也需要安装CacheManager这个lib包,然后通过Ocelot Cache manager扩展方法来添加CacheManager实现。

640?wx_fmt=png

"FileCacheOptions": { "TtlSeconds": 15, "Region": "somename" }

  在这个例子中,ttl设置为15秒,那么缓存所存在的时长就只有15秒。当然,你也可以通过添加你自定义缓存接口来注入自定义缓存服务。

1 services.AddSingleton<IOcelotCache<CachedResponse>, MyCache>()

 

认证

  如果我们需要对下游API进行认证以及鉴权服务的,则首先Ocelot 网关这里需要添加认证服务。这和我们给一个单独的API或者ASP.NET Core Mvc添加认证服务没有什么区别。

640?wx_fmt=png

然后在ReRoutes的路由模板中的AuthenticationOptions进行配置,只需要我们的AuthenticationProviderKey一致即可。

640?wx_fmt=png

签权

  我们通过认证中的AllowedScopes 拿到 claims之后,如果要进行权限的鉴别需要添加以下配置。

"RouteClaimsRequirement": {    "UserType": "registered"}

  当前请求上下文的token中所带的claims如果没有 name=”UserType” 并且 value=”registered” 的话将无法访问下游服务。

 

一个简单的例子

  上面我们简单介绍了一下Ocelot的部分功能,要需完整功能介绍,可参考官方文档进行https://ocelot.readthedocs.io,接下来笔者做了一个简单的路由转发的示例,来演示一下Ocelot基于http/https协议的强大而又简单的功能。

  基于上面介绍的三个项目,我们只介绍了作为网关能使用到的功能,另外我们还需要一个上游作为请求客户端(当然,笔者更喜欢将客户端做成一个Console控制台,方便,快捷),一个下游作为服务端,项目名称任意。

  当下游服务端ASP.NET的默认模板被创建后,默认会创建一个ValueController,为了演示和获取当前路由转发的结果,我们只需要对其中一个接口稍作修改,设置默认启动端口为5000。

640?wx_fmt=png

而上游服务中,可以用HttpClient来模拟一个请求。

640?wx_fmt=png

此处8080作为ApiGateway服务端,默认使用通用路由模板(上游和下游直接路由通用匹配{url}),代码不再贴出。启动8080网关和5000服务端,通过Console控制台直接访问8080所配置(映射)出来的公开地址(实际就是5000上的api/values),可看到如下的结果。

640?wx_fmt=png

  如需查看更多的demo示例和源码,可参考笔者的源码https://github.com/steveleeCN87/doteasy.rpc/tree/master/src/doteasy.rpc.demo

 

总结

  Ocelot能实现的功能远远不止这些,更多内容可以参考Ocelot官方API或张队的解说。

 

补个插曲

  对了,关注DotEasy.Rpc小伙伴们,该框架已经更新到1.0.3,主要增加和修改了以下内容:

  1. 接口注册改用Autofac,实现统一批量接口注入,而非每次手动一个一个的去注入接口。

  2. 通过代理生成,将原有的“兔子耳朵”取消,增加了客户端非异步远程调用方式,避免每次调用均实现Task非阻塞方式来实现接口调用。

  3. 通过代理生成,调用端将自动释放接口实例资源,也就是IDisposable接口的实现,而客户端不用实现。

  4. 通过代理生成,如服务节点中不存在网关服务(非微服务,而是直接的RPC调用),客户端对服务端的访问可使用Token进行身份验证。

 

  现在的客户端代码是越来越简单,功能越来越丰富了:

640?wx_fmt=png

下一步将研究和实现网关中http到rpc协议自动(或手动)转换,也许会走弯路,喜欢的小伙伴请继续关注,也将在下一篇介绍。

  感谢阅读!


相关文章:

  • 微服务之:从零搭建ocelot网关和consul集群

  • IdentityServer4与ocelot实现认证与客户端统一入口

  • 定制Ocelot来满足需求

  • AspNetCore中使用Ocelot之 IdentityServer4

  • Ocelot-基于.NET Core的开源网关实现

  • .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  • Swagger如何访问Ocelot中带权限验证的API

  • Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

  • .NET Core微服务之基于Ocelot实现API网关服务

  • .NET Core微服务之基于Ocelot实现API网关服务(续)

  • .NET微服务体系结构中为什么使用Ocelot实现API网关

  • Ocelot简易教程(一)之Ocelot是什么

  • Ocelot简易教程(二)之快速开始1

  • Ocelot简易教程(二)之快速开始2

  • Ocelot简易教程(三)之主要特性及路由详解

  • Ocelot简易教程(四)之请求聚合以及服务发现

  • Ocelot简易教程(五)之集成IdentityServer认证以及授权

  • Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

  • Ocelot简易教程(七)之配置文件数据库存储插件源码解析

  • ASP.NET Core中Ocelot的使用:API网关的应用

  • ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由

  • ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

  • 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

  • 定制Ocelot来满足需求

  • 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

  • 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

  • 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

  • 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

  • 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

  • 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

  • 【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4

  • 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

  • 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

  • 【.NET&nbsp;Core项目实战-统一认证平台】第十二章&nbsp;授权篇-深入理解JWT生成及验证流程

  • 【.NET&nbsp;Core项目实战-统一认证平台】第十三章&nbsp;授权篇-如何强制有效令牌过期

原文地址:

https://www.cnblogs.com/SteveLee/p/Ocelot_Api_http_and_https.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NOI2009] 变换序列 (匈牙利最大匹配)

description … solution 我竟然一眼题&#xff01;&#xff01; 变换后的TTT数组是[0,n)[0,n)[0,n)的排列&#xff0c;变换规则也有&#xff0c;距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个最大匹配&#xff1f;&#xff1f; 无解就是匹配数量达不到nnn罢了…

使用 WeihanLi.Npoi 操作 CSV

Intro最近发现 csv 文件在很多情况下都在使用&#xff0c;而且经过大致了解&#xff0c;csv 格式简单&#xff0c;相比 excel 文件要小很多&#xff0c;读取也很是方便&#xff0c;而且也很通用&#xff0c;微软的 ml.net 的示例项目 用来训练模型的数据也是使用的 csv 来保存的…

种类问题

几乎所有种类问题都可以转化成两种模型之一 1.直接维护ans数组 2.统计二维数点问题 前置知识 二维静态数点 以y为第一元素&#xff0c;x为第二元素&#xff0c;原点优先级大于查询点&#xff0c;对所有点&#xff08;原点查询点&#xff09;&#xff0c;然后求 for(int i1;…

「LibreOJ Round #11」Misaka Network 与测试 (网络流跑二分图匹配)

description 研究者们想要测试 Misaka Network&#xff0c;于是他们把 Misaka Network 中的所有妹妹们召集到了一起。 现在妹妹们排成了 N行 M 列&#xff0c;有的位置没有人。现在研究者们给每一个个体的超能力进行了评定&#xff0c;一共有三个能力等级&#xff1a;Level 1 …

YbtOJ-相似子串【SA,RMQ,二分】

正题 题目大意 给出一个长度为nnn的字符串&#xff0c;两个串相似当且仅当可以通过每种字符置换使得它们相同。 qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r​子串有多少个相似的。 1≤n≤105,1≤q≤51051\leq n\leq 10^5,1\leq q\leq 5\times 10^51≤n≤105,1≤…

程序员修仙之路--把用户访问记录优化到极致

点击上方蓝色字体&#xff0c;关注我们菜菜呀&#xff0c;前几天做的用户空间&#xff0c;用户反映有时候比较慢呀CEO,CTO,CFO于一身的CXO是吗&#xff1f;菜菜我把你拉进用户反馈群&#xff0c;你解决一下呀CEO,CTO,CFO于一身的CXO&#xff08;完了&#xff0c;以后没清净时候…

[国家集训队]航班安排 (最大费用最大流)

description 神犇航空有K架飞机&#xff0c;为了简化问题&#xff0c;我们认为每架飞机都是相同的。神犇航空的世界中有N个机场&#xff0c;以0…N-1编号&#xff0c;其中0号为基地机场&#xff0c;每天0时刻起飞机才可以从该机场起飞&#xff0c;并不晚于T时刻回到该机场。一…

新数据革命:开源图形化数据引擎Hawk5发布

Hawk是一款开源图形化的爬虫和数据清洗工具&#xff0c;GitHub Star超过2k&#xff0c;前几代版本介绍如下&#xff1a;Hawk3: 终于等到你: 图形化开源爬虫Hawk 3发布!Hawk2: 120项优化: 超级爬虫Hawk 2.0重磅发布&#xff01;Hawk1: 如何从互联网采集海量数据&#xff1f;租房…

[TJOI2018]智力竞赛 (匈牙利)

description 题目描述 小豆报名参加智力竞赛&#xff0c;他带上了 n个好朋友作为亲友团一块来参加比赛。 比赛规则如下&#xff1a;一共有 m道题目&#xff0c;每个人都有 1 次答题机会&#xff0c;每次答题为选择一道题目回答&#xff0c;在回答正确后&#xff0c;可以从这个…

ASP.NET Core如何在ActionFilterAttribute里做依赖注入

点击蓝字关注我在ASP.NET Core里&#xff0c;我们可以使用构造函数注入很方便地对Controller&#xff0c;ViewComponent等部件做依赖注入。但是如何给过滤器ActionFilterAttribute也用上构造函数注入呢&#xff1f;问题我的博客系统里有个用来删除订阅文件缓存的ActionFilter&a…

[八省联考2018]劈配 (匈牙利)

description 一年一度的综艺节目《中国新代码》又开始了。Zayid 从小就梦想成为一名程序员&#xff0c;他觉得这是一个展示自己的舞台&#xff0c;于是他毫不犹豫地报名了。 轻车熟路的 Zayid 顺利地通过了海选&#xff0c;接下来的环节是导师盲选&#xff0c;这一阶段的规则…

助力苏州、星火相传,广苏两地微软技术俱乐部交流纪实

2019年1月19日时值二十四节气“大寒”前夕&#xff0c;江南水乡冬日的寒气盖不住苏州.NET开发者的热情&#xff0c;就在这一天苏州微软技术俱乐部成立了并举办了第一场大型的线下交流活动。星火相传2018年12月8日广州.NET微软技术俱乐部举办了恢复以来的第一场大型线下技术交流…

微软技术专家为您解读深度学习

随着阿尔法狗、无人驾驶、智能翻译的横空出世&#xff0c;“人工智能”这个已经存在60多年的词语&#xff0c;仿佛一夜之间重新成为热词。同时被科技圈和企业界广泛提及的还有“机器学习”“深度学习”“神经网络”…… 但如此喧嚣热烈的气氛之下&#xff0c;大部分人对这一领域…

「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)

description 戳我看题目哦 solution 有一道非常相似的题目 一棵树&#xff0c;每条边限制两个端点的大小关系&#xff08;限制 a[u]>a[v]a[u]>a[v]a[u]>a[v] 或 a[u]<a[v]a[u]<a[v]a[u]<a[v]&#xff09; 求有多少种符合要求的排列aaa满足整棵树的限制。n…

PCB 机器学习(ML.NET)初体验实现PCB加投率预测

使用ML.NET建立PCB加投率模型对单一蚀刻工序进行加投率预测, 此实例为最简单预测&#xff0c;要想实现全流程加投率预测挑战难度还是挺大的&#xff0c;可以查看另一种关于大数据在PCB行业应用---加投率计算基本原理:PCB 加投率计算实现基本原理--K最近邻算法&#xff08;KNN&a…

潘淳的苏州.NET俱乐部成立有感!附我的录音

引言&#xff1a;今天是1月21日&#xff0c;我&#xff08;潘淳&#xff09;的生日&#xff0c;两天前刚刚过了他&#xff08;苏俱&#xff09;的生日&#xff0c;微软技术俱乐部&#xff08;苏州&#xff09;在苏州微软正式成立。作为大会活动的策划者和活动发起者之一&#x…

十年 IT 老兵带你通过案例学架构,附C#代码

技术大会上的分享大多高大上&#xff0c;亿级流量、超大型研发团队&#xff0c;虽然值得借鉴&#xff0c;但由于应用场景与研发资源的差异&#xff0c;一般企业并不容易落地。其实&#xff0c;中小型研发团队在IT行业还是占大多数&#xff0c;他们在技术架构方面的问题较多&…

浅谈一致性Hash原理及应用

在讲一致性Hash之前我们先来讨论一个问题。问题&#xff1a;现在有亿级用户&#xff0c;每日产生千万级订单&#xff0c;如何将订单进行分片分表&#xff1f;小A&#xff1a;我们可以按照手机号的尾数进行分片&#xff0c;同一个尾数的手机号写入同一片/同一表中。大佬&#xf…

如何定义开发完成?(Definition of Done)

最近在拜读郑晔的10x程序员工作法&#xff0c;收益良多&#xff0c;文中提出一个概念叫DoD&#xff08;Definition of Done&#xff09;给我的感触颇深。这让我联想到实际工作过程中&#xff0c;经常遇到的扯皮、争吵等各种场景&#xff0c;其实就和这个DoD分不开。一、场景描述…

【正睿2021寒假省选第二轮集训 day 1】串 (后缀自动机+记忆化)

description 定义一个字符串的子串是这个字符串的某个连续区间的字符组成的串。比如&#xff0c;“djq"的子串是"d”,“j”,“q”,“dj”,“jq”,和"djq"。 定义F(a,b)为最长在字符串bb中至少出现一次的字符串a的子串&#xff0c;例如&#xff1a; F(“d…