面向Elasticsearch的高性能应用网关INFINI Gateway的介绍

news2024/11/18 5:43:13

1.微服务的API网关介绍

网关的含义很多,应用范围也很广,不同的领域理解也不一样,站在分布式领域基于微服务的架构风格中,API网关其实就是一个微服务系统的统一入口。往往微服务是指由多个应用组成的一个个独立的服务系统,各自拥有自己的数据库、框架甚至语言等,这些小的服务通常以Rest API风格向外提供统一的服务支持,来被多个终端以及第三方应用调用。此时如果没有一个网关服务对这些微服务进行统一的授权、认证、接入、监控和日志记录等管理,就会非常麻烦,各个服务之间的调用也很混乱,复杂度会急剧上升,扩容也麻烦。所以网关的作用不言而喻,向外提供了REST/HTTP的访问,向内提供了对服务的管理。

API网关的主要目的是让API 网关变成由应用所发起的每个请求的入口,这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。并处理每个微服务需要考虑的问题,如日志、监控、异常处理、容错、回滚、通信、消息格式、容器、服务发现、备份、测试、报警、跟踪、工具、文档、扩展、时区、API版本、网络延迟、健康检查、负载均衡等等。目前微服务网关主要方向有基于微服务应用级别的网关如:Nginx、Zuul、Sping Cloud GateWay ,还有基于云原生的云原生服务,如:Traefik。而Zuul和Spring Cloud Gateway结合Spring Cloud全家桶结合使用效果较好,下面我主要基于 Zuul和Spring Cloud Gateway以及Traefik这三者之间的网关进行详细介绍:

zuul

Gatway

Traefik

介绍

Zuul 是 Netflix 公司的开源项目,Spring Cloud 在 Netflix 项目中也已经集成了 Zuul,依赖名叫:spring-cloud-starter-netflix-zuul。

Zuul构建于 Servlet 2.5,兼容 3.x,使用的是阻塞式的 API,不支持长连接,Zuul处理的是http请求没有提供异步支持,流控等均由hystrix支持。依赖包spring-cloud-starter-netflix-zuul。

Spring Cloud Gateway 是 Spring Cloud 微服务平台的一个子项目,属于 Spring 开源社区,依赖名叫:spring-cloud-starter-gateway。

Spring Cloud Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成,开发体验相对来说十分不错。

Traefik 是一个开源的边缘路由器,在容器化技术领域,它可以通过服务配置自动发现相应的服务,并为其创建相应的路由,其提供了基于全动态路由配置和启动配置,使得 Traefik无需维护和同步单独的配置文件就可以发现服务(无需重新启动,无需连接中断)。对于多个服务,Traefik可以实现自动负载均衡。Traefik 原生兼容所有主要的集群技术,例如 Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon。Traefik 通过 API 处理程序公开了许多信息,例如所有路由器、服务、中间件等的配置。 与Traefik 的所有功能一样,可以使用静态配置启用此处理程序。

相同点

zuul和gateway底层都是servlet的拦截器,两者均是web网关,处理的是http请求。Traefik通过Kubernetes存储状态,并利用Ingress通过https将所有流量路由到对应的服务。

是否支持异步

Zuul仅支持同步,Zuul和 Zuul 2.x 比,Zuul 2.x 在底层上有了很大的改变,使用了异步无阻塞式的 API,性能改善明显,不过现在 Spring Cloud 也没集成 Zuul 2.x,

gateway支持异步。底层是使用Spring webflux的非堵塞的函数式 Reactive Web 框架,理论上gateway则更适合于提高系统吞吐量。

容器化状态可以作为Kubernetes ingress controller

完全替代nginx controller 异步配置

性能表现

getway和zuul在zuul没有进行参数调优的时候,getway的性能会远高于zuul。该测试来源如下注释1.1

GatewaySpring Boot和Spring Webflux提供的Netty底层环境,不能和传统的Servlet容器一起使用,也不能打包成一个WAR包。

依赖spring-boot-starter-webflux和/ spring-cloud-starter-gateway

