在微服务架构中,网关(Gateway)扮演着“守门人”的角色。它不仅是前后端交互的唯一入口,还承担着路由、过滤、负载均衡、安全控制等多种职责。对于一个微服务系统来说,网关的设计和实现直接决定了系统的性能、安全性和可扩展性。
我深知网关是大厂面试中的高频考点。无论是 BAT 还是其他一线互联网公司,面试官总会围绕网关的设计与实现提出一系列问题。例如:
本文将结合实战场景,手把手教你如何设计一个高性能、高可用的网关,并通过代码示例解析大厂面试中的常见问题。
在 pom.xml
中引入 Spring Cloud Gateway 的依赖:
org.springframework.cloud
spring-cloud-starter-gateway
在 application.yml
中配置网关的基本路由规则:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
Spring Cloud Gateway 的过滤器链是其核心功能之一。我们可以根据需求自定义过滤器,例如实现鉴权功能:
@Component
public class AuthFilter implements GlobalFilter {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !isValidToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().send();
}
return chain.filter(exchange);
}
private boolean isValidToken(String token) {
// 实际项目中可以调用鉴权服务验证 token
return true;
}
}
灰度发布是微服务系统中常用的一种发布策略。通过网关的路由规则,我们可以轻松实现灰度发布。
debug
标记)动态调整路由规则。RouteLocator
动态注册路由。@Component
public class DynamicRouteLocator implements RouteLocator {
@Autowired
private IUserService userService;
@Override
public Flux getRoutes() {
return Flux.fromIterable(() -> {
List routes = new ArrayList<>();
// 根据用户角色动态生成路由规则
userService.getUsers().forEach(user -> {
if (user.getRole().equals("ADMIN")) {
routes.add(new Route.Builder()
.id("admin-route")
.uri("lb://admin-service")
.predicate(new PathPredicate("/api/admin/**"))
.build());
}
});
return routes;
});
}
}
限流和熔断是保障系统稳定性的关键措施。Spring Cloud Gateway 结合 Sentinel 或 Resilience4j 可以轻松实现这一功能。
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user-service", r -> r.path("/api/user/**")
.filters(f -> f.requestRateLimiter(config -> config.setRateLimiter(new RedisRateLimiter())))
.uri("lb://user-service"))
.build();
}
}
安全认证是网关的另一大核心功能。我们可以结合 JWT 和 OAuth2 实现统一的认证机制。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
通过本文的实战演练,相信你已经对 Spring Cloud 网关的核心功能、常见面试场景以及优化技巧有了全面的了解。网关的设计不仅需要扎实的技术功底,还需要对业务场景有深刻的理解。
如果你觉得这篇文章对你有所帮助,欢迎关注我的技术博客或加入我的学习社群(在评论区留言或私信我),在这里你可以获取更多 Spring Cloud 微服务相关的学习资料和实战经验分享!让我们一起在微服务的世界里不断成长!