首页 > 其他分享 >使用Ocelot搭建网关Gateway

使用Ocelot搭建网关Gateway

时间:2023-10-28 21:24:57浏览次数:39  
标签:网关 Ocelot CachedResponse url Consul CustomCacheDictionary key Gateway

一、Ocelot官网和学习地址

  官网:https://threemammals.com/ocelot

  Git:https://github.com/ThreeMammals/Ocelot

  文档:https://ocelot.readthedocs.io/en/latest/index.html

二、搭建网关Gateway

  1 .新建一个WebAPI服务进程,独立进程完成网关请求转发,承上启下。

    2.nuget-Ocelot 安装Ocelot类库  

                 

    3. Startup配置中间件和IOC注册

      builder.Configuration.AddJsonFile("configuration.json", false, true);//表示要读取这个配置文件

      builder.Services.AddOcelot();

      app.UseOcelot();//使用Ocelot的中间件来完成http响应

    4. 增加配置文件+指定地址     

 1 ////*****************************单地址多实例负载均衡********************************
 2 {
 3   "Routes": [
 4    {
 5      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
 6       "DownstreamScheme": "http",
 7       "DownstreamHostAndPorts": [
 8        {
 9           "Host": "127.0.0.1",
10           "Port": 5726
11         },
12         {
13           "Host": "127.0.0.1",
14           "Port": 5727
15         },
16         {
17           "Host": "127.0.0.1",
18           "Port": 5728
19         }//能负载均衡,但是不能动态伸缩---写到数据库动态?服务挂掉,人不一定知道----Consul可以,结合起来
20       ],
21       "UpstreamPathTemplate": "/T/{url}", //网关地址--url变量   //冲突的还可以加权重Priority
22       "UpstreamHttpMethod": [ "Get", "Post" ],
23       "LoadBalancerOptions": {
24         "Type": "RoundRobin" //轮询 //"LeastConnection" //最少连接数的服务器  "NoLoadBalance" //不负载均衡  //"CookieStickySessions" //会话粘滞  //
25       }
26      31     }
32   ]
33 }

三、Ocelot+Consul

  Ocelot也是写死的配置文件---无法做到服务动态伸缩,可以使用Ocelot+Consul来实现服务的动态伸缩

  1. Nuget Ocelot.Provider.Consul

  2. ConfigureServices AddConsul    

builder.Services.AddOcelot().AddConsul()

 

  3. 更新配置文件   

{
  "Routes": [
    {
      "UpstreamPathTemplate": "/T/{url}", //网关地址--url变量
      "UpstreamHttpMethod": [ "Get", "Post" ],

      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
      "DownstreamScheme": "http",

      "UseServiceDiscovery": true,
      "ServiceName": "TestService", //consul服务名称
      "LoadBalancerOptions": {
        "Type": "RoundRobin" //轮询      LeastConnection-最少连接数的服务器   NoLoadBalance不负载均衡
     }
    }
  ],
  "GlobalConfiguration": {
    //"BaseUrl": "http://127.0.0.1:6299", //网关对外地址
    "ServiceDiscoveryProvider": {
      "Host": "127.0.0.1",
      "Port": 8500,
     "Type": "Consul" //由Consul提供服务发现, 每次请求去consul
    } 

  }
}

四、服务治理:缓存

  1. Nuget Ocelot.Cache.CacheManager

  2. ConfigureServices AddCacheManager   

builder.Services.AddOcelot()
    .AddConsul()
    .AddCacheManager(x =>
    {
        x.WithDictionaryHandle();//默认字典存储---默认---换成分布式的--换个存储的介质
    })

 

  3. 配置文件

     "FileCacheOptions": {
       "TtlSeconds": 15, //Second
       "Region": "UserCache" //可以调用Api缓存清理
      }

 

  4. 缓存扩展CustomCache+IOC替换

//来个扩展--非常常见的基于IOC的扩展---IOC控制反转,用来生成对象---会先注册映射关系,然后反射生成---那就可以去覆盖映射关系,换成自定义对象,就可以做到扩展

builder.Services.AddSingleton<IOcelotCache<CachedResponse>, CustomCache>();//IOC替换
public class CustomCache : IOcelotCache<CachedResponse>
{
    private class CacheDataModel
    {
        public CachedResponse CachedResponse { get; set; }
        public DateTime Timeout { get; set; }
        public string Region { get; set; }
    }

