1.什么是API网关

API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API。它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。

Ocelot介绍

Ocelot是用.net Core实现的一款开源的网关,Ocelot其实就是一组按照顺序排列的.net core中间件。它接受到请求之后用request builder构建一个HttpRequestMessage对象并发送到下游服务,当下游请求返回到Ocelot管道时再由一个中间件将HttpRequestMessage映射到HttpResponse上返回客户端。

开源地址点击这里

使用Ocelot傻瓜式转发

新建三个项目webApi项目,分别命名为ApiGateway,Api_A,Api_B



  

设置Api_A端口为5001,Api_B端口为5002,ApiGateway为5000

为ApiGateway项目安装Ocelot,在Nuget中搜索Ocelot或者直接使用Install-Package Ocelot进行安装。最新版本为13.8.x支持core3.0。

在ApiGateway新建一个configuration.json配置文件。

{
"ReRoutes": [
{
//上游Api请求格式
"UpstreamPathTemplate": "/Api_A/{controller}/{action}",
//网关转发到下游格式
"DownstreamPathTemplate": "/api/{controller}/{action}",
//上下游支持请求方法
"UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
"DownstreamScheme": "http",
//下游服务配置
"DownstreamHostAndPorts": [
{
//下游地址
"Host": "localhost",
//下游端口号
"Port": 5001
}
]
},
{
"UpstreamPathTemplate": "/Api_B/{controller}/{action}",
"DownstreamPathTemplate": "/api/{controller}/{action}",
"UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5002
}
]
}
]
}

Startup.csConfigureServicesConfigure中配置Ocelot

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddOcelot(new ConfigurationBuilder()
.AddJsonFile("configuration.json")
.Build());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseOcelot();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}

分别为Api_A,和Api_B分别添加一个print接口。

[HttpGet("print")]
public string Print()
{
return "Api_A";
}
[HttpGet("print")]
public string Print()
{
return "Api_B";
}

测试网关

启动三个项目,使用postman来调用网关

访问Api_A服务

访问Api_B服务

可以看到网关通过接受到的请求的Url后通过我们的配置自动转发到了我们想要访问的服务。

网关的负载均衡

当下游拥有多个节点的时候,我们可以用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了

总结

简单的实现了通过网关来访问api接口。ocelot功能远不止这些,之后会实现与IdentityServer的认证鉴权。服务发现。

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

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

    网关的负载均衡 当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置 { "UpstreamPathTemplate": "/Api_A ...

  2. .Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡

    目录 限流 熔断 缓存 Header转化 HTTP方法转换 负载均衡 注入/重写中间件 后台管理 最后 在上篇.Net微服务实践(三)[网关]:Ocelot配置路由和请求聚合中我们介绍了Ocelot的 ...

  3. .net core使用ocelot---第四篇 限流熔断

    简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证 .net core使用ocelot---第三篇 日志记录 前几篇文章我们陆续介 ...

  4. Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级

    相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...

  5. ASP.NET Core中使用漏桶算法限流

    漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...

  6. Hystrix介绍以及服务的降级限流熔断

    (dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...

  7. springBoot整合Sentinel实现降级限流熔断

    由于hystrix的停止更新,以及阿里Sentinel在历年双十一的贡献.项目中使用了Sentinel,今天我们来讲讲Sentinel的入门教程,本文使用1.6.3版本进行讲解 本文通过Sentine ...

  8. DBPack 限流熔断功能发布说明

    上周我们发布了 v0.4.0 版本,增加了限流熔断功能,现对这两个功能做如下说明. 限流 DBPack 限流熔断功能通过 filter 实现.要设置限流规则,首先要定义 RateLimitFilter ...

  9. .Net Core使用Ocelot网关(二) -鉴权认证

    前言 上一章已经简单的介绍了ocelot的使用了,但是网关暴露的接口如果什么人都能访问的话安全性就太低啦.所以我们需要去鉴权和认证.这里我们使用identityServer4给我们的网关来鉴权认证. ...

随机推荐

  1. 基于代码生成器的快速开发平台 JEECG

    JEECG是一款基于代码生成器的J2EE快速开发平台,开源界“小普元”超越传统商业企业级开发平台.引领新的开发模式(Online Coding模式(在线开发)->代码生成器模式->手工ME ...

  2. windows下载安装swoole的方法

    windows下载安装swoole的方法先安装Cygwin 选择163镜像(速度非常快) add url http://mirrors.163.com/cygwin/ 然后安装gcc php pcre ...

  3. T-SQL Part XII: Access Remote SQL Server

    要链接远程的SQL Server,需要一下几个步骤(以下的步骤都是在远程系统上进行): 确认远程SQL Server所监听的端口号 官方的文档是使用SQL Server Configuration M ...

  4. SqlServer2005 查询 第八讲 order by

    今天我们来说模糊查询 模糊查询 -- --模糊查询[主要用在搜索中]格式:select 字段的集合 from 表名 where 某个字段名 like 匹配条件 --注意:匹配条件通常含有通配符,通配符 ...

  5. JVM浅谈

    **前言** 由于先前也遇到过一些性能问题,OOM算是其中的一大类了.因此也对jvm产生了一些兴趣.自己对jvm略做了些研究.后续继续补充. **从oom引申出去** 既然说到oom,首先需要知道oo ...

  6. VMware NAT模式ping通外网[CentOS7]

    使用一张网卡,NAT模式 在编辑里打开虚拟网络编辑器 dhcp设置的范围 你的虚拟机的IP 就在那个范围里 NAT设置里有填网关 这里我们vmware 的设置就OK了 在去把你的网络适配器改下iP 这 ...

  7. spring security进阶 使用数据库中的账户和密码认证

    目录 spring security 使用数据库中的账户和密码认证 一.原理分析 二.代码实现 1.新建一个javaWeb工程 2.用户认证的实现 3.测试 三.总结 spring security ...

  8. vim的查找功能

    vim是一款强大的编辑器. 在vim下要查找字符串: 一,全匹配: 1,从上往下查找,比如“string” :   /string 2,从下往上查找,比如“string” : ?string 二,模糊 ...

  9. workspaces only allow trusted client with self-signed cert

    1. 生成ca. openssl genrsa -out CA_neonone.workspace.key 2048 openssl req -x509 -new -nodes -key CA_neo ...

  10. Spring Boot2 系列教程(二十七)Nginx 极简扫盲入门

    上篇文章和大家聊了 Spring Session 实现 Session 共享的问题,有的小伙伴看了后表示对 Nginx 还是很懵,因此有了这篇文章,算是一个 Nginx 扫盲入门吧! 基本介绍 Ngi ...