Fork me on GitHub

Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、认证、鉴权、简单缓存、限流熔断、负载均衡器等。简单的来说Ocelot是一堆的asp.net core middleware组成的一个有顺序的管道。当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务返回response之后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。

项目描述

> 1. 这是一个ASP.NET Core Web项目,主要展示Ocelot的使用
> 2. 实现Ocelot来控制访问
> 3. 实现Ocelot来控制负载均衡

项目架构

// OcelotStudy项目
namespace OcelotInput
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
              .ConfigureAppConfiguration((hostingContext, config) =>
              {
                  config
                      .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                      .AddJsonFile("ocelotsettings.json", true, true)
                      .AddEnvironmentVariables();
              })
              .UseStartup<Startup>();
    }
}

namespace OcelotInput
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseOcelot().Wait();
        }
    }
}

其他两个是asp.net core api的项目,vs直接创建就可以

Ocelot配置

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/values/{action}", //下游服务配置
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 54679
        },
        {
          "Host": "localhost",
          "Port": 57417
        }
      ],
      "UpstreamPathTemplate": "/values/{action}", //上游服务配置
      "UpstreamHttpMethod": [
        "Get"
      ],
      //"AddHeadersToRequest": {},
      //"AddClaimsToRequest": {},
      //"RouteClaimsRequirement": {},  //配置Claims鉴权
      //"AddQueriesToRequest": {},
      //"RequestIdKey": "",
      //"FileCacheOptions": {  //缓存配置
      //  "TtlSeconds": 0,
      //  "Region": ""
      //},
      //"ReRouteIsCaseSensitive": false,
      //"ServiceName": "",
      //"QoSOptions": {   //服务质量与熔断
      //  "ExceptionsAllowedBeforeBreaking": 3,
      //  "DurationOfBreak": 10,
      //  "TimeoutValue": 5000
      //},
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      } //LoadBalancer将决定负载均衡的算法,LeastConnection – 将请求发往最空闲的那个服务器,RoundRobin – 轮流发送,NoLoadBalance – 总是发往第一个请求或者是服务发现
      //"RateLimitOptions": {  //为限流配置
      //  "ClientWhitelist": [],
      //  "EnableRateLimiting": false,
      //  "Period": "",
      //  "PeriodTimespan": 0,
      //  "Limit": 0
      //},
      //"AuthenticationOptions": {  //配置服务认证
      //  "AuthenticationProviderKey": "",
      //  "AllowedScopes": []
      //},
      //"HttpHandlerOptions": {
      //  "AllowAutoRedirect": false,
      //  "UseCookieContainer": false
      //  //"UseTracing": true
      //}
      //"UseServiceDiscovery": false,  // 配置服务发现
    }
    //{
    //  "DownstreamPathTemplate": "/{url}",
    //  "DownstreamScheme": "https",
    //  "DownstreamHostAndPorts": [
    //    {
    //      "Host": "localhost",
    //      "Port": 80
    //    }
    //  ],
    //  "UpstreamPathTemplate": "/{url}",
    //  "UpstreamHttpMethod": [ "Get" ]
    //}
  ]
  //"Aggregates": [ //服务聚合配置
  //  {
  //    "ReRouteKeys": [
  //      "Tom",
  //      "Laura"
  //    ],
  //    "UpstreamPathTemplate": "/"
  //  }
  //]
}

运行效果

Web1项目:http://localhost:54679,    Web2项目:http://localhost:57417,     Ocelot项目:http://localhost:57083

源码地址

https://github.com/jasonhua95/samll-project/tree/master/OcelotStudy

posted on 2019-03-20 21:09  lingfeng95  阅读(227)  评论(0编辑  收藏  举报