Program.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using System.Net;
  2. using System.Net.Sockets;
  3. using System.Text.Json;
  4. using Base;
  5. using Common;
  6. using Extensions;
  7. using Filters;
  8. using Infrastructure;
  9. using Infrastructure.Model;
  10. using Lycoris.Yarp.Nacos.Extensions;
  11. using Microsoft.AspNetCore.Authorization;
  12. using Microsoft.AspNetCore.Server.Kestrel.Core;
  13. using Middleware;
  14. using Nacos.AspNetCore.V2;
  15. using Nacos.V2;
  16. using Nacos.V2.DependencyInjection;
  17. using Nacos.V2.Naming;
  18. using Ocelot.DependencyInjection;
  19. using Ocelot.Middleware;
  20. using Ocelot.Provider.Nacos;
  21. using SummerBoot.Core;
  22. using Util;
  23. using Yarp.ReverseProxy.Configuration;
  24. ThreadPool.SetMinThreads(200, 200);
  25. var builder = WebApplication.CreateBuilder(args);
  26. // Add services to the container.
  27. builder.Services.AddControllers();
  28. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  29. builder.Services.AddEndpointsApiExplorer();
  30. //注入HttpContextAccessor
  31. builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
  32. //IPRatelimit
  33. // builder.Services.AddIPRate(builder.Configuration);
  34. builder.Services.AddSession();
  35. builder.Services.AddHttpContextAccessor();
  36. // builder.Services.AddCors(option => option.AddPolicy("cors", policy => policy.AllowAnyHeader().AllowAnyMethod().AllowCredentials().SetIsOriginAllowed(_ => true)));
  37. builder.Services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true).Configure<IISServerOptions>(x => x.AllowSynchronousIO = true);
  38. string nacosIp = "localhost";
  39. var host = Dns.GetHostEntry(Dns.GetHostName());
  40. foreach (var ip in host.AddressList)
  41. {
  42. if (ip.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(ip))
  43. {
  44. nacosIp = ip.ToString();
  45. }
  46. }
  47. builder.Configuration["NacosConfig:Ip"] = nacosIp;
  48. //配置中心
  49. builder.Configuration.AddNacosV2Configuration(builder.Configuration.GetSection("NacosConfig"));
  50. //服务注册
  51. builder.Services.AddNacosAspNet(builder.Configuration, "NacosConfig");
  52. //绑定整个对象到Model上
  53. builder.Services.Configure<OptionsSetting>(builder.Configuration);
  54. // builder.Configuration.AddJsonFile("iprate.json");
  55. //配置文件
  56. builder.Services.AddSingleton(new AppSettings(builder.Configuration));
  57. //请求大小限制
  58. builder.Services.AddRequestLimit(builder.Configuration);
  59. //配置文件
  60. builder.Services.AddSingleton(new AppSettings(builder.Configuration));
  61. //app服务注册
  62. builder.Services.AddAppService();
  63. builder.Services.AddMvc(options =>
  64. {
  65. options.Filters.Add(typeof(GlobalActionMonitor));//全局注册
  66. options.Filters.Add(typeof(AuthorizationFilter));
  67. })
  68. .AddJsonOptions(options =>
  69. {
  70. //options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString;
  71. options.JsonSerializerOptions.WriteIndented = true;
  72. options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter());
  73. options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter());
  74. options.JsonSerializerOptions.Converters.Add(new StringConverter());
  75. //PropertyNamingPolicy属性用于前端传过来的属性的格式策略,目前内置的仅有一种策略CamelCase
  76. options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
  77. //options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;//属性可以忽略大小写格式,开启后性能会降低
  78. });
  79. builder.Services.AddSummerBoot();
  80. builder.Services.AddSummerBootFeign();
  81. var initRoutes = Array.Empty<RouteConfig>();
  82. var initClusters= Array.Empty<ClusterConfig>();
  83. builder.Services.AddSingleton(new InMemoryConfigProvider(initRoutes, initClusters));
  84. builder.Services.AddSingleton<IProxyConfigProvider>(sp =>
  85. sp.GetRequiredService<InMemoryConfigProvider>());
  86. // 2. 把 Provider 喂给 YARP
  87. builder.Services.AddReverseProxy();
  88. // 注册REDIS 服务
  89. var openRedis = builder.Configuration["RedisServer:open"];
  90. if (openRedis == "1")
  91. {
  92. RedisServer.Initalize();
  93. }
  94. builder.WebHost.ConfigureKestrel(o =>
  95. {
  96. o.Limits.MaxRequestBodySize = 100 * 1024 * 1024; // 100 MB
  97. });
  98. builder.Services.AddHostedService<RefreshYarp>();
  99. var app = builder.Build();
  100. InternalApp.ServiceProvider = app.Services;
  101. InternalApp.Configuration = builder.Configuration;
  102. InternalApp.WebHostEnvironment = app.Environment;
  103. //初始化db
  104. // builder.Services.AddDb(app.Environment);
  105. var workId = builder.Configuration["workId"].ParseToInt();
  106. if (app.Environment.IsDevelopment())
  107. {
  108. workId += 1;
  109. }
  110. SnowFlakeSingle.WorkId = workId;
  111. //使用全局异常中间件
  112. app.UseMiddleware<GlobalExceptionMiddleware>();
  113. app.Use(next => new RequestDelegate(
  114. async context =>
  115. {
  116. context.Request.EnableBuffering();
  117. await next(context);
  118. }
  119. ));
  120. // Configure the HTTP request pipeline.
  121. if (app.Environment.IsDevelopment())
  122. {
  123. }
  124. app.UseCors();
  125. app.UseHttpsRedirection();
  126. app.UseAuthorization();
  127. app.MapControllerRoute(
  128. name: "default",
  129. pattern: "{controller=Home}/{action=Index}/{id?}");
  130. app.MapControllers();
  131. // app.Urls.Add("http://*:8000");
  132. // app.UseOcelot().Wait(); // 使用Ocelot中间件
  133. // app.MapGet("/debug-yarp", (IProxyConfigProvider p) =>
  134. // {
  135. // var cfg = p.GetConfig();
  136. // return Results.Json(new
  137. // {
  138. // RoutesCount = cfg.Routes.Count,
  139. // ClustersCount = cfg.Clusters.Count,
  140. // FirstRoute = cfg.Routes.FirstOrDefault(),
  141. // FirstCluster = cfg.Clusters.FirstOrDefault()
  142. // });
  143. // });
  144. // app.MapGet("/debug-proxy-route", (HttpContext ctx, IProxyConfigProvider prov) =>
  145. // {
  146. // var route = prov.GetConfig().Routes.FirstOrDefault(r =>
  147. // r.Match.Path == "/noauth/api/{**catch-all}");
  148. // return Results.Json(route);
  149. // });
  150. app.MapGet("/", (HttpContext ctx, IProxyConfigProvider prov) =>
  151. {
  152. return Results.Content("OmegaES");
  153. });
  154. app.MapReverseProxy();
  155. app.UseMiddleware<RefererMiddleware>();
  156. app.Run("http://*:8000");