.net core ocelot+consul+jwt 身份验证,服务治理与发现,网关配置(二)增加consul
上一篇 搞了那么多还没有加上consul 这一篇加上consul
consul 的功能 服务治理与发现 , 如果 服务越来越多那么 配置也越来越多 能不能把服务地址统一,然后统一从这个地址访问就行了 这就是consul的作用
上一篇 忘说了ocelot 有负载均衡的配置忘说了
LeastConnection - 最少连接,跟踪哪些服务正在处理请求,并把新请求发送到现有请求最少的服务上。该算法状态不在整个Ocelot集群中分布。
RoundRobin - 轮询可用的服务并发送请求。 该算法状态不在整个Ocelot集群中分布。
NoLoadBalancer - 不负载均衡,从配置或服务发现提供程序中取第一个可用的下游服务。
这次补上 路由配置
LeastConnection 最小连接数
1 "LoadBalancerOptions": { 2 "Type": "LeastConnection" 3 },
下面进入正题
consul 官网上下一个
Install | Consul | HashiCorp Developer
windows下 consul 有开发模式 不能持久化 有server模式可以持久化 这里快速搞 就开发模式吧
consul agent -dev
新增项目
运行和停止 Agent
Consul agent 是 Consul 的核心:它运行 agent,执行维护成员信息、运行 check、通知 service、处理 queries 等的重要任务。Agent 必须在作为 Consul 集群一部分运行于每个节点上。
Agent 有两种模式:client 或 server。
Server 要参与 consensus quorum,当遇到故障情况时,这些节点通过 Raft 提供强一致性和强有效性,在 Server 节点上的较高负载意味着它们应该运行在专属的实例 —— 它们比 client 节点更为资源密集型。在整个集群中,绝大部分都为 Client 节点。
client 把所有的 RPCs 请求转发到 server 端,是相对无状态的。唯一在后台运行的时 client 端执行了 LAN gossip pool,只消耗极少的资源和网络带宽。
Running an Agent
Agent 通过执行 consul agent 启动。这个命令是阻塞的,除非主动终止。Agent 命令需要很多配置参数,但大多数都有默认值。
————————————————
版权声明:本文为CSDN博主「阳光倾洒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/quanzhan_King/article/details/131469063
ConsulAgent是Consul的核心进程,Agent的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul集群的每一个节点都必须运行agent进程。
Agent有两种模式:client或server。
Server要参与consensus quorum,当遇到故障情况时,这些节点通过Raft提供强一致性和强有效性,在Server节点上的较高负载意味着它们应该运行在专属的实例——它们比客户端节点更为资源密集型。在整个集群中,绝大部分都为Client节点。
client把所有的RPCs转发到server端,是相对无状态的。唯一在后台运行的时client端执行了LAN gossip pool,只消耗极少的资源和网络带宽。
————————————————
版权声明:本文为CSDN博主「YoungerChina」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/younger_china/article/details/52255005
Agent——agent是一直运行在Consul集群中每个成员上的守护进程。通过运行 consul agent 来启动。agent可以运行在client或者server模式。指定节点作为client或者server是非常简单的,除非有其他agent实例。所有的agent都能运行DNS或者HTTP接口,并负责运行时检查和保持服务同步。
Client——一个Client是一个转发所有RPC到server的代理。这个client是相对无状态的。client唯一执行的后台活动是加入LAN gossip池。这有一个最低的资源开销并且仅消耗少量的网络带宽。
Server——一个server是一个有一组扩展功能的代理,这些功能包括参与Raft选举,维护集群状态,响应RPC查询,与其他数据中心交互WAN gossip和转发查询给leader或者远程数据中心。
DataCenter——虽然数据中心的定义是显而易见的,但是有一些细微的细节必须考虑。例如,在EC2中,多个可用区域被认为组成一个数据中心?我们定义数据中心为一个私有的,低延迟和高带宽的一个网络环境。这不包括访问公共网络,但是对于我们而言,同一个EC2中的多个可用区域可以被认为是一个数据中心的一部分。
Consensus——在我们的文档中,我们使用Consensus来表明就leader选举和事务的顺序达成一致。由于这些事务都被应用到有限状态机上,Consensus暗示复制状态机的一致性。
Gossip——Consul建立在Serf的基础之上,它提供了一个用于多播目的的完整的gossip协议。Serf提供成员关系,故障检测和事件广播。更多的信息在gossip文档中描述。这足以知道gossip使用基于UDP的随机的点到点通信。
LAN Gossip——它包含所有位于同一个局域网或者数据中心的所有节点。
WAN Gossip——它只包含Server。这些server主要分布在不同的数据中心并且通常通过因特网或者广域网通信。
RPC——远程过程调用。这是一个允许client请求server的请求/响应机制。
-----------------------------------
©著作权归作者所有:来自51CTO博客作者wx62ccd9cc616d1的原创作品,请联系作者获取转载授权,否则将追究法律责任
服务发现之consul的介绍、部署和使用
https://blog.51cto.com/u_15715098/5920980
需要理解 ConsulClient 和 agent
consulClient 需要配置 consul ui 的配置项 比如说 数据中心config.Datacenter = "dc1";,
ip地址端口号 8500 而 agent 是consul 核心 扶着 注册服务,健康检查,响应查询等 所以
1 using Consul; 2 using Microsoft.AspNetCore.Builder; 3 using Microsoft.Extensions.Configuration; 4 using Microsoft.Extensions.DependencyInjection; 5 using Microsoft.Extensions.Options; 6 using System; 7 using System.Collections.Generic; 8 using System.Linq; 9 using System.Net; 10 using System.Text; 11 using System.Threading.Tasks; 12 13 namespace Common.core.consul 14 { 15 public static class ConsulExtend 16 { 17 public static async Task<IApplicationBuilder> UseCustomConsulAsync(this IApplicationBuilder app, IConfiguration config) 18 { 19 ConsulOptions consulOptions = new ConsulOptions(); 20 config.Bind(consulOptions); 21 config.GetSection("ConsulOptions").Bind(consulOptions); 22 return await ConsulExtend.UseDefaultConsulAsync(app, consulOptions); 23 } 24 25 public static async Task<IApplicationBuilder> UseDefaultConsulAsync(this IApplicationBuilder app, 26 ConsulOptions options) 27 { 28 using ConsulClient client = new ConsulClient(config => 29 { 30 config.Address = new Uri(options.ConsulMain.Address); 31 config.Datacenter = options.ConsulMain.Datacenter; 32 //config.Address = new Uri("http://localhost:8500"); 33 //config.Datacenter = "dc1"; 34 }); 35 await client.Agent.ServiceRegister(new AgentServiceRegistration 36 { 37 ID = Guid.NewGuid().ToString(), 38 Name = options.ConsulRegister.Name, 39 Address = options.ConsulRegister.Address, 40 Port = options.ConsulRegister.Port, 41 //Address = "localhost", 42 //Port = 5032, 43 Tags = new string[] { options.ConsulRegister.Tag }, 44 Check = new AgentServiceCheck() 45 { 46 DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(options.ConsulRegister.DeregisterCriticalServiceAfter),//服务启动多久后注册 47 Interval = TimeSpan.FromSeconds(options.ConsulRegister.Interval),//健康检查时间间隔 48 HTTP = options.ConsulRegister.HealthCheckUrl,///健康检查地址 49 Timeout = TimeSpan.FromSeconds(options.ConsulRegister.Timeout) 50 } 51 }); 52 return app; 53 } 54 } 55 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Common.core.consul 8 { 9 public class ConsulOptions 10 { 11 public ConsulMain ConsulMain { get; set; } 12 public ConsulRegister ConsulRegister { get; set; } 13 } 14 /// <summary> 15 /// consul ui 16 /// </summary> 17 public class ConsulMain 18 { 19 public string Address { get; set; } 20 public string Datacenter { get; set; } 21 } 22 23 /// <summary> 24 /// consul 下节点 注册 25 /// </summary> 26 public class ConsulRegister 27 { 28 public string Name { get; set; } 29 public string Address { get; set; } 30 public int Port { get; set; } 31 public string Tag { get; set; } 32 33 public string HealthCheckUrl { get; set; } 34 public int Interval { get; set; } 35 public int Timeout { get; set; } 36 public int DeregisterCriticalServiceAfter { get; set; } 37 } 38 39 }
以下项目引用
1 { 2 "Logging": { 3 "LogLevel": { 4 "Default": "Information", 5 "Microsoft.AspNetCore": "Warning" 6 } 7 }, 8 "AllowedHosts": "*", 9 "Audience": { 10 "Secret": "sdfsdfsrty45634kkhllghtdgdfss345t678fs", //密钥 11 "Issuer": "SwiftCode.BBS", //发行人 12 "Audience": "wr" //订阅人 13 }, 14 "ConsulOptions": { 15 "ConsulMain": { 16 "Address": "http://localhost:8500", 17 "Datacenter": "dc1" 18 }, 19 "ConsulRegister": { 20 "Name": "MainWeb", 21 "Address": "localhost", 22 "Port": 5032, 23 "Tag": "1", 24 "HealthCheckUrl": "http://localhost:5032/HealthCheck", 25 "Interval": 10, 26 "Timeout": 5, 27 "DeregisterCriticalServiceAfter": 20 28 } 29 }, 30 //redis分布式缓存 31 "RedisConfig": { 32 //是否打开缓存1是0否 33 "IsOpenCache": "0", 34 "ReadWriteHosts": "192.168.1.2:6379,192.168.1.3:6379,password=123456", 35 "ReadOnlyHosts": "192.168.1.2:6379,password=123456" 36 } 37 }
1 using Common.core.consul; 2 using Microsoft.AspNetCore.Authentication.JwtBearer; 3 using Microsoft.Extensions.DependencyInjection; 4 using Microsoft.IdentityModel.Tokens; 5 using Microsoft.OpenApi.Models; 6 using Swashbuckle.AspNetCore.Filters; 7 using System.Text; 8 9 var builder = WebApplication.CreateBuilder(args); 10 11 // Add services to the container. 12 13 builder.Services.AddControllers(); 14 // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle 15 builder.Services.AddEndpointsApiExplorer(); 16 builder.Services.AddSwaggerGen(options => 17 { 18 19 //开启小锁 20 options.OperationFilter<AddResponseHeadersFilter>(); 21 options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>(); 22 //在header 中添加token 传给后台 23 options.OperationFilter<SecurityRequirementsOperationFilter>(); 24 //添加安全定义 25 options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme 26 { 27 Description = "jwt授权直接在下框输入token,格式 bearer+空格+token", 28 Name = "Authorization",//默认参数名称 29 In = ParameterLocation.Header, 30 Type = SecuritySchemeType.ApiKey, 31 BearerFormat = "JWT", 32 Scheme = "Bearer" 33 }); 34 //添加安全要求 35 options.AddSecurityRequirement(new OpenApiSecurityRequirement { 36 { 37 new OpenApiSecurityScheme{ 38 Reference =new OpenApiReference{ 39 Type = ReferenceType.SecurityScheme, 40 Id ="Bearer" 41 } 42 },new string[]{ } 43 } 44 }); 45 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "JwtMainWebApI.xml"); 46 options.IncludeXmlComments(path, true); 47 options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo 48 { 49 Title = "主页登录", 50 Description = "主页登录" 51 }); 52 }); 53 54 //注入consul 配置 55 builder.Services.Configure<ConsulOptions>(builder.Configuration.GetSection("ConsulOptions")); 56 57 //jwt 58 builder.Services.AddAuthentication(options => 59 { 60 options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 61 options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 62 }).AddJwtBearer(options => 63 { 64 //读取配置文件 65 var audienceConfig = builder.Configuration.GetSection("Audience"); 66 var symmetricKeyAsBase64 = audienceConfig["Secret"]; 67 var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64); 68 var signingKey = new SymmetricSecurityKey(keyByteArray); 69 options.TokenValidationParameters = new TokenValidationParameters 70 { 71 ValidateIssuerSigningKey = true, 72 IssuerSigningKey = signingKey, 73 ValidateIssuer = true, 74 ValidIssuer = audienceConfig["Issuer"],//发行人 75 ValidateAudience = true, 76 ValidAudience = audienceConfig["Audience"],//订阅人 77 ValidateLifetime = true, 78 ClockSkew = TimeSpan.Zero,//这个是缓冲过期时间,也就是说,即使我们配置了过期时间,这里也要考虑进去,过期时间+缓冲,默认好像是7分钟,你可以直接设置为0 79 RequireExpirationTime = true, 80 }; 81 }); 82 83 //builder.Services.AddCors(options => 84 //{ 85 // options.AddPolicy("cors", policy => 86 // { 87 // policy.AllowAnyOrigin(); 88 // policy.AllowAnyHeader(); 89 // policy.AllowAnyMethod(); 90 // }); 91 //}); 92 93 var app = builder.Build(); 94 95 // Configure the HTTP request pipeline. 96 if (app.Environment.IsDevelopment()) 97 { 98 app.UseSwagger(); 99 app.UseSwaggerUI(options => 100 { 101 options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); 102 options.RoutePrefix = ""; 103 }); 104 } 105 //app.UseCors("cors"); 106 //注册consul 107 app.UseCustomConsulAsync(app.Configuration).Wait(); 108 // consul 健康检查 109 app.Map("/HealthCheck", config => 110 { 111 config.Run(async context => 112 { 113 context.Response.StatusCode = 200; 114 app.Logger.LogError( $"{context.Request.Host}consul健康检查成功"); 115 await Task.CompletedTask; 116 }); 117 }); 118 119 app.UseHttpsRedirection(); 120 app.UseAuthentication(); 121 app.UseAuthorization(); 122 123 app.MapControllers(); 124 125 app.Run();
1 using Common.core.consul; 2 using Consul; 3 using Microsoft.AspNetCore.Http; 4 using Microsoft.AspNetCore.Mvc; 5 using Microsoft.Extensions.Options; 6 7 namespace JwtMainWebApI.Controllers 8 { 9 10 /// <summary> 11 /// 测试 consul 12 /// </summary> 13 [Route("api/[controller]")] 14 [ApiController] 15 public class ConsulController : ControllerBase 16 { 17 private readonly ConsulOptions _consulOptions; 18 public ConsulController(IOptionsMonitor<ConsulOptions> optionsMonitor) 19 { 20 _consulOptions = optionsMonitor.CurrentValue; 21 } 22 /// <summary> 23 /// 请求consul节点 24 /// </summary> 25 /// <returns></returns> 26 [HttpGet] 27 public async Task<IActionResult> Get() 28 { 29 using ConsulClient consulClient = new ConsulClient(config => 30 { 31 config.Address = new Uri(_consulOptions.ConsulMain.Address); 32 }); 33 var services = consulClient.Catalog.Service("MainWeb").Result.Response; 34 if (services != null && services.Any()) 35 { 36 HttpClient httpClient = new HttpClient(); 37 HttpResponseMessage responseMessage = await httpClient.GetAsync($"http://{_consulOptions.ConsulRegister.Address}:{_consulOptions.ConsulRegister.Port}/WeatherForecast"); 38 string result = await responseMessage.Content.ReadAsStringAsync(); 39 return Ok(result); 40 } 41 return BadRequest(); 42 } 43 } 44 }
测试结果
ocelot 配置 之前没有 配置consul 下游用的是http 配置consul 根节点要新增consul 路由http那里要注释同时要新增开启consul配置
路由http注释
新增 开启 consul servicename 对应的是consul 节点服务的名称
根节点的配置
1 { 2 "Routes": [ 3 { 4 "DownstreamPathTemplate": "/", 5 "UpstreamPathTemplate": "/", 6 "UpstreamHttpMethod": [ 7 "Get" 8 ], 9 "DownstreamHttpMethod": "", 10 "DownstreamHttpVersion": "", 11 "AddHeadersToRequest": {}, 12 "AddClaimsToRequest": {}, 13 "RouteClaimsRequirement": {}, 14 "AddQueriesToRequest": {}, 15 "RequestIdKey": "", 16 "FileCacheOptions": { 17 "TtlSeconds": 0, 18 "Region": "" 19 }, 20 "RouteIsCaseSensitive": false, 21 "ServiceName": "", 22 "DownstreamScheme": "http", 23 "DownstreamHostAndPorts": [ 24 { 25 "Host": "localhost", 26 "Port": 51876 27 } 28 ], 29 "QoSOptions": { 30 "ExceptionsAllowedBeforeBreaking": 0, 31 "DurationOfBreak": 0, 32 "TimeoutValue": 0 33 }, 34 "LoadBalancer": "", 35 "RateLimitOptions": { 36 "ClientWhitelist": [], 37 "EnableRateLimiting": false, 38 "Period": "", 39 "PeriodTimespan": 0, 40 "Limit": 0 41 }, 42 "AuthenticationOptions": { 43 "AuthenticationProviderKey": "", 44 "AllowedScopes": [] 45 }, 46 "HttpHandlerOptions": { 47 "AllowAutoRedirect": true, 48 "UseCookieContainer": true, 49 "UseTracing": true, 50 "MaxConnectionsPerServer": 100 51 }, 52 "DangerousAcceptAnyServerCertificateValidator": false 53 }, 54 55 56 { 57 "UpstreamPathTemplate": "/api/Auth/{everything}", 58 "UpstreamHttpMethod": [ "Get", "Post", "Put", "PATCH", "Delete", "Options" ], 59 "DownstreamPathTemplate": "/api/Auth/{everything}", 60 //"DownstreamScheme": "http", 61 //"DownstreamHostAndPorts": [ 62 // { 63 // "Host": "localhost", 64 // "Port": 5246 65 // } 66 //], 67 //跨域 68 "DownstreamHeaderTransform": { 69 "Access-Control-Allow-Origin": "http://localhost:5253", //不存在就添加 70 "Access-Control-Allow-Methods": "*", 71 "Access-Control-Allow-Headers": "*" 72 }, 73 74 /*熔断/超时 75 超时就是网关请求服务时可容忍的最长响应时间。 76 熔断的意思就是当请求某个服务的异常次数达到一定量时, 77 那么网关在一定时间内就不再对这个服务发起请求了,直接熔断*/ 78 "QoSOptions": { 79 "ExceptionsAllowedBeforeBreaking": 3, //发生错误的次数 80 "DurationOfBreak": 10000, //熔断时间 81 "TimeoutValue": 5000 //请求超过 5 秒,它将自动超时。 82 }, 83 /*缓存*/ 84 "FileCacheOptions": { 85 "TtlSeconds": 5, //过期时间 86 "Region": "productcache" 87 }, 88 /*限流*/ 89 "RateLimitOptions": { 90 "ClientWhitelist": [ "SuperClient" ], //白名单中的客户端可以不受限流的影响 91 "EnableRateLimiting": true, //是否限流 92 "Period": "5s", //限流的单位时间 93 "PeriodTimespan": 2, //请求上限多少秒后可以重试 94 "Limit": 1 //定义的时间内可以发出的最大请求数 95 }, 96 "UseServiceDiscovery": true, //开启consul发现 97 "ServiceName": "Auth", 98 "LoadBalancerOptions": { 99 "Type": "RoundRobin" //轮询 LeastConnection-最少连接数的服务器 NoLoadBalance不负载均衡 100 } 101 }, 102 103 { 104 "UpstreamPathTemplate": "/api/Login", 105 "UpstreamHttpMethod": [ "Get", "Post", "Put", "PATCH", "Delete", "Options" ], 106 "DownstreamPathTemplate": "/api/Login", 107 //"DownstreamScheme": "http", 108 //"DownstreamHostAndPorts": [ 109 // { 110 // "Host": "localhost", 111 // "Port": 5032 112 // } 113 //], 114 //跨域 115 "DownstreamHeaderTransform": { 116 "Access-Control-Allow-Origin": "http://localhost:5253", //不存在就添加 117 "Access-Control-Allow-Methods": "*", 118 "Access-Control-Allow-Headers": "*" 119 }, 120 /*熔断/超时 121 超时就是网关请求服务时可容忍的最长响应时间。 122 熔断的意思就是当请求某个服务的异常次数达到一定量时, 123 那么网关在一定时间内就不再对这个服务发起请求了,直接熔断*/ 124 "QoSOptions": { 125 "ExceptionsAllowedBeforeBreaking": 3, //发生错误的次数 126 "DurationOfBreak": 10000, //熔断时间 127 "TimeoutValue": 5000 //请求超过 5 秒,它将自动超时。 128 }, 129 /*缓存*/ 130 "FileCacheOptions": { 131 "TtlSeconds": 5, //过期时间 132 "Region": "productcache" 133 }, 134 /*限流*/ 135 "RateLimitOptions": { 136 "ClientWhitelist": [ "3" ], //白名单中的客户端可以不受限流的影响 137 "EnableRateLimiting": true, //是否限流 138 "Period": "5s", //限流的单位时间 139 "PeriodTimespan": 2, //请求上限多少秒后可以重试 140 "Limit": 1 //定义的时间内可以发出的最大请求数 141 }, 142 //鉴权授权 143 "AuthenticationOptions": { 144 "AuthenticationProviderKey": "TestKey", 145 "AllowedScopes": [ "testscope" ] 146 }, 147 "UseServiceDiscovery": true, //开启consul发现 148 "ServiceName": "MainWeb" , 149 "LoadBalancerOptions": { 150 "Type": "RoundRobin" //轮询 LeastConnection-最少连接数的服务器 NoLoadBalance不负载均衡 151 } 152 }, 153 154 //身份验证swagger 155 { 156 "UpstreamPathTemplate": "/auth/swagger/v1/swagger.json", 157 "UpstreamHttpMethod": [ "Get", "Post", "Put", "PATCH", "Delete", "Options" ], 158 "DownstreamPathTemplate": "/swagger/v1/swagger.json", 159 //"DownstreamScheme": "http", 160 //"DownstreamHostAndPorts": [ 161 // { 162 // "Host": "localhost", 163 // "Port": 5246 164 // } 165 //], 166 "DownstreamHeaderTransform": { 167 "Access-Control-Allow-Origin": "http://localhost:5253", //不存在就添加 168 "Access-Control-Allow-Methods": "*", 169 "Access-Control-Allow-Headers": "*" 170 }, 171 /*熔断/超时 172 超时就是网关请求服务时可容忍的最长响应时间。 173 熔断的意思就是当请求某个服务的异常次数达到一定量时, 174 那么网关在一定时间内就不再对这个服务发起请求了,直接熔断*/ 175 "QoSOptions": { 176 "ExceptionsAllowedBeforeBreaking": 3, //发生错误的次数 177 "DurationOfBreak": 10000, //熔断时间 178 "TimeoutValue": 5000 //请求超过 5 秒,它将自动超时。 179 }, 180 /*缓存*/ 181 "FileCacheOptions": { 182 "TtlSeconds": 5, //过期时间 183 "Region": "productcache" 184 }, 185 /*限流*/ 186 "RateLimitOptions": { 187 "ClientWhitelist": [ "SuperClient" ], //白名单中的客户端可以不受限流的影响 188 "EnableRateLimiting": true, //是否限流 189 "Period": "5s", //限流的单位时间 190 "PeriodTimespan": 2, //请求上限多少秒后可以重试 191 "Limit": 1 //定义的时间内可以发出的最大请求数 192 }, 193 "UseServiceDiscovery": true, //开启consul发现 194 "ServiceName": "Auth", 195 "LoadBalancerOptions": { 196 "Type": "RoundRobin" //轮询 LeastConnection-最少连接数的服务器 NoLoadBalance不负载均衡 197 } 198 }, 199 200 //主页面swagger 201 { 202 "UpstreamPathTemplate": "/jwtmain/swagger/v1/swagger.json", 203 "UpstreamHttpMethod": [ "Get", "Post", "Put", "PATCH", "Delete", "Options" ], 204 "DownstreamPathTemplate": "/swagger/v1/swagger.json", 205 //"DownstreamScheme": "http", 206 //"DownstreamHostAndPorts": [ 207 // { 208 // "Host": "localhost", 209 // "Port": 5032 210 // } 211 //], 212 "DownstreamHeaderTransform": { 213 "Access-Control-Allow-Origin": "http://localhost:5253", //不存在就添加 214 "Access-Control-Allow-Methods": "*", 215 "Access-Control-Allow-Headers": "*" 216 }, 217 /*熔断/超时 218 超时就是网关请求服务时可容忍的最长响应时间。 219 熔断的意思就是当请求某个服务的异常次数达到一定量时, 220 那么网关在一定时间内就不再对这个服务发起请求了,直接熔断*/ 221 "QoSOptions": { 222 "ExceptionsAllowedBeforeBreaking": 3, //发生错误的次数 223 "DurationOfBreak": 10000, //熔断时间 224 "TimeoutValue": 5000 //请求超过 5 秒,它将自动超时。 225 }, 226 /*缓存*/ 227 "FileCacheOptions": { 228 "TtlSeconds": 5, //过期时间 229 "Region": "productcache" 230 }, 231 /*限流*/ 232 "RateLimitOptions": { 233 "ClientWhitelist": [ "SuperClient" ], //白名单中的客户端可以不受限流的影响 234 "EnableRateLimiting": true, //是否限流 235 "Period": "5s", //限流的单位时间 236 "PeriodTimespan": 2, //请求上限多少秒后可以重试 237 "Limit": 1 //定义的时间内可以发出的最大请求数 238 }, 239 "UseServiceDiscovery": true, //开启consul发现 240 "ServiceName": "MainWeb" , 241 "LoadBalancerOptions": { 242 "Type": "RoundRobin" //轮询 LeastConnection-最少连接数的服务器 NoLoadBalance不负载均衡 243 } 244 } 245 ], 246 "GlobalConfiguration": { 247 "BaseUrl": "http://localhost:5253", 248 "ServiceDiscoveryProvider": { 249 "Scheme": "http", 250 "Host": "localhost", 251 "Port": 8500, 252 "Type": "Consul" 253 }, 254 "RateLimitOptions": { 255 "DisableRateLimitHeaders": false, //是否禁用X-Rate-Limit和Retry-After标头 256 "QuotaExceededMessage": "{\"res_code\":\"999\",\"res_msg\":\"请求中\"}", //请求达到上限时返回 257 "HttpStatusCode": 999, //HTTP状态代码 258 "ClientIdHeader": "Test" 259 } 260 } 261 }
出现个坑 在consul 注册节点那里