c++builder 运行网站的api_.NET Core 微服务:Ocelot的API网关实现

news/2024/5/9 4:11:30/文章来源:https://blog.csdn.net/weixin_39742065/article/details/111202125

(给DotNet加星标,提升.Net技能)

转自:另一个老李

cnblogs.com/SteveLee/p/Ocelot_Api_http_and_https.html

微服务架构

2e86a33573c9d96ee0f0b768ff17d379.png

什么是网关?

通过DotNetty构建的远程RPC框架《.NET跨平台RPC框架DotNettyRPC》,已经实现了远程客户端的调用,使用的体验是:跟在本地调用接口一样没有任何的区别。

但是,这调用是没有任何限制的,任何人、任何客户端、只要知道了服务节点地址,并通过TCP实现RPC调用,便可大大方方的、肆无惮忌的调用这些服务节点,如果就这样部署在生产环境上,是非常危险的。

因此,我们需要引入“网关”这样的中间服务,来限制和管理流入的请求合法性和合规性。

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

d0ee1cbd26c27f670fa25e90f45b970f.png

而是将一台服务器的部分组件,通过软件技术,实现网络管理,比如网卡(笔者曾见过一台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、Butterfly Tracing集成,并且这些功能都只需要简单的配置即可完成。

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

这里从张队这边借用一张图,当然,笔者也推荐查看官方原始API文档:https://ocelot.readthedocs.io

e5ad4ece5700c126b61fb4b1d2d8da3a.gif

Ocelot的使用结构图

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

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

abc736a71bb0f520f97b5ba536b0360d.png

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

结合IdentityServer

c025843dd6b30b6d42747a8fbcb56f07.png

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

网关的集群

8864e7924380dda2ae3505627120d2a6.png

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

Consul服务发现

37983bb1677485a5c02259e78e03617c.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也可以。

78d980ebd95ab8b3e70449d160223752.png

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

public void ConfigureServices(IServiceCollection services){
   services.AddOcelot();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
   if (env.IsDevelopment())
   {
       app.UseDeveloperExceptionPage();
   }
   app.UseOcelot().Wait();
}

添加配置

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

{
   "ReRoutes": [],
   "GlobalConfiguration": {
       "BaseUrl": "https://api.mybusiness.com"
   }
}

要特别注意一下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中

public static IWebHostBuilderCreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args)
       .ConfigureAppConfiguration((hostingContext, builder) =>
{    
builder.SetBasePath(hostingContext.HostingEnvironment
.ContentRootPath)
.AddJsonFile("Ocelot.json");
})
.UseStartup();
}

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

{
   "DownstreamPathTemplate": "/api/post/{postId}",
   "DownstreamScheme": "https",
   "DownstreamHostAndPorts": [
           {
               "Host": "localhost",
               "Port": 80,
           }
       ],
   "UpstreamPathTemplate": "/post/{postId}",
   "UpstreamHttpMethod": [ "Get"]
}
  • DownstreamPathTemplate:下游服务的路径模板,支持RESTful模板路径。

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

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

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

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

捕获所有(通用模板)

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

{
   "DownstreamPathTemplate": "/{url}",
   "DownstreamScheme": "https",
   "DownstreamHostAndPorts": [
           {
               "Host": "localhost",
               "Port": 80,
           }
       ],
   "UpstreamPathTemplate": "/{url}",
   "UpstreamHttpMethod": [ "Get" ]
}

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

上游Host

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

{
   "DownstreamPathTemplate": "/",
   "DownstreamScheme": "https",
   "DownstreamHostAndPorts": [
           {
               "Host": "10.0.10.1",
               "Port": 80,
           }
       ],
   "UpstreamPathTemplate": "/",
   "UpstreamHttpMethod": [ "Get" ],
   "UpstreamHost": "a.jessetalk.cn"
}

优先级

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

{
   "UpstreamPathTemplate": "/goods/{catchAll}"
   "Priority": 0
}
{
   "UpstreamPathTemplate": "/goods/delete"
   "Priority": 1
}

比如你有同样两个路由,当请求/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来统一处理该路由聚合服务。

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

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

public class FakeDefinedAggregator : IDefinedAggregator
{
   public TaskAggregate(List responses){
      ...6     }
}

有了这个特性,您几乎可以做任何您想做的事情,因为下游响应包含内容、头和状态代码,请注意,如果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中进行配置。

