Asp .Net Core 系列:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、 ...

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

简介

什么是 Ocelot ?

Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。
Ocelot是一个简单、机动且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微服务。
以下是Ocelot的一些重要功能:

  • 路由管理:Ocelot允许您界说路由规则,将请求路由到正确的微服务。
  • 认证和授权:Ocelot支持多种认证机制,如JWT、OAuth等,并允许您界说访问控制策略,确保只有授权的用户才气访问特定的API。
  • 限流和速率限制:Ocelot提供了一些内置的限流和速率限制功能,以确保您的服务不会受到太过的请求压力。
  • 监控和日记:Ocelot可以网络和表现各种度量指标,帮助您了解您的服务的性能和举动。此外,它还可以将日记记录到各种日记源,以便您进行分析和故障排除。
  • 集成:Ocelot可以与现有的服务集成,包括Kubernetes、Consul等。
  • 易于扩展:Ocelot的设计使其易于扩展,您可以编写自己的中心件来处置惩罚特定的逻辑,例如修改请求或响应、添加自界说的认证机制等。
  • 可扩展的设置:Ocelot利用JSON设置文件进行设置,这意味着您可以轻松地根据需要进行设置更改,而无需重新编译代码。
总之,Ocelot是一个功能强大且易于利用的API网关,可以帮助您保护、监控和扩展您的微服务。
官网:https://ocelot.readthedocs.io/en/latest/index.html
什么是 Nacos ?

Nacos是一个易于构建云原生应用的动态服务发现、设置管理和服务管理平台。它是Dynamic Naming and Configuration Service的首字母简称。Nacos提供了一组简单易用的特性集,包括动态服务发现、服务设置、服务元数据及流量管理等功能,帮助用户快速实现微服务的发现、设置和管理。Nacos还支持多种服务注册方式和服务发现方式,如DNS、RPC、原生SDK和OpenAPI等。
此外,Nacos致力于提供更敏捷和容易的微服务平台构建、交付和管理。它是构建以“服务”为中心的当代应用架构(例如微服务范式、云原生范式)的服务底子设施,可以或许支持动态DNS服务权重路由和动态DNS服务等特性。
官网:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
什么是 Swagger ?

Swagger是一种规范和完整的框架,用于天生、描述、调用和可视化RESTful风格的Web服务。它是一个规范和完整的框架,用于天生、描述、调用和可视化RESTful风格的Web服务。总体目的是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法、参数和模子紧密集成到服务器端的代码,允许API始终保持同步。
此外,Swagger还提供了一个文档工具,可主动天生Web服务的API文档,使开辟人员可以或许更轻松地理解和利用API。它还提供了一个测试工具,可以模仿对Web服务的API请求并验证响应。
什么是 Cors ?

CORS(跨泉源资源共享,Cross-Origin Resource Sharing)是一种机制,允许Web应用步伐在未经服务器明白许可的情况下,通过浏览器向服务器发送跨域请求。CORS是一种W3C规范,旨在办理Web应用步伐中的跨域题目,以促进Web应用步伐的安全性和可扩展性。
在Web应用步伐中,浏览器会遵循同源策略(Same-Origin Policy),即默认只允许来自同一域的页面之间进行通信。然而,随着Web应用步伐的发展,越来越多的应用步伐需要与不同域的资源进行交互,例如利用第三方API或进行跨域请求。为了办理这个题目,CORS规范允许服务器通过设置适当的HTTP标头来明白地允许跨域请求。
当浏览器向服务器发送跨域请求时,服务器可以在响应头中包含一个Access-Control-Allow-Origin标头,指定允许哪些源进行跨域请求。浏览器会检查这个标头,如果允许的源与请求的源匹配,则允许跨域请求。此外,CORS规范还界说了其他一些相干的标头,如Access-Control-Allow-Methods、Access-Control-Allow-Headers等,以进一步控制跨域请求的举动。
通过利用CORS机制,Web应用步伐可以更安全、更有效地进行跨域请求,进步了应用步伐的可扩展性和用户体验。
Asp .Net Core 集成 Ocelot

