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