java部署項(xiàng)目流程幾種常見(jiàn)方式詳解
java部署有幾種方式,這里說(shuō)一個(gè)比較簡(jiǎn)單的
方式一:Docker 容器化部署
Docker:將Java應(yīng)用程序及其運(yùn)行時(shí)環(huán)境打包成一個(gè)Docker鏡像。Docker容器提供了隔離的運(yùn)行環(huán)境,確保應(yīng)用程序在不同環(huán)境中具有一致的行為??梢酝ㄟ^(guò)Docker Compose或Kubernetes等工具來(lái)管理和部署多個(gè)容器化應(yīng)用。(后續(xù)會(huì)出教程)
方式二:云平臺(tái)部署
PaaS (Platform as a Service):如Heroku、Google App Engine、AWS Elastic Beanstalk等云平臺(tái)提供了Java應(yīng)用的托管服務(wù)。開(kāi)發(fā)者只需上傳代碼或WAR/JAR文件,平臺(tái)會(huì)自動(dòng)處理應(yīng)用的部署、擴(kuò)展和管理。
IaaS (Infrastructure as a Service):如AWS EC2、Azure VM、Google Compute Engine等云平臺(tái)允許您創(chuàng)建虛擬機(jī)并在其上部署Java應(yīng)用。您可以完全控制服務(wù)器的配置和環(huán)境設(shè)置。
Serverless:如AWS Lambda、Google Cloud Functions等無(wú)服務(wù)器計(jì)算平臺(tái)允許您以函數(shù)的形式部署Java代碼,按需執(zhí)行并自動(dòng)擴(kuò)展。
這里為了方便使用寶塔進(jìn)行部署
寶塔面板(BT Panel)是一款基于Web的Linux服務(wù)器管理工具,旨在簡(jiǎn)化Linux服務(wù)器的管理和部署過(guò)程。它提供了圖形化的用戶界面,寶塔面板支持多種操作系統(tǒng),如CentOS、Ubuntu、Debian等,并且提供了豐富的功能來(lái)幫助用戶部署和管理網(wǎng)站、數(shù)據(jù)庫(kù)、郵件服務(wù)等。
涉及到具體的部署方式,前端要遵循 Next.is 服務(wù)端渲染的部署模式,基于 Node.is 運(yùn)行;后端可以直接運(yùn)行 jar 包。
也可使用docker進(jìn)行部署,有空了會(huì)出過(guò)程
部署計(jì)劃
前端:通過(guò) Nginx 進(jìn)行部署,訪問(wèn)地址為 http://{域名}。由于是 Node 服務(wù),實(shí)際運(yùn)行在 3000 端口。
后端:通過(guò) Nginx 進(jìn)行轉(zhuǎn)發(fā),訪問(wèn)地址為 http://{域名}/api 。實(shí)際運(yùn)行在 8101 端口。JDK 建議選擇 17 版本!
為什么要用 Nginx 轉(zhuǎn)發(fā)?
前端和后端域名一致,保證不會(huì)出現(xiàn)跨域問(wèn)題。
Nginx:服務(wù)器 80 端口,默認(rèn)已安裝,
數(shù)據(jù)庫(kù):服務(wù)器 3306 端口,默認(rèn)已安裝。
Redis:服務(wù)器 6379 端口,需要手動(dòng)安裝
做好規(guī)劃后,我們需要在騰訊云控制臺(tái)的防火墻中開(kāi)通需要外網(wǎng)訪問(wèn)的服務(wù)端口:

添加自己需要開(kāi)放的防火墻即可

環(huán)境準(zhǔn)備
mysql,這里使用docker進(jìn)行安裝
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
里面的賬號(hào)密碼可以自行設(shè)置
寶塔也可進(jìn)行直接安裝mysql,這里不做演示,redis使用寶塔進(jìn)行演示
redis安裝,搜索直接安裝即可


要部署 Java 項(xiàng)目,必須安裝 JDK。在寶塔面板中,可以通過(guò)下圖的方式快速安裝指定版本的 JDK。

建議多安裝幾個(gè)版本,比如 JDK8、11、17,需要用哪個(gè)版本的時(shí)候可以隨時(shí)切換。
后端代碼打包
修改 application-prod 生產(chǎn)環(huán)境配置,包括數(shù)據(jù)庫(kù)、Redis 等,替換為上述安裝依賴時(shí)指定的配置(如用戶名、密碼)
以下僅供參考,總之就是把數(shù)據(jù)庫(kù)連接等配置改為線上地址 改之前可以手動(dòng)進(jìn)行連接測(cè)試
# 線上配置文件
server:
port: 8101
spring:
# 數(shù)據(jù)庫(kù)配置
# todo 需替換配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://你自己的服務(wù)器地址:3306/mianshiniu
username: root
password: 你自己的數(shù)據(jù)庫(kù)密碼
# Redis 配置
# todo 需替換配置
redis:
database: 1
host: 你自己的服務(wù)器地址
port: 6379
timeout: 5000
password: 你自己的數(shù)據(jù)庫(kù)密碼
# Elasticsearch 配置
# todo 需替換配置
elasticsearch:
uris: http://你自己的服務(wù)器地址:9200
# username: root
# password: 你自己的es密碼
mybatis-plus:
configuration:
# 生產(chǎn)環(huán)境關(guān)閉日志
log-impl: ''
#mybatis-plus:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 接口文檔配置
knife4j:
basic:
enable: true
username: root
password: 自己設(shè)置
sa-token:
# token 名稱(同時(shí)也是 cookie 名稱)
token-name: token
# token 有效期(單位:秒) 默認(rèn)30天,-1 代表永久有效
timeout: 2592000
# token 最低活躍頻率(單位:秒),如果 token 超過(guò)此時(shí)間沒(méi)有訪問(wèn)系統(tǒng)就會(huì)被凍結(jié),默認(rèn)-1 代表不限制,永不凍結(jié)
active-timeout: -1
# 是否允許同一賬號(hào)多地同時(shí)登錄 (為 true 時(shí)允許一起登錄, 為 false 時(shí)新登錄擠掉舊登錄)
is-concurrent: false
# 在多人登錄同一賬號(hào)時(shí),是否共用一個(gè) token (為 true 時(shí)所有登錄共用一個(gè) token, 為 false 時(shí)每次登錄新建一個(gè) token)
is-share: true
# token 風(fēng)格(默認(rèn)可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
token-style: uuid
# 是否輸出操作日志
is-log: true打包即可