要在ASP.NET Core中集成Ocelot,您可以按照以下步骤进行操作:

  • 安装Ocelot NuGet包:
    在您的ASP.NET Core项目中,打开终端或NuGet包管理器控制台,并运行以下下令来安装Ocelot的NuGet包:
  1. dotnet add package Ocelot
复制代码

  • 添加Ocelot设置文件:
  1. {
  2.   "Routes": [ //这里注意一下版本(旧版本用ReRoutes)
  3.     {
  4.       "DownstreamPathTemplate": "/api/{controller}", //下游路径模板
  5.       "DownstreamScheme": "http", //下游方案
  6.       //"DownstreamHostAndPorts": [
  7.       //  {
  8.       //    "Host": "localhost",
  9.       //    "Port": "5014"
  10.       //  }
  11.       //], //下游主机和端口
  12.       "UpstreamPathTemplate": "/api/product/{controller}", //上游路径模板
  13.       "UpstreamHttpMethod": [], //上游请求方法,可以设置特定的 HTTP 方法列表或设置空列表以允许其中任何方法
  14.       "ServiceName": "api-product-service", //请求服务名称
  15.       "LoadBalancerOptions": {
  16.         "Type": "LeastConnection" //负载均衡算法:目前 Ocelot 有RoundRobin 和LeastConnection算法
  17.       }
  18.     }
  19.   ],
  20.   "GlobalConfiguration": {
  21.     "BaseUrl": "http://localhost:5015", //进行标头查找和替换以及某些管理配置
  22.     "ServiceDiscoveryProvider": {
  23.       "Type": "Nacos"
  24.     }
  25.   },
  26.   "Nacos": {
  27.     "ServerAddresses": [ "http://127.0.0.1:8848" ], //服务地址
  28.     "UserName": "nacos",  //用户名
  29.     "Password": "nacos", //密码
  30.     "ServiceName": "api-gateway", //服务名称
  31.     //"Namespace": "",  //命名空间
  32.     //"GroupName": "DEFAULT_GROUP" //组名,
  33.     //"ClusterName": "DEFAULT", // 集群名称
  34.     "ListenInterval": 1000,   //监听
  35.     "RegisterEnabled": true, // 注册是否启动
  36.     "InstanceEnabled": true   //实例是否启动
  37.   },
  38.   "Url": "http://*:5015"
  39. }
复制代码

  • 设置Ocelot服务:
  1. builder.Services.AddOcelot();
复制代码
在Configure方法中设置请求管道并添加Ocelot中心件:
  1. app.UseOcelot().Wait();
复制代码
网关集成 Nacos

