Commit 225ca035 authored by 康明's avatar 康明

Init

parents
File added
# 代码管理规范
开发新功能时,评估当前功能如果后期不使用会不会影响系统使用,如果关联性较强建议新建一个分支开发新功能
- 尽量划分小功能模块提交,便于找出问题模块的代码
- 迭代版本后,拉取最新的master代码进行下一阶段的dev开发
- 规范填写commit message,至少填写开发了什么模块,修复了什么bug
- 如有新的模块,记得补充README
## 撰写提交信息
提交commit时,必须给出完整扼要的提交信息,规范格式如下:
:::info
[Type]: subject
Type包括:
feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
build: 对项目构建或者依赖的改动
revert: feat(pencil): add 'graphiteWidth' option (撤销之前的commit)
:::
例:
:::info
[fix]: 修复新增楼栋无法关联项目
:::
# Java开发注意事项
# 一、异常
## 1. 六类典型空指针问题
- 包装类型的空指针问题
```java
public class NullPointTest {
public static void main(String[] args) throws InterruptedException {
System.out.println(testInteger(null));
}
private static Integer testInteger(Integer i) {
return i + 1; //包装类型,传参可能为null,直接计算,则会导致空指针问题
}
}
```
- 级联调用的空指针问题
```java
public class NullPointTest {
public static void main(String[] args) {
//fruitService.getAppleService() 可能为空,会导致空指针问题
fruitService.getAppleService().getWeight().equals("18");
}
}
```
- Equals方法左边的空指针问题
```java
public class NullPointTest {
public static void main(String[] args) {
String s = null;
if (s.equals("666")) { //s可能为空,会导致空指针问题
System.out.println("公众号:捡田螺的小男孩,666");
}
}
}
```
- ConcurrentHashMap 类似容器不支持 k-v为 null
```java
public class NullPointTest {
public static void main(String[] args) {
Map map = new ConcurrentHashMap<>();
String key = null;
String value = null;
map.put(key, value);
}
}
```
- 集合,数组直接获取元素
```java
public class NullPointTest {
public static void main(String[] args) {
int [] array=null;
List list = null;
System.out.println(array[0]); //空指针异常
System.out.println(list.get(0)); //空指针一场
}
}
```
- 对象直接获取属性
```java
public class NullPointTest {
public static void main(String[] args) {
User user=null;
System.out.println(user.getAge()); //空指针异常
}
}
```
## 2. 异常的几个坑
- **finally重新抛出的异常也要注意**
```java
public void wrong() {
try {
log.info("try");
//异常丢失
throw new RuntimeException("try");
} finally {
log.info("finally");
throw new RuntimeException("finally");
}
}
```
一个方法是不会出现两个异常的呢,所以finally的异常会把try的**异常覆盖**。正确的使用方式应该是,finally 代码块**负责自己的异常捕获和处理**
```java
public void right() {
try {
log.info("try");
throw new RuntimeException("try");
} finally {
log.info("finally");
try {
throw new RuntimeException("finally");
} catch (Exception ex) {
log.error("finally", ex);
}
}
}
```
# 二、Spring事务未生效
日常业务开发中,我们经常跟事务打交道,**事务失效**主要有以下几个场景:
- 底层数据库引擎不支持事务
- 在非public修饰的方法使用
- rollbackFor属性设置错误
- 本类方法直接调用
- 异常被try...catch吃了,导致事务失效。
其中,最容易踩的坑就是后面两个,**注解的事务方法给本类方法直接调用**,伪代码如下:
```java
public class TransactionTest{
public void A(){
//插入一条数据
//调用方法B (本地的类调用,事务失效了)
B();
}
@Transactional
public void B(){
//插入数据
}
}
```
如果用异常catch住,**那事务也是会失效呢**~,伪代码如下:
```java
@Transactional
public void method(){
try{
//插入一条数据
insertA();
//更改一条数据
updateB();
}catch(Exception e){
logger.error("异常被捕获了,那你的事务就失效咯",e);
}
}
```
# 三、数据访问
## 1. Mysql8数据库的时区坑
对mysql数据库进行升级,新版本为8.0.12。但是升级完之后,发现now()函数,获取到的时间比北京时间晚8小时,原来是因为mysql8默认为美国那边的时间,需要指定时区。
:::info
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8& **serverTimezone=Asia/Shanghai**
:::
## 2. 数据库使用utf-8存储, 插入表情异常的坑
低版本的MySQL支持的utf8编码,最大字符长度为 3字节,但是呢,存储表情需要4个字节,因此如果用utf8存储表情的话,会报SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column,所以一般用utf8mb4编码去存储表情。
# 四、待定
## 1. 疏忽switch的return和break
```java
public class SwitchTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("testSwitch结果是:"+testSwitch("1"));
}
private static String testSwitch(String key) {
switch (key) {
case "1":
System.out.println("1");
case "2":
System.out.println(2);
return "2";
case "3":
System.out.println("3");
default:
System.out.println("返回默认值");
return "4";
}
}
}
```
输出结果:
```java
1
2
testSwitch结果是:2
```
switch 是会**沿着case一直往下匹配的,直到遇到return或者break。** 所以,在写代码的时候留意一下,是不是你要的结果。
This diff is collapsed.
This diff is collapsed.
# Git仓库规范
*不允许将公司级项目创建在私人账号目录下,例如:zhangsan/mdm*
# 代码仓库创建
在GitLab上先按项目建组,组里根据实际情况(例如按前、后端)分别建立Project
- 创建项目组Group按系统的英文描述命名,中间如需分隔符,一律用“-”
- 创建项目按项目具体负责的模块命名,中间如需分隔符,一律用“-”
- 每个项目有自己10-100字的描述,用于说明这个仓库是做什么的。
- 仓库由仓库Owner(或GroupOwner)负责,权限也由其分配。
- 每个项目都需要README.md文件,用于描述这个仓库相关的一些信息。
- 除文档说明类型仓库,所有代码仓库都需要有.gitignore文件,根据项目种类不同设定
参考示例:[http://www.shxrtech.com:8081/example-group](http://www.shxrtech.com:8081/example-group)
# 代码评审规范
## 前言
**Code Review 目的**
- 保证代码可读性,一致性。
- 代码层面减少bug,最基本缺少控制判断、异常处理。
- 减少重复代码(新人很容易多个轮子),比如日期处理函数,common有。自己也写,utils有,service也有,导致多处重复。
- 知识共享**+**设计讨论。
# CR模板
[xxxx项目_代码检查报告_20220828.xls](https://www.yuque.com/attachments/yuque/0/2022/xls/240791/1661825366155-54348cf1-e443-4dba-8d7a-581b4f6d3941.xls?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2022%2Fxls%2F240791%2F1661825366155-54348cf1-e443-4dba-8d7a-581b4f6d3941.xls%22%2C%22name%22%3A%22xxxx%E9%A1%B9%E7%9B%AE_%E4%BB%A3%E7%A0%81%E6%A3%80%E6%9F%A5%E6%8A%A5%E5%91%8A_20220828.xls%22%2C%22size%22%3A59392%2C%22type%22%3A%22application%2Fvnd.ms-excel%22%2C%22ext%22%3A%22xls%22%2C%22source%22%3A%22%22%2C%22status%22%3A%22done%22%2C%22mode%22%3A%22title%22%2C%22download%22%3Atrue%2C%22taskId%22%3A%22u6f811eab-45a3-41b0-9e5a-d30cfe6c3e7%22%2C%22taskType%22%3A%22upload%22%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22iqKtN%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22file%22%7D)
# 分支管理规范
# 1. 发布主分支(master)
- 每个代码库有且仅有一个主分支 master。所有提供给用户使用的正式版本,都在这个主分支上发布。
- master 分支仅用于发布正式版本,同时需确保主分支的任何内容都是可部署的。并且只允许对 master 进行其他分支的合并和创建标记操作,不能单独在 master 分支上进行提交。
# 2.开发主分支(develop)
- develop 分支是进行开发的基础分支,其他的短特性分支是基于develop分支切分出来的,当开始一个新的功能分支时,它将是开发的基础。
- 新功能的开发分支会合并在develop分支中,等待被整合到 master 分支中。
# 3. 功能分支(feature)
- feature 分支为开发某个功能点而创建。
- 完成功能点的开发后,feature 分支的最新内容部署 test 环境进行功能测试验收。功能点测试完成后再合并入 develop分支,并删除 feature 分支。
# 4. 热修复分支(hotfix)
- 正式发布以后,出现 Bug 。这时就需要创建一个 hotfix分支 ,进行 Bug 热修复,hotfix是基于master分支进行切分的,完成会合并入master分支,再合并到develop分支。
- 分支的命名格式为hotfix-[新版本号码],例如hotfix-0.1.1。
- 漏洞修复后需要为hotfix 分支制作一个新的修订号版本标记。最后,根据实际情况可选的合并入 master 分支,再合并到develop分支,并删除 hotfix 分支。
**仓库中存在两种长期分支:master和develop。master中存放对外发布的版本,只有稳定的发布版本才会合并到master中。develop用于日常开发,存放最新的开发版本。**
**二种临时分支:feature,hotfix,仅仅只是临时存在的,根据需要来创建,此类分支完成了自己的任务之后就会被删除掉。**
# 分支命名规约
| 前缀 | 含义 |
| --- | --- |
| master | 主分支,可用的、稳定的、可直接发布的版本 |
| develop | 开发主分支,最新的代码分支 |
| feature-** | 功能开发分支 |
| hotfix-** | 已发布bug修复分支 |
## 版本号规范
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
1.主版本号:当你做了不兼容的 API 修改。
2.次版本号:当你做了向下兼容的功能性新增。
3.修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
# 环境管理规范
项目常用的几个环境:开发环境(DEV)、测试环境(TEST)、用户接受度测试环境(UAT)、生产环境(PROD)。根据各项目情况而定多数项目最少需要3个环境进行实际开发。
# DEV环境
开发人员或者开发团队的工作环境,可以根据开发的需求随时将变更更新在环境当中用于测试,可以是开发人员的本地环境,也可以是团队统一的环境,此环境必须与其他环境和资源严格隔离。
# TEST环境
该环境用于测试所有开发人员的代码进行整合之后运行环境,供测试人员使用。
# UAT环境
UAT环境主要是用来作为客户验证测试的环境。UAT环境应尽可能多地模拟生产环境,也可以兼作演示、培训用环境。
# PROD环境
即正式环境,主要用于生产使用。
[
](https://blog.csdn.net/zhengide/article/details/104616144)
# JDK安装手册
## Linux系统下安装方式
- **首先查看系统中是否已安装JDK**
:::info
[root@VM-12-6-centos software]# java -version
:::
显示如下:
:::info
openjdk version "1.8.0_102"
OpenJDK Runtime Environment(build 1.8.0_102-b14)
OpenJDK 64-Bit Server VM(build 25.102-b14, mixed mode)
:::
- **卸载已安装的**
首先检测安装包:
:::info
[root@VM-12-6-centos software]# rpm -qa | grep java
:::
显示如下:
:::info
java-1.7.0-openjdk-1.7.0.111-2.6.7.8.el7.x86_64
python-javapackages-3.4.1-11.el7.noarch
tzdata-java-2016g-2.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64
:::
卸载:
:::info
[root@VM-12-6-centos software]# rpm -e --nodeps tzdata-java-2016g-2.el7.noarch
[root@VM-12-6-centos software]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111- 2.6.7.8.el7.x86_64
[root@VM-12-6-centos software]# rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64
[root@VM-12-6-centos software]# rpm -e --nodeps java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
[root@VM-12-6-centos software]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64
:::
之后再次输入rpm -qa | grep java 查看卸载情况:
:::info
[root@VM-12-6-centos software]# rpm -qa | grep java
python-javapackages-3.4.1-11.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
:::
- **安装JDK**
首先到官网下载需要的JDK版本,也可以从[公司软件库](https://www.baidu.com)下载,在此省略此步骤
将jdk包上传到系统中指定的目录 **/opt/software**
创建JDK存放目录:
:::info
[root@VM-12-6-centos local]# mkdir /usr/local/java
:::
进入安装包目录:
:::info
[root@VM-12-6-centos local]# cd /opt/software
:::
解压jdk-8u161-linux-x64.tar.gz安装包到指定目录:
:::info
[root@VM-12-6-centos software]# tar -zxvf jdk-8u161-linux-x64.tar.gz -C /usr/local/java
:::
设置环境变量:
:::info
[root@VM-12-6-centos java]# vim /etc/profile
:::
在最后面添加:
:::info
export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
:::
记得保存噢! (1.使用vim编辑好文件后,按下esc键退出编辑状态; 2.输入冒号+wq字符,按下回车.)
执行profile文件:
:::info
[root@VM-12-6-centos java]# source /etc/profile
:::
这样可以使配置文件立即生效
- **检测JDK是否安装成功**
执行命令:
:::info
[root@VM-12-6-centos java]# java -version
:::
出现以下结果则JDK安装成功:
:::info
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
:::
至此,JDK安装结束。
# Nginx安装手册
## 安装包下载
[http://nginx.org/en/download.html](http://nginx.org/en/download.html)
- **安装Nginx**
1. 安装依赖:
:::info
[root@VM-12-6-centos software]# yum -y install gcc zlib zlib-devel pcre pcre-devel openssl openssl-devel make
:::
2. 解压安装包并切换到文件夹中:
:::info
[root@VM-12-6-centos software]# tar -zxvf /opt/software/nginx-1.22.0.tar.gz
[root@VM-12-6-centos software]# cd nginx-1.22.0
:::
3. 开始执行编译、安装(一并安装SSL模块):
:::info
[root@VM-12-6-centos nginx-1.22.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@VM-12-6-centos nginx-1.22.0]# make && make install
:::
4. 查看是否安装成功
:::info
[root@VM-12-6-centos nginx-1.22.0]# /usr/local/nginx/sbin
[root@VM-12-6-centos nginx-1.22.0]# ./nginx -V
:::
显示如下:
:::info
nginx version: nginx/1.22.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
:::
安装结束。
- **配置环境变量**
1. 查看 nginx 版本,此时会发现报 bash:nginx: 未找到命令,需要我们手动配置打开环境变量的文件
:::info
[root@VM-12-6-centos nginx-1.22.0]# nginx -v
:::
显示如下:
:::info
bash: nginx: command not found...
:::
2. 编辑环境变量文件:
:::info
[root@VM-12-6-centos nginx-1.22.0]# vim /etc/profile
:::
行末加上自己的nginx安装目录下sbin目录的地址:
```shell
.... #前面省略
export PATH=$PATH:/usr/local/nginx/sbin
```
3. 重新加载环境:
:::info
[root@VM-12-6-centos nginx-1.22.0]# source /etc/profile
:::
4. 再次查看 nginx 版本
:::info
[root@iZuf68wpeyqmolhdab3bh0Z software]# nginx -v
:::
显示如下:
:::info
nginx version: nginx/nginx-1.22.0
:::
- **开机启动配置**
1. 先创建开机自启脚本:
:::info
[root@VM-12-6-centos software]# cd /etc/systemd/system
[root@VM-12-6-centos system]# vim nginx.service
:::
2. 内容复制到 vim 中:
```shell
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
```
3. 服务命令:
:::info
**第一种方式启动**
**#启动nginx服****务**
cd /usr/local/nginx/sbin/
./nginx
**#查看运行状态**
ps aux | grep nginx
**#停止nginx服务**
./nginx –s stop
**#重启nginx服务**
./nginx –s reload
**#检查配置文件是否正确**
./nginx –t
**#查看nginx版本**
./nginx –v
**第二种基于配置开机启动模式启动**
**#设置开机自启动**
systemctl enable nginx
**#启动nginx服务**
systemctl start nginx.service
**#重新启动服务**
systemctl restart nginx.service
**#查看服务当前状态**
systemctl status nginx.service
**#停止开机自启动**
systemctl disable nginx.service
:::
4. 访问服务器IP
显示welcom to nginx 说明启动安装成功了,接下来可以通过编辑nginx.conf文件来进行项目的部署了。建议备份一下配置文件。
- **配置HTTPS**
证书可以自行到阿里云或者腾讯云申请免费的证书,并下载对应Nginx的证书
服务器 /usr/local/nginx/conf 下创建 cert 目录,并将证书放入该文件夹中
编辑Nginx配置文件:
:::info
[root@VM-12-6-centos software]# cd /usr/local/nginx/conf
[root@VM-12-6-centos conf]# vim nginx.conf
:::
在http代码块里添加如下配置:
```shell
server {
listen 80;
server_name xxx.com; #你的域名
rewrite ^(.*)$ https://$host$1 permanent; #把http的域名请求转成https
}
server {
listen 443;
server_name xxx.com;
ssl on;
ssl_certificate cert/xxxxxxxxxxxxxxx.pem; #证书文件路径
ssl_certificate_key cert/xxxxxxxxxxxxxxx.key; #证书文件路径
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!!
ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#配置根路径(根据自身需求进行配置)
location / {
proxy_pass http://127.0.0.1:8080;
}
#配置后台业务路径(根据自身需求进行配置)
location /portal {
alias /usr/local/app/webapps/portal/;
index index.html index.htm;
}
}
```
- **常用配置**
```shell
nginx对上传文件大小有要求,默认1m,如果很大,还要适当调整上传超时时间。
1. client_max_body_size
限制请求体的大小,若超过所设定的大小,返回413错误。
client_header_timeout
读取请求头的超时时间,若超过所设定的大小,返回408错误。
3. client_body_timeout
读取请求实体的超时时间,若超过所设定的大小,返回413错误。
proxy_connect_timeout
http请求无法立即被容器(tomcat, netty等)处理,被放在nginx的待处理池中等待被处理。此参数为等待的最长时间,默认为60秒,官方推荐最长不要超过75秒。
proxy_read_timeout
http请求被容器(tomcat, netty等)处理后,nginx会等待处理结果,也就是容器返回的response。此参数即为服务器响应时间,默认60秒。
proxy_send_timeout
http请求被服务器处理完后,把数据传返回给Nginx的用时,默认60秒。
```
# Redis安装手册
Redis约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版(如2.8版、3.0版),奇数版本是非稳定版(如2.7版、2.9版),生产环境下一般需要使用稳定版本。
# 安装依赖
redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装:
:::info
gcc -v
:::
如果没有安装则通过以下命令安装:
:::info
yum install -y gcc
:::
# 下载安装包
访问查看需要的版本:[http://download.redis.io/releases](http://download.redis.io/releases)
:::info
**#安装包统一存放到/opt/software目录下,没有则进入/opt目录执行创建mkdir software创建**
cd /opt/software
wget http://download.redis.io/releases/[redis-6.2.6.tar.gz](http://download.redis.io/releases/redis-6.2.6.tar.gz)
:::
如果提示wget找不到通过一下命令安装:
:::info
yum -y install wget
:::
# 解压安装包并安装
解压安装包
:::info
tar xzf redis-6.2.6.tar.gz -C /usr/local
:::
进入解压目录并编译
:::info
**#进入解压目录**
cd redis-6.2.6
**#编译**
make
**#指定安装目录并进行安装**
make install PREFIX=/usr/local/redis-6.2.6
:::
# 启动Redis服务
通过守护进程方式启动
:::info
**#修改redis.conf**
cd /usr/local/redis-6.2.6
vim redis.conf
**# 修改内容如下:**
daemonize 的值从 no 修改成 yes
**#使用ESC键,并输入**
:wq
:::
启动服务
:::info
cd /usr/local/redis-6.2.6/bin
./redis-server ../redis.conf
:::
查看进程来确定redis是否启动成功
:::info
ps -ef |grep redis
:::
关闭服务
:::info
cd /usr/local/redis-6.2.6/bin
/redis-cli shutdown
:::
# 项目部署手册
# 1. 目的
为了保证系统稳定性运行,严格管理、规范实施,制定本项目部署和版本发布规范。
# 2. 项目部署环境
## 2.1 Spring Boot 项目
### 2.1.1 部署路径目录
- app --资源总目录
- fatjar  --项目Jar包目录
- tool --项目启动脚本目录
- logs --日志目录
- backup --备份目录
- tmp --临时目录
### 2.1.2 启动脚本定义
Linux:
```shell
#!/bin/bash
FAT_JAR_DIR=../fatjar/
APP_NAME=check-service*
APP_PATH=$FAT_JAR_DIR$APP_NAME
PROFILES_ACTIVE=test
if [ "$2" ]; then
PROFILES_ACTIVE=$2
fi
PID=$(ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}')
case "$1" in
start)
if [ "$PID" ]; then
kill -9 "$PID"
echo kill $APP_NAME "$PID"
fi
java -jar $APP_PATH --spring.profiles.active="$PROFILES_ACTIVE" > /dev/null 2>&1 &
echo $APP_NAME is start at profiles "$PROFILES_ACTIVE"
;;
stop)
if [ -z "$PID" ]
then
echo $APP_NAME is already stopped
else
echo kill "$PID"
kill -9 "$PID"
echo $APP_NAME is stopped
fi
;;
status)
if [ -z "$PID" ]
then
echo $APP_NAME is already stopped
else
echo $APP_NAME is running
fi
;;
*)
echo "useing generator-boot.sh (start|stop|status)"
esac
```
:::info
**修改脚本参数参数:**
FAT_JAR_DIR:默认../fatjar/,一般不用调整
APP_NAME:Jar名称,例如:check-service-1.0.0.jar,可写成check-service*,但必须保证唯一,通过check-service*只能找到一个文件,如再出现check-service-biz-1.0.0.jar则会找到2个将存在问题
PROFILES_ACTIVE:项目环境,根据服务器是属于DEV/TEST/PORD进行调整
**如何启动, 停止, 以及查询服务的运行状态:**
./run-xxx.sh start //启动项目
./run-xxx.sh stop //停止项目
./run-xxx.sh status //查看项目状态
注意事项:
1. 如果当前服务器存在多个用户账号去启停程序,需要注意采用原始账号操作,否则可能会启动多个进程,操作程序错误。
1. 有特殊场景下会存在多个程序进程执行,可通过命令:ps -ef | grep java 查找到PID,再通过kill -9 PID 结束进程。
:::
## 2.2 Tomcat 项目
- Tomcat 安装略过
- Tomcat 同级创建backup目录,用于备份项目包
- 直接将 Web 项目文件拷贝到 webapps 目录中
## 2.3 Vue 项目
开发完的vue的项目 首先运行 以下命令 对项目进行打包
### **2.3.1 打包**
默认情况下,使用vue-cli创建的项目,package.json里的script应该已经配置了build指令,直接执行yarn build 或者 npm run build即可。
### **2.3.1 部署路径目录**
第一种方式:将vue打包后放在springboot项目的resource下的static文件夹下,将vue当成一个静态资源去访问,部署相对方便,能跟springboot项目一起被打成jar包,启动方便。
第二种方式:用ngnix去做代理,vue、springboot分开部署,分开部署不会相互影响。
通用情况下采用第二种方式,部署到nginx的html目录下。
**域名根目录部署**
比如我们希望项目部署到[http://shxrtech.com](https://link.zhihu.com/?target=http%3A//a.com/test)下,这样访问[http://shxrtech.com](https://link.zhihu.com/?target=http%3A//a.com/test)访问到的是项目的首页
```shell
这里给出的是示例,具体需要按自己项目来
server {
#端口
listen 8081;
#ip地址
server_name localhost;
#这里为项目访问的根路径,以及默认访问的文件
location / {
#将打包后的前端项目放到root设置的路径下
root html/cosco;
#这里默认即可
index index.html index.htm;
}
#请求代理配置到你后端启动的地址
location /api {
proxy_pass http://localhost:8080/api;
}
}
```
**非域名根路径部署**
有时候同一台服务器同一端口下可能会根据目录划分出多个不同的项目,比如我们希望项目部署到[http://shxrtech.com/test](https://link.zhihu.com/?target=http%3A//a.com/test)下,这样访问[http://shxrtech.com/test](https://link.zhihu.com/?target=http%3A//a.com/test)访问到的是项目的首页,而非test前缀的地址会访问到其它项目。此时需要修改nginx配置以及Vue打包配置。
```shell
这里给出的是示例,具体需要按自己项目来
server {
#端口
listen 8081;
#ip地址
server_name localhost;
#这里为项目访问的根路径,以及默认访问的文件
location / {
#将打包后的前端项目放到root设置的路径下
root html/cosco;
#这里默认即可
index index.html index.htm;
}
location /test {
#将打包后的前端项目放到root设置的路径下
root html/test;
#这里默认即可
index index.html index.htm;
}
#请求代理配置到你后端启动的地址
location /api {
proxy_pass http://localhost:8080/api;
}
}
```
**最后就是nginx修改配置一定要重启!!**
:::info
**#进入nginx安装目录**
cd /usr/local/nginx/sbin/
**#检查配置文件是否正确**
./nginx –t
**#重启nginx服务**
./nginx –s reload
:::
### **2.3.1 **解决刷新路由404问题
Vue项目采用了history的路由方式后打包出现404
解决问题的办法:
1. 将路由模式改为hash
1. 修改nginx配置
```shell
location / {
root ...
index ...
try_files $uri $uri/ /index.html; ---解决页面刷新404问题
}
```
# 3. 部署事项
## 3.1 部署前期
- 测试环境应与生产环境采用相同的操作系统、数据库和服务器版本
- 合并代码到预发布分支,部署到测试环境进行测试验证,源代码必须保持一致,能够分环境配置参数的项目必须采用配置文件
- 部署中涉及到第三方配合的,需要制定上线计划,上线计划应该清晰地表明执行步骤和负责人
- 需要准备好回退计划
## 3.2 部署中
### 3.2.1 单节点发布:
- 编译---从git的master分支或指定tag拉取代码
- 上传---编译完成后的程序包上传到指定机器的目录下
- 停止---在指定服务器上停止当前需要更新的程序包
- 备份---在指定服务器上备份当前需要更新的程序包(必须要备份)
- 更新---在指定服务器上启动最新的程序包
### 3.2.2 多节点发布:
多节点部署是一种可以保证系统在不间断提供服务的情况下上线部署方式;
在系统升级的时候,先把集群中的节点A进行剔除,进行新版本的更新,此时集群中的节点B仍然在继续的提供服务;当节点A升级完毕,再把节点A添加到集群当中,然后在将节点B从集群中剔除进行升级,节点A进行提供服务,当节点B升级完毕后,再把节点B也恢复到负载列表中去。
### 3.2.3 数据库操作:
- 生产环境新增字段采用Alert 语句,详细记录到部署文件中。
- 涉及批量操作(含CURD)必须备份全表数据,规则采用:原表名_bakup_yyyymmdd,备份数据可根据时间周期选择性删除。
### 3.3 部署验证
- 服务启动验证,确保相关的服务均已启动。
- 检查日志中是否有错误信息
- 更新内容测试,对本次版本新增功能和修正BUG进行1次验证(部分无法验证的,在第二天进行观察日志输出是否正常)。
- 验证结果不达标,可选择回滚、现场修复、后期更新等方式。
- 项目部署完成或回滚后应及时通知项目负责人或客户此次发布相关结果。
- 上线完成后,更新归档上线文档
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment