网关Ocelot功能演示安排的明明白白~~~

前言

网关(Gateway)在微服务架构中至关重要,可以将其理解为是外部客户端(前端、MVC后台等调用方)与后台服务的连接点,通过这层可以做统一的处理,比如路由、身份认证和授权、服务治理等;

网关的好处:

  • 统一入口,调用方(客户端)不在为调哪个服务而头大,统一入口即可,由网关路由到对应后台服务;

  • 统一处理公共逻辑,比如认证和授权,避免相同逻辑多处实现,易于维护;

  • 对后台服务可以做负载均衡,根据指定的负载算法找到合适的后台服务调用,而这些细节调用方都不用理会,只管调就行啦;

  • 初步过滤非法请求,可以根据配置的请求规则过滤掉非法请求;

  • 屏蔽各服务真实地址,间接保证各服务的安全

网关带来的问题:

  • 在请求过程中,多增加了一层(网关)对请求进行处理,会消耗一些性能;

  • 高并发场景,对网关性能要求高,需要开发人员要有足够的能力处理;

整体来看,在微服务架构中,网关带来的便捷和好处肯定大于自身带来的问题,所以不必纠结于此。

目前常用的网关有Kong、Tyk、Zuul、Ambassador、Ocelot等,而在.Net中比较火的是Ocelot和Kong,接下来就以Ocelot为主展开来聊聊。

正文

Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,除了路由、请求聚合、负载均衡等功能外,还可以集成Consul做服务发现,集成Polly做服务治理等;相关功能只需简单的配置即可实现。接下来就把比较常用的功能依次举例演示一把,小伙伴们,搞起来~~~

0. 先把项目建好

整个演示中会使用到三个角色:网关层(端口为5000)、后台服务1(端口为8000)、后台服务2(端口为8001)。项目结构如下:

项目结构

网关对应代码如下:

网关代码

由于使用的是.NetCore3.1进行演示,则需要的Ocelot包版本最新为16.0.1,然后将对应服务和中间件进行注册;由于Ocelot是通过配置文件进行功能配置的,所以需要一个配置文件,并指定对应的路径;这里的ocelot.json(名字自定义就行)就放在根目录下,将文件属性改为始终复制或如果较新则复制,配置文件内容在下面会细说;这里网关层就完工啦;

两个后台服务接口基本上没动,只是将ServiceAPI1的端口改为8000,ServiceAPI2的端口改为8001;为了后续配置演示,分别新增了控制器,如下图:

服务接口

1. 路由

路由是指网关根据原始请求,匹配对应的路由配置规则,将其转发到真正的后台服务接口;这是网关的核心功能。

1.1 配置初体验

通过配置,实现统一入口(网关),访问后台两个不同的服务接口,如下配置:

{"Routes": [{"UpstreamPathTemplate": "/OcelotTest1/{url}","UpstreamHttpMethod": [ "Get"],"DownstreamPathTemplate": "/api/{url}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8000}]},{"UpstreamPathTemplate": "/OcelotTest2/{url}","UpstreamHttpMethod": [ "Get"],"DownstreamPathTemplate": "/api/{url}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8001}]}]
}

配置项解析:

  • Routes:这是个数组,将所有请求处理都配置在里面,每一个请求处理是一个对象;

  • UpstreamPathTemplate:上游请求路径模板;即对应调用方发出的请求,如不符合这个规则,就会被过滤掉;

  • UpstreamHttpMethod:上游请求的方式,可以传递多个,比如["Get","Post"];

  • DownstreamPathTemplate:下游请求的路径模板;对应真实API的请求地址,只有符合规则,才会正常转发到服务接口上;

  • DownstreamScheme:指定下游是http还是https;

  • DownstreamHostAndPorts:指定下游的Host和端口,这里可以写多个,多个时可以配置负载均衡;

将网关、后台服务接口1和后台服务接口2运行启动,访问如下:

路由访问

如路由配置所示,可以用{参数}这种形式,通过上游请求模板传递给下游请求模板中;

1.2 设置匹配的优先级

当请求匹配到配置的多个路由规则时,会选择配置在最前面的路由规则进行转发,可能不是自己需要,如下:

