桐原API接口开发平台部署流程

API 项目部署上线

配置交换空间

如果你跟我一样云服务器的内存很小,但是又没钱升级。可以配置一下交换空间

在 Linux 中,配置交换空间(Swap Space)是为了扩展系统的虚拟内存而设置的一块磁盘空间。交换空间允许操作系统将内存中不常用的数据移动到硬盘上,以释放内存供其他需要更紧急的任务使用。

配置交换空间的目的是为了解决内存不足的问题。当系统内存不足时,操作系统会将部分内存中的数据移到交换空间中,这样可以腾出内存空间供其他程序使用。交换空间的大小通常是物理内存大小的两倍或更多,但并不是越大越好,过大的交换空间可能会影响系统性能。

在 CentOS 7 系统上配置 4G 的交换空间,您可以按照以下步骤进行操作:

  1. 打开终端或登录到 CentOS 7 系统的命令行界面。

  2. 确保您具有 root 用户权限,或者以 root 用户身份执行以下命令。如果您不是 root 用户,请使用 sudo 命令来执行以下命令。

  3. 创建一个 4G 大小的交换文件。可以使用以下命令创建一个名为 swapfile 的 4G 交换文件:

     
      
    sudo fallocate -l 4G /swapfile

       

  4. 设置交换文件的权限,只允许 root 用户进行读写操作。执行以下命令:
     
      
    sudo chmod 600 /swapfile

       

  5. 使用 mkswap 命令将交换文件格式化为交换分区。执行以下命令:
     
      
    sudo mkswap /swapfile

       

  6. 启用交换文件,使用 swapon 命令。执行以下命令:
     
      
    sudo swapon /swapfile

       

  7. 确认交换空间已成功启用。执行以下命令:
     
      
    sudo swapon --show

       

    如果成功配置,将显示交换分区的相关信息。

  8. 更新系统的 /etc/fstab 文件,以便在启动时自动启用交换分区:

     
      
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

       

image-20230916012602014


前端部署

修改 url

修改 src/requestConfig.ts 文件的 baseURL 地址为真实的地址

 
baseURL: 'http://后端公网ip地址:7529',

   

image-20230916004928193


静态化设置

在 config/config.ts 文件(最后一行)中添加

 
exportStatic: {},

   

image-20230916000346088


打包前端项目

运行 build 把前端项目打包

build 命令运行完之后,根目录下会多了一个 dist 文件夹

在前端开发中,我们通常会使用构建工具(如 Webpack、Parcel 等)将源代码转换为可在浏览器中运行的静态文件。这个过程包括了代码的打包、压缩、转译等操作,最终生成的静态文件就是放置在 dist 文件夹中。

image-20230916005455660

image-20230916005526092

打包好后,可以通过 serve 来本地运行一下这个项目

如果没有安装的,需要安装 serve

serve 可以启动一个本地服务器,用于提供前端应用程序的静态文件。它可以监听指定的端口,并将静态文件提供给浏览器进行访问。这样可以在本地进行开发,并实时查看应用程序的效果。

以管理员身份运行 cmd,输入 npm i -g serve,回车。等待安装完成

b02e4f1d504820cd75df2a3a5c102a4


在 VS 中,右键 dist 文件夹 –> 复制路径

image-20230916010105105

然后在终端中,进入这个文件夹里。比如我刚刚复制的路径是 D:\api-platform\yuapi-frontend-master\dist

那么就在终端中输入命令 cd D:\api-platform\yuapi-frontend-master\dist

image-20230916010234534

然后输入 serve,就可以在本地运行这个项目了。

image-20230916010341268

serve 相当于在本地启动了一个 web 服务器,类似于 nginx。可以在本地把网页文件(dist 文件夹)放到服务器上启动起来,让我们可以访问

我们访问 NetWork 的链接:http://xxx.xxx.xxx.xxx:8000。可以看到能够成功访问前端服务。