    private static Dictionary<string, CacheDataModel> CustomCacheDictionary = new
         Dictionary<string, CacheDataModel>();

    /// <summary>
    /// 没做过期清理  所以需要
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <param name="ttl"></param>
    /// <param name="region"></param>
    public void Add(string key, CachedResponse value, TimeSpan ttl, string region)
    {
        Console.WriteLine($"This is {nameof(CustomCache)}.{nameof(Add)}");
        //CustomCacheDictionary.Add(key, new CacheDataModel()
        //{
        //    CachedResponse = value,
        //    Region = region,
        //    Timeout = DateTime.Now.Add(ttl)
        //});
        CustomCacheDictionary[key] = new CacheDataModel()
        {
            CachedResponse = value,
            Region = region,
            Timeout = DateTime.Now.Add(ttl)
        };
    }

    public void AddAndDelete(string key, CachedResponse value, TimeSpan ttl, string region)
    {
        Console.WriteLine($"This is {nameof(CustomCache)}.{nameof(AddAndDelete)}");
        CustomCacheDictionary[key] = new CacheDataModel()
        {
            CachedResponse = value,
            Region = region,
            Timeout = DateTime.Now.Add(ttl)
        };
    }

    public void ClearRegion(string region)
    {
        Console.WriteLine($"This is {nameof(CustomCache)}.{nameof(ClearRegion)}");
        var keyList = CustomCacheDictionary.Where(kv => kv.Value.Region.Equals(region)).Select(kv => kv.Key);
        foreach (var key in keyList)
        {
            CustomCacheDictionary.Remove(key);
        }
    }

    public CachedResponse Get(string key, string region)
    {
        Console.WriteLine($"This is {nameof(CustomCache)}.{nameof(Get)}");
        if (CustomCacheDictionary.ContainsKey(key) && CustomCacheDictionary[key] != null
            && CustomCacheDictionary[key].Timeout > DateTime.Now
            && CustomCacheDictionary[key].Region.Equals(region))
        {
            return CustomCacheDictionary[key].CachedResponse;
        }
        else
            return null;
    }
}

五、超时机制

  调用服务的操作可以配置为执行超时,如果服务未能在这个时间内响应,将回复一个失败消息。

  1. Nuget Polly

  2. AddPolly()

  3. 配置文件 QOS  

   "QoSOptions": {
        "ExceptionsAllowedBeforeBreaking": 3, //允许多少个异常请求
        "DurationOfBreak": 10000, // 熔断的时间,单位为ms
        "TimeoutValue": 2000 //单位ms 如果下游请求的处理时间超过多少则自如将请求设置为超时 默认90秒
      }

 

 超时可能放弃正确结果,为的是保证服务的可用---尽早报错的方案

六、熔断机制,限流机制,熔断机制

  添加配置

//*****************************超时+限流+熔断+降级+Consul+Polly********************************
{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/T/{url}", //网关地址--url变量
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "UseServiceDiscovery": true,
      "ServiceName": "ZhaoxiService", //consul服务名称
      "LoadBalancerOptions": {
        "Type": "RoundRobin" //轮询      LeastConnection-最少连接数的服务器   NoLoadBalance不负载均衡
      },
      "RateLimitOptions": {
        "ClientWhitelist": [ "eleven", "seven" ], //白名单 ClientId 区分大小写
        "EnableRateLimiting": true,
        "Period": "5m", //1s, 5m, 1h, 1d
        "PeriodTimespan": 30, //多少秒之后客户端可以重试
        "Limit": 5 //统计时间段内允许的最大请求数量---张队贡献的代码
      },
      //"AuthenticationOptions": {
      //  "AuthenticationProviderKey": "UserGatewayKey",
      //  "AllowedScopes": []
      //},
      //"QoSOptions": {
      //  "ExceptionsAllowedBeforeBreaking": 3, //允许多少个异常请求
      //  "DurationOfBreak": 10000, // 熔断的时间,单位为ms
      //  "TimeoutValue": 2000 //单位ms 如果下游请求的处理时间超过多少则自如将请求设置为超时 默认90秒
      //}
      //"FileCacheOptions": {
      //  "TtlSeconds": 15,
      //  "Region": "UserCache" //可以调用Api清理
      //}
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://127.0.0.1:6299", //网关对外地址
    "ServiceDiscoveryProvider": {
      "Host": "127.0.0.1",
      "Port": 8500,
      "Type": "Consul" //由Consul提供服务发现
    },
    "RateLimitOptions": {
      "QuotaExceededMessage": "Too many requests, maybe later? 11", // 当请求过载被截断时返回的消息
      "HttpStatusCode": 666, // 当请求过载被截断时返回的http status
      //"ClientIdHeader": "client_id" // 用来识别客户端的请求头,默认是 ClientId
    }
  }
}

 