默认先配置先匹配

遇到这种情况可以调整配置位置来满足需求,但明显不合理,Ocelot提供优先级(Priority)的配置,配置的值越大就越优先匹配,默认所有配置的路由优先级的值为0;如下配置可以满足需求:

路由优先级

在配置文件中可以配置万能模板,即所有请求都会匹配到该路由模板,但其优先级为最低,如果能匹配到其他模板,优先走其他路由,万能模板配置如下:

万能模板
1.3 区分匹配路由大小写

默认情况下,匹配路由是不区分大小写的;其实在实际过程中我们通常也不需要区分;但在一些应用场景要求区分大小,那就可以增加"RouteIsCaseSensitive": true配置即可。

2. 路由聚合

路由聚合就是可以将多个一般的路由(上面配置的路由就是)聚合在一起,然后将多个路由响应的结果统一返回给调用方;如下配置

image-20210402123033237

配置说明:

  • 路由配置中增加了Key,给需要聚合的路由分别配置一个不重复的Key值;

  • 在配置文件中增加Aggregates节点,这个节点和Routes节点是同级的;然后在里面的RouteKeys中配置需要聚合的路由Key,然后再配置一个上游模板路径,配置上游模板路径时同样可以传递参数,如上图所示;

运行结果:

image-20210402123819897

其实在刚开始直接返回字符串时(通常都是是返回Json,只是这里演示遇到了不规范情况,刚好可以说说),返回的结果并不是真正的Json字符串,这样可能前端解析就会出问题,所以需要处理一下返回结果;

如果不处理,就会出现如下情况:

返回结果不对

上图中在没处理之前,网关是直接将结果进行拼接,但最后整体不符合Json格式,JsonView就报错啦!!!

解决措施就是将字符串以Json的形式返回即可,简单的处理方式如下:

优化之后

上面的聚合演示是默认情况,Ocelot提供自定义聚合器的功能(继承IDefinedAggregator接口),并注册相关服务,然后在配置文件指定自定义的聚合器即可,如下(具体细节请详见官网):

image-20210402124814838

具体实现这里就不再演示了,好像自定义聚合器功能用的不太多,通常大家的做法是单独做一个后台聚合服务,若需要聚合数据,从聚合服务中获取即可;

3. 集成Consul做服务发现

如果还是通过配置文件一个一个的配置路由,是不是也太不给力啦,如果能和Consul结合,岂不是完美~~~

3.1 先把Consul集成到网关项目中

引入Ocelot.Provider.Consul,并在ConfigureServices中注册相关服务组件;

image-20210402134110433
3.2 在配置文件中增加Consul相关配置;
image-20210402223213939

配置文件说明:

  • GlobalConfiguration:全局配置,其实可以理解为所有路由共用的配置放在这;

  • ServiceDiscoveryProvider:服务发现的相关配置,Scheme代表用的是http还是https;Host代表的是Consul启动的主机;Port代表Consul启动的Http端口;Type这里使用的是Consul这种服务发现,可以指定其他服务发现框架;

  • BaseUrl:这个配置主要网关对外暴露的地址,也就是调用者使用的地址;

Routes中多了两个和一般路由不同的配置,如下:

  • ServiceName:指定服务名,这里是Consul注册服务时指定的服务名,根据这个名字内部可以获取到对应的Host和端口;所以有了ServiceName,就可以不用手动配置Host和端口啦;

  • LoadBalancerOptions:指定负载均衡算法,其实这里咱们还没有说到负载均衡,但如果不配置会报错,所以就提前配置上了;

3.3 启动Consul服务

将两个后台服务接口注册到Consul中;(过程就不细说啦,详细参考来,Consul 服务发现入个门(一看就会的那种)和运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)这两篇文章);这里用配置文件的方式,如下配置文件:

image-20210402221640328

然后启动Consul即可,这里为了演示方便,直接就用开发者模式啦;

3.4 运行结果
image-20210402222950495
3.5 动态路由

除了以上显示指定服务名之外,其实可以动态路由,如下配置运行:

image-20210402225019606

Routes节点不需要配置任何路由;

4. 负载均衡