宝塔创建前端站点
  1. 添加一个 PHP 站点

    image-20230916013840179

  2. 只填域名,其他默认就行。填好域名项后点击提交

    没有域名的可以先填 ip

    image-20230916014237857

  3. 删除根目录下的内容

    宝塔面板左侧栏找到文件,然后进入刚刚创建的文件夹(刚才新建站点的根目录)

    把这几个原始生成的内容全部删掉

    点击删除后,.user.ini 文件还是在,我就保留了

    也就是说,我只删除了除.user.ini 文件外的其他 3 个文件

    image-20230916014600940

  4. 把 dist文件夹里的内容拖到根目录下

    image-20230916015159867

  5. 测试访问域名

    访问前端域名,可以成功访问到前端项目


  6. 配置 nginx

    一定要配置,否着前端不能正常访问到后端

    宝塔面板左侧栏点击网站,点击刚刚新建的站点,点击配置文件

    image-20230916020025411

    在配置文件中加入下面配置后,点击保存

    #访问api后端相关配置
    location / {
    # 用于配合 browserHistory使用
    try_files uriuri/index.html /index.html;
    }
    location /api {
    rewrite ^/api/(.*) /1 break;
    # 后台服务地址
    proxy_pass http://后端ip地址/api;
    proxy_set_header X-Forwarded-Protoscheme;
    proxy_set_header Host http_host;
    proxy_set_header X-Real-IPremote_addr;
    }

至此,前端项目上线完毕~


后端部署

开放端口

首先宝塔面板和云服务器都要开放下面几个端口:

宝塔面板、云服务器都要开放

8848(Nacos)、9848(Nacos1)、9849(Nacos2)、3306(MySQL)、7529(backend)、8090(gateway)、8123(interface)

image-20230916151529144


安装 Java 环境

在宝塔面板中,网站 --> Java项目 --> 安装Tomcat

因为我的服务器还没有 Java 环境,所以要安装 Tomcat。

如果已经有 Java 环境的话就不用重复安装了

image-20230916152352482

安装 Tomcat9。等待安装完成

因为 springboot2.7 内置的是 tomcat9

image-20230916152439018

移植数据库
  1. 在宝塔面板中新建一个数据库(自己用 Navicat 新建也行)

    image-20230916144743766

  2. 如果想要在 Navicat 中访问到这个数据库,就要修改一下数据库的权限

    在对应的数据库中,点击权限,把访问权限更改为所有人

    image-20230916151857472

  3. 然后把这 4 个表复制到新的数据库

    image-20230916150601162


下载安装 Nacos

我在宝塔软件商店中没有找到 Nacos,所以手动下载了安装包放在服务器里

注意服务器安装的 Nacos 版本要与之前写代码时候启动的 Nacos 版本保持一致