提供了异步支持,提供了抽象负载均衡,提供了抽象流控,并默认实现了RedisRateLimiter。

  • 没有依赖 容器化部署

  • 带熔断器

  • Let’s Encrypt证书支持

  • 无缝重启

  • 支持多个后端:Docker/Kubernetes等

  • 自带一个简单的web ui,用于查看请求响应时间和配置等

核心作用

Zuul作为微服务系统的网关组件,是从设备和网站到Netflix流应用程序后端的所有请求的前门。作为边缘服务应用程序,Zuul旨在实现动态路由,监控,弹性和安全性。

SpringCloud Gateway中大量使用了Reactive的Webflux,使用非阻塞方式能更高效的利用线程资源。

云原生,可编程API/对接各种服务发现

实现语言

Java

Java

Golang

组成

Zuul的核心是一系列的过滤器,这些过滤器大致有以下功能:

身份认证与安全: 识别每个资源的验证要求,并不拒绝那些与要求不符的请求。

审查与监控: 在边缘位置追踪有意义的的数据和统计结果,从而产生精确的数据视图。

动态路由: 动态地将不同的请求路由到不同的后端集群。

压力测试: 逐渐增加指向集群的流量,以了解性能。

负载分配: 为每一种负载策略分配对应的容量,并启用超出限定值的请求。

静态响应处理: 在边缘位置直接建立部分响应,从而避免其转发到内部集群;

多区域弹性: 跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统边缘更贴近系统的使用者。

Gateway 由三部分组成:

(1)Filter(过滤器):

使用它拦截和修改请求,并且对上游的响应,进行二次处理。

(2)Route(路由):

一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。

(3)Predicate(断言):

这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。

Golang编写,提供小尺寸Docker镜像。

支持Docker/Etcd后端,天然连接微服务集群。

内置Web UI,管理相对方便。

自动配置ACME(Let's Encrypt)证书功能。

Restful API支持。

支持后端健康状态检查,根据状态自动配置。

支持动态加载配置文件和graceful重启。支持WebSocket和HTTP/2。

 总的来说,在微服务架构,如果使用了Spring Cloud生态的基础组件,则Spring Cloud Gateway相比而言更加具备优势,单从流式编程+支持异步上就足以让开发者选择它了。

  对于小型微服务架构或是复杂架构(不仅包括微服务应用还有其他非Spring Cloud服务节点),zuul也是一个不错的选择。

2.Elasticsearch为什么需要网关

上面讲了为什么微服务需要网关,其实最关键就是网关作为一个流量总入口,具有路由转发和过滤链的作用,在这一层能做很多公共的事情,比如:权限控制、日志收集、流量监控、限流容错等等。其实ES作为一个分布式的搜索和分析引擎,不仅仅充当着对大规模数据(结构化数据、非结构化数据、地理位置、指标)的存储功能,还提供了大规模的数据分析和检索功能。我们的大部分数据如:企业数据、专利数据、政策数据都存储在ES当中。所以对ES集群的高可用性、水平可扩展性、快照恢复、索引管理、集群安全等等都是ES集群设计考虑的重点,而怎么提高ES请求效率、降低重复请求,缓存常见查询,限速限流等等,对ES的整体性能有很大的提升作用,而ES的极限网关(INFINI Gateway)就是带着这样的使命出现的。

3.INFINI Gateway 介绍

极限网关INFINI Gateway)是一个面向 Elasticsearch 的高性能应用网关,其工作方式和普通的反向代理(nginx)一样,但是性能更高,一般是将网关部署在 Elasticsearch 集群前面, 将以往直接发送给 Elasticsearch 的请求都发送给网关,再由网关转发给请求到后端的 Elasticsearch 集群。因为网关位于在用户端和后端 Elasticsearch 之间。

如上所示,INFINI 网关针对所有的请求是透明的。我们原本的发向 Elasticsearch 的请求,现在只要提交给网关就可以了。对于客户端开发者来说,你无需了解网关后面是如何连接 Elasticsearch 的。网关位于 Elasticsearch 的前端。所有的请求都发向网关,再由网关进行转发到 Elasticsearch。当然它不是简单的转发,它可以把请求分发至各个 Elasticsearch 节点或不同的 Elasticsearch 集群,也可以针对请求依据一些规则进行修改或者拒绝等操作,或者针对 _bulk请求进行分析来提高摄入数据的速度。

