面试题答案
一键面试利用Spring Cloud Gateway智能路由功能进行请求分流处理
- 设计思路
- 请求分类识别:根据请求的特征,如请求路径、请求方法、请求头信息等,对不同类型的请求(高并发读请求、低频率写请求等)进行识别。
- 服务实例映射:针对不同类型的请求,将其映射到合适的微服务实例。例如,将高并发读请求路由到专门处理读操作且配置了缓存的微服务实例,将低频率写请求路由到负责写操作的实例。
- 关键实现步骤
- 添加依赖:在Spring Cloud Gateway项目的
pom.xml
文件中添加相关依赖,确保Spring Cloud Gateway功能可用。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
- 配置路由规则:在
application.yml
文件中配置路由规则。
这里通过spring: cloud: gateway: routes: - id: read_request_route uri: lb://read - service - instance predicates: - Path=/api/read/** - Method=GET - id: write_request_route uri: lb://write - service - instance predicates: - Path=/api/write/** - Method=POST
Path
和Method
等谓词来识别不同类型的请求,并将其路由到对应的微服务实例(使用负载均衡lb
)。 - 添加依赖:在Spring Cloud Gateway项目的
在智能路由层面实现安全防护
- 防止恶意请求
- 设计思路:通过对请求进行合法性校验,如检查请求头、请求参数是否符合预期格式,过滤掉明显不符合规范的请求。
- 关键实现步骤:
- 自定义过滤器:创建一个自定义的
GatewayFilter
,在过滤器中对请求进行校验。
@Component public class RequestValidationFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); // 检查请求头 if (!request.getHeaders().containsKey("Authorization")) { return Mono.error(new RuntimeException("Missing Authorization header")); } // 检查请求参数 MultiValueMap<String, String> params = request.getQueryParams(); if (params.getFirst("param1") == null) { return Mono.error(new RuntimeException("Missing param1")); } return chain.filter(exchange); } }
- 配置过滤器:在
application.yml
中配置自定义过滤器。
spring: cloud: gateway: routes: - id: read_request_route uri: lb://read - service - instance predicates: - Path=/api/read/** - Method=GET filters: - RequestValidationFilter
- 自定义过滤器:创建一个自定义的
- 限流
- 设计思路:使用令牌桶算法或漏桶算法对请求进行限流,控制单位时间内允许通过的请求数量,防止高并发请求压垮系统。
- 关键实现步骤:
- 添加限流依赖:例如添加
spring - cloud - gateway - actuator
依赖来使用Spring Cloud Gateway提供的限流功能。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring - cloud - gateway - actuator</artifactId> </dependency>
- 配置限流规则:在
application.yml
中配置限流规则。
这里通过spring: cloud: gateway: routes: - id: read_request_route uri: lb://read - service - instance predicates: - Path=/api/read/** - Method=GET filters: - name: RequestRateLimiter args: key - resolver: "#{@userKeyResolver}" redis - rate - limiter.replenishRate: 10 redis - rate - limiter.burstCapacity: 20
redis - rate - limiter
配置了每秒补充10个令牌(replenishRate
),令牌桶最大容量为20个(burstCapacity
),key - resolver
指定了限流的键解析器,用于确定限流的维度(如根据IP地址、用户ID等)。 - 添加限流依赖:例如添加