{
   "DownstreamPathTemplate": "/api/posts/{postId}",
   "DownstreamScheme": "https",
   "DownstreamHostAndPorts": [
           {
               "Host": "10.0.1.10",
               "Port": 5000,
           },
           {
               "Host": "10.0.1.11",
               "Port": 5000,
           }
       ],
   "UpstreamPathTemplate": "/posts/{postId}",
   "LoadBalancer": "LeastConnection",
   "UpstreamHttpMethod": [ "Put", "Delete" ]
}

LoadBalancer将决定负载均衡的算法

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

  • RoundRobin – 轮流发送

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

限流

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

"RateLimitOptions": {
   "ClientWhitelist": [],
   "EnableRateLimiting": true,
   "Period": "1s",
   "PeriodTimespan": 1,
   "Limit": 1
}
  • ClientWihteList 白名单

  • EnableRateLimiting 是否启用限流

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

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

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

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

"RateLimitOptions": {
 "DisableRateLimitHeaders": false,
 "QuotaExceededMessage": "Customize Tips!",
 "HttpStatusCode": 999,
 "ClientIdHeader" : "Test"
}
  • Http头  X-Rate-Limit 和 Retry-After 是否禁用

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

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

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

服务质量和熔断

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

"QoSOptions": {
   "ExceptionsAllowedBeforeBreaking":3,
   "DurationOfBreak":5,
   "TimeoutValue":5000
}
  • ExceptionsAllowedBeforeBreaking 允许多少个异常请求

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

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

缓存

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

service.AddOcelot()
   .AddCacheManager(x =>
   {
       x.WithDictionaryHandle();
   })
"FileCacheOptions": { "TtlSeconds": 15, "Region": "somename" }

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

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

认证

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

public void ConfigureServices(IServiceCollection services){
   var authenticationProviderKey = "TestKey";
   services.AddAuthentication()
       .AddJwtBearer(authenticationProviderKey, x =>
       {
       });
}

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

"ReRoutes": [{
       "DownstreamHostAndPorts": [
           {
               "Host": "localhost",
               "Port": 51876,
           }
       ],
       "DownstreamPathTemplate": "/",
       "UpstreamPathTemplate": "/",
       "UpstreamHttpMethod": ["Post"],
       "ReRouteIsCaseSensitive": false,
       "DownstreamScheme": "http",
       "AuthenticationOptions": {
           "AuthenticationProviderKey": "TestKey",
           "AllowedScopes": []
       }
   }]

签权

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

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

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

一个简单的例子

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

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

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

// GET api/values
[HttpGet]
public ActionResultstring>> Get()
{return new[] { "WebServer", Request.GetDisplayUrl() };
}

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

using (var httpClient = new HttpClient())
{

   // 此处访问的是网关的接口映射路径,而不是实际的接口URL路径
   var response = httpClient.GetAsync(new Uri("http://127.0.0.1:8080/api/values")).Result;
   Console.WriteLine("response: " + response);
   Console.WriteLine("content: " + response.Content.ReadAsStringAsync().Result);
}

此处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进行身份验证。

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

public static void Test(){
   const string token =
     "eyJhbGciOiJSUzI1NiIsImtpZCI6IjRhMjZjNDZlMzY0NjY2ODgwYjk0MGE1YjZmY2FkMCIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE1NDc0MzMwOTEsImV4cCI6MTU0NzQzNjY5MSwiaXNzIjoiaHR0cDovLzEyNy4wLjAuMTo4MDgwIiwiYXVkIjpbImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9yZXNvdXJjZXMiLCJhcGkxIl0sImNsaWVudF9pZCI6InJvLmNsaWVudCIsInN1YiI6IjEiLCJhdXRoX3RpbWUiOjE1NDc0MzMwOTEsImlkcCI6ImxvY2FsIiwic2NvcGUiOlsiYXBpMSJdLCJhbXIiOlsicHdkIl19.SmzE3KR_FOfIFIzjnAqiHVt35uefpuiExtnwKO9msIYl389bLjvLWqgwyRV5XgT0oIPYcvj2Th5ABBM9baD-pHCOaGooEwHYA4ydu1yabqEKLIooEV_mo73OSQHMYIo9DGzTddg8Ut7JKyVHLZAAJfz6NMp6NZwunEMrF1NsIj6GiL1psZ-kyZSrvIdUSFHh92mCjPmiUfUdUPZIlVZLYrFEsxJQ6gHgQUpMwwQscdoLXkyw6PJ6xLhW_RJvOYWMust1TIvMqVaxsouuaV6EKACpOJndSy7JuQy-_7Gbes7jYlrS-bntsLoi4SK9SDJenlHHc-lCUIbsHIDkbZEiwg";
   using (var proxy = ClientProxy.Generate(new Uri("http://127.0.0.1:8500"), token))
   {
       Console.WriteLine($@"{proxy.MultiParTest("aaaa", "bbb", "ccccc")}");
       Console.WriteLine($@"{proxy.GetDictionary().Result["key"]}");
       Console.WriteLine($@"{proxy.Async(1).Result}");
       Console.WriteLine($@"{proxy.Sync(1)}");
   }
   Console.ReadKey();
}

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