我上传到了(/user/local)路径里

  1. 进入该路径
     
      
    cd /usr/local

       

  2. 输入解压命令
     
      
    tar -zxvf nacos-server-2.2.3.tar.gz

       

    • tar: 是一个用于打包和解包文件的命令。
    • -zxvf: 是 tar 命令的选项和参数。其中,-z 表示使用 gzip 解压缩,-x 表示解包,-v 表示显示详细的处理信息,-f 表示后面紧跟着要解包的文件名。
    • nacos-server-2.2.3.tar.gz: 是要解压缩的文件名。

    执行这个命令将会将”nacos-server-2.2.3.tar.gz” 文件解压缩,并还原其中的文件和目录结构。解压后的文件将会被放置在当前目录下

    image-20230916154201504

    解压完成后可以把压缩包删除掉(小小的服务器真是寸土寸金)

  3. 减小 nacos 启动时占用的内存大小

    因为我的服务器内存很小,所以要进行这一步。如果你内存比较大的话也可以直接启动 Nacos

    解压完成后,在当前目录下会多出来一个 Nacos 文件夹。

    输入下面命令进入 bin 目录

     
      
    cd /usr/local/nacos/bin

       

    里面有一个 startup.sh 文件,

    image-20230916154441754

    把 startup.sh 文件里的:

     
      
    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn128m"

       

    修改为:

     
      
    JAVA_OPT="${JAVA_OPT} -Xms64m -Xmx64m -Xmn16m"

       

    在这个命令中,-Xms64m 表示设置 Java 堆的初始大小为 64MB,-Xmx64m 表示设置 Java 堆的最大大小为 64MB,-Xmn16m 表示设置新生代的大小为 16MB。

    image-20230916154641200

    然后保存退出。

    因为我是用的 FinalShell 远程连接的服务器,所以可以直接双击打开文件修改

    也可以用 xvim startup.sh 命令修改

  4. 启动 Nacos

    在 bin 目录下,执行下面命令单机启动 Nacos

     
      
    sh startup.sh -m standalone

       

    如果需要关闭 Nacos

    方法一:可以在 bin 目录下执行这条命令:sh shutdown.sh

    方法二:直接输入这条命令 ps -ef | grep nacos | grep -v grep | awk '{print $2}' | xargs kill -9

    • ps -ef: 这个命令用于列出当前系统中所有正在运行的进程。
    • grep nacos: 在进程列表中过滤出包含关键词”nacos” 的行。
    • grep -v grep: 过滤掉包含关键词”grep” 的行,避免将 grep 命令本身也匹配进来。
    • awk '{print $2}': 使用 awk 命令提取每行的第二个字段,即进程 ID。
    • xargs kill -9: 将之前提取的进程 ID 作为参数传递给 kill 命令,并使用信号 9(SIGKILL)强制终止这些进程。

    综合起来,这个命令的目的是找到所有名为”nacos” 的进程,并将其强制终止。

  5. 解决报错

    我在启动 Nacos 的时候出现了一个报错

     
      
    [root@pidanxiaali bin]# sh startup.sh -m standalone
    which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
    readlink: 缺少操作数
    Try 'readlink --help' for more information.
    dirname: 缺少操作数
    Try 'dirname --help' for more information.
    ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! !!

       

    上网查了一下应该是启动脚本里面没有配置 java 变量

    解决方法:

    在 startup.sh 文件开头加上 jdk 的路径

    image-20230916162103265

    可以在宝塔面板网站 --> Java项目 --> 添加Java项目里看到 jdk 的路径位置

    比如我这里的路径就是:/usr/local/btjdk/jdk8

    image-20230916162003139

浏览器访问:http://服务器外网地址:8848/nacos/。查看 Nacos 是否启动成功

能访问到就是启动成功了~

image-20230916162431650

部署 Bakcend 项目

记得要先开启 Nacos

  1. 修改 cilent-sdk 项目

    修改网关 IP 为服务器 IP

    image-20230916164844930

    修改完成后,重新执行 maven 的 install 函数重新打包

  2. backend 项目中,刷新一下 maven。复制一个 application.yml 文件改名为 application-prod.yml

    application.yml 是主要的配置文件,用于开发和测试环境的配置,而 application-prod.yml 是生产环境的配置文件,用于生产环境特定的配置。

    application.yml 是默认配置,而上线时,application-prod.yml 中的配置会覆盖掉 application.yml 的配置。

    有什么需要修改的配置,可以不用修改 application.yml 文件,而是直接在 application-prod.yml 文件中添加需要修改的配置

  3. 修改 dubbo 配置 host 地址,数据库的 url、用户名和密码
     
      
    spring:
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://公网IP:3306/pidanapi
    username: 数据库用户名
    password: 数据库秘密
    dubbo:
    application:
    name: dubbo-springboot-demo-provider
    protocol:
    name: dubbo
    port: -1
    registry:
    id: nacos-registry
    address: nacos://公网IP:8848
    config-center:
    timeout: 40000

       

    image-20230916163847730

  4. 执行 maven 的 package 函数命令打包

    生成的 jar 包在 backend 项目的 \target 文件夹里

    image-20230916165356985

  5. 宝塔面板上传 jar 包到服务器

    在宝塔面板的文件项中,在创建 3 个对应的文件夹,把刚刚的 jar 包上传到 backend 文件夹中

    image-20230916165525293

  6. 添加 Java 项目

    网站 --> Java项目 --> 添加Java项目

    主要是两项

    项目 jar 路径:选择刚刚上传的 jar 包

    项目端口:要填真实的 backend 项目端口

    其他可以报保持默认。点击提交

    image-20230916170118397


