Ocelot(一)- .Net Core开源网关

Ocelot - .Net Core开源网关

作者:markjiang7m2

原文地址:https://www.cnblogs.com/markjiang7m2/p/10857688.html

源码地址:https://gitee.com/Sevenm2/OcelotDemo

今天要给大家介绍的Ocelot是一个基于 .net core的开源WebAPI服务网关项目,它的功能非常强大,包括了路由、请求聚合、服务发现、认证鉴权、限流、负载均衡等功能。而这些功能都可以直接通过修改json配置文件即可使用,非常方便。Ocelot是系统中对外暴露的一个请求入口,所有外部接口都必须通过这个网关才能向下游API发出请求,就如地铁中的安检系统,所有人都必须经过安检才能乘坐地铁。

我将通过具体案例对Ocelot的功能进行一一展开说明,而本文中涉及案例的完整代码都可以从我的代码仓库进行下载。

搭建Ocelot项目

通过VS2017新建一个基于 .net core WebAPI项目,然后通过nuget直接搜索Ocelot或者使用以下命令行添加Ocelot的引用。

Install-Package Ocelot

在项目的根目录添加一个.json配置文件,文件名自定义,此案例为Ocelot.json.添加配置如下:

{
    "ReRoutes": [],
    "GlobalConfiguration": {
    }
}

可以看到在我们的配置文件中包含两个配置项,ReRoutes是一个数组,将会包含服务器的路由配置,GlobalConfiguration则是一个全局配置项。我会在下文中通过各种案例详细说明配置项中的具体内容以及如何使用,因此,在这里暂时不展开说明。

将该配置文件添加到 .net core configuration中

Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, builder) => {
            builder.AddJsonFile("Ocelot.json");
        })
        .UseStartup<Startup>();

因为 .net core支持当配置文件被修改后会重新加载,所以如果我们需要支持重新加载,可修改为:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, builder) => {
            builder.AddJsonFile("Ocelot.json", optional: false, reloadOnChange: true);
        })
        .UseStartup<Startup>();

将Ocelot作为中间件注册,需要添加两个命名空间

Startup.cs

using Ocelot.DependencyInjection;
using Ocelot.Middleware;
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddOcelot();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseMvc();
    app.UseOcelot().Wait();
}

至此,我们的Ocelot就已经搭建完成了。下面我们通过具体案例来说明如何修改配置进行相关功能的使用。

配置参数介绍

我们先来认识一下到底包含哪些参数,以及这些参数的含义。前面我们有介绍到,配置文件中包含两个配置项:ReRoutes和GlobalConfiguration。

我们先来看GlobalConfiguration,它是一个全局配置项,通常我们都要在这个配置项中添加一个属性BaseUrl,BaseUrl就是Ocelot服务对外暴露的Url。

"GlobalConfiguration": {
    "BaseUrl": "http://localhost:4727"
}

ReRoutes是一个数组,其中的每一个元素代表了一个路由,而一个路由所包含的所有可配置参数如下:

{
    "DownstreamPathTemplate": "/",
    "UpstreamPathTemplate": "/",
    "UpstreamHttpMethod": [
        "Get"
    ],
    "AddHeadersToRequest": {},
    "AddClaimsToRequest": {},
    "RouteClaimsRequirement": {},
    "AddQueriesToRequest": {},
    "RequestIdKey": "",
    "FileCacheOptions": {
        "TtlSeconds": 0,
        "Region": ""
    },
    "ReRouteIsCaseSensitive": false,
    "ServiceName": "",
    "DownstreamScheme": "http",
    "DownstreamHostAndPorts": [
        {
            "Host": "localhost",
            "Port": 8001,
        }
    ],
    "QoSOptions": {
        "ExceptionsAllowedBeforeBreaking": 0,
        "DurationOfBreak": 0,
        "TimeoutValue": 0
    },
    "LoadBalancer": "",
    "RateLimitOptions": {
        "ClientWhitelist": [],
        "EnableRateLimiting": false,
        "Period": "",
        "PeriodTimespan": 0,
        "Limit": 0
    },
    "AuthenticationOptions": {
        "AuthenticationProviderKey": "",
        "AllowedScopes": []
    },
    "HttpHandlerOptions": {
        "AllowAutoRedirect": true,
        "UseCookieContainer": true,
        "UseTracing": true
    },
    "UseServiceDiscovery": false
}
  • Downstream 下游服务配置
  • UpStream 上游服务配置
  • Aggregates 服务聚合配置
  • ServiceName, LoadBalancer, UseServiceDiscovery 服务发现配置
  • AuthenticationOptions 服务认证配置
  • RouteClaimsRequirement Claims 鉴权配置
  • RateLimitOptions 限流配置
  • FileCacheOptions 缓存配置
  • QosOptions 服务质量与熔断配置
  • DownstreamHeaderTransform 头信息转发配置