推荐阅读

(点击标题可跳转阅读)

DotNetty跨平台的网络通信库

.NET Core 分布式微服务Jimu:支持Swagger

.NET Core用RPC方式进行高效的HTTP服务访问

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

cc64fb7b979e2341667479e2e72c8d0f.png

喜欢就点一下「好看」呗~

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

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

相关文章

国内图片网站Yupoo的架构

之前向大家介绍过全球最大在线图片服务网站Flickr网站架构&#xff0c;Yupoo&#xff08;又拍网&#xff09;作为国内最大的图片服务提供商&#xff0c;我们也一起来看看它的架构&#xff0c;同样是提供图片服务&#xff0c;看看他与Flickr的差别在哪里&#xff0c;大家看完本文…

LOL钓鱼网站实战渗透

点击上方蓝字关注我们相信很多人都有遇到过这样的经历&#xff0c;无意中点到一些钓鱼网站&#xff0c;然后就泄露了自身信息&#xff0c;造成了一定的损失&#xff0c;对于这样的网站各位需警惕&#xff0c;千万不要乱点击来历不明的网站。今天我就来说说钓鱼网站的事&#xf…

查看网站所有会话_PHP-会话控制

会话控制因为 HTTP 是无状态的协议&#xff0c;没有办法记录多个事务请求间的状态。即访问一个页面请求后再请求另一个页面时无法判断两次请求来自同一下用户。会话原理在PHP中实现会话的原理是为用户分配一个唯一的加密ID&#xff0c;并保存在用户客户端&#xff0c;并在整个会…

网站URL网址末尾是否应该使用反斜杠

2019独角兽企业重金招聘Python工程师标准>>> 当对网站进行SEO优化时&#xff0c;难免会遇到因为URL导致的重复页面问题&#xff0c;其中一个比较常见的现象就是因页面地址后是否有添加反斜杠造成的&#xff0c;举例如下&#xff1a; 链接A&#xff1a; www.example.…

Redis网站热搜关键词加载实践,建议收藏

侠梦的开发笔记回复【面试题】获取2021年最新java面试题合集&#xff5e;来源&#xff1a;Catcher8www.cnblogs.com/catcher1994/p/5877262.html对于一个网站来说&#xff0c;无论是商城网站还是门户网站&#xff0c;搜索框都是有一个比较重要的地位&#xff0c;它的存在可以说…

一例千万级pv高性能高并发网站架构

2019独角兽企业重金招聘Python工程师标准>>> 受CU管理员的邀请参考“千万级pv高性能高并发网站架构与设计交流探讨帖”主题的交流&#xff0c;发表了一案例与大家分享。 一个支撑千万级PV的网站是非常考验一个架构是否成熟、健壮(本文不涉及软件架构的层面&am…

黑科技Python轻松爬取网站信息,看完我是佩服得五体投地!

1. 引言 本文主要介绍如何使用Scrapy结合PhantomJS采集天猫商品内容&#xff0c;文中自定义了一个DOWNLOADER_MIDDLEWARES&#xff0c;用来采集需要加载js的动态网页内容。看了很多介绍DOWNLOADER_MIDDLEWARES资料&#xff0c;总结来说就是使用简单&#xff0c;但会阻塞框架&a…

牛掰!10年python爬虫经验开发的案例让你搞定全球80%以上的网站

项目要求&#xff1a; 用户入口 1、商品信息存在文件里 2、已购商品&#xff0c;余额记录。 商家入口 可以添加商品&#xff0c;修改商品价格 商家入口&#xff1a; # Author:P J Jimport osps 1 >>>>>> 修改商品 2 >>>>>> 添加商…

快就完事了!10分钟用python爬取网站视频和图片

话不多说&#xff0c;直接开讲&#xff01;教你如何用Python爬虫爬取各大网站视频和图片。 网站分析&#xff1a; 我们点视频按钮 可以看到url是&#xff1a; http://www.budejie.com/video/ 接着我们点开网页源码&#xff0c;看下面之处 接着我们把那个下面画红线的链接点开…