要将Naocs集成Ocelot到中,您可以按照以下步骤进行操作:

  • 下载Ocelot.Provider.Nacos 源码,导入Ocelot.Provider.Nacos 项目
    github:https://github.com/softlgl/Ocelot.Provider.Nacos
    修改Ocelot.Provider.Nacos 源码,在Ocelot 22版本中 IServiceDiscoveryProvider接口中的Get方法变成了GetAsync
    升级各Nuget包
    1. using System;
    2. using System.Linq;
    3. using System.Collections.Generic;
    4. using System.Threading.Tasks;
    5. using Ocelot.ServiceDiscovery.Providers;
    6. using Ocelot.Values;
    7. using Nacos.V2;
    8. using Microsoft.Extensions.Options;
    9. using Ocelot.Provider.Nacos.NacosClient.V2;
    10. using NacosConstants = Nacos.V2.Common.Constants;
    11. namespace Ocelot.Provider.Nacos
    12. {
    13.     public class Nacos : IServiceDiscoveryProvider
    14.     {
    15.         private readonly INacosNamingService _client;
    16.         private readonly string _serviceName;
    17.         private readonly string _groupName;
    18.         private readonly List<string> _clusters;
    19.         public Nacos(string serviceName, INacosNamingService client, IOptions<NacosAspNetOptions> options)
    20.         {
    21.             _serviceName = serviceName;
    22.             _client = client;
    23.             _groupName = string.IsNullOrWhiteSpace(options.Value.GroupName) ?
    24.                "" : options.Value.GroupName;
    25.             _clusters = (string.IsNullOrWhiteSpace(options.Value.ClusterName) ? NacosConstants.DEFAULT_CLUSTER_NAME : options.Value.ClusterName).Split(",").ToList();
    26.         }
    27.         public async  Task<List<Service>> GetAsync()
    28.         {
    29.             var services = new List<Service>();
    30.             var instances = await _client.GetAllInstances(_serviceName, _groupName, _clusters);
    31.             if (instances != null && instances.Any())
    32.             {
    33.                 services.AddRange(instances.Select(i => new Service(i.InstanceId, new ServiceHostAndPort(i.Ip, i.Port), "", "", new List<string>())));
    34.             }
    35.             return await Task.FromResult(services);
    36.         }
    37.     }
    38. }
    复制代码
  • 设置Ocelot:
    在Ocelot的设置中,您需要指定Nacos作为服务发现和设置的提供者。在Ocelot的设置文件(例如appsettings.json)中,添加以下内容:
  1. {
  2.   "GlobalConfiguration": {
  3.     "BaseUrl": "http://localhost:5015", //进行标头查找和替换以及某些管理配置
  4.     "ServiceDiscoveryProvider": {
  5.       "Type": "Nacos" //指定Nacos
  6.     }
  7.   },
  8.   "Nacos": {
  9.     "ServerAddresses": [ "http://127.0.0.1:8848" ], //服务地址
  10.     "UserName": "nacos",  //用户名
  11.     "Password": "nacos", //密码
  12.     "ServiceName": "api-gateway", //服务名称
  13.     //"Namespace": "",  //命名空间
  14.     //"GroupName": "DEFAULT_GROUP" //组名,
  15.     //"ClusterName": "DEFAULT", // 集群名称
  16.     "ListenInterval": 1000,   //监听
  17.     "RegisterEnabled": true, // 注册是否启动
  18.     "InstanceEnabled": true   //实例是否启动
  19.   }
  20. }
复制代码

  • 启动Ocelot:
    在您的ASP.NET Core应用步伐中启动Ocelot。您可以在Startup.cs文件中添加以下代码:
  1. builder.Services.AddOcelot().AddNacosDiscovery("Nacos");
复制代码
下游设置 Nacos


  • 安装必要的NuGet包:
    在Visual Studio中打开你的项目,通过NuGet包管理器安装Nacos.AspNetCore包。可以通过NuGet包管理器控制台运行以下下令来安装:
  1. Install-Package Nacos.AspNetCore
复制代码

  • 设置Nacos客户端:
    在appsettings.json文件中添加Nacos服务的设置信息,例如服务器地点、端口、命名空间等信息。示例设置如下:
  1. {
  2.   "Nacos": {
  3.     "ServerAddresses": [ "http://127.0.0.1:8848" ],
  4.     //命名空间GUID,public默认没有
  5.     //"Namesapce": "",
  6.     "UserName": "nacos",
  7.     "Password": "nacos",
  8.     // 配置中心
  9.     //"Listeners": [
  10.     //  {
  11.     //    "Group": "dev",
  12.     //    "DataId": "api-product-service",
  13.     //    "Optional": false
  14.     //  }
  15.     //],
  16.     // 服务发现
  17.     "Ip": "localhost", // Nacos 注册时如果没有指定IP,那么就按照本机的IPv4 Address
  18.     "Port": "5014", //端口
  19.     "ServiceName": "api-product-service" // 服务名称
  20.     //"GroupName": "",
  21.     // 权重
  22.     //"Weight": 100
  23.   }
  24. }
复制代码

  • 设置依靠注入:
    如果你需要在你的应用步伐中利用Nacos服务,可以在Startup.cs的ConfigureServices方法中注册Nacos服务的依靠注入。示例如下:
  1. builder.Services.AddNacosAspNet(builder.Configuration,"Nacos");
