多环境

什么是多环境?

ChatGPT:

​ 多环境指在软件开发过程中,为了满足不同的需求和环境,开发人员需要在不同的环境中进行开发、测试和部署。常见的多环境包括开发环境、测试环境、预生产环境和生产环境等。每个环境都有自己的特点和要求,例如开发环境需要更多的调试工具和测试数据,而生产环境需要更高的性能和可靠性。多环境的使用可以保证软件在不同的环境中都能够正常运行,并且可以提高软件开发的效率和质量。

简单来说,多环境就是将同一套项目代码根据实际情况来调整配置并部署到不同的机器上。

为什么需要多环境?

ChatGPT:

  1. 避免生产环境出现问题:多环境可以帮助开发人员在不同的环境中进行测试和验证,确保软件在生产环境中运行时没有问题。
  2. 提高开发效率:开发人员可以在不同的环境中进行不同的测试和验证,从而提高开发效率。
  3. 降低风险:通过多环境,可以降低生产环境出现问题的风险,同时也可以降低测试和部署过程中出现问题的风险。
  4. 适应不同的需求:不同的环境适用于不同的需求,可以针对不同的需求进行不同的配置和测试,从而满足不同的用户需求。
  5. 保护数据安全:多环境可以保护数据的安全,例如开发环境中的数据可能是模拟数据,而生产环境中的数据则是真实数据,需要进行保护。

总结:

  1. 每个环境互不影响,防止开发、测试中危险操作影响正式业务
  2. 区分不同的阶段(不同的环境有不同的要求和特点):开发 / 测试 / 开发
  3. 对项目进行优化
    • 本地日记级别
    • 精简依赖,节省项目体积
    • 项目环境 / 参数的调整,如JVM参数

多环境的分类

ChatGPT:

多环境可以按照不同的分类方式进行划分,以下是常见的多环境分类方式:

  1. 按照使用者划分:可以将多环境划分为开发环境、测试环境、预生产环境和生产环境等。
  2. 按照部署方式划分:可以将多环境划分为本地环境、云环境、虚拟化环境和容器化环境等。
  3. 按照操作系统划分:可以将多环境划分为Windows环境、Linux环境、Mac环境等。
  4. 按照网络划分:可以将多环境划分为内网环境、外网环境、测试网络环境等。
  5. 按照应用程序划分:可以将多环境划分为Web应用程序环境、移动应用程序环境、桌面应用程序环境等。
  6. 按照数据源划分:可以将多环境划分为开发数据库环境、测试数据库环境、生产数据库环境等。

不同的多环境分类方式可以满足不同的需求和场景,开发人员可以根据实际情况选择适合自己的多环境分类方式。

  1. 本地环境,通常是自己的电脑,localhost(127.0.0.1)。
  2. 开发环境(远程开发),大家同连一台机器
  3. 测试环境(测试) 开发 / 测试 / 产品,单元测试 / 性能测试 / 功能测试 / 系统集成测试,独立的数据库、独立的服务器
    • 沙箱环境(实验环境,测试环境的一种):为验证某功能,一个完全隔离的环境。
  4. 预发布环境(体验服):和正式环境一致,正式环境数据库,寻找更多问题
  5. 正式环境(线上,公开对外访问的项目):尽量不要改动,保证上线前的代码“完美”运行。

前端多环境

  • 请求地址
    • 开发环境:localhost:端口号
    • 线上环境:域名,例如user-backend.wpixiu.cn
