nginx部署前端工程替代方案gateway
有市场要求部署的前端vue工程不使用nginx中间件。想弄国产替代的东方通之类的,公司没有购买该产品,我参考了网上的一些java网关框架,springcloud组件:gateway实现代替。
- 注意后台都是用java编写的,因此也使用java实现前端静态文件的部署。
- 至于市场为什么要替换nginx?客户可能有他们的考量,比如预计5万亿元的设备更新款。我们提供解决方案即可。
转自:https://lingkang.top/archives/nginx-bu-shu-qian-duan-gong-cheng-ti-dai-fang-an-gateway
依赖
创建一个Maven项目 frontend-gateway
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.18.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>top.lingkang</groupId>
    <artifactId>frontend-gateway</artifactId>
    <version>1.0.0</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--Spring Cloud Gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.1.5.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>central</id>
            <name>huaweicloud</name>
            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
            <layout>default</layout>
            <!-- 是否开启发布版构件下载 -->
            <releases>
                <enabled>true</enabled>
            </releases>
            <!-- 是否开启快照版构件下载 -->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>
为什么使用springboot低版本?
 公司产品是基于jdk8、springboot2.1.x的
编写配置 application.yml
server:
  port: 8080
# 配置 dist,其中 C:\Users\Administrator\Desktop\temp\dist\index.xml 索引文件
dist:
  path: C:\Users\Administrator\Desktop\temp\dist
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods:
              - GET
              - POST
              - PUT
              - DELETE
      routes:
        - id: auth
          uri: http://10.8.6.125/auth-center
          predicates:
            # 匹配路径转发
            - Path=/auth-center/**
        - id: pro
          uri: http://10.8.6.125/pro
          predicates:
            # 匹配路径转发
            - Path=/pro/**
配置
启动类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @author lingkang
 * @create by 2024/3/7 16:25
 */
@SpringBootApplication
public class FrontendGatewayApplication implements ApplicationRunner {
    private static final Logger log = LoggerFactory.getLogger(FrontendGatewayApplication.class);
    @Value("${server.port:8080}")
    private String port;
    public static void main(String[] args) {
        SpringApplication.run(FrontendGatewayApplication.class, args);
    }
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("启动完成, access to http://localhost:{}", port);
    }
}
配置类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import org.springframework.web.reactive.config.ResourceHandlerRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import java.io.File;
/**
 * @author lingkang
 * @create by 2024/3/7 16:29
 */
@Configuration
public class AppConfig implements WebFluxConfigurer {
    private static final Logger log = LoggerFactory.getLogger(AppConfig.class);
    @Value("${dist.path}")
    private String path;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if (StringUtils.isEmpty(path))
            throw new RuntimeException("dist目录路径配置不能为空: dist.path, 请在application.yml中配置");
        if (!path.endsWith("/") && !path.endsWith("\\\\")) {
            path += File.separator;
        }
        log.info("dist目录路径: {}", path);
        registry.addResourceHandler("/**").addResourceLocations("file:" + path);
    }
}
重定向类
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.reactive.result.view.Rendering;
/**
 * @author lingkang
 * @create by 2024/3/7 16:30
 */
@Controller
public class WebController {
    @GetMapping("/")
    public Rendering index() {
        return Rendering.redirectTo("/index.html").build();
    }
}
启动访问
http://localhost:8080

登录后能正常访问产品

生产部署
将frontend-gateway-1.0.0.jar与application.yml 配置文件放于同一目录
Window下执行启动命令:
java -jar -Dspring.config.location=application.yml frontend-gateway-1.0.0.jar
Linux下执行:
nohup java -jar -Dspring.config.location=application.yml frontend-gateway-1.0.0.jar > nohup.out 2>&1 & 



