部署 gateway 项目
  1. 配置 application-prod.yml

    跟 backend 项目一样,复制一个 application.yml 文件改名为 application-prod.yml

    添加内容:

     
      
    dubbo:
    application:
    name: dubbo-api-platform-backend-provider
    protocol:
    name: dubbo
    port: -1
    registry:
    id: nacos-registry
    address: nacos://公网IP:8848

       

  2. 修改 CustomGlobalFilter 文件的模拟接口地址为服务器 IP
     
      
    private static final String INTERFACE_HOST = "http://公网IP:8123";

       

    image-20230916170718572

  3. 添加 Java 项目

    修改完成后,执行 maven 的 package 函数命令打包

    把 jar 包上传到 gateway 文件夹中

    添加 Java 项目,选好 jar 包填好真实的端口号。点击提交

    image-20230916171125330

部署 Interface 项目
  1. 自己看看配置文件有没有需要修改的,我的没有,就直接打包了

  2. 添加 Java 项目

    执行 maven 的 package 函数命令打包

    把 jar 包上传到 interface 文件夹中

    添加 Java 项目,选好 jar 包填好真实的端口号。点击提交

    image-20230916171430336

测试项目

注意项目的启动顺序是:先启动 Nacos –> 启动 backend–> 启动 gateway(一定要 backend 启动成功后)–> 启动 interface

  1. 登录 Nacos 管理页面看看服务有没有注册上

    下面的页面已经成功注册上了

    image-20230916171613006

  2. 打开我们的网站,测试是否能成功调用

    这里看到接口可以成功调用!而且请求地址也对的上。

    image-20230926064132466

    image-20230926063814494


