以下是关于 Spring Boot + Vue 前后端开发的打包、测试、监控、预先编译和容器部署 的详细说明,涵盖从开发到生产部署的全流程:
1. 打包
1.1 后端(Spring Boot)
打包方式
使用 Maven 或 Gradle 打包成可执行的 JAR/WAR 文件:
<!-- pom.xml 配置 Spring Boot Maven 插件 -->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
执行命令:
mvn clean package # 生成 target/*.jar 文件
Docker 包装
创建 Dockerfile
:
# 使用官方 JDK 基础镜像
FROM openjdk:8-jdk-alpine
# 复制构建好的 JAR 包
COPY target/*.jar app.jar
# 暴露端口
EXPOSE 8080
# 运行命令
ENTRYPOINT ["java", "-jar", "app.jar"]
1.2 前端(Vue)
打包配置
使用 Vue CLI 的 build
命令生成静态资源:
npm run build # 生成 dist/ 目录
Vue 配置示例(vue.config.js)
module.exports = {// 指定输出目录outputDir: 'dist',// 静态资源公共路径(用于部署到子路径)publicPath: process.env.NODE_ENV === 'production' ? '/vue/' : '/',// 配置代理解决开发环境跨域devServer: {proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,pathRewrite: { '^/api': '' }}}}
};
2. 测试
2.1 后端测试
单元测试(JUnit + Mockito)
@SpringBootTest
class UserControllerTest {@Autowiredprivate UserController userController;@MockBeanprivate UserService userService;@Testvoid testGetUser() {// 模拟 UserService 的返回值when(userService.getUser(1L)).thenReturn(new User(1L, "John"));// 调用 Controller 方法ResponseEntity<User> response = userController.getUser(1L);// 断言结果assertEquals("John", response.getBody().getName());}
}
集成测试(SpringBootTest)
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ApplicationTests {@Autowiredprivate TestRestTemplate restTemplate;@Testpublic void testHealthCheck() {ResponseEntity<String> response = restTemplate.getForEntity("/health", String.class);assertEquals(200, response.getStatusCodeValue());}
}
性能测试(JMeter)
- 使用 JMeter 脚本模拟高并发请求,测试接口响应时间。
- 配置线程组、HTTP 请求、断言和监听器(如聚合报告)。
2.2 前端测试
单元测试(Jest)
// user.test.js
import { getUser } from './user';test('getUser should return user data', () => {expect(getUser(1)).toEqual({ id: 1, name: 'Alice' });
});
E2E 测试(Cypress)
// cypress/integration/example_spec.js
describe('访问首页', () => {it('加载首页并验证标题', () => {cy.visit('/');cy.get('h1').contains('欢迎来到 Vue 应用');});
});
静态代码分析(ESLint)
在 package.json
中配置:
{"eslintConfig": {"extends": ["plugin:vue/vue3-essential","eslint:recommended"]}
}
3. 监控
3.1 后端监控
Spring Boot Actuator
-
依赖配置:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
配置
application.yml
:management:endpoints:web:exposure:include: "health,info,metrics"
-
常用端点:
/actuator/health
:健康检查。/actuator/metrics
:性能指标(如内存、CPU、HTTP 请求耗时)。
Prometheus + Grafana
-
集成 Prometheus:
添加依赖:<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId> </dependency>
访问
/actuator/prometheus
获取指标数据。 -
Grafana 配置:通过 Prometheus 数据源创建仪表盘。
日志监控(ELK Stack)
- 日志配置(Logback):
<configuration><appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>localhost:4560</destination></appender><root level="INFO"><appender-ref ref="LOGSTASH" /></root> </configuration>
3.2 前端监控
错误跟踪(Sentry)
- Vue 插件配置:
import * as Sentry from '@sentry/vue';Sentry.init({dsn: 'https://your-dsn@o123.ingest.sentry.io/456',integrations: [new Sentry.BrowserTracing(),new Sentry.Vue({ Vue })], });
性能监控(APM)
- 使用 New Relic 或 Datadog 的前端 SDK 监控页面加载时间、API 响应时间。
4. 预先编译
4.1 后端预编译
-
Maven 编译阶段:
mvn compile # 仅编译 Java 代码
-
构建缓存:利用 Maven 的
~/.m2/repository
缓存依赖,减少重复下载。
4.2 前端预编译
Webpack 配置优化
-
代码分割(Code Splitting):
// vue.config.js chainWebpack(config) {config.optimization.splitChunks({chunks: 'all',minSize: 30000,minChunks: 1,maxAsyncRequests: 5,maxInitialRequests: 3,automaticNameDelimiter: '~',name: true,cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/,priority: -10},default: {minChunks: 2,priority: -20,reuseExistingChunk: true}}}); }
-
Tree Shaking:通过 ES6 模块化自动删除未使用的代码。
-
环境变量管理:
# .env.development VUE_APP_API_URL=http://localhost:8080/api
5. 容器部署
5.1 Docker 部署
Dockerfile(后端)
# 基础镜像
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 复制构建好的 JAR 包
COPY target/*.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动命令
CMD ["java", "-jar", "app.jar"]
Dockerfile(前端)
# 使用 Nginx 作为静态资源服务器
FROM nginx:alpine
# 复制 Vue 打包后的 dist 目录到 Nginx 默认目录
COPY dist/ /usr/share/nginx/html/
# 暴露端口
EXPOSE 80
Docker Compose(多服务部署)
version: '3'
services:backend:build: ./spring-bootports:- "8080:8080"environment:SPRING_PROFILES_ACTIVE: prodfrontend:build: ./vueports:- "80:80"
5.2 Kubernetes 部署
部署 YAML 文件
# 后端 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-boot-deploy
spec:replicas: 3selector:matchLabels:app: spring-boottemplate:metadata:labels:app: spring-bootspec:containers:- name: spring-bootimage: your-registry/spring-boot:latestports:- containerPort: 8080
---
# 前端 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: vue-deploy
spec:replicas: 2selector:matchLabels:app: vuetemplate:metadata:labels:app: vuespec:containers:- name: vueimage: your-registry/vue:latestports:- containerPort: 80
---
# 服务(Service)
apiVersion: v1
kind: Service
metadata:name: spring-boot-service
spec:selector:app: spring-bootports:- protocol: TCPport: 8080targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: vue-service
spec:selector:app: vueports:- protocol: TCPport: 80targetPort: 80
---
# Ingress(路由配置)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-service
spec:rules:- http:paths:- path: /pathType: Prefixbackend:service:name: vue-serviceport:number: 80- path: /apipathType: Prefixbackend:service:name: spring-boot-serviceport:number: 8080
5.3 CI/CD 流水线(GitHub Actions)
示例工作流(.github/workflows/ci-cd.yml)
name: CI/CD Pipelineon:push:branches: [ main ]jobs:build-backend:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up JDK 11uses: actions/setup-java@v2with:java-version: '11'distribution: 'adopt'- name: Build with Mavenrun: mvn clean package -DskipTestsbuild-frontend:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Install Node.jsuses: actions/setup-node@v3with:node-version: '16'- name: Install dependenciesrun: npm install- name: Build Vuerun: npm run builddeploy:needs: [build-backend, build-frontend]runs-on: ubuntu-lateststeps:- name: Push Docker Imagesuses: docker/build-push-action@v3with:context: ./spring-bootpush: truetags: registry.example.com/spring-boot:latestenv:REGISTRY_USER: ${{ secrets.REGISTRY_USER }}REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}- name: Deploy to Kubernetesrun: |kubectl apply -f k8s/deployment.yamlkubectl rollout status deployment/spring-boot-deploykubectl apply -f k8s/frontend-deployment.yamlkubectl rollout status deployment/vue-deploy
6. 总结
- 打包:后端用 Maven/Gradle,前端用 Vue CLI,生成可部署的 JAR 和静态资源。
- 测试:后端用 JUnit + Mock,前端用 Jest + Cypress。
- 监控:后端用 Actuator + Prometheus/Grafana,前端用 Sentry + APM。
- 编译优化:代码分割、Tree Shaking、环境变量管理。
- 部署:Docker 包装 + Kubernetes 部署,结合 CI/CD 实现自动化流水线。
通过以上步骤,可以高效地完成前后端分离应用的开发、测试、监控和部署。