网关与部署
约 680 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Spring Cloud › 实战项目:微服务电商系统
网关统一鉴权
@Component
@Order(-1)
public class AuthGlobalFilter implements GlobalFilter {
private static final List<String> WHITE_LIST = List.of(
"/api/users/login",
"/api/users/register",
"/api/products/search"
);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String path = exchange.getRequest().getURI().getPath();
// 白名单放行
if (isWhiteList(path)) {
return chain.filter(exchange);
}
// 检查 Token
String token = exchange.getRequest().getHeaders()
.getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
return unauthorized(exchange, "未登录");
}
// 验证 JWT
try {
String jwtToken = token.replace("Bearer ", "");
Claims claims = JwtUtil.parseToken(jwtToken);
String userId = String.valueOf(claims.get("userId"));
// 传递用户 ID 到下游
ServerHttpRequest mutated = exchange.getRequest().mutate()
.header("X-User-Id", userId)
.header("X-Username", String.valueOf(claims.get("username")))
.build();
return chain.filter(exchange.mutate().request(mutated).build());
} catch (Exception e) {
return unauthorized(exchange, "Token 无效或已过期");
}
}
}CORS 配置
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsWebFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOriginPatterns(List.of("*"));
config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
config.setAllowedHeaders(List.of("*"));
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source =
new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}Docker Compose 部署
# docker-compose.yml
services:
mysql:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
volumes:
- ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
- mysqldata:/var/lib/mysql
redis:
image: redis:7-alpine
ports:
- "6379:6379"
nacos:
image: nacos/nacos-server:v2.3.0
environment:
MODE: standalone
ports:
- "8848:8848"
- "9848:9848"
zipkin:
image: openzipkin/zipkin:latest
ports:
- "9411:9411"
sentinel:
image: bladex/sentinel-dashboard:1.8.8
ports:
- "8858:8858"
gateway:
build: ./shop-gateway
ports:
- "8080:8080"
depends_on: [nacos]
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
user-service:
build: ./shop-user
ports:
- "8081:8081"
depends_on: [nacos, mysql]
product-service:
build: ./shop-product
ports:
- "8082:8082"
depends_on: [nacos, mysql, redis]
order-service:
build: ./shop-order
ports:
- "8083:8083"
depends_on: [nacos, mysql, redis]
cart-service:
build: ./shop-cart
ports:
- "8084:8084"
depends_on: [nacos, redis]
volumes:
mysqldata:各服务 Dockerfile
# 通用 Dockerfile(以 user-service 为例)
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY target/shop-user-1.0.0.jar app.jar
EXPOSE 8081
ENV SPRING_PROFILES_ACTIVE=prod
ENTRYPOINT ["java", "-jar", "app.jar"]部署流程
# 1. 编译打包
mvn clean package -DskipTests
# 2. 启动中间件
docker compose up -d mysql redis nacos zipkin sentinel
# 3. 启动微服务
docker compose up -d gateway user-service product-service order-service cart-service
# 4. 验证
curl http://localhost:8080/api/users/register \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"123456"}'
curl http://localhost:8080/api/products/search?keyword=手机
# 5. 查看
# Nacos 控制台:http://localhost:8848/nacos
# Sentinel 控制台:http://localhost:8858
# Zipkin 控制台:http://localhost:9411生产部署清单
| 检查项 | 说明 |
|--------|------|
| Nacos 集群 | 至少 3 节点生产集群 |
| Sentinel 规则持久化 | 配置 Nacos 数据源,避免重启丢失 |
| 配置加密 | 数据库密码、JWT 密钥使用 Nacos 加密 |
| 日志采集 | 统一日志格式 + ELK 集中管理 |
| 资源限制 | Docker 容器的 `--memory` 和 `--cpus` |
| 监控告警 | Prometheus + Grafana 监控微服务指标 |
| CI/CD | GitHub Actions 自动化构建、镜像推送、部署 |
| 链路采样 | Micrometer Tracing 采样设为 0.1 |小结
- Gateway 统一认证 + Token 透传 + CORS 配置。
- Docker Compose 一键启动全部中间件和微服务,共 10 个容器。
- Nacos + Sentinel + Zipkin 形成完整的微服务治理体系。
- 持续集成:GitHub Actions 自动打包镜像并部署。
- 读者完成此项目后可独立上手 Spring Cloud 微服务开发。
上一节:订单与购物车服务