复制代码
设置跨域(Cors)

  1. using Microsoft.AspNetCore.Builder;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace MCode.Common.Extensions.Cors
  9. {
  10.     public static class CorsServiceExtensions
  11.     {
  12.         private readonly static string PolicyName = "MCodeCors";
  13.         /// <summary>
  14.         /// 添加跨域
  15.         /// </summary>
  16.         /// <param name="services">服务集合</param>
  17.         /// <returns></returns>
  18.         public static IServiceCollection AddMCodeCors(this IServiceCollection services)
  19.         {
  20.             if (services == null) throw new ArgumentNullException(nameof(services));
  21.             //origin microsoft.aspnetcore.cors      
  22.             return services.AddCors(options =>
  23.             {
  24.                 options.AddPolicy(PolicyName, policy =>
  25.                 {
  26.                     policy.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
  27.                 });
  28.             });
  29.         }
  30.         /// <summary>
  31.         /// 使用跨域
  32.         /// </summary>
  33.         /// <param name="app">应用程序建造者</param>
  34.         /// <returns></returns>
  35.         public static IApplicationBuilder UseMCodeCors(this IApplicationBuilder app)
  36.         {
  37.             return app.UseCors(PolicyName);
  38.         }
  39.     }
  40. }
复制代码
网关和微服务中设置Swagger

SwaggerOptions
  1. using Microsoft.OpenApi.Models;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace MCode.Common.Extensions.Swagger
  8. {
  9.     /// <summary>
  10.     /// Swagger配置
  11.     /// </summary>
  12.     public class SwaggerOptions
  13.     {
  14.         /// <summary>
  15.         /// 服务名称
  16.         /// </summary>
  17.         public string ServiceName { get; set; }
  18.         /// <summary>
  19.         /// API信息
  20.         /// </summary>
  21.         public OpenApiInfo ApiInfo { get; set; }
  22.         /// <summary>
  23.         /// Xml注释文件
  24.         /// </summary>
  25.         public string[] XmlCommentFiles { get; set; }
  26.         /// <summary>
  27.         /// 构造函数
  28.         /// </summary>
  29.         /// <param name="serviceName">服务名称</param>
  30.         /// <param name="apiInfo">API信息</param>
  31.         /// <param name="xmlCommentFiles">Xml注释文件</param>
  32.         public SwaggerOptions(string serviceName, OpenApiInfo apiInfo, string[] xmlCommentFiles = null)
  33.         {
  34.             ServiceName = !string.IsNullOrWhiteSpace(serviceName) ? serviceName : throw new ArgumentException("serviceName parameter not config.");
  35.             ApiInfo = apiInfo;
  36.             XmlCommentFiles = xmlCommentFiles;
  37.         }
  38.     }
  39. }
复制代码
SwaggerEndPoint
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace MCode.Common.Extensions.Swagger
  7. {
  8.     /// <summary>
  9.     /// Swagger终端
  10.     /// </summary>
  11.     public class SwaggerEndPoint
  12.     {
  13.         /// <summary>
  14.         /// 名称
  15.         /// </summary>
  16.         public string Name { get; set; }
  17.         /// <summary>
  18.         /// 地址
  19.         /// </summary>
  20.         public string Url { get; set; }
  21.     }
  22. }
复制代码
OcelotSwaggerOptions
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace MCode.Common.Extensions.Swagger
  7. {
  8.     /// <summary>
  9.     /// 网关Swagger配置
  10.     /// </summary>
  11.     public class OcelotSwaggerOptions
  12.     {
  13.         public List<SwaggerEndPoint> SwaggerEndPoints { get; set; }
  14.     }
  15. }
