一、什么是网关
网关是出现在系统边界上的一个串行集中式的强管控服务,这里的边界是企业IT系统的边界,可以理解为企业级应用防火墙,主要起到隔离外部访问与内部系统的作用。在微服务概念的流行之前,网关就已经诞生了,例如银行、证券等领域常见的前置机系统,它也是解决访问认证、报文转换、访问统计等问题的。网关的流行,源于近几年来,移动应用与企业间互联需求的兴起。移动应用、企业互联,使得后台服务支持的对象,从以前单一的Web应用,扩展到多种使用场景,且每种使用场景对后台服务的要求都不尽相同。这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,网关成为了微服务架构的一个标配组件。
二、为什么需要网关(以权限校验为例)
1、实现方案
方案1:每个服务自己实现一遍
方案2:写到一个公共的服务中,然后其他所有服务都依赖这个服务
方案3:写到服务网关的前置过滤器中,所有请求过来进行权限校验
2、方案评估
方案1:缺点太明显,基本不用。
方案2:相较于方案1好很多,代码开发不会冗余,但是有以下两个缺点:
a:由于每个服务引入了这个公共服务,那么相当于在每个服务中都 引入了相同的权限校验的代码,使得每个服务的jar包大小增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好。
b:由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。
方案3:服务网关恰好可以解决了方案2的两个缺点
a:将权限校验的逻辑写在网关的过滤器中,后端服务不需要关注权限校验的代码,所以服务的jar包中也不会引入权限校验的逻辑,不会增加jar包大小
b:如果想修改权限校验的逻辑,只需要修改网关中的权限校验过滤器即可,而不需要升级所有已存在的微服务
3、作用概况
三、网关技术调研
综述:经调研,使用Spring Cloud Zuul解决方案的占多数,已经能满足绝大多数公司需求。但除了一些超级公司外,比如阿里,京东,他们是自己撸的一套网关。此外,点评直接采用的nginx负载均衡前置网关,而没用第七层网关,原因据说是七层网关会影响性能,但由于对其架构不甚了解,所以也不得而知。
1、 携程:zuul
2、阿里无线:ACCS网关方案
3、京东:tomcat sevelet ,基于netty自研
四、网关技术选型
1、网关有哪些技术架构(按语言分类)
网关技术架构 | 语言 | 相对java进行说明 |
Kong | Lua | 1、非java语言开发的对jav性能优势不明显 2、对内部协议和基础组件支持或者拓展不方便 |
API Umbrella | ||
apigee | Node.js | |
StrongLoop | ||
Tyk | go | |
Zuul 1.x(servlet+Groovy) | java | 具备以上非java语言开发的所有功能,所以只需要对比该4个框架即可 |
Zuul 2.x (servlet+RexNetty+Groovy) | ||
Spring cloud zuul (spring整合zuul 1.x) | ||
Spring cloud gateway |
2、特性比较
特性 | Spring cloud zuul | Spring cloud gateway | Zuul 2.x |
star | 2088 | 519 | 4081 |
watch | 328 | 114 | 647 |
更新时间 | 2018-04 | 2018-03 | 2018-03 |
开源组织 | spring | Spring | netflix |
开源语言 | java | java | Java+groovy |
使用难易 | 易 | 易 | 中 |
可扩展性 | 高 | 高 | 高 |
可维护性 | 高 | 高 | 高 |
|
|
|
|
|
|
|
|
3、spring cloud zuul和spring cloud zuul性能比对
测试工具:jmeter
系统:win10
处理器:i5-7500 3.40GHz
RAM:16.0GB
a:一千个并发,字节大小11544-11610
spring cloud gateway和spring cloud zuul聚合报告
比较avergaer得知zuul响应时间接近gateway的两倍,比较throughput得知zuul的吞吐量是gateway的两倍
再看执行结果明细
比较偏离值可知zuul稳定性是gateway的2倍多
b:一万个并发, 字节大小11544-11610
综合以上指标,在一万个并发的时候,经过多次测试,性能差不多,有的时候gateway性能高一些。
c:在十万并发,字节大小11544-11610
综上指标可知,经多次测试在十万并发的情况下spring cloud gateway吞吐量和稳定性是spring cloud zuul的一倍左右
五、总结
由于zuul2.x在官网有些功能文档不全,故不对起进行性能比对
由于Spring Cloud Gateway未完全成熟,而且性能,稳定性等,现在无从考证,没有使用案例,基于Spring Cloud Gateway方案构建自己的网关风险比较大
所以,若并发量小于10万,则建议使用spring cloud zuul
六、参考文章:
http://microservices.io/patterns/apigateway.html
https://github.com/Netflix/zuul/wiki
https://segmentfault.com/a/1190000012848405#articleHeader10
http://m.vlambda.com/wz_wE1SSrhH0z.html#
https://m.sohu.com/a/127357764_609518/?pvid=000115_3w_a
https://blog.youkuaiyun.com/younger_z/article/details/52851339?locationNum=11&fps=1