在高并发场景,后台服务是需要做集群部署的,而Ocelot可以在配置路由规则时,开启负载均衡功能,并指定对应的均衡算法,从而实现请求按算法转发到后台服务。

4.1 模拟集群环境

为了方便演示集群效果,这里将后台服务主机的端口打印出来,代码如下:

image-20210403002543495

然后通过命令的方式,将ServiceAPI1后台服务启动多个,只是端口不一样而已;如下:

image-20210403221010139
4.2 将启动起来的服务配置网关中

启动起来之后,将他们配置到路由中,如下:

image-20210403204553359

配置解析:

  • DownstreamHostAndPorts中配置多个启动的后台服务Host和端口;

  • LoadBalancerOptions指定负载均衡算法,图中指定的是轮询,通常有以下几种:

  • LeastConnection 把新请求转发到请求最少的后台服务上;

  • RoundRobin 将请求轮询轮询转发都配置的后台服务上;

  • NoLoadBalancer 不负载均衡;

  • CookieStickySessions 使用cookie关联相关的请求到指定的服务;

4.3 网关运行起来看效果
image-20210403220600727
4.4 搭配Consul一块用

首先进行修改Consul的配置文件,然后将其启动,见下图:

image-20210403221739328

如上图所示,在相同服务名ServiceAPI1Name下面注册了两个服务,一个端口是8000,一个端口是8003;

然后在网关中修改一下配置,然后启动:

负载均衡

咦,到这发现篇幅略长啦,先暂停吧;另外Polly这个知识点之前没聊过,下期先补上,然后继续聊其他功能~~~~~

项目地址:https://github.com/zyq025/IDS4Demo/tree/main/OcelotDemo/OcelotCodeDemo

总结

本来想通过一篇文章把常用的功能点演示一下的,篇幅太长不太好(小伙伴有反应);下期会继续说Ocelot集成CacheManager做缓存、集成IdentityServer4做认证授权、集成Polly做服务治理。

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

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

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

相关文章

通过Dapr实现一个简单的基于.net的微服务电商系统

本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在。时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于dapr的文章不太多,所以今天就借…

基于 Python 自建分布式高并发 RPC 服务

RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要角色。Google 开源了 gRPC…

程序员江湖鄙视链大全,看看你处于链条的哪一级?

有人的地方就有江湖。程序员,是一个知识、智商、都异于常人的 群体,有人总结了程序员江湖等级鄙视链的方法和流程。老婆漂亮的程序员鄙视老婆不漂亮的程序员鄙视有女友的程序员鄙视单身狗程序员而在单身狗之间,才有了语言,编辑器和…

java什么是静态_什么是java静态

什么是java静态java静态包括静态变量、静态方法、静态初始化块,以下是静态的详解。(推荐教程:java教程)1. 什么是静态变量大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在…

如何在 .NET 程序万种死法中有效的生成 Dump (上)

一:背景相信很多人都知道通过 任务管理器 抓取dump,虽然简单粗暴,但无法满足程序的无数种死法,比如:内存膨胀,程序爆炸CPU爆高,程序累死应用无响应,用户气死意外退出,和人…

74款app源码,值得你拥有的干货

最近,小编一直在整理一些app的源码,如:BiliClient(仿bilibili客户端)、WeChat高仿微信、知乎专栏App、Compass(MIUI指南针的社区开源版)等。现在小编打算将这些资料免费分享给大家!&…

监控系统简介:使用 Prometheus 与 Grafana

注:本文虽以 Docker 进行演示,但 Docker 并不是必须的,相关软件也可以直接安装到计算机上背景如果我们是Web应用的开发者,会对响应时间、接口的稳定性等比较敏感,在站点尚未部署到生产环境时,我们有充足的时…

7500 cpuz跑分 i5_核心硬盘 i5 7500性能测试_DIY攒机酷品测试-中关村在线

下面我们进入CPU测试环节。为保测试性准确可靠,以下测试均采用Windows 10 1周年版 64位正版系统,且不对操作系统进行任何优化,用以获取最大的系统稳定性与兼容性。Intel 酷睿i5 7500i5 7500 CPU-ZFritz Chess BenchmarkFritz Chess Benchmark…

