网关的负载均衡

当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置

{
    "UpstreamPathTemplate": "/Api_A/{controller}/{action}",
    "DownstreamPathTemplate": "/api/{controller}/{action}",
    "DownstreamScheme": "https",
    "LoadBalancer": "LeastConnection",
    "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
    "DownstreamHostAndPorts": [
            {
                "Host": "127.0.0.1",
                "Port": 5001,
            },
            {
                "Host": "127.00.1",
                "Port": 5002,
            }
        ],
}

LoadBalancer是来决定负载的算法

  • LeastConnection:将请求发往最空闲的那个服务器
  • RoundRobin:轮流转发
  • NoLoadBalance:总是发往第一个请求或者是服务发现

限流

限流可以防止上下游服务器因为过载而崩溃,可以使用RateLimitOptions来配置限流

{
    "RateLimitOptions": {
        "ClientWhitelist": [“127.0.0.1”],
        "EnableRateLimiting": true,
        "Period": "5s",
        "PeriodTimespan": 1,
        "Limit": 10
    }
}
  • ClientWihteList:白名单,不受限流控制。
  • EnableRateLimiting:使用启用限流。
  • Period:限流控制的时间段 1s, 5m, 1h, 1d。
  • PeroidTimeSpan:超过限流限制的次数后,需要等待重置的时间(单位是秒)。
  • Limit:在限流控制时间段内最大访问数。
    对于除了请求头中ClientId=127.0.0.1的意外所有求情启用限流,5秒该api最多10次,如果达到10次需要从第10次请求闭合后等待一秒进行下一次访问。

超过限流后会返回429状态码,并在在返回头(Response Header)的Retry-After属性中返回等待重置时间。


限流的默认提示,code码,和限制标志都是可以自己配置的

 {
  "GlobalConfiguration": {
    "BaseUrl":"www.baidu.com",
    "RateLimitOptions": {
      "DisableRateLimitHeaders": false,
      "QuotaExceededMessage": "接口限流!",
      "HttpStatusCode": 200,
      "ClientIdHeader": "ClientId"
    }
  }

  • DisableRateLimitHeaders:是否显示X-Rate-Limit和Retry-After头
  • QuotaExceededMessage:提示信息
  • HttpStatusCode:状态码
  • ClientIdHeader:用来设别客户请求头,默认为ClientId。
  • BaseUrl 网关暴露的的地址。

熔断

熔断是在下游服务故障或者请求无响应的时候停止将请求转发到下游服务。

 {
    "QoSOptions": {
    "ExceptionsAllowedBeforeBreaking": 3,
    "DurationOfBreak": 20,
    "TimeoutValue": 5000
    }
}
  • ExceptionsAllowedBeforeBreaking:允许多少个异常请求。
  • DurationOfBreak:熔断的时间(秒)。
  • TimeoutValue:下游请求的处理时间超过多少则将请求设置为超时。

缓存

Ocelot可以对下游请求结果进行缓存,主要是依赖于CacheManager来实现的。

{
    "FileCacheOptions": {
        "TtlSeconds": 60,
        "Region": "key"
    }
}
  • TtlSeconds:缓存时间(秒)。
  • Region:缓存分区名
    我们可以调用Ocelot的API来移除某个区下面的缓存 。

请求头的转化

Ocelot允许在请求下游服务之前和之后转换Header.目前Ocelot只支持查找和替换.

如果们需要转发给下游的Header重添加一个key/value

{
    "UpstreamHeaderTransform": {
        "demo": "xxxxxxx"
    }
}

如果们需要在返回给客户端的的Header中添加一个key/value

{
    "DownstreamHeaderTransform": {
        "demo": "xxxxxxx"
    }
}

如果我们需要替换Heaher中某些值

{
    //请求
    "UpstreamHeaderTransform": {
        "demo": "a,b"
    },
    //响应
    "DownstreamHeaderTransform":
    {
        "demo": "a,b"
    }
}

语法是{find},{replace}, 利用b取代a

在Header转换中可以使用占位符

  • {BaseUrl} - 这个是Ocelot暴露在外的url. 例如http://localhost:5000/.
  • {DownstreamBaseUrl} - 这个是下游服务的基本url 例如http://localhost:5001/. 目前这个只在DownstreamHeaderTransform中起作用.
  • {TraceId} - 这个是Butterfly的跟踪id.目前这个也只在DownstreamHeaderTransform中起作用

如果您想将location头返回给客户端,可能需要将location更改为Ocelot的地址而不是下游服务地址。 Ocelot可以使用以下配置实现。

{
    "DownstreamHeaderTransform": {
    "Location": "{DownstreamBaseUrl},{BaseUrl}"
    },
}

给Header中添加下游地址

响应的Header中已经替换成BaseUrl了

总结

简单的配置了Ocelot的负载,限流,熔断,Header转换。具体配置还需要结合业务去搭配。下一次会给Ocelot集成Identity认证,鉴权。

.Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]的更多相关文章

  1. .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换

    1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...

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

    Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...

  3. .Net Core的API网关Ocelot使用 (一)

    1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...

  4. 初探.Net Core API 网关Ocelot(一)

    一.介绍 Ocelot 是基于.NetCore实现的开源的API网关,支持IdentityServer认证.Ocelot具有路由.请求聚合.服务发现.认证.鉴权.限流熔断等功能,并内置了负载均衡器与S ...

  5. .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡

    大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...

  6. .NET Core 微服务—API网关(Ocelot) 教程 [一]

    前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...

  7. .NET Core 微服务—API网关(Ocelot) 教程 [二]

    上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...

  8. .NET Core 微服务—API网关(Ocelot) 教程 [三]

    前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...

  9. .NET Core 微服务—API网关(Ocelot) 教程 [四]

    前言: 上一篇 介绍了Ocelot网关和认证服务的结合使用,本篇继续介绍Ocelot相关请求聚合和Ocelot限流 一.请求聚合 Ocelot允许声明聚合路由,这样可以把多个正常的Routes打包并映 ...