当然,我们在实际使用过程中不需要设置所有的参数,只需要根据实际需要进行配置即可。

案例一 路由

路由是Ocelot最基本的功能。Ocelot接收到来自上游服务的请求,经过验证后,将请求转发到下游服务,因此,我们首先要配置路由当中上下游服务参数。

{
    "DownstreamPathTemplate": "/api/ocelot/{Id}",
    "DownstreamScheme": "http",
    "DownstreamHostAndPorts": [
            {
                "Host": "localhost",
                "Port": 8001,
            }
        ],
    "UpstreamPathTemplate": "/ocelot/{Id}",
    "UpstreamHttpMethod": ["Get"]
}
  • DownstreamPathTemplate 下游请求Url模板,{}中的内容代表动态参数
  • DownstreamScheme 下游服务http scheme
  • DownstreamHostAndPorts 下游服务的地址,如果使用LoadBalancer的话这里可以填多项
  • UpstreamPathTemplate 上游也就是用户输入的请求Url模板
  • UpstreamHttpMethod 上游请求http方法,可使用数组

因此,当上游服务向地址http://localhost:4727/ocelot/5发出请求时,Ocelot会将请求转发到下游服务http://localhost:8001/api/ocelot/5

本案例提供了下游服务Demo - OcelotDownAPI,将OcelotDownAPI发布到IIS端口即可使用。下游服务在接收到请求后返回一个字符串用于表明自己的身份。