极限网关的特点:

  • 轻量级

极限网关是使用Golang编写的,安装包非常简洁,仅仅10MB左右,不需要外部依赖,部署安装非常简单。只需要下载对应平台的二进制文件,启动网关程序的二进制程序文件即可。

  • 极致性能

极限网关在编写每一行代码时候,都会考虑如何让其运行在最佳状态。经测试,极限网关比同类主流网关产品速度快25%左右。且争对Elasticsearch做了非常细致的优化,能够成倍提升写入和查询的速度。

  • 跨版本支持

极限网关正对不同的ElasticSearch版本做了兼容和针对性处理,能够让业务代码无缝的进行适配,后端ES集群版本升级亦能做到无缝过渡,有效降低版本级和数据迁移复杂度。

  • 可观测性

极限网关可以动态对ElasticSearch运行过程中产生的任何请求进行截获和分析,通过指标和日志来了解所有集群的运行情况,并用于提升性能和优化业务。同时,也可以用于审计和慢查询分析。

  • 高可用

极限网关内置多种高可用解决方案,前端请求入口支持基于虚拟IP的双击热备,节点上下线能够自动发现,自动处理后端故障,自动进行请求的重试和迁移。

  • 灵活可扩展

极限网关的每个模块都可以独立扩展,可灵活的对每个请求进行干预和路由,支持路由的智能学习,内置丰富的过滤器,通过配置动态修改每个的处理逻辑,也支持通过插件来进行扩展。

4. 极限网关可以做什么事情?

通过上面对INFINI Gateway特点的描述,可以看出来其高效性。下面是对使用场景的描述:

  • WAF与安全

Elasticsearch 中的每一份数据都是很宝贵的,为了保护数据的安全性,不被黑客攻击和脚本注入等。WAF(Web Application Filrewall) 的需求应用而生。不管是跨站点脚本攻击还是跨站点脚本注入,又或是弱密码、暴力破解,还是程序员不合理的查询参数滥用。极限网关都能对这些来自不同的web应用程序客户端的各类请求进行内容检测和验证,通过执行一系列针对Elasticsearch的安全策略来确保其安全性和合法性,对非法的请求及时阻断,从而对后端Elasticsearch进行保护。

  • 流量管控

如果不对发生Elasticsearch集群的请求进行管控,可能造成集群的性能降级从而影响总体的稳定性和可用性,极限网关支持多种方式来进行限流:

- 常规QPS限流 - 按照IP进行限速

- 按照集群进行限速 - 按照并发数控制

- 按照索引进行限速 - 按照宽带流量控制

- 按照用户进行限速

  • 流量路由

极限网关可以在网管层进行流量的复制和转发以及路由,可用于:

- 实现集群双写,新旧版本各一套集群,通过网关同时双写,从而实现升级、测试的无缝操作

- 流量迁移,可以导出部分流量到测试集群,进行灰度发布、测试

- 多版本,多集群的在线转发,可以根据参数灵活进行请求和路由转发

- 通过路由写请求到本地磁盘或者kafka,从而解耦前端写入和后端集群,在不停机情况下,实现后端集群的升级、维护和在线重建能力。

  • 请求干预

极限网关可以在网关层进行查询请求和改写:

- 通过在线修改错误查询请求,可以实现在不修改业务代码重新部署上线的情况下实现问题的快速修复,从而降低故障时间。

- 可以在线对Elasticsearch 查询结果进行动态修改,比如实现特定关键字改写,数据混淆或者返回固定结果。

- 可以动态聚合来自其他数据源(如:MySql、Hive) 的数据,在Elasticsearch返回文档之上附加其他字段,用于直接给前端展示最终需要的数据

  • 查询加速

极限网关使用了一系列手段来提高数据分析场景的查询体验:

-查询缓存,通过缓存常见,重复的高频请求,实现就近折回,提升查询速度,降低后端查询压力

