.net core 实践篇————网关

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net core 实践篇————网关相关的知识,希望对你有一定的参考价值。

参考技术A 简单整理一下网关。

在介绍网关之前,介绍一下BFF,BFF全称是Backend For Frontend,它负责认证授权,服务聚合,目标是为前端提供服务。

说的通透一点,就是有没有见过这种服务。

上述就是buff通过代理其他服务来让前端访问。这时候就有人说了,这不就是网关吗?

是的,个人理解这本来就属于一种网关。以前网关只负责数据协议的转发,现在变得高级了,功能更多了。

但是如果只负责数据协议的转发,那么就有一个专门的认证服务。每次用户访问网关的时候,网关要转到认证服务去认证,然后才能到后面具体访问的服务。

这就变得非常麻烦了,故而就把认证授权移到了网关中,这样系统的复杂性就减少了。

那么什么聚合服务呢?

上文中服务2和服务3进行了聚合,就是某个服务调用了服务2和服务3的接口实现了新的接口,暴露出去了。

同样,如果服务2和服务3的聚合的接口比较少,且改动性比较少的情况下,也可以直接放到网关中,这样避免系统复杂性。

其实现实中很多东西没有必要全部分开,一般是考虑到安全性和稳定性,安全性没得说,必须的东西,稳定性就是改动该服务后影响的服务节点是多少,如果是高频改动,那么即使是一个接口也要独立出去。

像下面的,因为如果有不同领域的应用,那么最好分开来,因为一个网关的改动会影响到其他不同领域的应用。

然后这里有一个详细的介绍演化的
: https://blog.csdn.net/yang75108/article/details/86987404 .

那么来看一下.net core如何打造网关吧。

可以先看下文档哈。
https://github.com/ThreeMammals/Ocelot

这里就演示一下getStart。因为如果演示复杂的,不一定用的上,而且整理的混乱,有需求才有实践。千万级之所以是千万级应用,是因为用户千万级。

首先安装好Ocelot。

添加服务:

注册中间件:

app.UseOcelot().Wait(); 应该放在中间件的最后,为什么呢?

因为网关内可能有一些其他api,比如说认证授权的,那么让那些api先生效,最后才执行到Ocelot网关处理部分。

然后在9001中加入请求:

log如下:

我们可以直接通过配置来实现网关,当然这是大部分,这些看文档就好,有些需要做其他处理的,那么就可以自己在网关中写api了。

Ocelot——初识基于.Net Core的API网关

前言

环境及安装

目前版本的Ocelot是基于.Net core 2.0开发的,所以你的项目也得是.net core2.0及以上的。

  1. 新建一个netcoreapp2.0 项目

     dotnet new console -n ApiGateway
  2. 安装Ocelot

    dotnet add package Ocelot
  3. 编写代码
    Progarm.cs

using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace ApiGateway{  

 class Program    {      
   static void Main(string[] args)        {            IWebHostBuilder builder = new WebHostBuilder();            builder.ConfigureServices(s => {                s.AddSingleton(builder);            });            builder.UseKestrel()                .UseContentRoot(Directory.GetCurrentDirectory())                .UseStartup<Startup>();          
     var host = builder.Build();                        host.Run();        }    } }

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
using CacheManager.Core;
using ConfigurationBuilder = Microsoft.Extensions.Configuration.ConfigurationBuilder;
using System;

namespace ApiGateway{  

 public class Startup    {      
  public Startup(IHostingEnvironment env)        {      
       var builder = new ConfigurationBuilder()                .SetBasePath(env.ContentRootPath)                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)                .AddJsonFile("configuration.json")                .AddEnvironmentVariables();            Configuration = builder.Build();        }      
       
      public IConfigurationRoot Configuration { get; }    
        