复制代码
SwaggerServiceExtensions
  1. using Microsoft.AspNetCore.Builder;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Microsoft.OpenApi.Models;
  4. namespace MCode.Common.Extensions.Swagger
  5. {
  6.     /// <summary>
  7.     /// Swagger 服务扩展
  8.     /// </summary>
  9.     public static class SwaggerServiceExtensions
  10.     {
  11.         /// <summary>
  12.         /// 添加 Swagger 服务
  13.         /// </summary>
  14.         /// <param name="services"></param>
  15.         /// <param name="swaggerOptions"></param>
  16.         /// <returns></returns>
  17.         public static IServiceCollection AddMCodeSwagger(this IServiceCollection services, SwaggerOptions swaggerOptions)
  18.         {
  19.             services.AddSingleton(swaggerOptions);
  20.             SwaggerGenServiceCollectionExtensions.AddSwaggerGen(services, c =>
  21.             {
  22.                 c.SwaggerDoc(swaggerOptions.ServiceName, swaggerOptions.ApiInfo);
  23.                 if (swaggerOptions.XmlCommentFiles != null)
  24.                 {
  25.                     foreach (string xmlCommentFile in swaggerOptions.XmlCommentFiles)
  26.                     {
  27.                         string str = Path.Combine(AppContext.BaseDirectory, xmlCommentFile);
  28.                         if (File.Exists(str)) c.IncludeXmlComments(str, true);
  29.                     }
  30.                 }
  31.                 SwaggerGenOptionsExtensions.CustomSchemaIds(c, x => x.FullName);
  32.                 c.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme
  33.                 {
  34.                     Type = SecuritySchemeType.Http,
  35.                     Scheme = "bearer",
  36.                     BearerFormat = "JWT",
  37.                     Description = "请输入 bearer 认证"
  38.                 });
  39.                 c.AddSecurityRequirement(new OpenApiSecurityRequirement
  40.                                               {
  41.                                                   {
  42.                                                       new OpenApiSecurityScheme
  43.                                                       {
  44.                                                           Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "bearerAuth" }
  45.                                                       },
  46.                                                       new string[] {}
  47.                                                   }
  48.                                               });
  49.             });
  50.             return services;
  51.         }
  52.         /// <summary>
  53.         /// 使用 Swagger UI
  54.         /// </summary>
  55.         /// <param name="app"></param>
  56.         /// <returns></returns>
  57.         public static IApplicationBuilder UseMCodeSwagger(this IApplicationBuilder app)
  58.         {
  59.             string serviceName = app.ApplicationServices.GetRequiredService<SwaggerOptions>().ServiceName;
  60.             SwaggerUIBuilderExtensions.UseSwaggerUI(SwaggerBuilderExtensions.UseSwagger(app), c =>
  61.             {
  62.                 c.SwaggerEndpoint("/swagger/" + serviceName + "/swagger.json", serviceName);
  63.             });
  64.             return app;
  65.         }
  66.         public static IServiceCollection AddMCodeOcelotSwagger(this IServiceCollection services, OcelotSwaggerOptions ocelotSwaggerOptions)
  67.         {
  68.             services.AddSingleton(ocelotSwaggerOptions);
  69.             SwaggerGenServiceCollectionExtensions.AddSwaggerGen(services);
  70.             return services;
  71.         }
  72.         public static IApplicationBuilder UseMCodeOcelotSwagger(this IApplicationBuilder app)
  73.         {
  74.             OcelotSwaggerOptions ocelotSwaggerOptions = app.ApplicationServices.GetService<OcelotSwaggerOptions>();
  75.             if (ocelotSwaggerOptions == null || ocelotSwaggerOptions.SwaggerEndPoints == null)
  76.             {
  77.                 return app;
  78.             }
  79.             SwaggerUIBuilderExtensions.UseSwaggerUI(SwaggerBuilderExtensions.UseSwagger(app), c =>
  80.             {
  81.                 foreach (SwaggerEndPoint swaggerEndPoint in ocelotSwaggerOptions.SwaggerEndPoints)
  82.                 {
  83.                     c.SwaggerEndpoint(swaggerEndPoint.Url, swaggerEndPoint.Name);
  84.                 }
  85.             });
  86.             return app;
  87.         }
  88.     }
  89. }
复制代码
效果



   其他文章:Asp .Net Core 系列:集成 Ocelot+Consul+Swagger+Cors实现网关、服务注册、服务发现

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表