-钝化时间精度,通过Kibana查询请求里面的时间条件钝化,可以进一步提高缓存效率,避免短时间内无意义的重复请求,节省后端资源

-对于海量数据分析的场景,可以实现百倍查询性能的提升。

  • 索引加速

极限网关可以大大提升Elasticsearch 的索引吞吐和性能:

-请求合并,将单次的索引请求合并为批次索引请求,提高索引效率,降低后端压力

-索引目的地感知,将索引文档安装目标节点存放位置进行重新组装,从而实现索引请求的精准投递,避免后端集群的二次转发

-流量压缩,网关通过对索引的流量压缩,提高网络宽带的利用率,提升后端的总吞吐量

-同步请求转异步批次,通过将请求合并整理并整合成更大量的批次,然后进行异步提交,实现索引吞吐量的提高。

  • 异地容灾

极限网关可以实现多集群双写来实现多集群的异地容灾

- 无缝透明多写,应用无需任何调整

- 同步加异步组合方式,不丢失请求的校验功能

- 通过流量压缩来降低异地机房宽带开销

- 业务操作级别的复制,跨版本兼容并存

- 异地双集群的高可用,随时切换读写

- 后端读写故障对前端业务无感知

- 节点故障自动处理,写入请求不丢失

- 结合快照和Translog可以完全做索引

- 实时索引校验任务确保三方数据完全一致

  • 查询分析

极限网关可以完整的跟踪发往Elasticsearch 集群的所有请求,用于深入分析:

- 流量分析,集群的访问一目了然,发现异常

- 慢查询分析,定位性能瓶颈

- 查询日志分析,跟踪指定请求,调试定位查询问题

- 审计分析,可用于对部门、人员进行集群操作行为的审计

5.INFINI Gateway使用案例

6.引用注释

1.1 springCloud网关Zuul和GateWay区别_菜鸟的突变的博客-CSDN博客_zuul与gateway区别

1.2 https://zhuanlan.zhihu.com/p/44117164

1.3 https://www.jianshu.com/p/cb7ad17b2e13

1.4 https://www.bbsmax.com/A/kmzLN9eA5G/

1.5 https://blog.hypriot.com/post/microservices-bliss-with-docker-and-traefik/

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

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

相关文章

【C/C++】类型限定符extern、const、Volatile、register

1、extern: 声明一个变量,extern声明的变量没有建立存储空间。 extern int a ; //变量在定义的时候创建存储空间。 ①当我们在编译器中试图运行以下代码,系统会报错。 错误原因是“无法解析外部符号_a”.系统认为变量a是没有开辟内存空间的…

【3】MyBatis+Spring+SpringMVC+SSM整合一套通关

三、SpringMVC 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体…

网络应用之静态Web服务器-多任务版

静态Web服务器-多任务版学习目标能够写出多线程版的多任务web服务器程序1. 静态Web服务器的问题目前的Web服务器,不能支持多用户同时访问,只能一个一个的处理客户端的请求,那么如何开发多任务版的web服务器同时处理 多个客户端的请求?可以使…

ROS进行深度相机的标定

前言 自己使用标定板对深度相机进行标定。 参考:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration 一、准备标定板 在下面的网站中可下载棋盘格标定板,可用A4纸打印下来。 http://wiki.ros.org/camera_calibration/Tutorials/…

Spring Boot整合Kaptcha实现验证码功能

目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha,创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口,在接口中使用 kaptcha 工具类来生成验证码图片(验证码信息)并返回3 登录时从sess…

阻塞队列BlockingQueue

一、概念阻塞队列:从名字可以看出,他也是队列的一种,那么他肯定是一个先进先出(FIFO)的数据结构。与普通队列不同的是,它支持两个附加操作,即阻塞添加和阻塞删除方法。如上图,线程1往…

2023年值得参加的数学建模竞赛介绍

数学建模竞赛:一次参与,终身受益 博主7年数学建模竞赛经验,历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博,有需要数模竞赛帮助的可以私信我。 有同学咨询还有那些数学建模比赛可以参加,哪些含金量比较高&…

Qt图片定时滚动播放器+透明过渡动画

