联雅网站建设公司,殡葬类网站建设,泉州建设网站公司,建设网站的心得前言 最近一直在忙公司和私下的兼职#xff0c;白天十个小时#xff0c;晚上四个小时#xff0c;感觉每天都是打了鸡血似的#xff0c;精神满满的#xff0c;连自己那已经学打酱油的娃都很少关心#xff0c;也有很长一段时间没有更新博客了#xff0c;特别抱歉#… 前言 最近一直在忙公司和私下的兼职白天十个小时晚上四个小时感觉每天都是打了鸡血似的精神满满的连自己那已经学打酱油的娃都很少关心也有很长一段时间没有更新博客了特别抱歉小伙伴们都等得想取关了吧哈哈开个玩笑这里十分感谢小伙伴们一直以来的关注和支持。 还有不到半个月的时间猪年就要到来在这里先提前祝大家猪年吉祥愿君身体健康福寿绵长吉祥如意财源滚滚心想事成万事顺利新年快乐好运平安 你看这小猪多可爱有点像麦兜甜品先到这儿我们一起来看本节也是第三部分的主要思想重点。你可能会问怎么突然一下画风全变了而且还多了这么多的框框和一些看不懂的图标不急本来笔者想直接就中间那一部分单独拎出来讲解但确实无法让部分朋友理解索性直接将整个微服务架构全部展现了出来。 什么是网关 上一篇我们通过DotNetty构建的远程RPC框架已经实现了远程客户端的调用使用的体验是跟在本地调用接口一样没有任何的区别。但是这调用是没有任何限制的任何人、任何客户端、只要知道了服务节点地址并通过TCP实现RPC调用便可大大方方的、肆无惮忌的调用这些服务节点如果就这样部署在生产环境上是非常危险的。因此我们需要引入“网关”这样的中间服务来限制和管理流入的请求合法性和合规性。 当然这里我们提到的网关并非物理机上的实体网关交换机如下图所示 而是将一台服务器的部分组件通过软件技术实现网络管理比如网卡笔者曾见过一台DELL服务器上装了11块网卡通过OSI模型进行管理实现比如流量限制路由转发、验证、签权等等一些列功能所以我们一般称之为API网关。我们看看网上的统一解释 API网关是一个服务器是系统的唯一入口。从面向对象设计的角度看它与外观模式类似。API网关封装了系统内部架构为每个客户端提供一个定制的API。它可能还具有其它职责如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 --百度 通常情况下 API 网关要做很多工作它作为一个系统的后端总入口承载着所有服务的组合路由转换等工作除此之外我们一般也会把安全限流缓存日志监控重试熔断等放到 API 网关来做那么可以试想在高并发的情况下这里可能会出现一个性能瓶颈。 另外如果没有开源项目的支撑前提下自己来做这样一套东西是非常大的一个工作量而且还要做 API 网关本身的高可用等如果一旦做不好有可能最先挂掉的不是你的服务节点而就是这个API网关。 这个时候通常我们会去找一些开源的 API 网关项目目前社区关于 API Gataway 的项目有以下这些TykTyk是一个开放源码的API网关它是快速、可扩展和现代的。Tyk提供了一个API管理平台其中包括API网关、API分析、开发人员门户和API管理面板。Try 是一个基于Go实现的网关服务。KongKong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行通过插件扩展它提供了超越核心平台的额外功能和服务。Orange和Kong类似也是基于OpenResty的一个API网关程序是由国人开发的学姐也是贡献者之一。Netflix zuulZuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。apiaxle: Nodejs 实现的一个 API 网关。api-umbrella: Ruby 实现的一个 API 网关。ocelot: .Net平台下实现的一个API网关其中我们的张队张善友也参与了此项目的开发。本系列单从Net Core入手所以我们只讨论Ocelot网关的作用和使用。 什么是OcelotOcelot是一个用.NET Core实现并且开源的API网关它功能强大包括了路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Consul集成并且这些功能都只需要简单的配置即可完成 。 简单的说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 Ocelot的使用结构图 用一台web api来作为Ocelot的宿主在这里有一个json配置文件里面设置了所有对当前这个网关的配置。它会接收所有的客户端请求并路由到对应的下游服务器进行处理再将请求结果返回。而这个上下游请求的对应关系也被称之为路由。一起来看看官方给出的基础结构图 在公共网络上无论是客户端a还是客户端b还是其他任何智能设备通过http/https进行访问都将经过Ocelot进行一次过滤而这些过滤将通过Ocelot的配置文件及其简单的配置便可实现下游路由转发然后在通过指定的下游路由配置请求到映射的指定服务节点上。当然这是最只是Ocelot基础的路由转发。 结合IdentityServer 私有网络中不做验证的畅通访问是极不可取的、非常危险的因此Ocelot为我们提供了私有网络身份验证解决方案我们可以通过跟IdentityServer进行结合实现私有网络身份验证当网关需要认证信息的时候会与IdentityServer服务器进行交互来完成。 网关的集群 只有一个网关是很非常危险的也就是我们通常所讲的单点一旦只要它挂了所有的服务全部挂掉这显然无法达到高可用的目的所以我们也可以部署多台网关当然这个时候在多台网关前你还需要一台负载均衡器用于平衡请求到网关的负载的平衡。 Consul服务发现 在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也可以。 我们把这个网关项目取名为ApiGatway然后在这个项目的Startup中添加依赖注入和中间件即可完成Ocelot安装和注入添加配置 我们需要添加一个.json的文件用来添加Ocelot的配置以下是最基本的配置信息。要特别注意一下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中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/1DownstreamPathTemplate下游服务的路径模板支持RESTful模板路径。DownstreamScheme下游服务协议支持http和https。DownstreamHostAndPorts下游服务的地址和集合用于定义要将请求转发到的任何下游服务的主机和端口通常这只包含一个条目但有时您可能希望向下游服务加载负载均衡。UpstreamPathTemplate: 上游也就是用户输入的请求Url模板支持RESTful模板路径或者设置一个空列表以允许其中任何一个方法。UpstreamHttpMethod: 上游请求http方法可使用数组。 捕获所有通用模板 通用模板即所有请求全部转发UpstreamPathTemplate与DownstreamPathTemplate设置为 “/{url}”万能模板的优先级最低只要有其它的路由模板其它的路由模板则会优先生效。 上游Host 上游Host也是路由用来判断的条件之一由客户端访问时的Host来进行区别。比如当a.jessetalk.cn/users/{userid}和b.jessetalk.cn/users/{userid}两个请求的时候都可以进行区别对待。优先级 对多个产生冲突的路由设置优化级可通过priority属性来定义我们希望路由与上游HttpRequest的匹配顺序。比如你有同样两个路由当请求/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中添加AddSingletonDefinedAggregatorFakeDefinedAggregator来统一处理该路由聚合服务。services.AddOcelot().AddTransientDefinedAggregatorFakeDefinedAggregator(); 而FakeDefinedAggregator需要继承于IDefinedAggregator这样下游服务的统一处理将经过该Aggreage后返回到Response中。有了这个特性您几乎可以做任何您想做的事情因为下游响应包含内容、头和状态代码请注意如果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查询语句如果需要集成GraphQLOcelot官方有自带示例https://github.com/ThreeMammals/Ocelot/tree/develop/samples/OcelotGraphQL 路由负载均衡 当下游服务有多个结点的时候我们可以在DownstreamHostAndPorts中进行配置。 LoadBalancer将决定负载均衡的算法LeastConnection – 将请求发往最空闲的那个服务器RoundRobin – 轮流发送NoLoadBalance – 总是发往第一个请求或者是服务发现 限流 对请求进行限流可以防止下游服务器因为访问过载而崩溃这个功能就是我们的张队添加进去的Ocelot支持上游请求的速率限制这样您的下游服务就不会过载。ClientWihteList 白名单EnableRateLimiting 是否启用限流Period 统计时间段1s, 5m, 1h, 1dPeroidTimeSpan 多少秒之后客户端可以重试Limit 在统计时间段内允许的最大请求数量 在 GlobalConfiguration下我们还可以进行以下配置Http头 X-Rate-Limit 和 Retry-After 是否禁用QuotaExceedMessage 当请求过载被截断时返回的消息HttpStatusCode 当请求过载被截断时返回的http statusClientIdHeader 用来识别客户端的请求头默认是 ClientId 服务质量和熔断 熔断的意思是停止将请求转发到下游服务。当下游服务已经出现故障的时候再请求也是功而返并且增加下游服务器和API网关的负担。这个功能是用的Pollly来实现的我们只需要为路由做一些简单配置即可。关于Polly的使用我会在下一个章节中介绍。ExceptionsAllowedBeforeBreaking 允许多少个异常请求DurationOfBreak 熔断的时间单位为秒TimeoutValue 如果下游请求的处理时间超过多少则自如将请求设置为超时 缓存 Ocelot支持一些非常基本的缓存功能他是基于CacheManager实现的当然我们在使用的过程中也需要安装CacheManager这个lib包然后通过Ocelot Cache manager扩展方法来添加CacheManager实现。FileCacheOptions: { TtlSeconds: 15, Region: somename } 在这个例子中ttl设置为15秒那么缓存所存在的时长就只有15秒。当然你也可以通过添加你自定义缓存接口来注入自定义缓存服务。1 services.AddSingletonIOcelotCacheCachedResponse, MyCache() 认证 如果我们需要对下游API进行认证以及鉴权服务的则首先Ocelot 网关这里需要添加认证服务。这和我们给一个单独的API或者ASP.NET Core Mvc添加认证服务没有什么区别。然后在ReRoutes的路由模板中的AuthenticationOptions进行配置只需要我们的AuthenticationProviderKey一致即可。签权 我们通过认证中的AllowedScopes 拿到 claims之后如果要进行权限的鉴别需要添加以下配置。RouteClaimsRequirement: { UserType: registered} 当前请求上下文的token中所带的claims如果没有 name”UserType” 并且 value”registered” 的话将无法访问下游服务。 一个简单的例子 上面我们简单介绍了一下Ocelot的部分功能要需完整功能介绍可参考官方文档进行https://ocelot.readthedocs.io接下来笔者做了一个简单的路由转发的示例来演示一下Ocelot基于http/https协议的强大而又简单的功能。 基于上面介绍的三个项目我们只介绍了作为网关能使用到的功能另外我们还需要一个上游作为请求客户端当然笔者更喜欢将客户端做成一个Console控制台方便快捷一个下游作为服务端项目名称任意。 当下游服务端ASP.NET的默认模板被创建后默认会创建一个ValueController为了演示和获取当前路由转发的结果我们只需要对其中一个接口稍作修改设置默认启动端口为5000。而上游服务中可以用HttpClient来模拟一个请求。此处8080作为ApiGateway服务端默认使用通用路由模板上游和下游直接路由通用匹配{url}代码不再贴出。启动8080网关和5000服务端通过Console控制台直接访问8080所配置映射出来的公开地址实际就是5000上的api/values可看到如下的结果。 如需查看更多的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进行身份验证。 现在的客户端代码是越来越简单功能越来越丰富了下一步将研究和实现网关中http到rpc协议自动或手动转换也许会走弯路喜欢的小伙伴请继续关注也将在下一篇介绍。 感谢阅读相关文章微服务之:从零搭建ocelot网关和consul集群IdentityServer4与ocelot实现认证与客户端统一入口定制Ocelot来满足需求AspNetCore中使用Ocelot之 IdentityServer4Ocelot-基于.NET Core的开源网关实现.NET Core微服务之基于OcelotIdentityServer实现统一验证与授权Swagger如何访问Ocelot中带权限验证的APIOcelot.JwtAuthorize一个基于网关的Jwt验证包.NET Core微服务之基于Ocelot实现API网关服务.NET Core微服务之基于Ocelot实现API网关服务续.NET微服务体系结构中为什么使用Ocelot实现API网关Ocelot简易教程一之Ocelot是什么Ocelot简易教程二之快速开始1Ocelot简易教程二之快速开始2Ocelot简易教程三之主要特性及路由详解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项目实战-统一认证平台】第十一章 授权篇-密码授权模式【.NETnbsp;Core项目实战-统一认证平台】第十二章nbsp;授权篇-深入理解JWT生成及验证流程【.NETnbsp;Core项目实战-统一认证平台】第十三章nbsp;授权篇-如何强制有效令牌过期原文地址:https://www.cnblogs.com/SteveLee/p/Ocelot_Api_http_and_https.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com