前言
实践前后端分离的开发模式已经有两年左右的时间了,对于前后端分离开发模式的概念在这里不做过多解释,本文主要是总结开发模式并构建一个较为成熟的前后端分离应用
技术选型
关于技术选型方面线下国内比较流行的主要是SpringBoot+Vuejs这个技术栈,所以本文将基于这个技术栈来讲解,涉及到的技术主要有
- 环境
- Java
- Maven
- Nodejs
- Nginx
- 前端
- vue-cli
- 后端
- SpringBoot
环境准备
这里简要引用Windows下的环境搭建,关于Linux(Centos7)的环境搭建会再部署架构中讲到
- Java : JDK开发环境搭建及环境变量配置
- Maven :Maven开发环境搭建
- Nodejs :NodeJS、NPM安装配置与测试步骤(windows版本)
- Nginx :windows下nginx的安装及使用
构建前后端分离工程
目录规划
整体目录主要分为三块,如下所示
打包后的目录主要分为三块,如下所示
后端工程
后端工程主要基于SpringBoot脚手架搭建,SpringBoot基础的集成环境搭建可以参考我的另一篇博客SpringBoot集成环境搭建
首先创建一个只有Web功能的SpringBoot项目,修改其maven打包的配置实现以下两个功能
- 将打包的jar文件移动至dist目录下
- 将多环境配置文件从jar内部移动至外部的dist/config目录下
此项修改主要依赖于以下两个maven插件
详细的插件配置如下,在server/pom.xml的plugins标签下添加如下代码<!--复制配置文件-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/../dist/config</outputDirectory>
<overwrite>true</overwrite>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<!--移动并重命名jar包-->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<move file="${project.basedir}/target/${project.artifactId}-${project.version}.${project.packaging}" tofile="${project.basedir}/../dist/${project.artifactId}-${project.version}.${project.packaging}" />
</target>
</configuration>
</execution>
</executions>
</plugin>
进入到server/pom.xml同级目录,执行mvn clean package指令,打包成功会在dist目录下生成编译后的jar文件,dist/config目录下生成项目的配置文件
前端工程
前端工程主要基于vue-cli脚手架创建,vue项目的环境搭建可以参照vue-用Vue-cli从零开始搭建一个Vue项目
现在创建一个基础的vue项目,修改config/index.js配置以实现打包的静态资源生成至dist/html目录
进入到front/package.json同级目录,执行npm run build指令,打包成功会在dist/html目录生成静态文件
集成测试
来个接口
编写一个获取用户信息的接口
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
/**
* 获取当前登录用户的个人信息
*
* @return 当前登录用户的个人信息
*/
"/user/me") (
public Map<String, Object> me() {
Map<String, Object> result = new HashMap<>();
result.put("username", "admin");
result.put("roles", Arrays.asList("admin", "normal", "none"));
result.put("depts", Arrays.asList("办公室", "组织部"));
result.put("menus", Arrays.asList("工作台", "系统管理"));
return result;
}
}
配置代理
配置以下前端工程的代理转发,用于解决开发环境接口调试的跨域问题
写个页面
写个前端页面测试后端接口,进入front/package.json同级目录执行npm i axios -s,修改HelloWord.vue组件为如下代码
<template> |
进入测试链接http://localost:8081
单点部署
nginx配置
分离部署主要依赖于nginx来完成,利用nginx来分发前后端的内容,nginx的配置如下
#user root;# linux下必须有此配置 不然会导致403权限不足
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
error_log logs/error.log error;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
set $application_path C:/workspace/java/server-front-separate;# 这里的父级路径需要根据项目路径设置
location /api {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
alias $application_path/dist/html/;
try_files $uri $uri/ /index.html last;# 解决页面刷新404问题
index index.html index.htm;
}
}
}
打包前后端应用
- 前端应用: 进入front/package.json同级目录,执行npm run build指令
- 后端应用: 进入server/pom.xml同级目录,执行mvn clean package指令
编写快速启动脚本(支持多环境)
- linux下启动脚本start.sh
|
- windows下启动脚本start.bat
@echo off |
- linux下关闭脚本stop.sh
|
- windows下关闭脚本stop.bat
@echo off |
启动nginx以及后端服务
- windwos
- 运行nginx.exe
- 运行dist/bin/start.bat
- linux
- nginx -s start
- dist/bin/start.sh prod