Ocelot(九)- 教你如何配置Ocelot?

配置

能够在此处找到示例配置配置有两个部分。一组ReRoutes和一个GlobalConfiguration。ReRoutes是告诉Ocelot如何处理上游请求的对象。全局配置有点hacky并容许覆盖ReRoute特定设置。若是您不想管理大量ReRoute特定设置,这将很是有用。git

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

这是一个示例ReRoute配置,您不须要设置全部这些内容,但这是目前可用的全部内容: github

{
          "DownstreamPathTemplate": "/", "UpstreamPathTemplate": "/", "UpstreamHttpMethod": [ "Get" ], "AddHeadersToRequest": {}, "AddClaimsToRequest": {}, "RouteClaimsRequirement": {}, "AddQueriesToRequest": {}, "RequestIdKey": "", "FileCacheOptions": { "TtlSeconds": 0, "Region": "" }, "ReRouteIsCaseSensitive": false, "ServiceName": "", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 51876, } ], "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 }, "DangerousAcceptAnyServerCertificateValidator": false } 

有关如何使用这些选项的更多信息以下。算法

多种环境

像任何其余asp.net核心项目同样,Ocelot支持配置文件名,例如configuration.dev.json,configuration.test.json等。为了实现这一点,请向您添加如下内容json

.ConfigureAppConfiguration((hostingContext, config) =>
        {
            config
                .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                .AddJsonFile("appsettings.json", true, true)
                .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
                .AddJsonFile("ocelot.json")
                .AddJsonFile($"configuration.{hostingContext.HostingEnvironment.EnvironmentName}.json")
                .AddEnvironmentVariables();
        })

Ocelot如今将使用特定于环境的配置,若是没有,则返回ocelot.json。缓存

您还须要设置相应的环境变量ASPNETCORE_ENVIRONMENT。有关这方面的更多信息能够在asp.net核心文档中找到服务器

合并配置文件

问题296中请求了此功能,并容许用户拥有多个配置文件,以便更轻松地管理大型配置。cookie

您能够像下面同样调用AddOcelot(),而不是直接添加配置,例如AddJsonFile(“ocelot.json”)。并发

.ConfigureAppConfiguration((hostingContext, config) =>
    {
        config
            .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true)
            .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
            .AddOcelot(hostingContext.HostingEnvironment)
            .AddEnvironmentVariables();
    })

在这种状况下,Ocelot将查找与模式(?i)ocelot匹配的任何文件。([a-zA-Z0-9] *。)json而后将它们合并在一块儿。若是要设置GlobalConfiguration属性,则必须具备名为ocelot.global.json的文件。app

Ocelot合并文件的方式基本上是加载它们,循环它们,添加任何ReRoutes,添加任何AggregateReRoutes,若是文件名为ocelot.global.json,则添加GlobalConfiguration以及任何ReRoutes或AggregateReRoutes。而后,Ocelot会将合并的配置保存到名为ocelot.json的文件中,这将在ocelot运行时用做事实的来源。asp.net

目前在此阶段没有验证,只有在Ocelot验证最终合并配置时才会发生。在调查问题时,须要注意这一点。若是你有任何问题,我建议你一直检查ocelot.json中的内容。

您还能够为Ocelot提供特定路径以查找下面的配置文件。

.ConfigureAppConfiguration((hostingContext, config) =>
    {
        config
            .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true)
            .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
            .AddOcelot("/foo/bar", hostingContext.HostingEnvironment)
            .AddEnvironmentVariables();
    })

Ocelot须要HostingEnvironment,所以它知道从算法中排除任何特定的环境。

在consul中存储配置

您须要作的第一件事是安装在Ocelot中提供Consul支持的NuGet包。

Install-Package Ocelot.Provider.Consul

而后在注册服务时添加如下内容:Ocelot将尝试在consul KV商店中存储和检索其配置。

services
   .AddOcelot() .AddConsul() .AddConfigStoredInConsul(); 

您还须要将如下内容添加到ocelot.json中。这就是Ocelot如何找到您的Consul代理并进行交互以从Consul加载和存储配置。

"GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
        "Host": "localhost",
        "Port": 9500
    }
}

我决定在使用Raft一致性算法并发现其超级难度以后建立此功能。为何不利用领事已经给你这个事实!我想这意味着若是你想充分利用Ocelot,你如今就把领事看成一个依赖。

在向当地领事代理发出新请求以前,此功能具备3秒ttl缓存。

更改时从新加载JSON配置

Ocelot支持在更改时从新加载json配置文件。例如,当手动更新ocelot.json文件时,如下内容将从新建立Ocelots内部配置。

config.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);

配置密钥

若是您使用Consul进行配置(或未来使用其余提供程序),您可能须要键入配置,以即可以进行多项配置:) 问题346中请求了此功能为了指定密钥,您须要在配置json文件的ServiceDiscoveryProvider部分中设置ConfigurationKey属性,例如

"GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
        "Host": "localhost",
        "Port": 9500,
        "ConfigurationKey": "Oceolot_A"
    }
}

在此示例中,Ocelot将在Consul中查找时使用Oceolot_A做为配置的关键。

若是未设置ConfigurationKey,则Ocelot将使用字符串InternalConfiguration做为键。

跟踪重定向/使用的CookieContainer 

在ReRoute配置中使用HttpHandlerOptions来设置HttpHandler行为:

1. AllowAutoRedirect是一个值,指示请求是否应遵循重定向响应。若是请求应自动遵循来自下游资源的重定向响应,则将其设置为true; 不然是假的。默认值为false。

2. UseCookieContainer是一个值,指示处理程序是否使用CookieContainer属性存储服务器cookie并在发送请求时使用这些cookie。默认值为false。请注意,若是您使用CookieContainer,则Ocelot会为每一个下游服务缓存HttpClient。这意味着对该DownstreamService的全部请求将共享相同的cookie。问题274是由于用户注意到cookie正在共享而建立的。我试着想办法解决这个问题,但我认为这是不可能的。若是不缓存客户端,则意味着每一个请求都会得到一个新客户端,从而得到一个新的cookie容器。若是您从缓存的客户端容器中清除cookie,则会因飞行请求而得到竞争条件。这也意味着后续请求不使用先前响应中的cookie!总而言之,状况并不是如此。除非你有一个很是好的理由,不然我会避免将UseCookieContainer设置为true。只需查看您的回复标题,并在下次请求时将Cookie转发回来!

SSL错误

若是要忽略SSL警告/错误,请在ReRoute配置中设置如下内容。

"DangerousAcceptAnyServerCertificateValidator": true

我不建议这样作,我建议您建立本身的证书,而后若是能够的话,让本地/远程计算机信任它。

相关文章
相关标签/搜索