Android Ap 开发 设计模式第七篇:生成器模式

Builder Pattern 模式解读 生活在深圳这所高速发展的城市,高楼大厦林立。所谓万丈高楼平地起,在我们感慨楼层的高耸之外,更要配服楼层的建造者和设计者。大楼首先得打稳地基、搭建骨架,再由下往上一层层盖上去。而这样的架构从程序…

MySQL 创始人:写代码比打游戏还爽,程序员应该多泡开源社区

编者按:根据StackOverflow的最新调查,MySQL仍然是全世界最流行的数据库,受访的开发者中有44.3%的人在使用,超过了第二位的SQL Server 10多个百分点。可是你知道MySQL是怎么诞生的吗?openocean 的一篇有关MySQL开发者Mi…

tomcat如何修改java版本_Java程序员必备——Tomcat配置技巧Top10

一、配置系统管理(Admin Web Application)大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面。Tomcat按照自己的方式,同样提供一个成熟的管理工具,并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin …

祝福!微软 46 周年生日快乐!

46 年前的今天,即 1975 年 4 月 4 日,比尔盖茨(Bill Gates)和保罗艾伦(Paul Allen)共同创立了微软公司。他们是小时候认识的朋友及高中同学,并对电脑编程充满激情。1975 年 1 月,MIT…

荐书 | 没有数学思维的程序员不是好的问题解决者

今天小木给大家推荐以下五本关于数学历史或数学思维的名家著作。读者推荐:01《这才是最好的数学书》[日] 笹部贞市郎55.00赠:《谁谋杀了希尔伯特教授》数学漫画随机一本《神笔涂绘》内容简介:有人曾请教笹部贞士郎,是如何引领近代…

java反射sethaha_Java反射深度测试

通过反射API构造对象,并使用反射调用方式访问对象的public/private方法和字段。package lavasoft.test;/*** 测试的业务类** author leizhimin 2010-5-6 20:16:10*/public class MyService {private String msg;public MyService() {System.out.println("log: …

监控系统简介(二):使用 App Metrics 在 ASP.NET Web API 中记录指标

回顾在《监控系统简介:使用 Prometheus 与 Grafana》一文中,我们了解了什么是监控系统,Prometheus 这一监控工具及它提供的数据类型、PromQL 以及 Grafana 可视化工具的基本用法。今天这一篇我们将在 ASP.NET Web API 项目中进行实战&#xf…

剧透人生!你什么时候结婚换工作甚至狗带,Facebook都知道

来源:大数据文摘即将换工作?要结婚了?有亲人朋友要去世了?你关心的这些人生重大节点,有人希望比你提前知道它们何时发生,并基于此对你精准投放广告。惊悚?这是Facebook在2010年以来提交的一系列…

如何在 NET 程序万种死法中有效的生成 Dump (下)

一:背景 上一篇我们聊到了如何通过 procdump 抓取 cpu爆高 和 内存暴涨 两种情况,这一篇再聊聊如何去抓程序 挂死 和 意外退出。二:程序挂死 1. 定义程序挂死 简单的说就是程序没有响应,既然没响应了,可能 死锁, 可能 …

C++程序运行时内存布局之--无继承情况下的虚函数

2019独角兽企业重金招聘Python工程师标准>>> 虚函数是C实现多态的关键,没有虚函数,C只能是OB,不能完成OO。 本文介绍的是没有继承情况下,带有虚函数的类在内存中布局,以及其实例(对象&#xff0…

纠结学哪种编程语言?请看这个回答

各位童鞋,如果最近/未来几年有人还纠结学习哪种编程语言,那你可以请他/她参考一下这个 Quora 帖子的最高赞回答:> 能找一份工作:Java> 能找一份高薪工作:C> 啥样工作都能找到:Python> 总能找到…

NET问答: 有最干净利落的读写文件方式吗?

咨询区 ApprenticeHacker:在 C# 中有很多种读写文件的方式 (文本文件,非二进制)。为了践行 do more, write less 的思想,现寻找一种最简单最少代码量的方式,因为在我的项目中有太多的功能需要读写文件了。回答区 vc 74&#xff1a…