哪些專(zhuān)門(mén)做批發(fā)的網(wǎng)站有哪些短網(wǎng)址鏈接生成
目錄
一、軟件開(kāi)發(fā)整體介紹
1. 軟件開(kāi)發(fā)流程
1 第1階段: 需求分析
2 第2階段: 設(shè)計(jì)
3 第3階段: 編碼
4 第4階段: 測(cè)試
5 第5階段: 上線運(yùn)維
2. 角色分工
3. 軟件環(huán)境
1 開(kāi)發(fā)環(huán)境(development)
2 測(cè)試環(huán)境(testing)
3 生產(chǎn)環(huán)境(production)
二、蒼穹外賣(mài)項(xiàng)目介紹
1. 項(xiàng)目介紹
2. 產(chǎn)品原型
3. 技術(shù)選型
三、開(kāi)發(fā)環(huán)境搭建
1. 前端環(huán)境搭建
2. 后端環(huán)境搭建
1 熟悉項(xiàng)目結(jié)構(gòu)
1 使用idea打開(kāi)項(xiàng)目
2 項(xiàng)目結(jié)構(gòu)說(shuō)明
2 Git版本控制
1 準(zhǔn)備遠(yuǎn)程倉(cāng)庫(kù)
2 初始化Git本地倉(cāng)庫(kù)
?編輯
3 提交并推送到遠(yuǎn)程倉(cāng)庫(kù)
(2) 添加到暫存區(qū)
(3) 提交到本地倉(cāng)庫(kù)
(4) 推送到遠(yuǎn)程倉(cāng)庫(kù)
3 準(zhǔn)備數(shù)據(jù)庫(kù)環(huán)境
(1) 執(zhí)行SQL腳本
(2)?配置數(shù)據(jù)庫(kù)密碼
(3) 表的說(shuō)明
3. 前后端聯(lián)調(diào)和nginx
1 debug跟蹤登錄功能
2 nginx反向代理
(1) 反向代理介紹
(2) nginx反向代理的好處【重點(diǎn)】
(3) nginx反向代理的配置
(4) nginx負(fù)載均衡的配置
3.3 nginx小結(jié)
4. 完善登錄功能
四、導(dǎo)入接口文檔
五、Swagger
1. 介紹
2. 使用步驟
3. 常用注解
?編輯
4. yapi和Swagger的區(qū)別
5. 小結(jié)
克隆地址:魁(代碼疑點(diǎn))/sky-take-out
一、軟件開(kāi)發(fā)整體介紹
作為一名軟件開(kāi)發(fā)工程師,我們需要了解在軟件開(kāi)發(fā)過(guò)程中的開(kāi)發(fā)流程, 以及軟件開(kāi)發(fā)過(guò)程中涉及到的崗位角色,角色的分工、職責(zé), 并了解軟件開(kāi)發(fā)中涉及到的三種軟件環(huán)境。那么這一小節(jié),我們將從 軟件開(kāi)發(fā)流程、角色分工、軟件環(huán)境 三個(gè)方面整體介紹一下軟件開(kāi)發(fā)。
1. 軟件開(kāi)發(fā)流程
graph LR
需求分析-->設(shè)計(jì)
設(shè)計(jì)-->UI設(shè)計(jì) & 接口設(shè)計(jì) & 數(shù)據(jù)庫(kù)設(shè)計(jì) -->編碼
編碼-->前端編碼-->前端自測(cè)-->聯(lián)調(diào)
編碼-->后端編碼-->后端自測(cè)-->聯(lián)調(diào)
聯(lián)調(diào)-->測(cè)試-->上線運(yùn)維
1 第1階段: 需求分析
完成需求規(guī)格說(shuō)明書(shū)、產(chǎn)品原型編寫(xiě)。
需求規(guī)格說(shuō)明書(shū), 一般來(lái)說(shuō)就是使用 Word 文檔來(lái)描述當(dāng)前項(xiàng)目的各個(gè)組成部分,如:系統(tǒng)定義、應(yīng)用環(huán)境、功能規(guī)格、性能需求等,都會(huì)在文檔中描述。例如:
產(chǎn)品原型,一般是通過(guò)網(wǎng)頁(yè)(html)的形式展示當(dāng)前的頁(yè)面展示什么樣的數(shù)據(jù), 頁(yè)面的布局是什么樣子的,點(diǎn)擊某個(gè)菜單,打開(kāi)什么頁(yè)面,點(diǎn)擊某個(gè)按鈕,出現(xiàn)什么效果,都可以通過(guò)產(chǎn)品原型看到。 例如:
2 第2階段: 設(shè)計(jì)
設(shè)計(jì)的內(nèi)容包含 UI設(shè)計(jì)、數(shù)據(jù)庫(kù)設(shè)計(jì)、接口設(shè)計(jì)。
UI設(shè)計(jì)
用戶(hù)界面的設(shè)計(jì),主要設(shè)計(jì)項(xiàng)目的頁(yè)面效果,小到一個(gè)按鈕,大到一個(gè)頁(yè)面布局,還有人機(jī)交互邏輯的體現(xiàn)。例如:
數(shù)據(jù)庫(kù)設(shè)計(jì)
需要設(shè)計(jì)當(dāng)前項(xiàng)目中涉及到哪些數(shù)據(jù)庫(kù),每一個(gè)數(shù)據(jù)庫(kù)里面包含哪些表,這些表結(jié)構(gòu)之間的關(guān)系是什么樣的,表結(jié)構(gòu)中包含哪些字段。例如:
接口設(shè)計(jì)
通過(guò)分析原型圖,首先,粗粒度地分析每個(gè)頁(yè)面有多少接口,然后,再細(xì)粒度地分析每個(gè)接口的傳入?yún)?shù),返回值參數(shù),同時(shí)明確接口路徑及請(qǐng)求方式
3 第3階段: 編碼
編寫(xiě)項(xiàng)目代碼、并完成單元測(cè)試。
項(xiàng)目代碼編寫(xiě):作為軟件開(kāi)發(fā)工程師,我們需要對(duì)項(xiàng)目的模塊功能分析后,進(jìn)行編碼實(shí)現(xiàn)。
單元測(cè)試:編碼實(shí)現(xiàn)完畢后,進(jìn)行單元測(cè)試,單元測(cè)試通過(guò)后再進(jìn)入到下一階段。例如:
4 第4階段: 測(cè)試
在該階段中主要由測(cè)試人員, 編寫(xiě)測(cè)試用例, 對(duì)部署在測(cè)試環(huán)境的項(xiàng)目進(jìn)行功能測(cè)試, 并出具測(cè)試報(bào)告。
5 第5階段: 上線運(yùn)維
在項(xiàng)目上線之前, 會(huì)由運(yùn)維人員準(zhǔn)備服務(wù)器上的軟件環(huán)境安裝、配置, 配置完畢后, 再將我們開(kāi)發(fā)好的項(xiàng)目,部署在服務(wù)器上運(yùn)行。
2. 角色分工
在對(duì)整個(gè)軟件開(kāi)發(fā)流程熟悉后, 我們還有必要了解一下在整個(gè)軟件開(kāi)發(fā)流程中涉及到的崗位角色,以及各個(gè)角色的職責(zé)分工。
在實(shí)際的項(xiàng)目中, 有一些項(xiàng)目組由于人員配置緊張, 可能并沒(méi)有專(zhuān)門(mén)的架構(gòu)師或測(cè)試人員, 這個(gè)時(shí)候可能需要有項(xiàng)目經(jīng)理或者程序員兼任
????????
3. 軟件環(huán)境
作為軟件開(kāi)發(fā)工程師,在編碼的過(guò)程中就不可避免地會(huì)接觸多種軟件環(huán)境,我們主要來(lái)分析在工作中經(jīng)常遇到的三套環(huán)境, 分別是: 開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境。 接下來(lái),我們分別介紹一下這三套環(huán)境的作用和特點(diǎn)。
1 開(kāi)發(fā)環(huán)境(development)
我們作為軟件開(kāi)發(fā)人員,在開(kāi)發(fā)階段使用的環(huán)境,就是開(kāi)發(fā)環(huán)境,一般外部用戶(hù)無(wú)法訪問(wèn)。
比如,我們?cè)陂_(kāi)發(fā)中使用的MySQL數(shù)據(jù)庫(kù)和其他的一些常用軟件,我們可以安裝在本地, 也可以安裝在一臺(tái)專(zhuān)門(mén)的服務(wù)器中, 這些應(yīng)用軟件僅僅在軟件開(kāi)發(fā)過(guò)程中使用, 項(xiàng)目測(cè)試、上線時(shí),我們不會(huì)使用這套環(huán)境了,這個(gè)環(huán)境就是開(kāi)發(fā)環(huán)境。
2 測(cè)試環(huán)境(testing)
當(dāng)軟件開(kāi)發(fā)工程師,將項(xiàng)目的功能模塊開(kāi)發(fā)完畢,并且單元測(cè)試通過(guò)后,就需要將項(xiàng)目部署到測(cè)試服務(wù)器上,讓測(cè)試人員對(duì)項(xiàng)目進(jìn)行測(cè)試。那這臺(tái)測(cè)試服務(wù)器就是專(zhuān)門(mén)給測(cè)試人員使用的環(huán)境, 也就是測(cè)試環(huán)境,用于項(xiàng)目測(cè)試,一般外部用戶(hù)無(wú)法訪問(wèn)。
3 生產(chǎn)環(huán)境(production)
當(dāng)項(xiàng)目開(kāi)發(fā)完畢,并且由測(cè)試人員測(cè)試通過(guò)之后,就可以上線項(xiàng)目,將項(xiàng)目部署到線上環(huán)境,并正式對(duì)外提供服務(wù),這個(gè)線上環(huán)境也稱(chēng)之為生產(chǎn)環(huán)境。
application-dev.yaml:配置 開(kāi)發(fā)環(huán)境的各種參數(shù),比如開(kāi)發(fā)環(huán)境的數(shù)據(jù)庫(kù)地址
application-test.yaml:配置 測(cè)試環(huán)境的各種參數(shù),比如測(cè)試環(huán)境的數(shù)據(jù)庫(kù)地址
application.prod.yaml:配置 生產(chǎn)環(huán)境的各種參數(shù),比如生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù)地址
程序部署到哪個(gè)環(huán)境,就激活對(duì)應(yīng)的配置文件:
-
java -jar -Dspring.profiles.active=dev xxx.jar 啟動(dòng)程序并激活dev環(huán)境的配置
二、蒼穹外賣(mài)項(xiàng)目介紹
到公司里邊,需要給你提供 遠(yuǎn)程倉(cāng)庫(kù)的地址、并給你的git帳號(hào)開(kāi)通權(quán)限。如果沒(méi)有權(quán)限,是不能克隆的
獲取本地倉(cāng)庫(kù):
-
克隆遠(yuǎn)程倉(cāng)庫(kù),得到本地倉(cāng)庫(kù)。 這種倉(cāng)庫(kù)里邊已經(jīng)包含了 遠(yuǎn)程倉(cāng)庫(kù)的地址信息
-
本地初始化倉(cāng)庫(kù),這種倉(cāng)庫(kù)沒(méi)有關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù),需要添加遠(yuǎn)程倉(cāng)庫(kù)的信息 git remote add 簡(jiǎn)稱(chēng)代號(hào) 地址
切換分支,在分支里編寫(xiě)代碼:
-
開(kāi)發(fā)中,通常是要完成一個(gè)功能,就先拉取一個(gè)分支;要修改一個(gè)bug,需要先拉取一個(gè)分支
-
在分支里編寫(xiě)代碼并提交,可以推送
-
把分支代碼合并到 主開(kāi)發(fā)分支
推送到遠(yuǎn)程倉(cāng)庫(kù):
-
推送到遠(yuǎn)程倉(cāng)庫(kù):git push origin 分支名
-
獲取最新的代碼:git pull origin 分支名
1. 項(xiàng)目介紹
本項(xiàng)目(蒼穹外賣(mài))是專(zhuān)門(mén)為餐飲企業(yè)(餐廳、飯店)定制的一款軟件產(chǎn)品,包括 系統(tǒng)管理后臺(tái) 和 小程序端應(yīng)用 兩部分。其中系統(tǒng)管理后臺(tái)主要提供給餐飲企業(yè)內(nèi)部員工使用,可以對(duì)餐廳的分類(lèi)、菜品、套餐、訂單、員工等進(jìn)行管理維護(hù),對(duì)餐廳的各類(lèi)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),同時(shí)也可進(jìn)行來(lái)單語(yǔ)音播報(bào)功能。小程序端主要提供給消費(fèi)者使用,可以在線瀏覽菜品、添加購(gòu)物車(chē)、下單、支付、催單等。
接下來(lái),通過(guò)功能架構(gòu)圖來(lái)展示管理端和用戶(hù)端的具體業(yè)務(wù)功能模塊。
1. 管理端功能
員工登錄/退出 , 員工信息管理 , 分類(lèi)管理 , 菜品管理 , 套餐管理 , 菜品口味管理 , 訂單管理 ,數(shù)據(jù)統(tǒng)計(jì),來(lái)單提醒。
2. 用戶(hù)端功能
微信登錄 , 收件人地址管理 , 用戶(hù)歷史訂單查詢(xún) , 菜品規(guī)格查詢(xún) , 購(gòu)物車(chē)功能 , 下單 , 支付、分類(lèi)及菜品瀏覽。
2. 產(chǎn)品原型
產(chǎn)品原型,用于展示項(xiàng)目的業(yè)務(wù)功能,一般由產(chǎn)品經(jīng)理進(jìn)行設(shè)計(jì)。
注意事項(xiàng): 產(chǎn)品原型主要用于展示項(xiàng)目的功能,并不是最終的頁(yè)面效果。
1. 管理端
餐飲企業(yè)內(nèi)部員工使用。 主要功能有:
2. 用戶(hù)端
移動(dòng)端應(yīng)用主要提供給消費(fèi)者使用。主要功能有:
3. 技術(shù)選型
關(guān)于本項(xiàng)目的技術(shù)選型, 我們將會(huì)從 用戶(hù)層、網(wǎng)關(guān)層、應(yīng)用層、數(shù)據(jù)層 這幾個(gè)方面進(jìn)行介紹,主要用于展示項(xiàng)目中使用到的技術(shù)框架和中間件等。
1). 用戶(hù)層
本項(xiàng)目中在構(gòu)建系統(tǒng)管理后臺(tái)的前端頁(yè)面,我們會(huì)用到H5、Vue.js、ElementUI、apache echarts(展示圖表)等技術(shù)。而在構(gòu)建移動(dòng)端應(yīng)用時(shí),我們會(huì)使用到微信小程序。
2). 網(wǎng)關(guān)層
Nginx是一個(gè)服務(wù)器,主要用來(lái)作為Http服務(wù)器,部署靜態(tài)資源,訪問(wèn)性能高。在Nginx中還有兩個(gè)比較重要的作用: 反向代理和負(fù)載均衡, 在進(jìn)行項(xiàng)目部署時(shí),要實(shí)現(xiàn)Tomcat的負(fù)載均衡,就可以通過(guò)Nginx來(lái)實(shí)現(xiàn)。
3). 應(yīng)用層
SpringBoot: 快速構(gòu)建Spring項(xiàng)目, 采用 "約定優(yōu)于配置" 的思想, 簡(jiǎn)化Spring項(xiàng)目的配置開(kāi)發(fā)。
SpringMVC:SpringMVC是spring框架的一個(gè)模塊,springmvc和spring無(wú)需通過(guò)中間整合層進(jìn)行整合,可以無(wú)縫集成。
Spring Task: 由Spring提供的定時(shí)任務(wù)框架。
httpclient: 主要實(shí)現(xiàn)了對(duì)http請(qǐng)求的發(fā)送。
Spring Cache: 由Spring提供的數(shù)據(jù)緩存框架
JWT: 用于對(duì)應(yīng)用程序上的用戶(hù)進(jìn)行身份驗(yàn)證的標(biāo)記。
阿里云OSS: 對(duì)象存儲(chǔ)服務(wù),在項(xiàng)目中主要存儲(chǔ)文件,如圖片等。
Swagger: 可以自動(dòng)的幫助開(kāi)發(fā)人員生成接口文檔,并對(duì)接口進(jìn)行測(cè)試。
POI: 封裝了對(duì)Excel表格的常用操作。
WebSocket: 一種通信網(wǎng)絡(luò)協(xié)議,使客戶(hù)端和服務(wù)器之間的數(shù)據(jù)交換更加簡(jiǎn)單,用于項(xiàng)目的來(lái)單、催單功能實(shí)現(xiàn)。
4). 數(shù)據(jù)層
MySQL: 關(guān)系型數(shù)據(jù)庫(kù), 本項(xiàng)目的核心業(yè)務(wù)數(shù)據(jù)都會(huì)采用MySQL進(jìn)行存儲(chǔ)。
Redis: 基于key-value格式存儲(chǔ)的內(nèi)存數(shù)據(jù)庫(kù), 訪問(wèn)速度快, 經(jīng)常使用它做緩存。
Mybatis: 本項(xiàng)目持久層將會(huì)使用Mybatis開(kāi)發(fā)。
pagehelper: 分頁(yè)插件。
spring data redis: 簡(jiǎn)化java代碼操作Redis的API。
5). 工具
git: 版本控制工具, 在團(tuán)隊(duì)協(xié)作中, 使用該工具對(duì)項(xiàng)目中的代碼進(jìn)行管理。
maven: 項(xiàng)目構(gòu)建工具。
junit:單元測(cè)試工具,開(kāi)發(fā)人員功能實(shí)現(xiàn)完畢后,需要通過(guò)junit對(duì)功能進(jìn)行單元測(cè)試。
postman: 接口測(cè)工具,模擬用戶(hù)發(fā)起的各類(lèi)HTTP請(qǐng)求,獲取對(duì)應(yīng)的響應(yīng)結(jié)果。
三、開(kāi)發(fā)環(huán)境搭建
開(kāi)發(fā)環(huán)境搭建主要包含前端環(huán)境和后端環(huán)境兩部分。作為服務(wù)端開(kāi)發(fā)工程師, 我們課程學(xué)習(xí)的重心應(yīng)該放在后端的業(yè)務(wù)代碼上, 前端的頁(yè)面我們只需要導(dǎo)入資料中的nginx, 前端頁(yè)面的代碼我們只需要能看懂即可。
1. 前端環(huán)境搭建
1). 前端工程基于 nginx
從資料中找到前端運(yùn)行環(huán)境的nginx,移動(dòng)到非中文目錄下。
sky目錄中存放了管理端的前端資源,具體如下:
2). 啟動(dòng)nginx,訪問(wèn)測(cè)試
雙擊 nginx.exe 即可啟動(dòng) nginx 服務(wù),訪問(wèn)端口號(hào)為 80
http://localhost:80
2. 后端環(huán)境搭建
1 熟悉項(xiàng)目結(jié)構(gòu)
1 使用idea打開(kāi)項(xiàng)目
后端工程基于 maven 進(jìn)行項(xiàng)目構(gòu)建,并且進(jìn)行分模塊開(kāi)發(fā)。
1). 從當(dāng)天資料中找到后端初始工程:
2). 用 IDEA 打開(kāi)初始工程,了解項(xiàng)目的整體結(jié)構(gòu):
2 項(xiàng)目結(jié)構(gòu)說(shuō)明
對(duì)工程的每個(gè)模塊作用說(shuō)明:
對(duì)項(xiàng)目整體結(jié)構(gòu)了解后,接下來(lái)我們?cè)敿?xì)分析上述的每個(gè)子模塊:
sky-common模塊
模塊中存放的是一些公共類(lèi),可以供其他模塊使用
分析sky-common模塊的每個(gè)包的作用:
sky-pojo模塊
模塊中存放的是一些 entity、DTO、VO
分析sky-pojo模塊的每個(gè)包的作用:
sky-server模塊
模塊中存放的是 配置文件、配置類(lèi)、攔截器、controller、service、mapper、啟動(dòng)類(lèi)等
2 Git版本控制
1 準(zhǔn)備遠(yuǎn)程倉(cāng)庫(kù)
1.訪問(wèn)Gitee - 基于 Git 的代碼托管和研發(fā)協(xié)作平臺(tái),新建倉(cāng)庫(kù)
2 初始化Git本地倉(cāng)庫(kù)
3 提交并推送到遠(yuǎn)程倉(cāng)庫(kù)
1) 準(zhǔn)備忽略文件
(2) 添加到暫存區(qū)
右鍵模塊? --? Git -- Add
(3) 提交到本地倉(cāng)庫(kù)
(4) 推送到遠(yuǎn)程倉(cāng)庫(kù)
成功推送至遠(yuǎn)程倉(cāng)庫(kù)
3 準(zhǔn)備數(shù)據(jù)庫(kù)環(huán)境
(1) 執(zhí)行SQL腳本
今天的資料中有數(shù)據(jù)庫(kù)腳本:
sql文件,到數(shù)據(jù)庫(kù)執(zhí)行
(2)?配置數(shù)據(jù)庫(kù)密碼
yml配置文件修改本地?cái)?shù)據(jù)庫(kù)賬戶(hù)和密碼
(3) 表的說(shuō)明
3. 前后端聯(lián)調(diào)和nginx
1 debug跟蹤登錄功能
后端的初始工程中已經(jīng)實(shí)現(xiàn)了登錄功能,直接進(jìn)行前后端聯(lián)調(diào)測(cè)試即可
實(shí)現(xiàn)思路:
2 nginx反向代理
對(duì)登錄功能測(cè)試完畢后,接下來(lái),我們思考一個(gè)問(wèn)題:前端發(fā)送的請(qǐng)求,是如何請(qǐng)求到后端服務(wù)的?
前端請(qǐng)求地址:http://localhost/api/employee/login
后端接口地址:http://localhost:8080/admin/employee/login
很明顯,兩個(gè)地址不一致,那是如何請(qǐng)求到后端服務(wù)的呢?
nginx介紹
nginx:Engine X,俄羅斯人開(kāi)發(fā)的一個(gè)軟件,早期作為郵件收發(fā)的服務(wù)器代理。隨著后來(lái)的發(fā)展,也提供了其它的功能:
-
部署靜態(tài)資源,供客戶(hù)端訪問(wèn)
-
作為反向代理服務(wù)器,實(shí)現(xiàn)負(fù)載均衡
-
作為郵件收發(fā)的服務(wù)器
(1) 反向代理介紹
nginx 反向代理,就是將前端發(fā)送的動(dòng)態(tài)請(qǐng)求由 nginx 轉(zhuǎn)發(fā)到后端服務(wù)器
那為什么不直接通過(guò)瀏覽器直接請(qǐng)求后臺(tái)服務(wù)端,需要通過(guò)nginx反向代理呢?
(2) nginx反向代理的好處【重點(diǎn)】
-
提高訪問(wèn)速度
因?yàn)閚ginx本身可以進(jìn)行緩存,如果訪問(wèn)的同一接口,并且做了數(shù)據(jù)緩存,nginx就直接可把數(shù)據(jù)返回,不需要真正地訪問(wèn)服務(wù)端,從而提高訪問(wèn)速度。
-
進(jìn)行負(fù)載均衡
所謂負(fù)載均衡,就是把大量的請(qǐng)求按照我們指定的方式均衡的分配給集群中的每臺(tái)服務(wù)器。
-
保證后端服務(wù)安全
因?yàn)橐话愫笈_(tái)服務(wù)地址不會(huì)暴露,所以使用瀏覽器不能直接訪問(wèn),可以把nginx作為請(qǐng)求訪問(wèn)的入口,請(qǐng)求到達(dá)nginx后轉(zhuǎn)發(fā)到具體的服務(wù)中,從而保證后端服務(wù)的安全。
(3) nginx反向代理的配置
nginx 反向代理的配置方式:
server{listen 80;server_name localhost;location /api/{proxy_pass http://localhost:8080/admin/; #反向代理}
}
proxy_pass:該指令是用來(lái)設(shè)置代理服務(wù)器的地址,可以是主機(jī)名稱(chēng),IP地址加端口號(hào)等形式。
如上代碼的含義是:監(jiān)聽(tīng)80端口號(hào), 然后當(dāng)我們?cè)L問(wèn) http://localhost:80/api/../..這樣的接口的時(shí)候,它會(huì)通過(guò) location /api/ {} 這樣的反向代理到 http://localhost:8080/admin/上來(lái)。
# 反向代理,處理管理端發(fā)送的請(qǐng)求
location /api/ {proxy_pass http://localhost:8080/admin/;#proxy_pass http://webservers/admin/;
}
當(dāng)在訪問(wèn)http://localhost/api/employee/login,nginx接收到請(qǐng)求后轉(zhuǎn)到http://localhost:8080/admin/,故最終的請(qǐng)求地址為http://localhost:8080/admin/employee/login,和后臺(tái)服務(wù)的訪問(wèn)地址一致。
(4) nginx負(fù)載均衡的配置
當(dāng)如果服務(wù)以集群的方式進(jìn)行部署時(shí),那nginx在轉(zhuǎn)發(fā)請(qǐng)求到服務(wù)器時(shí)就需要做相應(yīng)的負(fù)載均衡。其實(shí),負(fù)載均衡從本質(zhì)上來(lái)說(shuō)也是基于反向代理來(lái)實(shí)現(xiàn)的,最終都是轉(zhuǎn)發(fā)請(qǐng)求。
nginx 負(fù)載均衡的配置方式:
upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;
}
server{listen 80;server_name localhost;location /api/{proxy_pass http://webservers/admin;#負(fù)載均衡}
}
upstream:如果代理服務(wù)器是一組服務(wù)器的話(huà),我們可以使用upstream指令配置后端服務(wù)器組。
如上代碼的含義是:監(jiān)聽(tīng)80端口號(hào), 然后當(dāng)我們?cè)L問(wèn) http://localhost:80/api/../..這樣的接口的時(shí)候,它會(huì)通過(guò) location /api/ {} 這樣的反向代理到 http://webservers/admin,根據(jù)webservers名稱(chēng)找到一組服務(wù)器,根據(jù)設(shè)置的負(fù)載均衡策略(默認(rèn)是輪詢(xún))轉(zhuǎn)發(fā)到具體的服務(wù)器。
注:upstream后面的名稱(chēng)可自定義,但要上下保持一致。
nginx 負(fù)載均衡策略:
輪詢(xún):
輪詢(xún):
? ?upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;}
weight:
upstream webservers{server 192.168.100.128:8080 weight=9;server 192.168.100.129:8080 weight=1; }
ip_hash:
upstream webservers{ip_hash;server 192.168.100.128:8080;server 192.168.100.129:8080; }
least_conn:
upstream webservers{least_conn;server 192.168.100.128:8080;server 192.168.100.129:8080; }
url_hash:
upstream webservers{hash &request_uri;server 192.168.100.128:8080;server 192.168.100.129:8080; }
fair:
upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;fair; }
正向代理:指客戶(hù)端的代理,服務(wù)端不知道(無(wú)感知的)=>VPN翻(非法)
反向代理;指服務(wù)端的代理,客戶(hù)端不知道(無(wú)感知的)
3.3 nginx小結(jié)
nginx的作用:
-
部署靜態(tài)資源,作為靜態(tài)資源服務(wù)器
-
作為反向代理,實(shí)現(xiàn)負(fù)載均衡
nginx要部署靜態(tài)資源:把靜態(tài)資源直接放到nginx的html目錄里
nginx要作為反向代理,并實(shí)現(xiàn)負(fù)載均衡:要修改nginx.conf
nginx負(fù)載均衡策略:
-
輪詢(xún):默認(rèn)策略,不配置負(fù)載均衡策略就是輪詢(xún)。把請(qǐng)求輪流分發(fā)到不同的目標(biāo)服務(wù)器上
-
weith:權(quán)重模式,給每個(gè)目標(biāo)服務(wù)器設(shè)置權(quán)重值,值越大,被分發(fā)到請(qǐng)求的機(jī)率就越高
-
ip_hash:ip哈希,相同ip的客戶(hù)端的請(qǐng)求,始終被分配到某一臺(tái)服務(wù)器上
-
url_hash:url哈希,相同請(qǐng)求路徑url的請(qǐng)求,始終被分配到某一臺(tái)服務(wù)器上
-
least_conn:最少連接,哪個(gè)服務(wù)器正在處理的請(qǐng)求少,就分配到哪個(gè)服務(wù)器上
-
fair:公平模式,哪個(gè)服務(wù)器響應(yīng)時(shí)間短,說(shuō)明服務(wù)器性能好,就多處理一些請(qǐng)求
4. 完善登錄功能
數(shù)據(jù)不允許存取名文密碼,安全不達(dá)標(biāo)
使用MD5算法對(duì)明文密碼加密
注意:MD5算法,不是加密算法,是數(shù)據(jù)摘要算法。在計(jì)算轉(zhuǎn)換過(guò)程中,會(huì)丟棄一部分原始數(shù)據(jù)。
特點(diǎn):
-
不可逆。有密文,不可能通過(guò)算法還原出來(lái)明文
-
一個(gè)明文 經(jīng)過(guò)MD5計(jì)算的結(jié)果,總是不變的
所以:MD5不可逆,但并不是不可破解。破解的方式:準(zhǔn)備彩虹表,就是 常用明文密碼和對(duì)應(yīng)的MD5結(jié)果
將來(lái):會(huì)使用 MD5 + 鹽 進(jìn)一步提升安全性,提升破解的難度
-
修改數(shù)據(jù)庫(kù)中明文密碼,改為MD5加密后的密文
打開(kāi)employee表,修改密碼。明文密碼123456,對(duì)應(yīng)的md5值是:e10adc3949ba59abbe56e057f20f883e
-
修改Java代碼,前端提交的密碼進(jìn)行MD5加密后再跟數(shù)據(jù)庫(kù)中密碼比對(duì)
打開(kāi)EmployeeServiceImpl.java,修改比對(duì)密碼
四、導(dǎo)入接口文檔
前后端分離
將課程資料中提供的項(xiàng)目接口導(dǎo)入YApi。訪問(wèn)地址:【YApi非常慢】YApi Pro-高效、易用、功能強(qiáng)大的可視化接口管理平臺(tái),注冊(cè)帳號(hào)并登錄
選擇蒼穹外賣(mài)-管理端接口.json導(dǎo)入
五、Swagger
1. 介紹
Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)(API Documentation & Design Tools for Teams | Swagger)。 它的主要作用是:
-
使得前后端分離開(kāi)發(fā)更加方便,有利于團(tuán)隊(duì)協(xié)作。
-
接口的文檔在線自動(dòng)生成,降低后端開(kāi)發(fā)人員編寫(xiě)接口文檔的負(fù)擔(dān)。
如果開(kāi)發(fā)中接口和早期設(shè)計(jì)的接口不同,不需要花很多時(shí)間重新編寫(xiě)接口文檔,Swagger會(huì)根據(jù)代碼直接生成接口文檔
-
功能測(cè)試
Spring已經(jīng)將Swagger納入自身的標(biāo)準(zhǔn),建立了Spring-swagger項(xiàng)目,現(xiàn)在叫Springfox。通過(guò)在項(xiàng)目中引入Springfox ,即可非常簡(jiǎn)單快捷的使用Swagger。
knife4j是為Java MVC框架集成Swagger生成Api文檔的增強(qiáng)解決方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一樣小巧,輕量,并且功能強(qiáng)悍!
目前,一般都使用knife4j框架。
2. 使用步驟
-
導(dǎo)入 knife4j 的maven坐標(biāo)
在sky-pojo模塊的pom.xml中添加依賴(lài)(已添加)
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
在配置類(lèi)中加入 knife4j 相關(guān)配置
在sky-server模塊中找到配置類(lèi)com.sky.config.WebMvcConfiguration
,添加內(nèi)容:
/*** 通過(guò)knife4j生成接口文檔* @return
*/@Beanpublic Docket docket() {ApiInfo apiInfo = new ApiInfoBuilder().title("蒼穹外賣(mài)項(xiàng)目接口文檔").version("2.0").description("蒼穹外賣(mài)項(xiàng)目接口文檔").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage("com.sky.controller")).paths(PathSelectors.any()).build();return docket;}/*** 設(shè)置靜態(tài)資源映射* @param registry
*/
protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
訪問(wèn)測(cè)試
接口文檔訪問(wèn)路徑為 http://ip:port/doc.html ---> http://localhost:8080/doc.html
思考:通過(guò) Swagger 就可以生成接口文檔,那么我們就不需要 Yapi 了?
1、Yapi 是設(shè)計(jì)階段使用的工具,管理和維護(hù)接口
2、Swagger 在開(kāi)發(fā)階段使用的框架,幫助后端開(kāi)發(fā)人員做后端的接口測(cè)試
3. 常用注解
通過(guò)注解可以控制生成的接口文檔,使接口文檔擁有更好的可讀性,常用注解如下:
補(bǔ)充:參數(shù)不是實(shí)參類(lèi):在形參上加 @ApiParam("參數(shù)描述")
//實(shí)體類(lèi)
@ApiModel(description = "員工登錄時(shí)傳遞的數(shù)據(jù)模型")
public class EmployeeLoginDTO implements Serializable {}//實(shí)體類(lèi)
@ApiModel(description = "員工登錄返回的數(shù)據(jù)格式")
public class EmployeeLoginVO implements Serializable {//實(shí)體類(lèi)的變量@ApiModelProperty("主鍵值")private Long id;@ApiModelProperty("用戶(hù)名")private String userName;@ApiModelProperty("姓名")private String name;@ApiModelProperty("jwt令牌")private String token;}--------------------------//Controller類(lèi)
@Api(tags = "員工相關(guān)接口")
public class EmployeeController {//Controller類(lèi)類(lèi)里的方法@ApiOperation("員工退出")public Result<String> logout() {}}
在啟動(dòng)服務(wù):訪問(wèn)http://localhost:8080/doc.html
4. yapi和Swagger的區(qū)別
兩者的共同點(diǎn):都是API接口文檔
不同點(diǎn):
-
YApi側(cè)重于功能開(kāi)發(fā)之前,設(shè)置API接口;Swagger側(cè)重于功能實(shí)現(xiàn)之后,生成接口文檔
-
YApi僅僅是設(shè)計(jì)接口,可以給前端用于Mock測(cè)試;Swagger可以給后端開(kāi)發(fā)人員,用于功能測(cè)試
5. 小結(jié)
項(xiàng)目如果整合了Swagger,在開(kāi)發(fā)中需要添加注解:
-
Controller類(lèi)上加注解
@Api(tags="Controller類(lèi)的描述")
-
Controller類(lèi)里方法上加注解
@ApiOperation("方法的描述")
-
Controller類(lèi)里方法參數(shù):
-
參數(shù)是實(shí)體類(lèi)
實(shí)體類(lèi)上加
@ApiModel(decription="實(shí)體類(lèi)的描述")
類(lèi)里的各種屬性上加
@ApiModelProperty("屬性的描述")
-
參數(shù)不是實(shí)參類(lèi):在形參上加
@ApiParam("參數(shù)描述")
-
Swagger會(huì)根據(jù)我們代碼里配置的注解,自動(dòng)生成接口文檔;也可以直接進(jìn)行功能測(cè)試