这样上线项目,轻轻松松~

程序员鱼皮

共 7192字,需浏览 15分钟

 ·

2024-08-07 13:25

大家好,我是程序员鱼皮。经过一个月的奋斗(肝疼),我的新项目鱼答答 AI 答题应用平台已经完结~

这是一个深入业务场景的企业级实战项目,基于 Vue 3 + Spring Boot + Redis + ChatGLM AI + RxJava + SSE 实现。用户可以基于 AI 快速制作并发布多种答题应用,支持检索和分享应用、在线答题并基于评分算法或 AI 得到回答总结;管理员可以审核应用、集中管理整站内容,并进行统计分析。

我也把这个项目部署上线了,感兴趣的朋友可以访问玩玩看~

https://yudada.code-nav.cn

这篇文章,主要给大家分享如何将项目部署上线。其实之前已经分享过使用服务器部署的传统方式,而这一次,我要分享一种更高效的部署方式,而且完全不需要用到服务器!不用输入 Linux 命令!

推荐观看视频教程:https://www.bilibili.com/video/BV1Xm421N7Xj

以下为文字版:

一、部署规划

1、获取源码

本项目分为开源版本和扩展版本。

开源版本:https://github.com/liyupi/yudada

扩展版本:前端补充了更多功能、后端使用了 Redisson 分布式锁和 Sharding JDBC 分库分表。

见编程导航项目教程的资料 => 项目源码:https://www.code-nav.cn/course/1790274408835506178

2、部署方案

本项目前端使用 Vercel 平台部署;后端使用微信云托管平台,以容器的方式进行部署。

Vercel 平台可免费部署前端项目,支持读取 GitHub 仓库的项目,根据 package.json 文件自动安装依赖并执行打包构建命令,还会提供测试域名和正式的 HTTPS 域名供用户访问。此外,支持自定义域名、代码变更时自动部署、快速回滚版本、监控等操作。

微信云托管平台以容器的方式部署项目,支持读取 GitHub 仓库的项目,并根据 Dockerfile 文件自动构建容器镜像并启动,还会提供 HTTPS 公网域名供用户访问。此外,支持自定义域名、代码变更时自动部署、快速回滚版本、监控等操作。注意,该平台按量计费,不用时记得停止服务。

相比于传统的服务器方式部署,采用这些平台部署项目的优点是:

  1. 不需要登录服务器输入命令、更方便
  2. 更易于项目的扩展和回滚
  3. 平台内置监控能力,更易于管理和运维项目

3、地址规划

前端:使用 Vercel 生成的默认域名,访问地址为 https://{域名}

后端:使用微信云托管生成的默认域名,访问地址为 https://{域名}/api,实际运行在 8101 端口。

数据库:需自行安装,一般为服务器的 3306 端口

Redis:需自行安装,一般为服务器 6379 端口

4、注意事项

注意,由于前端和后端都是用平台生成的默认域名,二者不一致,将会出现跨域问题。虽然后端已经通过 CorsConfig 全局支持了跨域,但 Cookie 无法跨域设置,会导致用户无法正常登录,所以后面需要进行解决。

二、安装依赖

本项目主要用到了 MySQL、Redis、对象存储和 ChatGLM AI 依赖。

1、MySQL

在鱼皮之前的教程中,已经讲过如何利用宝塔 Linux 面板快速安装 MySQL 和 Redis,可参考视频教程:https://www.bilibili.com/video/BV1eT421i7si/,此处不再赘述。

也可以使用微信云托管或者第三方云服务提供的 MySQL,不用自己安装:

2、Redis

对本项目来说,如果使用了开源代码,Redis 不是必须要安装的;如果使用扩展版的代码,Redisson 分布式锁依赖 Redis,所以必须要安装 Redis,或者注释掉分布式锁和 Redis 相关的代码。

3、对象存储

需要在腾讯云的访问控制中获取到对象存储所需的 key 和 secret。同时如果对象存储配置开启了防盗链,注意要将前端网站的域名添加到防盗链白名单中,否则图片将无法加载。

4、ChatGLM AI

本项目使用了智谱 AI,需要在智谱 AI 开放平台中获取到调用 AI 所需的 key。

三、后端部署

1、数据库初始化

进入后端项目,首先利用 IDEA 自带的数据库管理能力,连接远程数据库。

然后执行 sql 目录下的 create_table.sqlinit_data.sql 文件,创建库表和插入初始化数据。

成功看到了创建的库表:

2、项目修改

配置修改

修改生产环境的配置文件 application-prod.yml,主要是数据库、Redis、对象存储和 ChatGLM API key 的配置。

还可以修改接口文档的配置,设置需要密码才能访问,保护接口信息安全。

如果使用了扩展版源码,还需要编写分库分表的配置,一定不要遗漏!

要修改的部分配置如下:

spring:
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://{修改为你的数据库地址}/yudada
    username: 修改为你的用户名
    password: 修改为你的密码
  # Redis 配置
  redis:
    database: 1
    host: 修改为你的地址
    port: 6379
    password: 修改为你的密码
  # 分库分表配置(开源代码部署可忽略)
  shardingsphere:
    #数据源配置
    datasource:
      # 多数据源以逗号隔开即可
      names: yudada
      yudada:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://{修改为你的数据库地址}/yudada
        username: 修改为你的用户名
        password: 修改为你的密码

修改好配置后,可以将最新的代码推送到 GitHub 上,但是 一定要注意 !不要将包含密码和隐私数据的代码公开,建议新建一个 private 仓库 进行推送!

Dockerfile

Dockerfile 类似于一个脚本文件,用于指定构建 Docker 镜像的方式,这里直接给大家提供,不同的项目进行微调即可。

Dockerfile 代码如下,一般将其放到后端项目的根目录:

# Docker 镜像构建
# 选择基础镜像
FROM maven:3.8.1-jdk-8-slim as builder

# 解决容器时期与真实时间相差 8 小时的问题
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone

# 复制代码到容器内
WORKDIR /app
COPY pom.xml .
COPY src ./src

# 打包构建
RUN mvn package -DskipTests

# 容器启动时运行 jar 包
CMD ["java","-jar","/app/target/yudada-backend-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

其实就是把部署所需的环境和操作命令写在一起。

3、部署

首先进入微信云托管平台,创建环境并新建服务,注意要打开公网访问:

然后编写部署配置,选择发布在 GitHub 上的后端代码仓库,并且一定要修改端口号和实际后端项目一致!

注意目标目录要选择后端项目的根目录(这里是 yudada-backend),该目录内包含有 Dockerfile 文件。云托管平台会根据这个文件构建 Docker 镜像并启动容器。

配置完成后,点击发布,等待部署即可:

部署完成后,就可以通过云托管平台提供的公网域名进行访问和测试了。

如果部署遇到问题,注意查看部署日志,大概率是端口写错了或者依赖地址无法访问。可以参考鱼皮的 Bug 修复手册进行排查。

https://www.code-nav.cn/course/bug

云托管还提供了版本管理、查看日志、服务监控、云端调试、流水线部署等功能,可以观看鱼皮之前录制的云托管视频教程。

https://www.bilibili.com/video/BV1Je411X7TD

四、前端部署

1、项目修改

修改 request.ts 文件,区分开发环境和生产环境使用的接口地址。生产环境的接口地址就是上一步后端部署得到的公网域名。

代码如下:

// 是否是开发环境
export const isDev = process.env.NODE_ENV === "development";

// 创建 Axios 实例
const myAxios = axios.create({
  baseURL: isDev ? "http://localhost:8101" : "改为自己的后端地址",
  timeout: 60000,
  withCredentials: true,
});

2、部署

建议将项目发布到 GitHub 平台进行托管,敏感项目可以设置为 private。

先注册登录 Vercel 平台,授权 GitHub 后,点击新建项目,可以直接搜索到要部署的项目代码:

然后进入项目配置,由于本项目将前端、后端、小程序都放在了一起,所以必须指定项目目录为前端目录,然后平台会自动识别出这是一个 Vue 项目,并预设部署所需的命令。你也可以自行修改命令、添加环境变量等:

完成配置后,点击 Deploy 按钮,稍等片刻,即可完成部署。

部署完成后,就可以看到平台为我们生成的默认域名,可以直接访问。

五、问题处理

解决 Cookie 跨域

访问前端页面,虽然能够获取到主页数据,但是无法正常登录。具体表现为用户登录后,回到主页,仍然处于未登录的状态。

按 F12 打开网络控制台,可以看到由于跨域问题导致 Cookie 没种上,后端就无法标识前端用户,所以查询不到登录态。

要解决这个问题,一种典型的方法是让前端请求相同的域名,使用 Nginx 通过路径(比如 /api)转发到真实的后端,可参考视频教程:https://www.bilibili.com/video/BV1eT421i7si/。

但由于我们前端和后端项目都使用了第三方平台部署,不方便再引入 Nginx,怎么办呢?

还有一种方法,是修改后端项目设置 Cookie 的配置,必须同时设置 SameSite=None 和 Secure=true。SameSite=None 表示 Cookie 将被发送到跨站请求中,而 Secure=true 确保 Cookie 只能通过 HTTPS 连接发送,从而提高了安全性。

修改 Spring Boot 生产环境配置文件如下:

server:
  port: 8101
  servlet:
    session:
      cookie:
        # 解决跨域
        same-site: none
        secure: true

然后将修改推送到 GitHub 上,会自动触发微信云托管平台的流水线部署,稍等片刻后再次访问,这次项目的各操作都能够正常执行。


至此本项目已经部署完成,大家可以自行测试和验证项目的上线效果~

应。该。不。难。吧!

👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐

我的编程学习小圈子

19年的鱼皮差点进不去腾讯(不能再认同)

我们的小程序每天早上都白屏,真相是。。。

开发小同学的骚操作,还好被我发现了

鱼皮的 Java 学习路线《速览版》

我在简历上写了这个,超级加分!

用户破万了!

浏览 122
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报