08.2 — 网关与配置中心
核心: Spring Cloud Gateway 路由与过滤器、Nacos Config 动态刷新 面试高频度: ⭐⭐⭐⭐
← 返回 **返回 Spring Cloud 索引**
3. 网关 — Spring Cloud Gateway
路由配置
yaml
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service # 负载均衡
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1 # 去除前缀
- name: RequestRateLimiter # 限流
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 100
redis-rate-limiter.burstCapacity: 200
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- StripPrefix=1
- name: CircuitBreaker # 熔断
args:
name: orderService
fallbackUri: forward:/fallback/orders网关过滤器
java
// 自定义全局过滤器
@Component
@Slf4j
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 白名单路径跳过
String path = request.getURI().getPath();
if (path.contains("/auth/login") || path.contains("/auth/register")) {
return chain.filter(exchange);
}
// 校验 Token
String token = request.getHeaders().getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 将用户信息传递给下游服务
String userId = parseUserId(token);
exchange.getRequest().mutate()
.header("X-User-Id", userId)
.build();
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -100; // 高优先级
}
}4. 配置中心 — Nacos Config
yaml
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
file-extension: yaml # 配置文件格式
refresh-enabled: true # 支持动态刷新java
@RestController
@RefreshScope // 动态刷新配置
public class ConfigController {
@Value("${app.config.version:unknown}")
private String version;
@GetMapping("/config")
public String getConfig() {
return "Version: " + version;
}
}Nacos 配置管理优势
| 特性 | 说明 |
|---|---|
| 动态刷新 | 配置变更实时生效,无需重启 |
| 命名空间 | 环境隔离(dev/test/prod) |
| 分组管理 | 按业务领域分组配置 |
| 版本回滚 | 支持配置历史版本和回滚 |
| 监听器 | 配置变更回调通知 |
| 权限控制 | RBAC 权限管理 |
核心面试题
- Spring Cloud Gateway 的工作原理?和 Zuul 有什么区别?
- 配置中心的动态刷新原理(@RefreshScope)?