随机推荐

  1. javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: ResultSet is from UPDATE. No Data.

    Java jpa调用存储过程,抛出异常如下: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCEx ...

  2. 面试总问的jvm调优到底是要干什么?

    1. 压力测试的理解,xxx的性能10w/s,对你有意义么? 没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最 ...

  3. 微信小程序this.data和this.setData({})的区别

    this.data.xx是用来获取页面data对象的----------只是js(逻辑层)数据的更改: this.setData是用来更新界面的---------用于更新view层的.

  4. PHP 在 Laravel 中动态隐藏 API 字段

    我最近在 Laravel Brasil 社区看到一个问题,结果比看起来更有趣.想象一下你有一个 UsersResource 用下面的实现: <?php namespace App\Http\Re ...

  5. RGW Data Layout

    目录 Overview metadata bucket index data RGW Pools RGW Object References Overview RGW 中三个基本概念:user, bu ...

  6. django_5:表单1——文件上传

    上传文件1 class UserForm(forms.Form): name = forms.CharField() headImg = forms.FileField() def regist(re ...

  7. LVM扩容案例

    LVM基础命令: pvdisplay 查看检查pv pvremove /dev/sdb #清除一个pv fdisk -l 检查磁盘 df -h 检查全部磁盘大小 df -Th 检查磁盘大小和分区格式类 ...

  8. mysql定时任务(event事件)

    1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都 ...

  9. vim常用命令集合(精心整理)

    vim编辑器身为一个强大的linux平台编辑器,我就不多说他强大之处了,直接来简述下常用命令,提高自己使用编辑器的效率. 然后就先说下vim编辑器的模式,有的地方说三种,有的地方说两种,教程是按照两种 ...

  10. MySQL8.0 新特性 Hash Join

    概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜.有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQ ...