桐原API接口开发平台部署流程
API 项目部署上线
配置交换空间
如果你跟我一样云服务器的内存很小,但是又没钱升级。可以配置一下交换空间
在 Linux 中,配置交换空间(Swap Space)是为了扩展系统的虚拟内存而设置的一块磁盘空间。交换空间允许操作系统将内存中不常用的数据移动到硬盘上,以释放内存供其他需要更紧急的任务使用。
配置交换空间的目的是为了解决内存不足的问题。当系统内存不足时,操作系统会将部分内存中的数据移到交换空间中,这样可以腾出内存空间供其他程序使用。交换空间的大小通常是物理内存大小的两倍或更多,但并不是越大越好,过大的交换空间可能会影响系统性能。
在 CentOS 7 系统上配置 4G 的交换空间,您可以按照以下步骤进行操作:
- 打开终端或登录到 CentOS 7 系统的命令行界面。
-
确保您具有 root 用户权限,或者以 root 用户身份执行以下命令。如果您不是 root 用户,请使用 sudo 命令来执行以下命令。
-
创建一个 4G 大小的交换文件。可以使用以下命令创建一个名为 swapfile 的 4G 交换文件:
sudo fallocate -l 4G /swapfile
- 设置交换文件的权限,只允许 root 用户进行读写操作。执行以下命令:
sudo chmod 600 /swapfile
- 使用 mkswap 命令将交换文件格式化为交换分区。执行以下命令:
sudo mkswap /swapfile
- 启用交换文件,使用 swapon 命令。执行以下命令:
sudo swapon /swapfile
- 确认交换空间已成功启用。执行以下命令:
sudo swapon --show
如果成功配置,将显示交换分区的相关信息。
-
更新系统的
/etc/fstab
文件,以便在启动时自动启用交换分区:echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
前端部署
修改 url
修改 src/requestConfig.ts
文件的 baseURL
地址为真实的地址
baseURL: 'http://后端公网ip地址:7529', |
静态化设置
在 config/config.ts
文件(最后一行)中添加
exportStatic: {}, |
打包前端项目
运行 build 把前端项目打包
build 命令运行完之后,根目录下会多了一个 dist
文件夹
在前端开发中,我们通常会使用构建工具(如 Webpack、Parcel 等)将源代码转换为可在浏览器中运行的静态文件。这个过程包括了代码的打包、压缩、转译等操作,最终生成的静态文件就是放置在
dist
文件夹中。
打包好后,可以通过 serve 来本地运行一下这个项目
如果没有安装的,需要安装 serve
serve
可以启动一个本地服务器,用于提供前端应用程序的静态文件。它可以监听指定的端口,并将静态文件提供给浏览器进行访问。这样可以在本地进行开发,并实时查看应用程序的效果。
以管理员身份运行 cmd,输入 npm i -g serve
,回车。等待安装完成
在 VS 中,右键 dist 文件夹 –> 复制路径
。
然后在终端中,进入这个文件夹里。比如我刚刚复制的路径是 D:\api-platform\yuapi-frontend-master\dist
那么就在终端中输入命令 cd D:\api-platform\yuapi-frontend-master\dist
然后输入 serve
,就可以在本地运行这个项目了。
serve 相当于在本地启动了一个 web 服务器,类似于 nginx。可以在本地把网页文件(dist 文件夹)放到服务器上启动起来,让我们可以访问
我们访问 NetWork 的链接:http://xxx.xxx.xxx.xxx:8000
。可以看到能够成功访问前端服务。
宝塔创建前端站点
- 添加一个 PHP 站点
-
只填域名,其他默认就行。填好域名项后点击提交
没有域名的可以先填 ip
-
删除根目录下的内容
宝塔面板左侧栏找到
文件
,然后进入刚刚创建的文件夹(刚才新建站点的根目录)把这几个原始生成的内容全部删掉
点击删除后,
.user.ini
文件还是在,我就保留了也就是说,我只删除了除
.user.ini
文件外的其他 3 个文件 -
把
dist文件夹
里的内容拖到根目录下 -
测试访问域名
访问前端域名,可以成功访问到前端项目
-
配置 nginx
一定要配置,否着前端不能正常访问到后端
宝塔面板左侧栏点击
网站
,点击刚刚新建的站点,点击配置文件
在配置文件中加入下面配置后,点击
保存
#访问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)
安装 Java 环境
在宝塔面板中,网站 --> Java项目 --> 安装Tomcat
因为我的服务器还没有 Java 环境,所以要安装 Tomcat。
如果已经有 Java 环境的话就不用重复安装了
安装 Tomcat9
。等待安装完成
因为 springboot2.7 内置的是 tomcat9
移植数据库
- 在宝塔面板中新建一个数据库(自己用 Navicat 新建也行)
-
如果想要在 Navicat 中访问到这个数据库,就要修改一下数据库的权限
在对应的数据库中,点击
权限
,把访问权限更改为所有人
。 -
然后把这 4 个表复制到新的数据库
下载安装 Nacos
我在宝塔软件商店中没有找到 Nacos,所以手动下载了安装包放在服务器里
注意服务器安装的 Nacos 版本要与之前写代码时候启动的 Nacos 版本保持一致
我上传到了(/user/local)路径里
- 进入该路径
cd /usr/local
- 输入解压命令
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” 文件解压缩,并还原其中的文件和目录结构。解压后的文件将会被放置在当前目录下
解压完成后可以把压缩包删除掉(小小的服务器真是寸土寸金)
-
-
减小 nacos 启动时占用的内存大小
因为我的服务器内存很小,所以要进行这一步。如果你内存比较大的话也可以直接启动 Nacos
解压完成后,在当前目录下会多出来一个
Nacos
文件夹。输入下面命令进入 bin 目录
cd /usr/local/nacos/bin
里面有一个
startup.sh
文件,把
startup.sh
文件里的:JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn128m"
修改为:
JAVA_OPT="${JAVA_OPT} -Xms64m -Xmx64m -Xmn16m"
在这个命令中,
-Xms64m
表示设置 Java 堆的初始大小为 64MB,-Xmx64m
表示设置 Java 堆的最大大小为 64MB,-Xmn16m
表示设置新生代的大小为 16MB。然后保存退出。
因为我是用的 FinalShell 远程连接的服务器,所以可以直接双击打开文件修改
也可以用
xvim startup.sh
命令修改 - 启动 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” 的进程,并将其强制终止。
-
- 解决报错
我在启动 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 的路径可以在宝塔面板
网站 --> Java项目 --> 添加Java项目
里看到 jdk 的路径位置比如我这里的路径就是:
/usr/local/btjdk/jdk8
浏览器访问:http://服务器外网地址:8848/nacos/
。查看 Nacos 是否启动成功
能访问到就是启动成功了~
部署 Bakcend 项目
记得要先开启 Nacos
- 修改 cilent-sdk 项目
修改网关 IP 为服务器 IP
修改完成后,重新执行 maven 的
install
函数重新打包 -
backend 项目中,刷新一下 maven。复制一个
application.yml
文件改名为application-prod.yml
application.yml
是主要的配置文件,用于开发和测试环境的配置,而application-prod.yml
是生产环境的配置文件,用于生产环境特定的配置。application.yml
是默认配置,而上线时,application-prod.yml
中的配置会覆盖掉application.yml
的配置。有什么需要修改的配置,可以不用修改
application.yml
文件,而是直接在application-prod.yml
文件中添加需要修改的配置 - 修改 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
-
执行 maven 的
package
函数命令打包生成的 jar 包在 backend 项目的
\target
文件夹里 -
宝塔面板上传 jar 包到服务器
在宝塔面板的
文件
项中,在创建 3 个对应的文件夹,把刚刚的 jar 包上传到 backend 文件夹中 -
添加 Java 项目
网站 --> Java项目 --> 添加Java项目
主要是两项
项目 jar 路径:选择刚刚上传的 jar 包
项目端口:要填真实的 backend 项目端口
其他可以报保持默认。点击
提交
部署 gateway 项目
-
配置
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
- 修改
CustomGlobalFilter
文件的模拟接口地址为服务器 IPprivate static final String INTERFACE_HOST = "http://公网IP:8123";
-
添加 Java 项目
修改完成后,执行 maven 的
package
函数命令打包把 jar 包上传到 gateway 文件夹中
添加 Java 项目,选好 jar 包填好真实的端口号。点击提交
部署 Interface 项目
-
自己看看配置文件有没有需要修改的,我的没有,就直接打包了
-
添加 Java 项目
执行 maven 的
package
函数命令打包把 jar 包上传到 interface 文件夹中
添加 Java 项目,选好 jar 包填好真实的端口号。点击提交
测试项目
注意项目的启动顺序是:先启动 Nacos –> 启动 backend–> 启动 gateway(一定要 backend 启动成功后)–> 启动 interface
- 登录 Nacos 管理页面看看服务有没有注册上
下面的页面已经成功注册上了
-
打开我们的网站,测试是否能成功调用
这里看到接口可以成功调用!而且请求地址也对的上。
踩坑合集
-
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
-
云服务器 Nacos 启动失败
问题一:服务器的内存太小了(2c2g)
其实就是我服务器的内存太小了(2c2g),而且还运行着一个博客。即使侥幸 Nacos 启动成功了,后面启动 3 个项目的时候也会启动失败。本以为配置好虚拟交换空间后还可以勉强跑起来,没想到连启动 Nacos 都这么吃力。然后我购买了腾讯云的 2c4g 的服务器,花了 200 多大洋心疼了一个星期!!!
问题二:端口问题
购买了新服务器之后,我发现 Nacos 还是没有正常启动。搜集资料后发现还需开通两个端口:9848、9849
云服务器除了要宝塔面板和云服务器都要开放 8848 端口,还需开通两个端口:9848、9849
具体内容可以查看 Nacos 的官方文档
偏移量:
当nacos客户端升级为2.1版本后,新增了gRPC的通信方式,新增了两个偏移量端口(9848,9849)在原端口(8848)基础上面偏移量1000和1001。
原端口:8848 ——> 服务使用
偏移量端口1:9848 ——> 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
便宜连端口2:9849 ——> 服务端gRPC请求服务端端口,用于服务间同步等
客户端具有相同的偏移逻辑。用户按照 1.X 的使用方式配置主端口(默认 8848),并通过相同的 offset 计算出对应的 gRPC 端口(默认 9848)。
因此,如果客户端和服务器之间存在端口转发或防火墙,则需要对端口转发配置和防火墙配置进行相应调整。
-
项目部署成功了,但是调用接口的时候返回的是 403
可能一:这个坑我在第 7 期的时候也踩过,是入参的 url 跟数据库的 url 不一致导致的。
因为我们上线了云服务器,所以数据库中的
localhost
要改成公网IP
。而我在改动的时候,端口号忘记加上了入参 url:http:// 公网 IP:8123/api/name/user/
数据库 url:http:// 公网 IP/api/name/user/
两者 url 对不上,所以 gateway 没有办法转到正确的接口地址。
把数据库中的地址修改正确,就可以正常访问了!
可能二:在 gateway 项目中设置了白名单
我发现在本地部署没有问题,在云服务上部署就报 403,而且数据库中 url 地址也没错
我通过 java -jar 启动,查看日志发现了是 gateway 中的白名单问题
在 gateway 的 CustomGlobalFilter
文件中,有一个变量 IP_WHITE_LIST
这是下面 filter方法
访问控制 – 黑白名单的时候用到的 ip 列表
我发现在云服务器中部署的时候,入参 sourceAddress
并不是 127.0.0.1
,而是这个:
所以我猜想是不是白名单的问题。
于是我注释掉访问控制 - 黑白名单
这段代码。果然程序能正常访问。返回正确的参数
-
域名的问题
而使用域名访问的话,如果使用的是域名访问,而配置文件中写的是公网 IP 的话,那么就会出现一些问题。比如前端记不住登录态之类的。
个人建议,如果是要用域名访问的,把本文所有配置文件中用到的
公网IP
全部换成域名
。记得数据库中的 url 也要改成域名哦
如:xxx.xxx.xxx.xxx 换成 pidanxia.ink如:xxx.xxx.xxx.xxx:8848 换成:pidanxia.ink:8848
API 项目收官
恭喜你~API 项目从开发到上线已经全部完成!正式收官!
我有很多很多话想说,想对你说,想对我自己说。想对那个站在阳光下,眼睛里有梦想但口袋里没有口粮的自己说~
但是不知道如何通过文字表达出来,这部分内容先空着,日后会补充上去!