diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..6bedd36
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,3 @@
+FROM openjdk:8-jdk-alpine
+COPY target/sczx-gateway.jar app.jar
+ENTRYPOINT ["java", "-jar", "-Xms256m", "-Xmx512m", "app.jar"]
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..13f563c
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,77 @@
+pipeline {
+ agent any
+ tools {
+ maven 'M3'
+ }
+ environment {
+ APP_NAME = "sczx-gateway"
+ DOCKER_IMAGE = "${APP_NAME}:latest"
+ CONTAINER_NAME = "${APP_NAME}-container"
+ }
+
+ stages {
+ stage('Checkout') {
+ steps {
+ echo "📦 正在拉取代码..."
+ git branch: 'main', url: '你的 Git 仓库地址'
+ }
+ }
+
+ stage('Build with Maven') {
+ steps {
+ echo "🛠️ 正在使用 Maven 构建..."
+ sh 'mvn clean package -s settings.xml'
+ }
+ }
+
+ stage('Check Jar File') {
+ steps {
+ sh 'ls -la target/' // 确保 jar 文件存在
+ }
+ }
+
+ stage('Build Docker Image') {
+ steps {
+ echo "🐋 正在构建 Docker 镜像..."
+ sh """
+ docker build -t \${DOCKER_IMAGE} .
+ """
+ }
+ }
+
+ stage('Stop Old Container') {
+ steps {
+ echo "🛑 正在停止旧容器..."
+ sh '''
+ if [ "$(docker ps -f 'name=sczx-gateway-container' --format '{{.Status}}')" ]; then
+ docker stop sczx-gateway-container
+ docker rm sczx-gateway-container
+ fi
+ '''
+ }
+ }
+
+ stage('Run New Container') {
+ steps {
+ echo "🟢 正在运行新容器..."
+ sh """
+ docker run -d \
+ --name \${CONTAINER_NAME} \
+ -p 8089:8089 \
+ -e JAVA_OPTS="-Xms256m -Xmx512m -Duser.timezone=Asia/Shanghai" \
+ --restart always \
+ \${DOCKER_IMAGE}
+ """
+ }
+ }
+ }
+
+ post {
+ success {
+ echo "🎉 构建成功!网关已部署到 Docker 容器中。"
+ }
+ failure {
+ echo "❌ 构建失败,请检查日志!"
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..8d36030
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,156 @@
+
+
+ 4.0.0
+
+ com.sczx
+ sczx-gateway
+ 1.0.0
+ jar
+
+ sczx-gateway
+ 统一 API 网关服务
+
+
+ 1.8
+ 2.3.12.RELEASE
+ Hoxton.SR12
+ 2.2.9.RELEASE
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.12.RELEASE
+
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring-cloud-alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis-reactive
+
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+ provided
+
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ 1.6.14
+
+
+
+
+
+ sczx-gateway
+
+
+ src/main/resources
+
+ *.yml
+
+ true
+
+
+ src/main/resources
+
+ *.yml
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${java.version}
+ ${java.version}
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
diff --git a/settings.xml b/settings.xml
new file mode 100644
index 0000000..06004f8
--- /dev/null
+++ b/settings.xml
@@ -0,0 +1,12 @@
+
+
+
+ aliyun-maven
+ *
+ Aliyun Maven
+ https://maven.aliyun.com/repository/public
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/sczx/gateway/GatewayApplication.java b/src/main/java/com/sczx/gateway/GatewayApplication.java
new file mode 100644
index 0000000..f2f47b1
--- /dev/null
+++ b/src/main/java/com/sczx/gateway/GatewayApplication.java
@@ -0,0 +1,11 @@
+package com.sczx.gateway;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+}
diff --git a/src/main/java/com/sczx/gateway/filter/AuthGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/AuthGlobalFilter.java
new file mode 100644
index 0000000..0066e1b
--- /dev/null
+++ b/src/main/java/com/sczx/gateway/filter/AuthGlobalFilter.java
@@ -0,0 +1,35 @@
+package com.sczx.gateway.filter;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+@Component
+@Slf4j
+public class AuthGlobalFilter implements GlobalFilter, Ordered {
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ String path = exchange.getRequest().getPath().value();
+ log.info("🌐 请求路径: {}", path);
+
+ // 示例:拦截所有请求,校验 token
+// String token = exchange.getRequest().getHeaders().getFirst("Authorization");
+// if (token == null || !token.startsWith("Bearer ")) {
+// exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
+// return exchange.getResponse().setComplete();
+// }
+
+ return chain.filter(exchange);
+ }
+
+ @Override
+ public int getOrder() {
+ return 0; // 执行顺序
+ }
+}
diff --git a/src/main/java/com/sczx/gateway/filter/CorsGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/CorsGlobalFilter.java
new file mode 100644
index 0000000..0f8ada4
--- /dev/null
+++ b/src/main/java/com/sczx/gateway/filter/CorsGlobalFilter.java
@@ -0,0 +1,34 @@
+package com.sczx.gateway.filter;
+
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+@Configuration
+public class CorsGlobalFilter implements GlobalFilter {
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ HttpHeaders headers = exchange.getRequest().getHeaders();
+ // 判断是否为跨域请求
+ if (headers.containsKey("Origin")) {
+ HttpHeaders responseHeaders = exchange.getResponse().getHeaders();
+ responseHeaders.add("Access-Control-Allow-Origin", "*");
+ responseHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+ responseHeaders.add("Access-Control-Allow-Headers", "*");
+ responseHeaders.add("Access-Control-Allow-Credentials", "true");
+ responseHeaders.add("Access-Control-Max-Age", "3600");
+ responseHeaders.add("Access-Control-Expose-Headers", "*");
+ }
+ // 如果是 OPTIONS 预检请求,直接返回 200
+ if ("OPTIONS".equalsIgnoreCase(exchange.getRequest().getMethodValue())) {
+ exchange.getResponse().setStatusCode(HttpStatus.OK);
+ return exchange.getResponse().setComplete();
+ }
+ return chain.filter(exchange);
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..7db2f66
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,36 @@
+server:
+ port: 8089
+ shutdown: graceful # 启用优雅停机
+
+spring:
+ application:
+ name: sczx-gateway
+ cloud:
+ gateway:
+ discovery:
+ locator:
+ enabled: true # 开启从注册中心动态获取路由
+ lower-case-service-id: true # 服务名转小写
+ routes:
+ - id: user-service
+ uri: lb://sczx-app
+ predicates:
+ - Path=/zc/app/**
+ filters:
+ - StripPrefix=1
+ nacos:
+ discovery:
+ server-addr: 115.190.8.52:8848 # Nacos 地址
+ group: DEFAULT_GROUP
+ metadata:
+ version: 1.0.0
+ env: dev
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+ endpoint:
+ health:
+ show-details: always
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..e594345
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+ ${PATTERN}
+
+
+
+
+
+ ${LOG_FILE_PATH}/${hostname}/info.%d{yyyy-MM-dd}.log
+ 31
+
+
+
+ ${PATTERN}
+
+
+
+ WARN
+ DENY
+ NEUTRAL
+
+
+ ERROR
+ DENY
+ NEUTRAL
+
+
+
+
+
+ WARN
+
+ ${LOG_FILE_PATH}/${hostname}/warn.log
+ true
+
+ ${PATTERN}
+
+
+
+
+
+
+
+
+
\ No newline at end of file