欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列笔记和编程高频电子书!

在我后台回复「面试」可领取硬核面试笔记!

网关面试实战


技术选型方面

这一块的话,主要是考察对 网关技术 的了解,比如你使用了分布式系统,那你整个系统前肯定是有一个网关的

那你是如何去对网关进行技术选型的呢?这其实就是考察你对常见的几种网关是否熟悉,常用的几种网关以及优缺点如下:

  • Nginx:性能高,成熟,但是可扩展性不足,并且 Nginx 使用 c 编写,很难根据源码去进行定制化开发
  • Zuul:Zuul 有两个大的版本 Zuul1 和 Zuul2,是基于 Java 实现的,核心功能比较简单,如果需要一些灰度发布、限流、动态路由之类的功能,需要自己二次开发
  • Spring Cloud Gateway:目的就是为了替换 Zuul1,功能比较完善,性能相对于 Zuul1 来说好了很多
  • 自研网关:目前许多互联网都自研自己的网关,自研网关的好处就是可以根据自己业务特点提供一个定制化、高性能、可扩展的 API 网关解决方案,例如美团技术团队就自研了 Shepherd API 网关,可以参考文章:https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html

上边只是简单的提到了一些优缺点,如果你去面试,并且在简历中有较多的分布式相关的项目,一定要去对这些技术选型好好了解一下,不要对每个问题都只是知道个大概,再问就什么不知道了!



网关的核心功能:

那么如果系统中使用了网关,你是希望去使用它的什么功能呢?一定要了解网关的 应用场景,因为很可能讲完这个之后,会问你,让你自己设计一个网关,你会怎么设计呢?这不正是考察网关的功能以及对每个功能点如何进行设计的吗?

这里将网关的功能按照重要顺序列一下,重要的列在前边:

  • 动态路由:新上线某个服务,可以动态的将请求路径和服务的映射关系 热加载到网关 里去,服务增加或减少机器,网关也可以 自动感知到
  • 灰度发布:新功能正式上线之前,将新功能在少量机器上进行发布测试
  • 授权认证:对发送到网关的请求进行授权认证
  • 限流熔断
  • 性能监控:监控每个接口的 耗时成功率QPS
  • 系统日志:打印接口请求日志
  • 数据缓存

网关部署的机器配置:

这是属于网关系统在生产环境部署的内容了,这个之前在讲注册中心也讲过机器配置的问题,这里再啰嗦一下,多看看就记住了

常用的机器配置就是 4C8G、8C16G、16C32G、32C64G

那么像注册中心、网关系统,这种都是属于 基础架构类型的系统,一定要上配置高一点的机器,8C16G 以上的

网关系统部署在 8C16G 的机器上,每秒钟抗几千的请求是可以的

16C32G 的话,抗上万的请求也是没问题的

将机器配置和对应的请求量级大概可以对应起来就可以

并且网关系统一般是使用集群部署的,通过 Nginx 将请求再分散到多个网关系统上,可以抗更多请求,因为网关系统一般不会是整个系统的性能瓶颈

网关在整个系统中所处的地位如图所示:

网关面试实战_Nginx



网关中一些核心技术实现思路

可以去了解一下网关中核心技术是如何实现的,这里就以 动态路由灰度发布 来简单说一下实现思路

  • 动态路由

动态路由目的就是让 网关系统可以感知到服务上下线,你可以想一下学到的哪一个技术可以实现这个功能呢?

这个不就是 通知 功能吗?

那么直接通过 RocketMQ 就可以实现了,新服务上线,发送一个 MQ 通知,让网关系统去拉取最新的服务地址,如果机器下线,也可以发送 MQ 通知,让网关系统剔除掉这个服务即可


  • 灰度发布

这里说一下实现灰度发布的一个思路

首先,需要创建一张灰度发布表,包含字段如下:

id int(11) 
service_id varchar(255)
path varchar(255)
enable_gray_release int(11)

通过定时任务去查灰度发布表,存入 Map 中

再做一个灰度发布的 拦截器,比对请求路径是否启用灰度发布,如果启用灰度发布,就将流量转发到新部署的机器上去

这里将新版本的系统设置一个标志位,比如 ReleaseVersion,如果这个值为 NEW 的话,表示是新部署的系统,那么就可以根据这个标志位判断哪些机器上部署的系统是新版本了,将流量散发到这些新版本的机器上去

网关面试实战_Nginx_02