.NET Core + Ocelot:API 网关

关于 API 网关的作用,核心是 API 请求的收口及控制,如:鉴权、限流、熔断、数据缓存 等都是开发中常见的需求,将此类需求交给网关层处理,可以使每个微服务更聚焦于业务功能开发,同时也可为下游服务的安全及稳定性保驾护航。

在之前的文章  .NET Core + Spring Cloud:API 网关 有介绍过如何基于 Spring Cloud 中的 Zuul 实现 API 网关,功能实现上抛开不提,另外一个较大的特点是 .NET Core 可以完美的拥抱 Java 体系中的部分能力。本文将主要介绍 .NET Core 体系中的 API 网关框架:Ocelot[1],它包含了 路由、鉴权、限流、熔断、服务发现、请求聚合等非常丰富的功能,这些功能大多基于少量的配置实现,使用起来也并不复杂。

接下来通过简单例子先跑起来,然后再继续延伸更多特性的介绍,下面是 Ocelot 官方给出的一个最基础的架构图:

外网访问 Ocelot API 网关服务(单例),通过配置的规则(configuration.json),路由到下游的两个微服务实例(Http Service),这也就是最基本的转发能力。

路由转发

以下创建的 .NET Core API 服务均基于 .NET Core 3.1

  1. 创建微服务(ServiceA),并启动2个实例,两个实例使用的配置文件设置不同的 Id,方便后面接口调用识别不同实例。

    [Route("[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {public readonly IConfiguration _configuration;public TestController(IConfiguration configuration){_configuration = configuration;}[HttpGet]public string Get(){return $"service-a {_configuration["Id"]}";}
    }
    
  2. 创建网关服务

  • 安装 Ocelot NuGet 包;

  • 创建配置文件 configuration.json,内容如下:

    {"Routes": [   // 路由规则定义,数组{"DownstreamPathTemplate": "/{url}",   // 下游路径匹配模板"DownstreamScheme": "http","DownstreamHostAndPorts": [           // 下游服务的 host 和 port 设置,支持多实例{"Host": "192.168.124.11","Port": 8000},{"Host": "192.168.124.11","Port": 8001}],"UpstreamPathTemplate": "/servicea/{url}",  //  客户端访问地址路径匹配模板"UpstreamHttpMethod": [ "Get" ],            // 支持的 HttpMethod ,如:Get、Post、Put、Delete 等"LoadBalancerOptions": {                    // 多实例下负载均衡方式,支持:LeastConnection(最闲)、RoundRobin(轮询)、NoLoadBalance"Type": "RoundRobin"}}]
    }
    
  • Program.cs 中添加 Ocelot 配置文件引用

    public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();webBuilder.UseUrls("http://*:9600");webBuilder.ConfigureAppConfiguration(c =>{c.AddJsonFile("configuration.json");});});
    
  • Startup.cs  中注册服务与管道配置

    public void ConfigureServices(IServiceCollection services)
    {services.AddControllers();services.AddOcelot();
    }public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {// ....app.UseOcelot().Wait();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});
    }
    
  • 网关层接口调用测试 通过以上服务搭建,就完成了路由转发的功能,即当访问 /servicea/{任意路由地址} 都将自动转发到下游任意一个服务实例中相匹配的路由地址,网关服务访问地址为:http://192.168.124.11:9600192.168.124.11 是本机的 IPV4 地址),测试效果如下(下游服务实例被轮询访问):

  • 服务发现(Consul)

    Ocelot 支持与具备 服务发现[2] 功能的一些框架相结合,如:ConsulEureka,下游服务地址可直接从服务注册中心进行获取。接下来将结合 Consul 进行测试,有关 Consul 与 .NET Core 结合请参考文章:.NET Core + Consul 服务注册与发现 ,这部分内容这里就不重复介绍了,最终注册中心 service-a 有两个实例,如下:

    1. 安装 Ocelot.Provider.Consul NuGet 包;

    2. Startup.cs 中进行服务注册:

      services.AddOcelot().AddConsul();
      
    3. configuration.json 配置修改为如下:

      {"GlobalConfiguration": {"ServiceDiscoveryProvider": {  // 提供服务发现的 Provider"Scheme": "http","Host": "192.168.124.9",     // Consul 服务 host"Port": 8500,                // Consul 服务端口"Type": "Consul"             // 类型}},"Routes": [{"DownstreamPathTemplate": "/{url}","DownstreamScheme": "http","ServiceName": "service-a",  // 注册的服务名"UpstreamPathTemplate": "/servicea/{url}","UpstreamHttpMethod": [ "Get" ],"LoadBalancerOptions": {"Type": "RoundRobin"}}]
      }
      

    最终测试结果与上一部分一致,所以 Ocelot 完全可以与服务注册发现相结合应用到项目中。

    限流

    为了可以防止因请求过载而引起服务不稳定,可为路由规则添加相应的限流配置,如下:

    "RateLimitOptions": {"ClientWhitelist": [ "clientId1" ],"EnableRateLimiting": true,"Period": "5s","PeriodTimespan": 5,"Limit": 5  // 测试设置比较小
    }
    

    ClientWhitelist:限流白名单。如上,当请求头中包含 ClientId=clientId1 的请求则不受限流规则控制(ClientId key 名可修改EnableRateLimiting:开启限流Period:限流控制时间段,也就是多长时间内。支持 s(秒)、m(分)、h(小时)、d(天)PeriodTimespan:超过限制次数后,需要等待的时长(秒)Limit:在 Period 时长内最大访问次数

    当超出限流数量时,默认返回如下:

    如果需要修改返回值及状态码等可以通过修改 GlobalConfiguration 配置中的 RateLimitOptions 参数。

    熔断

    熔断是结合 Polly 实现的,在使用之前需要先安装 Ocelot.Provider.Polly NuGet 包,然后添加服务注册,如下:

    services.AddOcelot() .AddConsul().AddPolly();
    

    路由规则中增加如下配置:

    "QoSOptions": {"ExceptionsAllowedBeforeBreaking": 3,"DurationOfBreak": 5000,"TimeoutValue": 3000
    }
    

    ExceptionsAllowedBeforeBreaking:允许连续发生异常次数DurationOfBreak:熔断时长(ms)TimeoutValue:请求超时时间(ms)

    当超出允许异常次数时,接口 5s 内都会返回 503:

    网关高可用

    API 网关是所有请求的唯一入口,压力自然是比较大的,自身的高可用也很关键,所以网关服务在部署上必须多实例,网关上层还需要添加一层 LB,官方架构图如下:

    Ocelot 整体主要围绕配置进行功能扩充,本文只介绍了部分 Ocelot  的功能,另外还有 鉴权、缓存、请求合并、与 Kubernetes 结合等都是非常普遍的功能。

    参考资料

    [1]

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

    [2]

    服务发现: https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leedcode05 找出缺失的观测数据(思路加详解)

一&#xff1a;题目 现有一份 n m 次投掷单个 六面 骰子的观测数据&#xff0c;骰子的每个面从 1 到 6 编号。观测数据中缺失了 n 份&#xff0c;你手上只拿到剩余 m 次投掷的数据。幸好你有之前计算过的这 n m 次投掷数据的 平均值 。 给你一个长度为 m 的整数数组 rolls …

关于导入c3p0-0.9.5.5.jar包引发NoClassDefFoundError、ClassNotFoundException

一&#xff1a;问题描述 明明已经导入包了&#xff0c;而且还可以进入导入jar包的类中&#xff0c;可就是一运行就报错 NoClassDefFoundErrorClassNotFoundException 二&#xff1a;问题解决 再多导入一个jar包即可 这两个包必须全部导入才可&#xff0c;查了半天。

IT技术人,“三十而已”

最近电视剧《三十而已》热播&#xff0c;我家的电视机自然也是被霸屏&#xff0c;我还是跟着妹纸看了看&#xff0c;开头和结局完整看完&#xff0c;中间看了一点&#xff0c;大部分都是在微信公众号上通过别人的文章看完的。我个人也已经30了&#xff0c;今天也和你聊聊30这个…

html5访问本地资源,HTML5实现一个访问本地文件的实例今

怎么通过 html5 读取本地文件看你要读取什么 在高深一点的要phphtml5 打开本地文件夹我想在chrome浏览器下实现点击 打开文件夹html5本地存储怎么做&#xff0c;html5本地存储实例详解html5本地存储实例详解之创建 1 首先我们新建一个html5的空白文档&#xff0c;小编这里演示用…

[PBI催化剂]国际水准,中国首款重量级PowerBIDeskTop外部工具问世

今天看到PowerBI社区里有人推荐了SQLBI开发的Excel连接PowerBIDeskTop的外部工具功能。经了解后&#xff0c;发现其功能还是存在较大的缺陷&#xff0c;更增加了对【PBI催化剂】的优秀程度的信心。在Excel的应用领域&#xff0c;催化剂有绝对的信心是领先国际水准的。Excel连接…

查询在具有最小内存容量的所有PC中具有最快处理器的PC制造商 (20 分)(两种思路+详解)

一&#xff1a;题目&#xff1a; 本题目要求编写SQL语句&#xff0c; 查询在具有最小内存容量的所有PC中具有最快处理器的PC制造商。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product ( maker CHAR(20) , --制造商model CHAR(20) NOT NULL, …

用过 mongodb 吧, 这三个大坑踩过吗?

一&#xff1a;背景1. 讲故事前段时间有位朋友在微信群问&#xff0c;在向 mongodb 中插入的时间为啥取出来的时候少了 8 个小时&#xff0c;8 在时间处理上是一个非常敏感的数字&#xff0c;又吉利又是一个普适的话题&#xff0c;后来我想想初次使用 mongodb 的朋友一定还会遇…

vector容器中清空元素(但原来的元素还在)

一&#xff1a;上码演示 1&#xff1a;清空元素但其原来的元素还在 #include<bits/stdc.h> using namespace std; int main(){vector <int> vecInt;for (int i0;i<500;i){vecInt.push_back(i);}int j vecInt.capacity(); //j512int i vecInt.size(); …

html刮刮卡开始刮奖页面,html5刮刮卡抽奖 示例源码

【实例简介】【实例截图】【核心代码】Lottery Demobody{height:1000px;}#lotteryContainer {position:relative;width: 300px;height:100px;}#drawPercent {color:#F60;}刷新彩票已刮开 0% 区域。window.onload function () {var lottery new Lottery(lotteryContainer, #CC…

7-1 作业调度算法--先来先服务 (30 分)(思路+详解+vector+map+map做法)Come Baby!!!!!!!!!!!

一&#xff1a;题目&#xff1a; 输入N(N>0)个作业&#xff0c;输入每个作业的名字&#xff0c;到达时间&#xff0c;服务时间&#xff0c;按照先来先服务算法&#xff0c;计算每个作业的完成时间&#xff0c;周转时间&#xff0c;带权周转时间&#xff08;保留2位小数&…

html位置下移像素点,吃透移动端 1px的具体用法

最近在写移动端 H5 应用&#xff0c;遇到一个值得记录下来的点。现在从它的由来到实现&#xff0c;我们来聊一下移动端 1px&#xff0c;说 1px 不够准确&#xff0c;应该说成 1 物理像素 。通过阅读下面文章&#xff0c;你将会理解以下问题&#xff1a;问题为什么有 1px 这个问…

腾讯招.NET,居然要求精通MySQL,而不是SQLServer!

Docker、K8S、DevOps、微服务、云原生是这几年最火的技术名词&#xff0c;也是互联网的技术发展方向&#xff0c;.NET CoreMySQL的开源跨平台解决方案是.NET领域的不二之选&#xff01;然而大多数开发者甚至架构师&#xff0c;都聚焦在.NET Core上&#xff0c;以至于在MySQL性能…

7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!

一&#xff1a;题目 输入N&#xff08;N>0&#xff09;个作业&#xff0c;输入每个作业的名字&#xff0c;到达时间&#xff0c;服务时间&#xff0c;按照短作业优先算法&#xff0c;计算每个作业的完成时间&#xff0c;周转时间&#xff0c;带权周转时间&#xff08;保留2…

程序员过关斩将--Http请求中如何保持状态?

微信搜一搜架构师修行之路这是一个被无数程序员撸过的问题&#xff0c;却只有少数人了解了真相。大体上搜了一下&#xff0c;网上关于http协议保持状态误导大家的文章还是有的&#xff0c;比如&#xff1a;有人说利用ViewState&#xff0c;那是asp.net下独有的东西&#xff0c;…

7-3 作业调度算法--高响应比优先 (40 分)(思路+详解+vector容器做法)Come Baby!!!!!

一&#xff1a;题目 输入N(N>0)个作业&#xff0c;输入每个作业的名字&#xff0c;到达时间&#xff0c;服务时间&#xff0c;按照高响应比优先算法&#xff0c;计算每个作业的完成时间&#xff0c;周转时间&#xff0c;带权周转时间&#xff08;保留2位小数&#xff09;。…

基于C#开发的浏览器隐身工具-上班别乱开

魔鱼斯拉鹏_隐身高速浏览器是首款基于新款Chromium打造的超轻量“隐身”浏览器。采用时下流行的车机交互系统&#xff0c;主打“小透明”隐身访问功能&#xff0c;有了他你就可以&#xff08;上班&#xff09;肆意的开车遨游互联网了。测一测你的版本&#xff1a;https://liula…

vector容器中关于处理从非0位置开始赋值的操作

一&#xff1a;前言 问题描述&#xff1a;我们想从下标非0的位置开始赋值&#xff0c; 那么我们需要两步骤&#xff1a;1.确定开启的vector容器的范围(eg: vector v(1000)) 2.在赋值的时候&#xff0c;不可以用push_back()了&#xff0c;直接用&#xff08;v[i] values&…

html标签属性%= %,HTML标签属性集合

HTML标签属性集合更新时间&#xff1a;2017/2/8 10:28:00 浏览量&#xff1a;594 手机版图象热点映射范围锚&#xff0c;为文档定义连接首字母缩写词地址块引用放大字体为文档中的其他锚定义基本URL取代dir设置换行粗体在表单中创建一个按钮元素程序代码片段对某个文献引用定…

435. 无重叠区间(贪心经典题+思路+详解)

一&#xff1a;题目&#xff1a; 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1: 输入: [ [1,2],…

UEFI + GPT 启动 VHD

说明 周五&#xff0c;笔记本充不进电了&#xff0c;还好我的系统是做到 VHD 中的&#xff0c;把硬盘拿出来&#xff0c;插到其它机器上&#xff0c;从我的硬盘启动就可以了&#xff08;虽然当时没有从我的系统启动&#xff0c;因为只需要等待一天&#xff0c;周末就可以去修电…