[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{
    var result = await Task.Run(() =>
    {
        return $"This is from {HttpContext.Request.Host.Value}, path: {HttpContext.Request.Path}";
    });
    return Ok(result);
}

测试结果:

如果希望Ocelot能够转发所有的请求,则可以配置如下:

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

这样就能将所有Get请求转发到下游服务。不过这样配置的优先级是最低的,一旦匹配到其它路由模板,会优先选择。

如果希望Ocelot只转发来自某个特定上游服务Host的请求,则可以配置如下:

{
    "DownstreamPathTemplate": "/{url}",
    "DownstreamScheme": "http",
    "DownstreamHostAndPorts": [
            {
                "Host": "localhost",
                "Port": 8001,
            }
        ],
    "UpstreamPathTemplate": "/{url}",
    "UpstreamHttpMethod": ["Get"],
    "UpstreamHost": "localhost:4023"
}

这样Ocelot就只会转发来自localhost:4023的请求。需要注意的是,如果路由配置中包含两个除UpstreamHost以外都相同的路由,即其中一个带有UpstreamHost,而另外一个没有,则Ocelot会优先选择带有UpstreamHost的路由。

设置路由的优先级。我们可以定义ReRoutes路由数组中响应的优先级。0是最低的优先级,数字越大,优先级越高。

[
{
    "UpstreamPathTemplate": "/ocelot/{Id}"
    "Priority": 0
},
{
    "UpstreamPathTemplate": "/ocelot/10"
    "Priority": 1
},
]

总结

本文主要介绍了Ocelot的功能,并通过简单的案例讲述如何构建Ocelot网关以及对Ocelot的基本应用。由于Ocelot功能非常的强大,如果将所有的案例都放到同一篇文章中会导致篇幅过长,不便于阅读,因此,我将会针对Ocelot功能写成系列文章,希望大家继续捧场。

参考文献

本文在编写过程中引用或参考了以下文章中的部分内容,如有侵权,请联系修改或删除。

https://www.cnblogs.com/jesse2013/p/net-core-apigateway-ocelot-docs.html

原文地址:https://www.cnblogs.com/letyouknowdotnet/p/10964484.html

时间: 2024-08-29 23:34:35

Ocelot(一)- .Net Core开源网关的相关文章

.NET Core开源API网关 – Ocelot中文文档

原文:.NET Core开源API网关 – Ocelot中文文档 Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly Tracing集成.这些功能只都只需要简单的配置即可完成,下面我们会对这些功能的配置一一进行说明. 介绍 简单的来说Ocelot是一堆的asp.net core middleware组成的一个管道.当它拿到请求之后会用一个reque

积极拥抱.NET Core开源社区

潘正磊在上海的Tech Summit 2018 大会上给我们的.NET Core以及开源情况带来了最新信息. .Net Core 开源后取得了更加快速的发展,目前越活跃用户高达400万人,每月新增开发者45万,在 GitHub 上的月度增长达到15%.目前有来自超过3,700家企业的1.9万开发者在为 .NET Core 做贡献,.NET 基金会管理着超过60个项目. .NET Core 为开发者提供了跨平台.云原生应用的理想开发平台,特别是即将发布的 .NET Core 3,能够全面支持从网页

一份关于组建.NET Core开源团队的倡议书

组建这个.NET Core开源团队,旨在为社区出一份力,对自己能力也是一个提升,是一个即利于他人,也利于自己的想法和行动.如果你有很多想法,如果你需要认识更多志同道合的朋友,如果你想展示自己的才华,如果你想为自己的社会担当添上一笔,哪怕你就是为了装一次荡气回肠的逼,你可以来这里,咱们一起来干一场. 在这里,你的加入的目的不重要,不追求你加入组织的纯洁性(哈哈哈...),只要你分享了知识,你的所做的为他人解决了问题,或者指明了方向,有这一点就足够了. 欢迎大神,也欢迎菜鸟,因为目的是为了分享知识,

Magicodes.Admin.Core开源框架总体介绍

框架说明 Magicodes.Admin.Core框架在ABP以及ASP.NET ZERO的基础上进行了封装和完善,目前基于.NET Core 2.0+(Framework版本),由于部分组件在.NET Core没有找到替代组件,所以真正意义上跨平台版本会在后续推出. 目前本框架已经应用于团队的所有项目,在实际开发过程中还在不断地打磨. 由于本人和团队成员都是利用自己的时间来打磨本框架,因此在大部分情况下,并不会在相关群内进行解答,如果确实是疑难问题,请提交Issue.如果觉得本框架对您有所帮助

asp.net core api网关 实时性能监控

asp.net core api网关 实时性能监控 使用InfluxDB.Grafana Dockerfile 运行 InfluxDB.Grafana influxdb: image: influxdb ports: - "8086:8086" - "8083:8083" environment: - INFLUXDB_DB=TogetherAppMetricsDB - INFLUXDB_ADMIN_ENABLED=true - INFLUXDB_ADMIN_USE

Exceptionless - .Net Core开源日志框架

原文:Exceptionless - .Net Core开源日志框架 Exceptionless - .Net Core开源日志框架 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/11020140.html 官网地址:http://letyouknow.net 今天要给大家介绍的Exceptionless是一个基于 .net core的开源日志框架,Exceptionless的意思是:没有异常.Exceptionless可

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

写在前面 API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导等工作,我们可以形象的用下图来表示: 外部设备需要访问内部系统服务时必须要通过我们的API Gateway,目的是为了隔离内部服务和外部访问来做统一的认证授权,限流熔断,请求聚合,负载均衡,日志记录,监控预警等 通用功能,就像是我们系统的防火墙一样,在任何外部请求访问系统时都必须经过防火墙的验证. 更多关于网关的信息请参考前面的一篇文章<API网关模式> Oc

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

Ocelot作为基于.net core的API方关,有一个功能是统一验证,它的作用是把没有访问权限的请求挡在API网关外面,而不是到达API网关事端的API时才去验证:之前我有一篇博文https://www.cnblogs.com/axzxs2001/p/8005084.html,作过说明,这篇博文说明了实现代码,今天我把这个实现作了整理,封装成一个Nuget包,供大家方便调用. Web API的验证一般是用UserName和Password请求到Token,然后每次请求需要权限的API接口是把

.Net Core开源通讯组件 SmartRoute(服务即集群)

SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置即可实现服务通讯集群.SmartRoute是通过消息订阅的机制实现服务与服务之间的通讯,它可以让广播网段内所有服务器上的应用自动构建通讯集群: 而通讯集群完全是SmartRoute自动构建并不需要进行任何配置或安装中间服务.通过这种全新的通讯开发方式可以让开发者更轻松和简单地构建基于服务的集群通讯应用. SmartRoute的发展目标   智能集成服务通讯交互 不