架构师_程序员

查看: 364|回复: 2

[.NET Core] Ocelot 系列(一)ASP.NET Core 网关实战

[复制链接]
发表于 2020-6-28 18:50:12 | 显示全部楼层
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterfly Tracing集成。这些功能只都只需要简单的配置即可完成,下面我们会对这些功能的配置一一进行说明。

当然,Java项目也有网关,Spring Cloud Gateway 是Spring Cloud 新推出的网关框架,之前是Netflix Zuul。

【实战】CentOS 7 部署Kong API网关
https://www.itsvse.com/thread-5682-1-1.html

首先,新建一个 ASP.NET Core 3.1 的空项目,名称:dotnet-gateway-demo

nuget 安装 ocelot,命令如下:

  1. Install-Package Ocelot -Version 16.0.1
复制代码

新建两个 asp.net core 3.1 api 项目,名称分别是“web-api-demo1”、“web-api-demo2”。解决方案结构如下图:

QQ截图20200628180650.jpg

修改“web-api-demo1”、“web-api-demo2”项目 WeatherForecastController 控制器的 Get 方法,代码如下:

  1. [HttpGet]
  2.         public string Get()
  3.         {
  4.             return Assembly.GetExecutingAssembly().GetName().Name + " by:itsvse.com";
  5.         }
复制代码

demo1 链接:http://localhost:7853/weatherforecast
demo2 链接:http://localhost:7863/weatherforecast

QQ截图20200628182257.jpg

在 dotnet-gateway-demo 项目根目录下,新建配置文件"ocelot.json",如下:

  1. {
  2.   "GlobalConfiguration": {
  3.     "BaseUrl": "http://localhost:7639"
  4.   },
  5.   "Routes": [
  6.     {
  7.       "DownstreamHostAndPorts": [
  8.         {
  9.           "Host": "localhost",
  10.           "Port": 7853
  11.         }
  12.       ],
  13.       "DownstreamPathTemplate": "/weatherforecast",
  14.       "DownstreamScheme": "http",
  15.       "UpstreamHttpMethod": [ "Get" ],
  16.       "UpstreamPathTemplate": "/demo1"
  17.     },
  18.     {
  19.       "DownstreamHostAndPorts": [
  20.         {
  21.           "Host": "localhost",
  22.           "Port": 7863
  23.         }
  24.       ],
  25.       "DownstreamPathTemplate": "/weatherforecast",
  26.       "DownstreamScheme": "http",
  27.       "UpstreamHttpMethod": [ "Get" ],
  28.       "UpstreamPathTemplate": "/demo2"
  29.     }
  30.   ]
  31. }
复制代码
其中 BaseUrl 地址填写当前项目的启动URL,要根据自己实际情况填写

  • DownstreamPathTemplate:下游服务相对路径
  • DownstreamScheme:下游服务http schema
  • DownstreamHostAndPorts:下游服务的地址,如果使用LoadBalancer的话这里可以填多项
  • UpstreamPathTemplate: 上游也就是用户输入的请求Url模板
  • UpstreamHttpMethod: 上游请求http方法,可使用数组


在 Program.cs 的 CreateHostBuilder 中加入

  1. public static IHostBuilder CreateHostBuilder(string[] args) =>
  2.             Host.CreateDefaultBuilder(args)
  3.                 .ConfigureAppConfiguration((hostingContext, config) =>
  4.                 {
  5.                     config
  6.                         .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
  7.                         .AddJsonFile("appsettings.json", true, true)
  8.                         .AddJsonFile("appsettings" + hostingContext.HostingEnvironment.EnvironmentName + ".json", true, true)
  9.                         .AddJsonFile("ocelot.json", optional: false, reloadOnChange: true)
  10.                         .AddEnvironmentVariables();
  11.                 })
  12.                 .ConfigureWebHostDefaults(webBuilder =>
  13.                 {
  14.                     webBuilder.UseStartup<Startup>();
  15.                 });
复制代码
编辑 Startup.cs 文件,代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Builder;
  6. using Microsoft.AspNetCore.Hosting;
  7. using Microsoft.AspNetCore.Http;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using Microsoft.Extensions.Hosting;
  10. using Ocelot.DependencyInjection;
  11. using Ocelot.Middleware;

  12. namespace dotnet_gateway_demo
  13. {
  14.     public class Startup
  15.     {
  16.         // This method gets called by the runtime. Use this method to add services to the container.
  17.         // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
  18.         public void ConfigureServices(IServiceCollection services)
  19.         {
  20.             services.AddOcelot();
  21.         }

  22.         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  23.         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  24.         {
  25.             if (env.IsDevelopment())
  26.             {
  27.                 app.UseDeveloperExceptionPage();
  28.             }
  29.             
  30.             app.UseRouting();
  31.             app.UseEndpoints(endpoints =>
  32.             {
  33.                 endpoints.MapGet("/", async context =>
  34.                 {
  35.                     await context.Response.WriteAsync("Hello World!");
  36.                 });
  37.             });
  38.             app.UseOcelot().Wait();
  39.         }
  40.     }
  41. }
复制代码
其主要代码为:

  1. services.AddOcelot();
  2. app.UseOcelot().Wait();
复制代码
设置启动项目,同时启动3个web项目,如下图:

QQ截图20200628184022.jpg

设置完成后,启动,根据我们的配置规则,尝试访问:http://localhost:7639/demo1http://localhost:7639/demo2 如下图:

QQ截图20200628184515.jpg
我们在ocelot.json文件增加如下配置,试着反向代理本站,配置如下:

  1. {
  2.       "DownstreamHostAndPorts": [
  3.         {
  4.           "Host": "www.itsvse.com",
  5.           "Port": 443
  6.         }
  7.       ],
  8.       "DownstreamPathTemplate": "/",
  9.       "DownstreamScheme": "https",
  10.       "UpstreamHttpMethod": [ "Get" ],
  11.       "UpstreamPathTemplate": "/itsvse"
  12.     }
复制代码
尝试访问:http://localhost:7639/itsvse

QQ截图20200628185506.jpg

源码下载:

游客,如果您要查看本帖隐藏内容请回复


参考文档:https://ocelot.readthedocs.io/en/latest/

(完)






上一篇:VS 2019(Visual Studio)代码清理
下一篇:【前端必备】开发者调试面板
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2020-6-28 21:23:39 | 显示全部楼层
文章不错。。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2020-6-29 09:22:46 | 显示全部楼层
mark mark
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2020-9-30 03:49

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表