网关简介
背景分析
我们知道,一个大型系统在设计时,经常会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢?客户端可以直接向微服务发送请求,每个微服务都有一个公开的URL,该URL可以直接映射到具体的微服务,如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的架构,会存在着诸多的问题,例如,客户端请求不同的微服务可能会增加客户端代码或配置的复杂性。还有就是每个服务,在调用时都需要独立认证。并且存在跨域请求,也在一定程度上提高了代码的复杂度。基于微服务架构中的设计及实现上的问题,为了在项目中简化前端的调用逻辑,同时也简化内部服务之间互相调用的复杂度,更好保护内部服务,提出了网关的概念。
网关概述
网关本质上要提供一个各种服务访问的入口,并提供服务接收并转发所有内外部的客户端调用,还有就是权限认证,限流控制等等。Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0 和 等技术开发的一个网关组件,它旨在为微服务架构提供一种简单有效的统一的 API入口,负责服务请求路由、组合及协议转换,并且基于 Filter 链的方式提供了权限认证,监控、限流等功能。
优点:
1.性能强劲:是第一代网关Zuul的1.6倍
2.功能强大:内置了很多实用的功能,例如转发 监控 限流等
3.设计优雅 容易扩展
缺点
- 依赖Netty(NIO并发处理强只不过要自己写)与WebFlux(Spring5.0),不是传统的Servlet编程模型(Spring MVC就是基于此模型实现),学习成本高。
- 需要Spring Boot 2.0及以上的版本,才支持
执行流程分析(重要)
根据官方的说明,其Gateway具体工作流程,如图所示:
小节面试分析?
网关层面是如何实现负载均衡的?(通过服务名去查找具体的服务实例)
网关层面是如何通过服务名查找服务实例的?(Ribbon)
你了解Ribbon中的哪些负载均衡算法?(轮询,权重,hash,……可通过IRule接口进行查看分析)
网关进行请求转发的流程是怎样,有哪些关键对象?(XxxHandlerMapping,Handler,。。。)
网关层面服务的映射方式怎样的?(谓词-path,…,服务名/服务实例)
网关层如何记录服务的映射?(通过map,并要考虑读写锁的应用)
核心知识点
API 网关(Gateway)诞生背景
市场主流微服务网关(Spring Cloud Gateway,zuul,…)
API Gateway实现服务的保护和转发(重点)
API Gateway层面的负载均衡实现(重点,lb://sca-provider)
API Gateway请求处理原理分析(重点:官方图,了解关键代码,执行过程)
API Gateway中常用谓词(predicate)对象及实践。
API Gateway中过滤器(Filter)的类型及实践。
API Gateway中基于sentinel实现服务限流(API,路由id)。
API Gateway中基于自定义限流结果的处理(GatewayCallbackManager)。
常见问题分析
为什么要使用api网关?(服务保护,统一url访问,统一身份认证,统一跨域设计,。。。)
网关入门实践的步骤? (依赖,配置,启动,服务访问)
网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)
说说SpringCloud gateway处理请求的基本流程?(官方,断点)
网关中的谓词对象类型?(GatewayPredicate)
网关中的谓词对象是如何创建的?(谓词工厂)
你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)
网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动配置)
我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)
网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,配置,JVM参数)
网关层面的限流类型有哪些?(路由id,API分组)
我们是否可以对限流结果进行自定义处理?(可以,了解)