三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Spring Cloud Gateway 网关——路由、过滤器、限流

Spring Cloud Gateway 网关——路由、过滤器、限流

一、为什么需要网关

没有网关:客户端直接调用各个微服务,混乱且不安全 有网关:统一入口,做路由、鉴权、限流、日志 客户端 → Gateway → 订单服务/库存服务/用户服务

二、引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

三、配置路由

server:port:8080spring:cloud:gateway:routes:-id:order-serviceuri:lb://order-servicepredicates:-Path=/api/order/**filters:-StripPrefix=1-id:stock-serviceuri:lb://stock-servicepredicates:-Path=/api/stock/**

四、全局过滤器(鉴权)

@ComponentpublicclassAuthGlobalFilterimplementsGlobalFilter,Ordered{@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpRequestrequest=exchange.getRequest();// 放行登录接口Stringpath=request.getURI().getPath();if(path.contains("/auth/login")){returnchain.filter(exchange);}// 校验 TokenStringtoken=request.getHeaders().getFirst("Authorization");if(token==null||!jwtUtil.validateToken(token)){returnunauthorized(exchange);}returnchain.filter(exchange);}privateMono<Void>unauthorized(ServerWebExchangeexchange){exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);returnexchange.getResponse().setComplete();}@OverridepublicintgetOrder(){return-100;}}

五、限流过滤器

@ComponentpublicclassRateLimitFilterimplementsGlobalFilter{@AutowiredprivateStringRedisTemplateredisTemplate;@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){Stringip=exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();Stringkey="rate:"+ip;Longcount=redisTemplate.opsForValue().increment(key);if(count==1){redisTemplate.expire(key,10,TimeUnit.SECONDS);}if(count>10){returntooManyRequests(exchange);}returnchain.filter(exchange);}}

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!

← 返回列表