zoukankan      html  css  js  c++  java
  • .net core在Ocelot网关中统一配置Swagger

    最近在做微服务的时候,由于我们是采用前后端分离来开发的,提供给前端的直接是Swagger,如果Swagger分布在各个API中,前端查看Swagger的时候非常不便,因此,我们试着将Swagger集中放到网关中。

    这里我用两个API项目(一个BasicDataApi,一个UsersApi)和一个网关项目(ApiGateway)做示例,下面直接上代码。

    首先在BasicDataApi中配置Swagger:

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
                services.AddSwaggerGen(options =>
                {
                    options.SwaggerDoc("BasicDataApi", new Info { Title = "基础数据服务", Version = "v1" });
                    var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                    var xmlPath = Path.Combine(basePath, "Qka.BasicDataApi.xml");
                    options.IncludeXmlComments(xmlPath);
                });
            }
    
            public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                app.UseMvc()
                     .UseSwagger(c =>
                {
                    c.RouteTemplate = "{documentName}/swagger.json";
                })
                    .UseSwaggerUI(options =>
                {
                    options.SwaggerEndpoint("/BasicDataApi/swagger.json", "BasicDataApi");
                });
            }
    

    在UsersApi中一样的配置:

    public void ConfigureServices(IServiceCollection services)
            {          
                services.AddSwaggerGen(options =>
                {
                    options.SwaggerDoc("UsersApi", new Info { Title = "用户API接口", Version = "v1" });
                    var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                    var xmlPath = Path.Combine(basePath, "Qka.UsersApi.xml");
                    options.IncludeXmlComments(xmlPath);
                });
    
                services.AddMvc();
            }
    
            public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                
                app.UseMvc()
                    .UseSwagger(c =>
                    {
                        c.RouteTemplate = "{documentName}/swagger.json";
                    })
                    .UseSwaggerUI(options =>
                    {
                        options.SwaggerEndpoint("/UsersApi/swagger.json", "UsersApi");
                    });
            }                       
    

      最后在网关项目中修改Ocelot配置,获取两个项目的swagger.json不要授权:

      "ReRoutes": [
        {
          "DownstreamPathTemplate": "/UsersApi/swagger.json",
          "DownstreamScheme": "http",
          "ServiceName": "userapi",
          "LoadBalancer": "RoundRobin",
          "UseServiceDiscovery": true,
          "UpstreamPathTemplate": "/UsersApi/swagger.json",
          "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ]
        },
        {
          "DownstreamPathTemplate": "/BasicDataApi/swagger.json",
          "DownstreamScheme": "http",
          "ServiceName": "basedataapi",
          "LoadBalancer": "RoundRobin",
          "UseServiceDiscovery": true,
          "UpstreamPathTemplate": "/BasicDataApi/swagger.json",
          "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ]
        },
        {
          "DownstreamPathTemplate": "/UsersApi/{url}",
          "DownstreamScheme": "http",
          "ServiceName": "userapi",
          "LoadBalancer": "RoundRobin",
          "UseServiceDiscovery": true,
          "UpstreamPathTemplate": "/UsersApi/{url}",
          "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ] ,
          "AuthenticationOptions": {
            "AuthenticationProviderKey": "qka_api",
            "AllowedScopes": []
          }
        }
      ],
      "GlobalConfiguration": {
        "BaseUrl": "http://localhost:9000",
        "ServiceDiscoveryProvider": {
          "Host": "192.168.2.144",
          "Port": 8500
        }
      }
    }

    修改StartUp.cs文件的代码,注意在使用中间件的时候,UseMvc一定要在UseOcelot之前。

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddOcelot();
    
                var authenticationProviderKey = "qka_api";
                services.AddAuthentication("Bearer")
                    .AddIdentityServerAuthentication(authenticationProviderKey, options =>
                    {
                        options.Authority = "http://192.168.2.121:9066/";
                        options.RequireHttpsMetadata = false;
                        options.ApiName = "UserApi";
                    });
    
                services.AddMvc();
                services.AddSwaggerGen(options =>
                {
                    options.SwaggerDoc("ApiGateway", new Info { Title = "网关服务", Version = "v1" });
                });
            }
    
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                app.UseMetricsAllMiddleware();
                app.UseMetricsAllEndpoints();
    
                app.UseCors("default");
    
                var apis = new List<string> { "BasicDataApi", "UsersApi" };
                app.UseMvc()
                   .UseSwagger()
                   .UseSwaggerUI(options =>
                   {
                       apis.ForEach(m =>
                       {
                           options.SwaggerEndpoint($"/{m}/swagger.json", m);
                       });
                   });
    
                app.UseOcelot().Wait();
            }

    最后上图:

  • 相关阅读:
    Eclipse 开发过程中利用 JavaRebel 提高效率
    数字转化为大写中文
    网页变灰
    解决QQ截图无法在PS中粘贴
    ORACLE操作表时”资源正忙,需指定nowait"的解锁方法
    网页常用代码
    SQL Server 2000 删除注册的服务器
    GridView 显示序号
    读取Excel数据到DataTable
    清除SVN版本控制
  • 原文地址:https://www.cnblogs.com/focus-lei/p/9047410.html
Copyright © 2011-2022 走看看