java部署项目流程几种常见方式详解
目录
- 方式一:docker 容器化部署
- 方式二:云平台部署
- 这里为了方便使用宝塔进行部署
- 部署计划
- 环境准备
- 后端代码打包
- nginx配置
- 前端
- 环境准备
- 打包
- 注意,如果后端接口没启动,也可能会导致打包错误!
- 目录结构如下
- 总结
Java部署有几种方式,这里说一个比较简单的
方式一:Docker 容器化部署
Docker:将Java应用程序及其运行时环境打包成一个Docker镜像。Docker容器提供了隔离的运行环境,确保应用程序在不同环境中具有一致的行为。可以通过Docker Compose或Kubernetes等工具来管理和部署多个容器化应用。(后续会出教程)
方式二:云平台部署
PaaS (Platform as a Service):如Heroku、Google App Engine、AWS Elastic Beanstalk等云平台提供了Java应用的托管服务。开发者只需上传代码或WAR/JAR文件,平台会自动处理应用的部署、扩展和管理。
IaaS (Infrastructure as a Service):如AWS EC2、Azure VM、Google Compute Engine等云平台允许您创建虚拟机并在其上部署Java应用。您可以完全控制服务器的配置和环境设置。
Serverless:如AWS Lambda、Google Cloud Functions等无服务器计算平台允许您以函数的形式部署Java代码,按需执行并自动扩展。
这里为了方便使用宝塔进行部署
宝塔面板(BT Panel)是一款基于Web的linux服务器管理工具,旨在简化Linux服务器的管理和部署过程。它提供了图形化的用户界面,宝塔面板支持多种操作系统,如Centos、Ubuntu、Debian等,并且提供了丰富的功能来帮助用户部署和管理网站、数据库、邮件服务等。
涉及到具体的部署方式,前端要遵循 Next.is 服务端渲染的部署模式,基于 Node.is 运行;后端可以直接运行 jar 包。
也可使用docker进行部署,有空了会出过程
部署计划
前端:通过 Nginx 进行部署,访问地址为 http://{域名}。由于是 Node 服务,实际运行在 3000 端口。
后端:通过 编程客栈Nginx 进行转发,访问地址为 http://{域名}/api 。实际运行在 8101 端口。JDK 建议选择 17 版本!
为什么要用 Nginx 转发?
前端和后端域名一致,保证不会出现跨域问题。
Nginx:服务器 80 端口,默认已安装,
数据库:服务器 3306 端口,默认已安装。
Redis:服务器 6379 端口,需要手动安装
做好规划后,我们需要在腾讯云控制台的防火墙中开通需要外网访问的服务端口:
添加自己需要开放的防火墙即可
环境准备
mysql,这里使用docker进行安装
docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ -v /root/mysql/conf:/etc/mysql/conf.d \ -v /root/mysql/data:/var/lib/mysql \ -v /root/mysql/init:/docker-entrypoint-initdb.d \ mysql
里面的账号密码可以自行设置
宝塔也可进行直接安装mysql,这里不做演示,redis使用宝塔进行演示
redis安装,搜索直接安装即可
要部署 Java 项目,必须安装 JDK。在宝塔面板中,可以通过下图的方式快速安装指定版本的 JDK。
建议多安装几个版本,比如 JDK8、11、17,需要用哪个版本的时候可以随时切换。
后端代码打包
修改 application-prod 生产环境配置,包括数据库、Redis 等,替换为上述安装依赖时指定的配置(如用户名、密码)
以下仅供参考,总之就是把数据库连接等配置改为线上地址 改之前可以手动进行连接测试
# 线上配置文件 server: port: 8101 spring: # 数据库配置 # todo 需替换配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://你自己的服务器地址:3306/mianshiniu username: root password: 你自己的数据库密码 # Redis 配置 # todo 需替换配置 redis: database: 1 host: 你自己的服务器地址 port: 6379 timeout: 5000 password: 你自己的数据库密码 编程 # Elasticsearch 配置 # todo 需替换配置 elasticsearch: uris: http://你自己的服务器地址:9200 # username: root # password: 你自己的es密码 myBATis-plus: configuration: # 生产环境关闭日志 log-impl: '' #mybatis-plus: # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 接口文档配置 knife4j: basic: enable: true username: root password: 自己设置 sa-token: # token 名称(同时也是 cookie 名称) token-njsame: token # token 有效期(单位:秒) 默认30天,-1 代表永久有效 timeout: 2592000 # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 active-timeout: -1 # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) is-concurrent: false # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) is-share: true # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) token-style: uuid # 是否输出操作日志 is-log: true
打包即可
打包成功后会得到一个jar包
上传jar包到服务器
上传完成后,运行jar包即可
启动成功后即可看到
如果失败了可查看项目运行日志
但是现在我们无法通过ip地址加接口文档地址访问到测试文档
这是因为我们的服务器防火墙没有放开 8101端口。这里我们故意不放开,因为在之前的部署规划中,后端需要通过 Nginx 进行转发,从而解决跨域问题。
nginx配置
新建一个php(只是使用Nginx进行代理转发,并不写代码)
如果访问的是后端接口(地址有 /api 前缀),则 Nginx 将请求转发到后端服务,对应配置代码如下:
location /api { proxy_pass http://127.0.0.1:8101; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_buffering off; proxy_set_header Connection ""; }
添加代理规则
一定要注释掉下列配置!**否则访问接口文档时,静态资源的加载可能会出错:
服务器ip地址加/api/doc.html即可访问到接口文档
前端
环境准备
要选择稳定的版本进行安装
打包
- 线上的前端需要请求线上的后端接口,所以需要修改 libs/request.ts 文件中的请求地址为线上:
改为线上地址,因为Next.js在构建时需要调用后端接口,所以后android端必须启动才能完成构建
- 修改 Nextjs 配置文件 next.config.mjs ,使用 standalone 模式部署,这样上传到服务器的时候可以不用上传 nodemodules 目录。
ignoreBuildErrors: true, 忽略构建时的语法错误
- 执行打包命令,注意node.js版本要大于18.18,否则报错
如果构建过程中出现其他错www.devze.com误,需要根据错误信息排查并处理。比如下面这个示例,显然是 TypeScript 类型错误:
找到 fileController 文件,加个 // @ts-ignore 就好了:
可能还会遇到其他因为类型的错误,这类错误不影响运行,但是会在 Next,js 打包时被检测,可以根据实际情况修改。或者直接在打包时忽略 TypeScript错误,参考官方文档:Configuration: TypeScript | Next.js
注意,如果后端接口没启动,也可能会导致打包错误!
打包成功后,看到下图信息,能够很直观地看到哪些页面用到了静态渲染和服务端渲染:
然后在 .next 日录下会生成 standalone 目录,该目录就是可以独立部署的前端包。但是必须按照如下模式组织目录,一定不能有错!
- 1.将项目根目录下的 public 日录移动到.next/standalone 内
- 2.将.next/static日录移动到.next/standalone/.next内
目录结构如下
3.上传服务器,只需要上传standalone下的文件即可,建议打成压缩包上传,解压即可
4.新建一个node项目
修改配置
可以查看启动时的项目日志,快速定位问题
5 nginx转发
当用户访问除了后端之外的任何地址时,都找到前端的node服务 http://127.0.0.1:3000;,从而访问到页面
location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_buffering off; proxy_set_header Connection ""; }
完整的nginx代理如下
访问即可 ip或域名即可
总结
到此这篇关于java部署项目流程几种常见方式详解的文章就介绍到这了,更多相关java部署项目流程内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论