1
2
3
4
5
6
7
8
9
startFront(env){
if(env == 'prod'){ // 生产环境
// 不输出注释
// 项目优化
// 修改请求地址
}else{
// 保持本地开发逻辑
}
}
  • 启动方式

    • 开发环境: npm run start(本地启动,监听端口、自动更新)
    • 线上环境:npm run build(项目构建打包),可以使用serve工具启动(npm i -g serve
  • 项目配置

    不同的项目(框架)都有不同的配置文件,如umi的配置文件是config

    • 开发环境可以在配置文件后添加对应的环境名称后缀来区分开发环境和生产环境
    • 开发环境:config.dev.ts
    • 生产环境:config.prod.ts
    • 公共配置:config.ts

后端多环境

SpringBoot项目,通过application.yml添加不同的后缀来区分配置文件

1
java -jar .\user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
  • 依赖的环境地址
    • 数据库地址
    • 缓存地址
    • 消息队列地址
    • 项目端口号
  • 服务器配置

项目部署

原始部署

部署前端

web服务器:NginxApacheTomcat

安装Nginx服务器:

  1. 使用系统自带的软件包管理器快速安装,比如yum

  2. 官网。nginx: download,一定选择稳定版!

    image-20230519175917959

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # 服务器内下载
    # 此时处于/root目录下
    mkdir services
    cd services/
    curl -o nginx-1.24.0.tar.gz https://nginx.org/download/nginx-1.24.0.tar.gz

    # 解压
    tar -zxvf nginx-1.24.0.tar.gz

    ./configure

    # 安装相关依赖
    yum install pcre pcre-devel -y
    yum install openssl openssl-devel -y

    ./configure

    # 设置系统配置参数
    ./configure --with-http_ssl_module --with-http_v2_module --with-stream

    # 编译
    make

    # 安装
    make install

    # 添加环境变量
    vim /etc/profile
    # 在最后一行添加
    export PATH=$PATH:/usr/local/nginx/sbin
    # 使文件配置生效
    source /etc/profile

    nginx

    # 可查看哪个端口被哪个进程占用了,查看启动情况
    netstat -ntlp

    # 根据项目修改配置文件
    cd /usr/local/nginx/conf
    cp nginx.conf nginx.default.conf
    cat nginx.conf
    vim nginx.conf

    # 查看Nginx的启动者
    ps -ef|grep 'nginx'
    # 注意配置user与当前用户一致

    # 重新加载配置
    nginx -s reload

部署后端

根据项目需求进行安装

  1. 安装JAVA
1
2
yum install -y java-1.8.0-openjdk*
java -version
  1. 安装Maven,Maven – Download Apache Maven
1
2
3
4
5
6
7
8
9
10
11
12
13
cd /root/services
curl -o apache-maven-3.9.2-bin.tar.gz https://dlcdn.apache.org/maven/maven-3/3.9.2/binaries/apache-maven-3.9.2-bin.tar.gz
tar -zxvf apache-maven-3.9.2-bin.tar.gz

cd apache-maven-3.9.2/
cd bin
vim /etc/profile
export PATH=$PATH:/root/services/apache-maven-3.9.2/bin
source /etc/profile

cd /root/services
mvn -v
mvn -help
  1. 部署后端
1
2
3
4
5
# 下载代码
git clone xxx

# mvn,打包构建,跳过测试
mvn package -DskipTests
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#手动上传已打包好的jar包

# 给所有用户a,赋予可执行权限x
chmod a+x user-center-backend-0.0.1-SNAPSHOT.jar

java -jar ./user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

# 让项目在后台运行
nohup java -jar ./user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod &

# 查看项目运行
jobs
netstat -ntlp
jps

## 关闭
## 找到其进程号
ps aux
kill -9 xxx

宝塔 Linux 部署

Linux 可视化 运维面板 宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板 (bt.cn)

方便管理服务器,方便安装软件

1
2
# 某串神秘代码,会的人能看懂它的作用
curl https://io.bt.sy/install/update_panel.sh|bash

Docker 部署

什么是docker?

Docker是一个开源的应用程序容器化平台,它可以帮助软件工程师打包、部署和运行应用程序。使用Docker,开发人员可以将应用程序及其所有依赖项(如库、框架、工具等)打包到一个称为容器的独立运行环境中。这使得应用程序在不同的环境中运行时具有一致的表现和可移植性。Docker还提供了一套API和工具集,使得容器可移植、可扩展和可自动化化部署和管理,这使得应用程序的部署和管理变得更加高效和可靠。因此,Docker被广泛应用于云计算、微服务、持续交付和容器编排等领域。

docker是容器,可以将项目的环境(如Java、Nginx)和项目代码一起打包成镜像,所有人(有权限)都能下载镜像,更容易分发和移植。部署只需下载镜像,启动镜像即可。可以理解为软件安装包。

Docker安装:Get Started | Docker

Dockerfile,用于指定构建Docker镜像的方法。一般情况下不需要完全从0自己去写,建议去githubGitee等代码托管平台参考同类项目(如SpringBoot

Dockerfile编写:

  • FROM依赖的基础镜像

  • WORKDIR工作目录

  • COPY从本机复制文件

  • RUN执行命令

  • CMD/ENTRYPOINT指定运行容器时默认执行的命令,ENTRYPOINT可附加额外参数

    在 Dockerfile 中,ENTRYPOINT 和 CMD 都是用于指定容器启动时要运行的命令或程序。但它们的作用不同。

    ENTRYPOINT 指定容器启动时要执行的可执行文件或脚本,并将其他命令作为参数传递给该可执行文件或脚本。ENTRYPOINT 一般用于指定容器的主要应用程序或服务,并在其它命令行参数中指定特定的选项和参数。对于多个 ENTRYPOINT 声明,只有最后一个生效。

    CMD 用于在容器启动时提供默认的命令或程序。如果用户在执行 docker run 命令时没有显式指定要运行的命令,则会使用 CMD 中定义的默认命令或程序来启动容器。如果用户在执行 docker run 命令时指定了要运行的命令,则 CMD 中定义的默认命令或程序将被忽略。如果使用多条 CMD 命令,则只有最后一个 CMD 命令生效。

    在实际使用中,可以根据具体需求选择使用 ENTRYPOINT、CMD 或两者一起使用。通常建议将主要应用程序(如 nginx、MySQL 等)作为 ENTRYPOINT,将一些需要传递参数的选项作为 CMD,以便用户在运行容器时灵活地进行配置。例如:

    1
    2
    3
    4
    5
    6
    7
    复制代码FROM debian:latest
    WORKDIR /app
    COPY . /app
    RUN apt-get update && apt-get install -y nginx
    EXPOSE 80
    ENTRYPOINT ["nginx"]
    CMD ["-g", "daemon off;"]

    上述示例中,将 nginx 作为 ENTRYPOINT,并将 “-g daemon off;” 选项传递给 CMD。这将使 NGINX 在前台运行,并且在接收到 SIGTERM 信号后正常退出。

    需要注意的是,在实际使用中,还可以通过 docker run 命令行参数或编写自定义脚本来覆盖 ENTRYPOINT 和 CMD 中指定的命令,因此使用时需要进行充分的测试,确保容器能够按照预期工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 后端
FROM maven:3.5-jdk-8-alpine as builder

# Copy local code to the container image.
WORKDIR /app
COPY pom.xml .
COPY src ./src

# Build a release artifact.
RUN mvn package -DskipTests

# Run the web service on container startup.
CMD ["java","-jar","/app/target/user-center-backend-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

# 前端
FROM nginx

WORKDIR /usr/share/nginx/html/
USER root

COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf

COPY ./dist /usr/share/nginx/html/

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

根据Dockerfile构建镜像:

1
2
3
4
5
6
7
# docker build -t xxx 所在目录

# 后端
docker build -t user-center-backend:v0.0.1 .

# 前端
docker build -t user-center-front:v0.0.1 .

Docker构建优化:减小尺寸、减少构建时间(如多阶段构建,丢弃之前阶段不需要的内容)

docker run启动

1
2
3
4
5
6
docker run -p 80:80 -v -d user-center-front:v0.0.1

# 8082:8081
# 8082:用户访问端口
# 8081:项目启动端口
docker run -p 8007:8007 -v -d user-center-front:v0.0.1

虚拟化

  1. 端口映射:把本机的资源和容器内部的资源进行关联
  2. 目录映射:把本机的端口和容器应用的端口进行关联

进入容器

1
2
3
4
# 查看容器id,[container-id]
docker ps -a

docker exec -i -t [container-id] /bin/bash

杀死容器

1
docker kill [container-id]

查看日志

1
2
3
4
docker logs [container-id] 

# 实时追踪
docker logs [container-id] -f

查看镜像

1
docker images

强制删除镜像

1
docker rmi -f (镜像名)

Docker容器平台部署

  1. 云服务商容器平台(腾讯云、阿里云)
  2. 面向某个领域的容器平台(微信云托管花钱!

容器平台的好处

  1. 不需输入命令来操作,更方便
  2. 不用在控制台操作,更简单
  3. 大厂运维,更省心
  4. 其他:监控、告警、存储、负载均衡、自动扩容、流水线······