网关
作用:统一去操作、处理一些问题。类似于前台。
具体作用如下:
- 路由:起到转发的作用,比如有接口A和接口B,网关会记录这些信息,根据用户的请求地址和参数,转发到对应的接口(服务器/集群)
- /a => A服务器
- /b => B服务器
- 负载均衡:在路由的基础上
/c => 集群A(随机转发到一台机器上) - 统一鉴权:无论访问哪一个接口,都统一鉴定权限,不用重复写
- 跨域:网关统一处理跨域,不用在每个项目中单独处理
- 统一业务处理:把一些每个项目中都要做的通用逻辑放到上层(网关),统一处理,比如api项目的接口调用次数统计
- 访问控制:黑白名单,比如限制 DDOS IP。
- 发布控制:灰度发布,比如上线接口新版本,先给新接口分配 20% 的流量,老接口 80%,没问题的话,再慢慢调整比重,比重不断向新接口倾斜,直至最后完全替代老版本。
- 流量染色:给请求添加一些标识,一般添加在请求头中。
- 场景1:防止某个用户绕过网关直接访问接口服务器(项目地址暴露的话),可以在请求通过网关后添加一个类似于“source = gateway”,没有该请求头的请求一律拒绝访问
- 场景2:排查用户调用接口出不出问题,可以在请求中打一个唯一的 “traceId = xxx”,出问题后方便排查
- 接口保护:
- 请求保护:
- 接口脱敏:有返回服务器地址的话,抹掉请求头
- 降级(熔断):调用失败的话,访问其他接口(或提示信息等降级逻辑)
- 限流:
- 超时时间:类似10s没返回强制中断,保护服务器
- 统一日志、统一文档
网关的分类
全局网关(接入层网关):作用是负载均衡、请求日志等,不和业务逻辑绑定。
业务网关(微服务网关):会有一些业务逻辑,作用是将请求转发到不同的业务 / 项目 / 接口 / 服务。
当涉及网关分类时,一般情况下有**两种主要类型:**业务网关和全局网关,其中接入层网关也是全局网关的一种。它们有着一些区别。全局网关通常位于多个项目或微服务之上,负责根据用户请求将其转发到不同的业务、项目、接口或服务。另一方面,全局网关更多地关注请求本身,主要用于负载均衡。全局网关在大多数情况下并不涉及复杂的业务逻辑。相比之下,业务网关可能会包含一定的业务逻辑,比如之前提到的统计次数功能,这会影响你在技术选型上的决策。
全局网关的主要功能是负载均衡,将大量的请求平均分摊到系统中的多台机器上,它通常不涉及过多的业务逻辑,而更注重处理请求日志等任务。业务网关则更多地关注业务逻辑,例如统计次数、请求鉴权等,同时也会负责转发请求到具体的业务处理单元。
然而在实际开发中,上并不一定要明确区分业务网关和全局网关,因为它们的分类对于技术选型并不是绝对的要求。重要的是根据系统需求来选择适合的网关类型。
- Nginx(全局网关)、Kong 网关(API 网关,Kong),编程成本相对高一点。
- Spring Cloud Gateway(取代了 Zuul)性能高、可以用 Java 代码来写逻辑,适于学习。
Nginx 是比较推荐的全局网关,也称为接入层网关。Nginx 可以部署前端和后端,还能提供文件访问服务等多种功能,非常灵活。我们甚至可以在 Nginx 中编写业务逻辑,但是并不推荐这样做,因为它并不像 Spring Cloud Gateway 那样方便。
网关的技术选型可以参考文章:网关的技术选型