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。 |
|
核心作用 | 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/