目录参考结构PicturePlay.promain.cppmyqlabel.h 自定义QLabelmyqlabel.cpp自定义QLabelpictureplay.hpictureplay.cpppictureplay.uistyle.qss效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后,无法缩小只能放大 Qt的动画类修改…

3 决策树及Python实现

1 主要思想 1.1 数据 1.2 训练和使用模型 训练:建立模型(树) 测试:使用模型(树) Weka演示ID3(终端用户模式) 双击weka.jar选择Explorer载入weather.arff选择trees–>ID3构建树…

简单易懂又非常牛逼的Spring源码解析,推断构造与bean的实例化

简单易懂又非常牛逼的Spring源码解析,推断构造与bean的实例化原理解析实例化bean的入口工厂方法实例化推断构造初次筛选二次筛选bean的实例化代码走读实例化bean的入口createBeanInstance方法内部的流程推断构造初次筛选二次筛选bean的实例化总结往期文章&#xff1…

十六、vue3.0之富文本编辑器的选择

在工作过程中我们会遇到很多的时候会使用到富文本编辑器,市场上流行的也是各种各样的,那么究竟如何选择呢,今天就给大家讲讲有哪一些,方便大家的选择。 一、TinyMCE TinyMCE 是富文本编辑器领域的头部玩家之一,主流富文本编辑器,功能非常全,你需要的大多数功能它都支持…

深力科电子-MachXO3系列 LCMXO3LF-1300C-5BG256C 控制和桥接FPGA器件

深力科电子-lattice莱迪斯MachXO3系列 LCMXO3LF-1300C-5BG256C 控制和桥接FPGA器件 ,FPGA 现场可编程逻辑器件,小尺寸,高性能!在工业领域,它可以用于网络控制器,PLC,网络边缘计算,机器视觉和工业机器人&…

万字解析 Linux 中 CPU 利用率是如何算出来的?

在线上服务器观察线上服务运行状态的时候,绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如,随手拿来的一台机器,top 命令显示的利用率信息如下 这个输出结果说简单也简单,说复杂也不是那么容易就能全部搞明白…

【java web篇】使用JDBC操作数据库

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

学习Java前,应该了解的这些知识(新手必学)

Java语言广泛应用于编写web应用程序、移动开发、安卓开发等,市场上对Java人才需求量很大,有数据显示,Java工程师的薪资待遇随着人才市场的需求逐步递增,由此可见,Java人才需求量呈现持续上升趋势,供不应求。…

LevelDB架构介绍以及读、写和压缩流程

LevelDB 基本介绍 是一个key/value存储,key值根据用户指定的comparator排序。 特性 keys 和 values 是任意的字节数组。数据按 key 值排序存储。调用者可以提供一个自定义的比较函数来重写排序顺序。提供基本的 Put(key,value),Get(key),…

企业电子招标采购源码之电子招标投标全流程!

随着各级政府部门的大力推进,以及国内互联网的建设,电子招投标已经逐渐成为国内主流的招标投标方式,但是依然有很多人对电子招投标的流程不够了解,在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

13-mvc框架原理与实现方式

1、mvc原理 # mvc 与框架## 1.mvc 是什么1. m:model,模型(即数据来源),主要是针对数据库操作 2. v:view,视图,html 页面。视图由一个一个模板构成(模板是视图的一个具体展现或载体,视图是模板的一个抽象) 3. c:controller,控制器,用于mv之间的数据交互## 2.最简单的 mvc 就是一…

Java+Swing+Mysql实现超市管理系统

一、系统介绍1.开发环境操作系统:Win10开发工具 :IDEA2018JDK版本:jdk1.8数据库:Mysql8.02.技术选型JavaSwingMysql3.功能模块4.系统功能1.系统登录登出管理员可以登录、退出系统2.商品信息管理管理员可以对商品信息进行查询、添加…

MapReduce小试牛刀

部署完hadoop单机版后,试下mapreduce是怎么分析处理数据的 Word Count Word Count 就是"词语统计",这是 MapReduce 工作程序中最经典的一种。它的主要任务是对一个文本文件中的词语作归纳统计,统计出每个出现过的词语一共出现的次…