Python监控术,看看你的男女朋友究竟在逛些什么网站!

需求&#xff1a; (1) 获取你对象chrome前一天的浏览记录中的所有网址(url)和访问时间&#xff0c;并存在一个txt文件中 (2)将这个txt文件发送给指定的邮箱地址(你的邮箱) (3)建立例行任务&#xff0c;每天定时自动完成这些操作&#xff0c;你就可以通过邮件查看你对象每天看…

转帖一下《深入理解Nginx》在线支持网站的勘误,访问太慢了

2019独角兽企业重金招聘Python工程师标准>>> 《深入理解Nginx》在线支持网站 勘误公布 示例源码 答疑解惑 作者博客 微博互动 在线支持网站更改为&#xff1a;http://nginx.taohui.org.cn请大家访问新的站点&#xff0c;谢谢。 勘误公布 由于编写匆忙&#x…

一般网站有哪些常见漏洞?

Web应用是指采用B/S架构、通过HTTP/HTTPS协议提供服务的统称。随着互联网的广泛使用&#xff0c;Web应用已经融入到日常生活中的各个方面&#xff1a;网上购物、网络银行应用、证券股票交易、政府行政审批等等。在这些Web访问中&#xff0c;大多数应用不是静态的网页浏览&#…

每次Nginx 配置都浪费在了查资料上!来看看这个(在线配置网站)

Nginx 是一个高性能的 HTTP 和反向代理 web 服务器&#xff0c;同时也提供了 IMAP/POP3/SMTP 服务&#xff0c;其因丰富的功能集、稳定性、示例配置文件和低系统资源的消耗受到了开发者的欢迎。本文&#xff0c;我们总结了一些常用的 Nginx 配置代码&#xff0c;希望对大家有所…

tableau指标预警_如何使用Tableau分析敏捷,开发和网站指标

tableau指标预警开发人员在设计&#xff0c;开发&#xff0c;测试&#xff0c;部署和管理应用程序时使用了许多生产力&#xff0c;编码&#xff0c;测试和云管理工具。 尽管大多数工具都提供报告和分析功能&#xff0c;但技术团队可能有充分的理由开发自己的报告功能&#xff0…

有什么网站下载 消防编程软件_8个无套路下载软件的网站推荐给你

我曾经在一个朋友的电脑上看到过市面上的所有浏览器&#xff0c;我问他是做网页开发吗&#xff1f;他说他也不知道自己电脑怎么就莫名其妙安装了这么多浏览器。 效率君想了想&#xff0c;应该是这个原因。 先讲个我自己的经历吧。 前两天效率君想把Ps升级到2020&#xff0c;在百…

网站上线之前,基于SEO,该做哪些测试?

对于任何一个网站而言&#xff0c;在新站上线之初&#xff0c;每个SEO人员&#xff0c;都需要进行缜密的测试&#xff0c;用于辅助网站正式上线后&#xff0c;可以在搜索引擎中&#xff0c;有一个不错的排名。那么&#xff0c;新网站测试&#xff0c;都需要注意什么&#xff1f…

网站爬取工具

有时候需要将网站资源爬取到本地&#xff0c;文件少的情况下可以使用Chrome一个个保存。如果文件太多&#xff0c;则需要使用下面的辅助工具。 1.Teleport Ultra(不是Teleport Pro) 优点&#xff1a;爬取文件以及结构比较完整&#xff1b; 缺点&#xff1a;会修改原文件。会在j…

达内网站的标签翻页功能,模仿代码

参考网址&#xff1a;http://xm.tedu.cn/baidu/dnpp/?xmjavaqzs20170524fzct023&utm_term达内培训&ca_kid65421413813&ca_cv17282834319 【代码】 HTML&#xff1a; <div class"banner-wrap"><div class"container"><div clas…

几个不错的解密(MD5,SHA256等)网站

cmd5这个解密网站我相信大多数人都知道吧&#xff0c;数据库还是非常庞大的&#xff0c;一般的解密需求足够了&#xff0c;如果比较复杂就要付费了。网址&#xff1a;http://www.cmd5.com/PMD5解密&#xff0c;效果也不错&#xff0c;不收费&#xff0c;所以解密能力也有限。网…

谷歌新上线了一个安卓游戏开发者网站

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 谷歌为 Android 游戏开发者上线了一个网站。新网站自称 Android 游戏开发“中心”&#xff0c;目的在于帮助开发者为 Android 系统开发更有趣的手游。该网站可以帮助开发者寻找资源和工具&#…