      public void ConfigureServices(IServiceCollection services)        {            services.AddOcelot(Configuration); //此处添加Ocelot服务        }      
     
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)        {            loggerFactory.AddConsole(Configuration.GetSection("Logging"));            app.UseOcelot().Wait();//此处使用Ocelot服务        }    } }
  1. 编写配置文件
    大家可能看到了上述代码中使用了几个json文件,我们将configuration.json走位Ocelot的配置文件使用,具体配置内容下面会细说

    {"ReRoutes": [],"GlobalConfiguration": {}}

    至此,一个可运行的API网关即搭建完成(虽然什么都没有)

配置

Ocelot的使用基本是靠配置完成,我根据官方文档整理了一份对配置文件的理解,请参考下面注释

{    "ReRoutes": [    {//官方文档ReRoutes全节点示例      //Upstream表示上游请求,即客户端请求到API Gateway的请求      "UpstreamPathTemplate": "/", //请求路径模板      "UpstreamHttpMethod": [ //请求方法数组        "Get"      ],      //Downstreamb表示下游请求,即API Gateway转发的目标服务地址      "DownstreamScheme": "http", //请求协议,目前应该是支持http和https      "DownstreamHost": "localhost", //请求服务地址,应该是可以是IP及域名      "DownstreamPort": 51779, //端口号      "DownstreamPathTemplate": "/", //下游请求地址模板      "RouteClaimsRequirement": { //标记该路由是否需要认证        "UserType": "registered" //示例,K/V形式,授权声明,授权token中会包含一些claim,如填写则会判断是否和token中的一致,不一致则不准访问      },      //以下三个是将access claims转为用户的Header Claims,QueryString,该功能只有认证后可用      "AddHeadersToRequest": { //        "UserType": "Claims[sub] > value[0] > |", //示例        "UserId": "Claims[sub] > value[1] > |"//示例      },      "AddClaimsToRequest": {},      "AddQueriesToRequest": {},      "RequestIdKey": "", //设置客户端的请求标识key,此key在请求header中,会转发到下游请求中      "FileCacheOptions": { //缓存设置        "TtlSeconds": 15, //ttl秒被设置为15,这意味着缓存将在15秒后过期。        "Region": "" //缓存region,可以使用administrator API清除      },      "ReRouteIsCaseSensitive": false, //路由是否匹配大小写      "ServiceName": "", //服务名称,服务发现时必填      "QoSOptions": { //断路器配置,目前Ocelot使用的Polly        "ExceptionsAllowedBeforeBreaking": 0, //打开断路器之前允许的例外数量。        "DurationOfBreak": 0,                 //断路器复位之前,打开的时间(毫秒)        "TimeoutValue": 0                     //请求超时时间(毫秒)      },      "LoadBalancer": "", //负载均衡 RoundRobin(轮询)/LeastConnection(最少连接数)      "RateLimitOptions": { //官方文档未说明        "ClientWhitelist": [],        "EnableRateLimiting": false,        "Period": "",        "PeriodTimespan": 0,        "Limit": 0      },      "AuthenticationOptions": { //认证配置        "AuthenticationProviderKey": "", //这个key对应的是代码中.AddJWTBreark中的Key        "AllowedScopes": []//使用范围      },      "HttpHandlerOptions": {        "AllowAutoRedirect": true, //指示请求是否应该遵循重定向响应。 如果请求应该自动遵循来自Downstream资源的重定向响应,则将其设置为true; 否则为假。 默认值是true。        "UseCookieContainer": true //该值指示处理程序是否使用CookieContainer属性来存储服务器Cookie,并在发送请求时使用这些Cookie。 默认值是true。      },      "UseServiceDiscovery": false //使用服务发现,目前Ocelot只支持Consul的服务发现    }    ],    "GlobalConfiguration": {}}

路由 Routing

路由是API网关的标配,Ocelot会将上游请求(Upstream)转发到下游请求(Downstream)
示例:

{    "DownstreamPathTemplate": "/api/posts/{postId}",    "DownstreamScheme": "https",    "DownstreamPort": 80,    "DownstreamHost" "localhost",    "UpstreamPathTemplate": "/posts/{postId}",    "UpstreamHttpMethod": [ "Put", "Delete" ]}

其中使用{任意字符}括住的作为占位符变量使用,转发请求时,会将下游请求的{任意字符}替换为上游请求的{任意字符}。
Ocelot的默认路由是不区分大小写的,如果需要区分大小写,需要增加如下配置

"ReRouteIsCaseSensitive": true

了解路由后一个基础的API网关就建立而成了,下一篇讲介绍下其他功能

原文:http://www.cnblogs.com/yotsuki/p/7928095.html


以上是关于.net core 实践篇————网关的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 基础学习笔记 Ocelot网关配置使用

.Net Core with 微服务 - Ocelot 网关

.net core 微服务之Api网关(Api Gateway)

.NET Core开源API网关 – Ocelot中文文档

一次业务网关用ASP.NET Core 2.1重构的小结

asp.net core网关Ocelot的简单介绍& Ocelot集成Identity认证