标签:网关,Ocelot,CachedResponse,url,Consul,CustomCacheDictionary,key,Gateway
From: https://www.cnblogs.com/jiangyuhu/p/17794653.html

相关文章

  • 双网卡 iptables 做网关 实现局域网其它机器上网
    A机器和B机器在同一个局域网,A机器的网卡eno1可以上网,IP为111.111.111.111。A机器的网卡eno2不能上网,IP为:192.168.1.66。B机器不能上网,B机器的网卡eno1IP为192.168.2.80,B机器和eno2IP为192.168.1.80。A机器的eno2和B机器的eno2在同一网段,可以通信,如何实现B机器通过A机器上网?......
  • 如何优化工业5G网关的网络信号
    工业5G网关,通常是指支持5G网络,具有高速率、低时延、广接入等特点的高性能工业物联网智能网关,这类网关具有强大的设备接入能力、通信协议转换、运算处理能力、联动控制能力,有助于提升工业物联网整体通信效率,实现生产管理能力和水平的飞跃。要发挥工业5G网关的优势,就要保障网关能够......
  • 传统的API网关和SpringCloud Gateway区别对比
    传统的API网关和SpringCloudGateway的主要区别在于架构和性能。传统的API网关通常是独立于各个后端服务的,请求会先打到独立的网关层,再转发到服务集群。而SpringCloudGateway则将流量从南北走向改为东西走向,微服务网关和后端服务是在同一个容器中的,也被称为GatewaySidecar。......
  • 基于边缘智能网关的储能系统安全监测管理方案
    “储能系统+充电”是配套新能源汽车产业发展的重要应用之一。得益于电池技术的发展,新能源汽车正逐步迈入快充时代,由于在使用快速充电桩时,可能导致用电峰值负荷超过电网的承载能力,对于电网的稳定性和持续性会有较大影响,因此就需要搭配边缘侧的储能系统,通过灵活调节适配功率峰值,从而......
  • 工业 CPE 双频网关在工业物联网中的应用优势
    佰马工业CPE网关支持双频WiFi技术,兼容支持2.4GHz频段和5GHz频段,在增强工业物联网系统的连接性和效率方面发挥着至关重要的作用。每个WiFi频段都有其独特的优点和缺点,因此在工业物联网环境中,支持并利用多种通信频段,可带来多种好处。本篇就简单介绍一下双频WiFi功能在工......
  • 为什么需要网关
    Gateway网关是我们服务的守门神,所有微服务的统一入口。网关的核心功能特性:请求路由权限控制限流 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求......
  • springcloud-gateWay
    基础模板spring:cloud:gateway:routes: -id:gulimall-search#别重复就行 uri:lb://gulimall-search#对应微服务的applicationName predicates: -Path=/api/search/**predicates的概念每一个route对应一个--->RouteDefi......
  • 基于5G网关的风力发电远程监测方案优势
    风力发电是清洁能源的典型代表,是我国能源结构转型的重要组成。近年来我国大力发展风能、水能、光伏等清洁能源,加速双碳战略,长期致力于创造人与生态友好和谐的人居社会。针对风力发电机组和厂区的运营和管理,5G技术、物联网技术和边缘计算技术能够发挥强大助力作用,本篇就为大家介绍......
  • ingressgateway访问授权
    当externalTrafficPolicy设置为Local时,Istio会保留外部客户端的原始源IP地址,在IngressGateway层面进行IP访问控制时,你可以基于客户端的源IP地址来定义访问规则。kubectlpatchsvcistio-ingressgateway-nistio-system-p'{"spec":{"externalTrafficPolicy":"L......
  • 纺织物联网网关全面提高数字化管理水平
    随着我国纺织行业数字化转型深入推进,各种设备、技术的快速发展,产能浪费、效率低下成为制约纺织行业蓬勃发展的重要因素。 1、管理模式老旧,缺乏高效准确的管理系统,依赖于手工统计产量,存在工作量大、效率低,且无法实时共享等问题。 2、产能效率不清楚,机器设备未联网,无法实时监控机台......