(7)ASP.NET Core3.1 Ocelot Swagger
阿新 • • 發佈:2020-11-20
1.前言
前端與後端的聯絡更多是通過API介面對接,API文件變成了前後端開發人員聯絡的紐帶,開始變得越來越重要,而Swagger就是一款讓你更好的書寫規範API文件的框架。在Ocelot Swagger專案示例中,通過APIGateway專案路由配置閘道器、上下游服務Swagger。對解決方案中的示例APIServiceA、APIServiceB專案Get方法進行配置,檔案配置具體程式碼如下:
{ "Routes": [ { //下游服務地址 "DownstreamPathTemplate": "/swagger/v1/swagger.json", //傳輸協議 "DownstreamScheme": "http", //下游主機跟埠號(陣列) "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9001 } ], //上游服務地址 "UpstreamPathTemplate": "/a/swagger.json", //上游服務Http埠號(陣列) "UpstreamHttpMethod": [ "Get", "POST" ] }, { "DownstreamPathTemplate": "/swagger/v1/swagger.json", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9002 } ], "UpstreamPathTemplate": "/b/swagger.json", "UpstreamHttpMethod": [ "Get", "POST" ] }, { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9001 } ], "UpstreamPathTemplate": "/a", "UpstreamHttpMethod": [ "Get" ] }, { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9002 } ], "UpstreamPathTemplate": "/b", "UpstreamHttpMethod": [ "Get" ] } ], "GlobalConfiguration": { "RequestIdKey": "OcRequestId", "AdministrationPath": "/administration" } }
2.專案演示
2.1APIGateway專案
新增Ocelot、Swagger服務注入:
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseUrls("http://*:9000") .ConfigureAppConfiguration((hostingContext, config) => { config .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("ocelot.json") .AddEnvironmentVariables(); }) .ConfigureServices(s => { //新增Ocelot服務; s.AddOcelot(); s.AddMvc(); //新增Swagger服務; s.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "GW", Version = "v1" }); var basePath = PlatformServices.Default.Application.ApplicationBasePath; var xmlPath = Path.Combine(basePath, "APIGateway.xml"); c.IncludeXmlComments(xmlPath); }); }) .Configure(a => { //使用Swagger a.UseSwagger().UseSwaggerUI(c => { c.SwaggerEndpoint("/a/swagger.json", "APIServiceA"); c.SwaggerEndpoint("/b/swagger.json", "APIServiceB"); }); //使用Ocelot; a.UseOcelot().Wait(); }) .Build();
2.2APIServiceA專案
Startup新增Swagger服務注入:
ConfigureServices:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIServiceA", Version = "v1" }); var basePath = PlatformServices.Default.Application.ApplicationBasePath; var xmlPath = Path.Combine(basePath, "APIServiceA.xml"); c.IncludeXmlComments(xmlPath); }); Configure: app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "APIServiceA"); });
新增一個Get方法,對應APIGateway專案的路由上下游配置,具體程式碼如下:
/// <summary> /// Values controller. /// </summary> [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values /// <summary> /// Get values. /// </summary> /// <returns>The get.</returns> [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } }
2.3APIServiceB專案
Startup新增Swagger服務注入:
ConfigureServices:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIServiceB", Version = "v1" }); var basePath = PlatformServices.Default.Application.ApplicationBasePath; var xmlPath = Path.Combine(basePath, "APIServiceB.xml"); c.IncludeXmlComments(xmlPath); });
Configure:
app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "APIServiceB"); });
新增一個Get方法,對應APIGateway專案的路由上下游配置,具體程式碼如下:
/// <summary> /// Values controller. /// </summary> [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values /// <summary> /// Get values. /// </summary> /// <returns>The get.</returns> [HttpGet] public IEnumerable<string> Get() { return new string[] { "value3", "value4" }; } }
2.4專案執行
注:如果想把Swagger註釋警告提示取消,可以在對應專案檔案.csproj的PropertyGroup節點上加入<NoWarn>$(NoWarn);1591</NoWarn>這一行程式碼。
輸入dotnet run --project 專案路徑\專案檔案.csproj把三個專案啟動起來,通過在瀏覽器分別開啟APIServiceA與APIServiceB兩個站點上游服務Swagger地址,會看到如下資訊:
APIServiceA:
APIServiceB:
通過閘道器的路由配置,把Swagger整合到Ocelot中,統一入口管理,通過閘道器入口我們就能開啟不同下游服務的Swagger。這一系列章節都是Ocelot入門級別的文章,最後章節將會來介紹Ocelot結合Consul的服務發現。