打包成功后會(huì)得到一個(gè)jar包

上傳jar包到服務(wù)器

上傳完成后,運(yùn)行jar包即可

啟動(dòng)成功后即可看到

如果失敗了可查看項(xiàng)目運(yùn)行日志

但是現(xiàn)在我們無(wú)法通過(guò)ip地址加接口文檔地址訪問(wèn)到測(cè)試文檔
這是因?yàn)槲覀兊姆?wù)器防火墻沒(méi)有放開(kāi) 8101端口。這里我們故意不放開(kāi),因?yàn)樵谥暗牟渴鹨?guī)劃中,后端需要通過(guò) Nginx 進(jìn)行轉(zhuǎn)發(fā),從而解決跨域問(wèn)題。
nginx配置
新建一個(gè)php(只是使用Nginx進(jìn)行代理轉(zhuǎn)發(fā),并不寫代碼)

如果訪問(wèn)的是后端接口(地址有 /api 前綴),則 Nginx 將請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù),對(duì)應(yīng)配置代碼如下:
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 "";
}添加代理規(guī)則

一定要注釋掉下列配置!**否則訪問(wèn)接口文檔時(shí),靜態(tài)資源的加載可能會(huì)出錯(cuò):

服務(wù)器ip地址加/api/doc.html即可訪問(wèn)到接口文檔
前端
環(huán)境準(zhǔn)備

要選擇穩(wěn)定的版本進(jìn)行安裝

打包
- 線上的前端需要請(qǐng)求線上的后端接口,所以需要修改 libs/request.ts 文件中的請(qǐng)求地址為線上:
改為線上地址,因?yàn)镹ext.js在構(gòu)建時(shí)需要調(diào)用后端接口,所以后端必須啟動(dòng)才能完成構(gòu)建

- 修改 Nextjs 配置文件 next.config.mjs ,使用 standalone 模式部署,這樣上傳到服務(wù)器的時(shí)候可以不用上傳 nodemodules 目錄。
ignoreBuildErrors: true, 忽略構(gòu)建時(shí)的語(yǔ)法錯(cuò)誤

- 執(zhí)行打包命令,注意node.js版本要大于18.18,否則報(bào)錯(cuò)


如果構(gòu)建過(guò)程中出現(xiàn)其他錯(cuò)誤,需要根據(jù)錯(cuò)誤信息排查并處理。比如下面這個(gè)示例,顯然是 TypeScript 類型錯(cuò)誤:

找到 fileController 文件,加個(gè) // @ts-ignore 就好了:

可能還會(huì)遇到其他因?yàn)轭愋偷腻e(cuò)誤,這類錯(cuò)誤不影響運(yùn)行,但是會(huì)在 Next,js 打包時(shí)被檢測(cè),可以根據(jù)實(shí)際情況修改?;蛘咧苯釉诖虬鼤r(shí)忽略 TypeScript錯(cuò)誤,參考官方文檔:Configuration: TypeScript | Next.js
注意,如果后端接口沒(méi)啟動(dòng),也可能會(huì)導(dǎo)致打包錯(cuò)誤!
打包成功后,看到下圖信息,能夠很直觀地看到哪些頁(yè)面用到了靜態(tài)渲染和服務(wù)端渲染:

然后在 .next 日錄下會(huì)生成 standalone 目錄,該目錄就是可以獨(dú)立部署的前端包。但是必須按照如下模式組織目錄,一定不能有錯(cuò)!
- 1.將項(xiàng)目根目錄下的 public 日錄移動(dòng)到.next/standalone 內(nèi)
- 2.將.next/static日錄移動(dòng)到.next/standalone/.next內(nèi)
目錄結(jié)構(gòu)如下

3.上傳服務(wù)器,只需要上傳standalone下的文件即可,建議打成壓縮包上傳,解壓即可

4.新建一個(gè)node項(xiàng)目

修改配置

可以查看啟動(dòng)時(shí)的項(xiàng)目日志,快速定位問(wèn)題

5 nginx轉(zhuǎn)發(fā)
當(dāng)用戶訪問(wèn)除了后端之外的任何地址時(shí),都找到前端的node服務(wù) http://127.0.0.1:3000;,從而訪問(wèn)到頁(yè)面
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代理如下

訪問(wèn)即可 ip或域名即可

總結(jié)
到此這篇關(guān)于java部署項(xiàng)目流程幾種常見(jiàn)方式詳解的文章就介紹到這了,更多相關(guān)java部署項(xiàng)目流程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot接入cachecloud redis示例實(shí)踐
這篇文章主要介紹了springboot接入cachecloud redis示例實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
解決java.util.zip.ZipException: Not in GZIP&nbs
這篇文章主要介紹了解決java.util.zip.ZipException: Not in GZIP format報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot3.x循環(huán)依賴問(wèn)題解決方案
這篇文章主要介紹了SpringBoot3.x循環(huán)依賴的相關(guān)知識(shí),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06