踩坑合集

  1. application-prod.yml 文件不生效

    这个问题我之前做毕设的时候也出现过。我明明有 application-prod.yml 文件,但是文件内容却没有生效,上线后运行的却是 application.yml 文件。这个问题我暂时还没找到什么原因,但是我可以通过修改 application.yml 文件来修改配置,只不过会有点麻烦。不知道大家有没有跟我一样的情况,如果有相同情况的话,可以参考下面我的 application.yml 文件,给大家参考:

    backend 项目的 application.yml:(我在云服务器中没有使用 redis 来缓存 session,所以我注释掉了)

     
      
    spring:
    application:
    name: pidanxiaapi-backend
    # DataSource Config
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://公网IP:3306/pidanapi
    username: 数据库登陆名字
    password: 数据库登录密码
    mvc:
    pathmatch:
    matching-strategy: ANT_PATH_MATCHER
    # session 失效时间(分钟)
    session:
    timeout: 86400
    store-type: none
    # redis 配置
    # redis:
    # port: 6379
    # host: 公网IP
    # database: 0
    #server:
    # port: 7529
    # servlet:
    # context-path: /api
    server:
    address: 0.0.0.0
    port: 7529
    servlet:
    context-path: /api
    # cookie 30 天过期
    session:
    cookie:
    max-age: 2592000
    domain: 公网IP
    mybatis-plus:
    configuration:
    map-underscore-to-camel-case: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    global-config:
    db-config:
    logic-delete-field: isDelete # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
    logic-delete-value: 1 # 逻辑已删除值(默认为 1)
    logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    pidanapi:
    client:
    access-key: pidanxia
    secret-key: abcdefgh
    dubbo:
    application:
    name: dubbo-springboot-demo-provider
    protocol:
    name: dubbo
    port: -1
    registry:
    id: nacos-registry
    address: nacos://公网IP:8848
    config-center:
    timeout: 40000

       

    gateway 项目的 application.yml:

     
      
    server:
    port: 8090
    spring:
    cloud:
    gateway:
    default-filters:
    - AddResponseHeader=source, pidanxia
    routes:
    - id: api_route
    uri: http://公网IP:8123
    predicates:
    - Path=/api/**
    logging:
    level:
    org:
    springframework:
    cloud:
    gateway: trace
    dubbo:
    application:
    name: dubbo-springboot-demo-consumer
    qos-enable: true
    qos-accept-foreign-ip: false
    protocol:
    name: dubbo
    port: -1
    registry:
    id: nacos-registry
    address: nacos://公网IP:8848
    config-center:
    timeout: 40000

       

  2. 云服务器 Nacos 启动失败

    问题一:服务器的内存太小了(2c2g)

    其实就是我服务器的内存太小了(2c2g),而且还运行着一个博客。即使侥幸 Nacos 启动成功了,后面启动 3 个项目的时候也会启动失败。本以为配置好虚拟交换空间后还可以勉强跑起来,没想到连启动 Nacos 都这么吃力。然后我购买了腾讯云的 2c4g 的服务器,花了 200 多大洋心疼了一个星期!!!

    问题二:端口问题

    购买了新服务器之后,我发现 Nacos 还是没有正常启动。搜集资料后发现还需开通两个端口:9848、9849

    云服务器除了要宝塔面板和云服务器都要开放 8848 端口,还需开通两个端口:9848、9849

    具体内容可以查看 Nacos 的官方文档

    image-20230926073109222

    偏移量:

     
       
    当nacos客户端升级为2.1版本后,新增了gRPC的通信方式,新增了两个偏移量端口(9848,9849)在原端口(8848)基础上面偏移量1000和1001。
    原端口:8848 ——> 服务使用
    偏移量端口1:9848 ——> 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
    便宜连端口2:9849 ——> 服务端gRPC请求服务端端口,用于服务间同步等

       

    客户端具有相同的偏移逻辑。用户按照 1.X 的使用方式配置主端口(默认 8848),并通过相同的 offset 计算出对应的 gRPC 端口(默认 9848)。

    因此,如果客户端和服务器之间存在端口转发或防火墙,则需要对端口转发配置和防火墙配置进行相应调整。

  3. 项目部署成功了,但是调用接口的时候返回的是 403

    可能一:这个坑我在第 7 期的时候也踩过,是入参的 url 跟数据库的 url 不一致导致的。

    因为我们上线了云服务器,所以数据库中的 localhost 要改成公网IP。而我在改动的时候,端口号忘记加上了

    入参 url:http:// 公网 IP:8123/api/name/user/

    数据库 url:http:// 公网 IP/api/name/user/

    两者 url 对不上,所以 gateway 没有办法转到正确的接口地址。

    把数据库中的地址修改正确,就可以正常访问了!

    image-20230926071135964


可能二:在 gateway 项目中设置了白名单

我发现在本地部署没有问题,在云服务上部署就报 403,而且数据库中 url 地址也没错

我通过 java -jar 启动,查看日志发现了是 gateway 中的白名单问题

在 gateway 的 CustomGlobalFilter 文件中,有一个变量 IP_WHITE_LIST

这是下面 filter方法访问控制 – 黑白名单的时候用到的 ip 列表

image-20231008153935711

我发现在云服务器中部署的时候,入参 sourceAddress 并不是 127.0.0.1,而是这个:

image-20231008154108567

所以我猜想是不是白名单的问题。

于是我注释掉访问控制 - 黑白名单这段代码。果然程序能正常访问。返回正确的参数

image-20231008154251040

  1. 域名的问题

    而使用域名访问的话,如果使用的是域名访问,而配置文件中写的是公网 IP 的话,那么就会出现一些问题。比如前端记不住登录态之类的。

    个人建议,如果是要用域名访问的,把本文所有配置文件中用到的公网IP全部换成域名

    记得数据库中的 url 也要改成域名哦
    如:xxx.xxx.xxx.xxx 换成 pidanxia.ink

    如:xxx.xxx.xxx.xxx:8848 换成:pidanxia.ink:8848

API 项目收官

恭喜你~API 项目从开发到上线已经全部完成!正式收官!

我有很多很多话想说,想对你说,想对我自己说。想对那个站在阳光下,眼睛里有梦想但口袋里没有口粮的自己说~

但是不知道如何通过文字表达出来,这部分内容先空着,日后会补充上去!