Day20_学成在线项目就业指导
1 學(xué)成在線是個(gè)什么樣的項(xiàng)目?
1.1 項(xiàng)目背景
受互聯(lián)網(wǎng)+概念的催化,當(dāng)今中國(guó)在線教育市場(chǎng)的發(fā)展可謂是百花齊放、如火如荼。 按照市場(chǎng)領(lǐng)域細(xì)分為:學(xué)前教 育、K12教育、高等教育、留學(xué)教育、職業(yè)教育、語(yǔ)言教育、興趣教育以及綜合平臺(tái),其中,職業(yè)教育和語(yǔ)言教育 的市場(chǎng)優(yōu)勢(shì)突出。 根據(jù)Analysys易觀發(fā)布的數(shù)據(jù)顯示,預(yù)計(jì)2019年中國(guó)互聯(lián)網(wǎng)教育市場(chǎng)交易規(guī)模將達(dá)到3718億元 人民幣,未來(lái)三年互聯(lián)網(wǎng)教育市場(chǎng)規(guī)模保持高速增長(zhǎng)。
學(xué)成在線借鑒了MOOC(大型開(kāi)放式網(wǎng)絡(luò)課程,即MOOC(massive open online courses))的設(shè)計(jì)思想,是一 個(gè)提供IT職業(yè)課程在線學(xué)習(xí)的平臺(tái),它為即將和已經(jīng)加入IT領(lǐng)域的技術(shù)人才提供在線學(xué)習(xí)服務(wù),用戶通過(guò)在線學(xué) 習(xí)、在線練習(xí)、在線考試等學(xué)習(xí)內(nèi)容,最終掌握所學(xué)的IT技能,并能在工作中熟練應(yīng)用。
當(dāng)前市場(chǎng)的在線教育模式多種多樣,包括:B2C、C2C、B2B2C等業(yè)務(wù)模式,學(xué)成在線采用B2B2C業(yè)務(wù)模式,即向 企業(yè)或個(gè)人提供在線教育平臺(tái)和學(xué)生完成教學(xué)活動(dòng),市場(chǎng)上類(lèi)似的平臺(tái)有:網(wǎng)易云課堂、騰訊課堂等,學(xué)成在線的 特點(diǎn)是IT職業(yè)課程在線教學(xué)。
1.2 項(xiàng)目的功能模塊
學(xué)成在線是一個(gè)在線教育平臺(tái),提供IT職業(yè)課程在線學(xué)習(xí),平臺(tái)包括:門(mén)戶、學(xué)習(xí)中心、教學(xué)管理中心、系統(tǒng)管理 中心、社交系統(tǒng)等子系統(tǒng)。
項(xiàng)目的功能架構(gòu)如下圖:
門(mén)戶是整個(gè)平臺(tái)的入口,功能包括:門(mén)戶首頁(yè)、注冊(cè)/登錄、課程搜索、職業(yè)規(guī)劃,客服等。
學(xué)習(xí)中心為用戶提供在線學(xué)習(xí)服務(wù),包括:我的課程、視頻點(diǎn)播、視頻直播、在線考試、在線答疑、學(xué)習(xí)統(tǒng)計(jì)等功 能;
教學(xué)管理中心為教育機(jī)構(gòu)或個(gè)人講師提供教學(xué)管理功能,包括:課程管理、媒資管理、考試管理、問(wèn)答管理等功 能;
系統(tǒng)管理中心提供系統(tǒng)參數(shù)配置、CMS、數(shù)據(jù)字典、分類(lèi)管理等功能。
1.3 項(xiàng)目的技術(shù)架構(gòu)
項(xiàng)目采用前后端分離的技術(shù)架構(gòu),前端采用vue.js技術(shù)棧,服務(wù)端采用SpringBoot、SpringCloud等Spring全家桶 技術(shù)棧。
具體見(jiàn)問(wèn)題2.
2 項(xiàng)目采用什么技術(shù)架構(gòu)?
項(xiàng)目采用前后端分離的技術(shù)架構(gòu),前端采用vue.js構(gòu)建,服務(wù)端采用Spring Cloud微服務(wù)架構(gòu),系統(tǒng)分為用戶層、 CDN、負(fù)載均衡、前端UI、微服務(wù)層、數(shù)據(jù)層、接口層及DevOps等部分組成,下圖是完整的技術(shù)架構(gòu)圖:
業(yè)務(wù)流程舉例:
1、用戶可以通過(guò)pc、手機(jī)等客戶端訪問(wèn)系統(tǒng)進(jìn)行在線學(xué)習(xí)。
2、 系統(tǒng)應(yīng)用CDN技術(shù),對(duì)一些圖片、CSS、視頻等資源從CDN調(diào)度訪問(wèn)。
3、所有的請(qǐng)求全部經(jīng)過(guò)負(fù)載均衡器。
4、對(duì)于PC、H5等客戶端請(qǐng)求,首先請(qǐng)求UI層,渲染用戶界面。
5、客戶端UI請(qǐng)求服務(wù)層獲取進(jìn)行具體的業(yè)務(wù)操作。
6、服務(wù)層將數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)。
下圖是技術(shù)架構(gòu)簡(jiǎn)圖:
1、用戶層
用戶層描述了本系統(tǒng)所支持的客戶端用戶有哪些,本項(xiàng)目目前為各用戶提供服務(wù),包括H5、PC、Android和IOS 等。
2 、CDN全稱(chēng)Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò),本系統(tǒng)所有靜態(tài)資源全部通過(guò)CDN加速來(lái)提高訪問(wèn)速 度。系統(tǒng)靜態(tài)資源包括:html頁(yè)面、js文件、css文件、image圖片、pdf和ppt及doc教學(xué)文檔、video視頻等。
3 、負(fù)載均衡系統(tǒng)的CDN層、UI層、服務(wù)層及數(shù)據(jù)層均設(shè)置了負(fù)載均衡服務(wù),系統(tǒng)采用LVS+Nginx實(shí)現(xiàn)負(fù)載均衡均 衡。
4、 UI層
UI層描述了系統(tǒng)向pc用戶、app用戶、h5用戶提供的產(chǎn)品界面。本項(xiàng)目在PC和H5端采用vue.js+elementUI 實(shí)現(xiàn)。
5、 微服務(wù)層將系統(tǒng)服務(wù)分類(lèi)三類(lèi):前端服務(wù)、后端服務(wù)及系統(tǒng)服務(wù)。
前端服務(wù):主要為學(xué)習(xí)用戶提供學(xué)習(xí)服務(wù)。
后端服務(wù):主要為管理用戶提供教學(xué)管理服務(wù)。
系統(tǒng)服務(wù):公共服務(wù),為系統(tǒng)的所有微服務(wù)提供公共服務(wù)功能。
6、外部系統(tǒng)接口 包括如下接口:
1)第三方登錄接口,如QQ、微博、微信等。
2)支付寶、微信支付接口
3)短信接口 (阿里大于)
4)郵件接 口,通過(guò)smpt郵件服務(wù)器對(duì)外發(fā)送電子郵件。
5)微信公眾號(hào)
6)點(diǎn)播、直播。
7)OSS存儲(chǔ)
8)CDN,使用最里 云CDN服務(wù)加速視頻訪問(wèn)速度。
7、DevOps提供了本系統(tǒng)開(kāi)發(fā)、運(yùn)營(yíng)、維護(hù)支撐的系統(tǒng),包括如下內(nèi)容:
Eureka服務(wù)治理中心:提供服務(wù)治理服務(wù),包括:服務(wù)注冊(cè)、服務(wù)獲取等。
Docker容器化部署服務(wù):將本系統(tǒng)所有服務(wù)采用容器化部署方式。
Maven項(xiàng)目管理工具:提供管理項(xiàng)目所有的Java包依賴(lài)、項(xiàng)目工程打包服務(wù)。
Git/GitLab代碼管理服務(wù):提供git代碼管理服務(wù)。
Spring Boot Admin服務(wù)健康監(jiān)控:監(jiān)控微服務(wù)的健康狀態(tài)、會(huì)話數(shù)量、并發(fā)數(shù)等。
2.1 微服務(wù)技術(shù)棧
所有微服務(wù)基于Spring Boot、Spring Cloud構(gòu)建
1)控制層:
Spring MVC、Spring Security Oauth2 、Swagger
2)業(yè)務(wù)層:
事務(wù)控制:Spring
任務(wù)處理:Spring Task
數(shù)據(jù)緩存:Spring Data Redis
消息隊(duì)列:Spring RabbitTemplate
搜索: Elasticsearch
持久層:
操作MySQL:MyBatis、com.alibaba.druid(采用druid-spring-boot-starter)Spring Data Jpa 操作MongoDB:Spring Data Mongodb
數(shù)據(jù)層,采用MySQL和MongoDb存儲(chǔ)數(shù)據(jù),MySQL存儲(chǔ)用戶、課程等系統(tǒng)核心信息,MongoDb存儲(chǔ) cms、配置信息等
2.2 接口定義規(guī)范
項(xiàng)目架構(gòu)設(shè)立接口層,接口層使用swagger注解描述接口的內(nèi)容,接口定義規(guī)范如下:
1、請(qǐng)求
get 請(qǐng)求時(shí),前端請(qǐng)求key/value串,SpringMVC采用基本數(shù)據(jù)類(lèi)型(String、Integer等)或自定義類(lèi)型接收。
Post請(qǐng)求時(shí),前端請(qǐng)F(tuán)orm表單數(shù)據(jù)(application/x-www-form-urlencoded)和Json數(shù)據(jù)(Content-Type=application/json)、多部件類(lèi)型數(shù)據(jù)(multipart/form-data),對(duì)于Json數(shù)據(jù)SpringMVC使用 @RequestBody注解解析請(qǐng)求的json數(shù)據(jù)。
2、響應(yīng)
響應(yīng)結(jié)果統(tǒng)一信息為:是否成功、操作代碼、提示信息及自定義數(shù)據(jù)。
響應(yīng)結(jié)果統(tǒng)一格式為json。
2.3 注冊(cè)中心
兩臺(tái)Eureka Server互相注冊(cè),組成高可用。
微服務(wù)向Eureka Server注冊(cè)自己,并在遠(yuǎn)程調(diào)用時(shí)從微服務(wù)發(fā)現(xiàn)目標(biāo)服務(wù)地址。
微服務(wù)遠(yuǎn)程調(diào)用采用客戶端負(fù)載均衡技術(shù),使用Feign Client。
2.4 網(wǎng)關(guān)
網(wǎng)關(guān)的作用是負(fù)載均衡、路由轉(zhuǎn)發(fā)、請(qǐng)求過(guò)過(guò)濾等。
項(xiàng)目中網(wǎng)關(guān)與Nginx配合使用。
2.5 項(xiàng)目使用Spring了嗎?用了它的哪些東西?
項(xiàng)目是基于Spring進(jìn)行構(gòu)建的:
1、所有的微服務(wù)開(kāi)發(fā)采用Spring Boot開(kāi)發(fā)
2、數(shù)據(jù)層使用Spring Data JPA、Spring Data MongoDB、Spring Data redis
3、業(yè)務(wù)層使用Spring來(lái)控制本地事務(wù),還使用了Spring Task任務(wù)調(diào)度框架、Spring AMQP組件等。
4、控制層使用SpringMVC、Sprnig Security Oauth2。
5、微服務(wù)管理使用Spring Cloud的Eureka注冊(cè)中心,微服務(wù)之間調(diào)用使用Ribbon和Feign Client完成。
6、使用Zuul網(wǎng)關(guān)完成微服務(wù)安全驗(yàn)證
2.6 Spring Cloud是怎么使用的?
此問(wèn)題通常是在回答了項(xiàng)目的技術(shù)架構(gòu)后被問(wèn)及,根據(jù)具體的使用Spring Cloud完成微服務(wù)開(kāi)發(fā)的步驟來(lái)回答即 可。
1、每個(gè)微服務(wù)使用Spring Boot開(kāi)發(fā),每個(gè)微服務(wù)工程包括了web、service、dao三層,這和開(kāi)發(fā)一般的項(xiàng)目沒(méi)有 區(qū)別:
a、web層使用Spring MVC實(shí)現(xiàn),對(duì)外暴露API接口給前端調(diào)用。
b、service層就是根據(jù)業(yè)務(wù)邏輯編寫(xiě)JavaBean,并使用Spring的聲明式事務(wù)控制方式來(lái)控制事務(wù)。
c、dao層就是數(shù)據(jù)訪問(wèn)接口,來(lái)訪問(wèn)MySQL和Mongodb,訪問(wèn)MySQL使用Spring Data JPA和Mybatis,訪問(wèn) mongodb使用Spring data mongodb。
2、微服務(wù)開(kāi)發(fā)完成要向Eureka注冊(cè)中心注冊(cè),以便被其它微服務(wù)查找和訪問(wèn)。
3、微服務(wù)與微服務(wù)之間使用feign來(lái)調(diào)用,feign Client具有負(fù)載均衡的作用。只需要在接口上聲明@FeignClient注解,Spring底層會(huì)產(chǎn)生動(dòng)態(tài)代理對(duì)象,使用ribbon客戶端完成調(diào)用。
4、前端訪問(wèn)微服務(wù)需要通過(guò)網(wǎng)關(guān),網(wǎng)關(guān)使用Nginx和Zuul來(lái)實(shí)現(xiàn),Nginx是最前邊的負(fù)載均衡,通過(guò)Nginx之后便 到達(dá)了Zuul,項(xiàng)目中Zuul的功能是過(guò)慮用戶請(qǐng)求,判斷用戶身份,對(duì)于一些對(duì)外公開(kāi)的微服務(wù)則需要經(jīng)過(guò)Zuul,直接通過(guò)Nginx負(fù)載均衡即可訪問(wèn)。
2.7 Spring Data JPA 和 MyBatis為什么兩個(gè)都用?具體怎么用的?
此問(wèn)題是考察對(duì)數(shù)據(jù)訪問(wèn)接口的使用程度。
項(xiàng)目中使用Spring Data JPA和MyBatis都是用來(lái)訪問(wèn)MySQL,但是它們的分工不同:
Spring Data JPA是Spring 提供的一套JPA接口,使用Spring Data JPA主要完成一些簡(jiǎn)單的增、刪、改、查功能。
對(duì)于復(fù)雜的查詢功能會(huì)使用MyBatis編寫(xiě)SQL語(yǔ)言來(lái)實(shí)現(xiàn),因?yàn)槭褂肧pring Data JPA來(lái)做一些復(fù)雜的查詢是沒(méi)有 MyBatis方便的,Spring Data JPA是面向的對(duì)象,而MyBatis直接面向SQL語(yǔ)句。
2.8 什么雪崩?如何解決?
容錯(cuò)保護(hù)是指微服務(wù)在執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤并從錯(cuò)誤中恢復(fù)的能力。微服務(wù)容錯(cuò)性不好很容易導(dǎo)致雪崩效應(yīng),什么 是雪崩效應(yīng)?摘自百度百科中的定義:
微服務(wù)的雪崩效應(yīng)表現(xiàn)在服務(wù)與服務(wù)之間調(diào)用,當(dāng)其中一個(gè)服務(wù)無(wú)法提供服務(wù)可能導(dǎo)致其它服務(wù)也死掉,比如:?jiǎn)?點(diǎn)登錄服務(wù)調(diào)用用戶信息服務(wù)查詢用戶信息,由于用戶信息服務(wù)無(wú)法提供服務(wù)導(dǎo)致單點(diǎn)登錄服務(wù)一直等待,從而導(dǎo) 致用戶登錄、用戶退出功能無(wú)法使用,像這樣由一個(gè)服務(wù)所引起的一連串的多個(gè)服務(wù)無(wú)法提供服務(wù)即是微服務(wù)的雪 崩效應(yīng)。
Spring Cloud Hystrix 是基于Net?ix的開(kāi)源框架Hystrix的整合,它實(shí)現(xiàn)了斷路保護(hù)、線程隔離、信號(hào)隔離等容錯(cuò)
功能。
斷路保護(hù):
斷路保護(hù)就類(lèi)似家庭電路中的保險(xiǎn)絲,當(dāng)電路過(guò)載時(shí)保險(xiǎn)絲會(huì)自動(dòng)切斷,保護(hù)整個(gè)電路的安全。微服務(wù)的斷路保護(hù) 的工作原理是當(dāng)請(qǐng)求微服務(wù)失敗的數(shù)量達(dá)到一定比例時(shí)會(huì)切換為開(kāi)路狀態(tài),當(dāng)請(qǐng)求微服務(wù)時(shí)就直接返回結(jié)果不再請(qǐng) 求微服務(wù),當(dāng)保持開(kāi)路狀態(tài)一段時(shí)間后判斷微服務(wù)是否可以正常請(qǐng)求,如果正常則切換到半開(kāi)路狀態(tài),最后切換到 哪閉路狀態(tài)。
具體的操作方法可以采用 Fallback,會(huì)每個(gè)FeignClient方法調(diào)用Fallback,當(dāng)出現(xiàn)開(kāi)路則調(diào)用Fallback方法返回錯(cuò) 誤結(jié)果。
線程隔離:
調(diào)用微服務(wù)使用不同的線程池,線程池之間互不影響,即使某個(gè)服務(wù)不可用也不影響其它服務(wù)的調(diào)用,比如:對(duì)商 品服務(wù)的調(diào)用使用一個(gè)線程池,對(duì)用戶服務(wù)的調(diào)用使用另一個(gè)線程池,即使用戶服務(wù)不可用也不影響商品服務(wù)的調(diào) 用。
2.9 視圖層用什么技術(shù)實(shí)現(xiàn)?
此問(wèn)題問(wèn)的較模糊,沒(méi)有問(wèn)是客戶端的視圖還是服務(wù)端的視圖,所以此問(wèn)題不光是視圖技術(shù)還是考察你對(duì)前后端分 離的理解。
1、視圖層在前端和服務(wù)端都存在。
2、前端視圖采用vue.js+elementUI產(chǎn)品界面。
3、服務(wù)端都是暴露的rest接口,統(tǒng)一用json展示數(shù)據(jù)。
2.10 接口是怎么定義的?采用什么數(shù)據(jù)格式?如何實(shí)現(xiàn)?
本問(wèn)題考察前后端分離開(kāi)發(fā)中接口定義技能。
1、接口定義
使用 SpringMVC編寫(xiě)Controller方法,對(duì)外暴露Http接口,在Controller方法上使用RequestMapping、 PostMapping、GetMapping等注解定義Http接口。
2、采用什么數(shù)據(jù)格式?
分別說(shuō)明請(qǐng)求和響應(yīng):
請(qǐng)求:
get 請(qǐng)求時(shí),前端請(qǐng)求key/value串,SpringMVC采用基本數(shù)據(jù)類(lèi)型(String、Integer等)或自定義類(lèi)型接收。
Post請(qǐng)求時(shí),前端請(qǐng)F(tuán)orm表單數(shù)據(jù)(application/x-www-form-urlencoded)和Json數(shù)據(jù)(Content-Type=application/json)、多部件類(lèi)型數(shù)據(jù)(multipart/form-data),對(duì)于Json數(shù)據(jù)SpringMVC使用 @RequestBody注解解析請(qǐng)求的json數(shù)據(jù)。
響應(yīng):
統(tǒng)一響應(yīng)json格式。
3、如何實(shí)現(xiàn)的?
json格式數(shù)據(jù)SpringMVC采用FastJson解析為對(duì)象。
非json格式數(shù)據(jù)SpringMVC提供參數(shù)綁定的方法,將key/value或Form-Data數(shù)據(jù)轉(zhuǎn)換為對(duì)象或基本數(shù)據(jù)類(lèi)型的變 量。
3 前后端開(kāi)發(fā)時(shí)具體流程是什么?
前后端分離開(kāi)發(fā)模式在互聯(lián)網(wǎng)公司最常見(jiàn),特別是一些大型的互聯(lián)網(wǎng)公司,但是一些傳統(tǒng)的軟件開(kāi)發(fā)企業(yè)仍然是采 用傳統(tǒng)開(kāi)發(fā)模式,此問(wèn)題被問(wèn)及是考察你有沒(méi)有真正體會(huì)前端開(kāi)發(fā)的好處。
1、前端與后端開(kāi)發(fā)人員討論確定接口。
接口討論通過(guò),形成接口文檔 。
本項(xiàng)目專(zhuān)門(mén)設(shè)立一個(gè)api工程,在此工程定義接口,Spring Boot 集成Swagger,生成Swagger接口,前后端開(kāi)發(fā) 人員通過(guò)html查看接口文檔的內(nèi)容。
2、前端與后端開(kāi)發(fā)人員按照接口文檔進(jìn)行開(kāi)發(fā)。
開(kāi)發(fā)過(guò)程中各自進(jìn)行單元測(cè)試。
前端人員怎么進(jìn)行單元測(cè)試?
前端人員可以通過(guò)一些工具生成一些模擬數(shù)據(jù),比如:EasyMock。
有興趣的同學(xué)可自行查閱資料研究。
3、雙方功能開(kāi)發(fā)完成進(jìn)行前后端聯(lián)調(diào)。
閱讀:https://github.com/phodal/fe/blob/master/chapters/chapter-13.md
3.1 前端采用什么技術(shù)棧?
前端工程大多為單頁(yè)面應(yīng)用(SPA),采用vue.js框架開(kāi)發(fā),搜索功能前端采用nuxt.js服務(wù)端渲染(SSR)框架開(kāi) 發(fā)。
技術(shù)棧包括:
1、node.js 2、vue.js 3、npm/cnpm 4、webpack 5、axios 6、nuxt.js
4 CMS頁(yè)面管理
CMS (Content Management System)即內(nèi)容管理系統(tǒng),本項(xiàng)目對(duì)CMS系統(tǒng)的定位是對(duì)各各網(wǎng)站(子站點(diǎn))頁(yè) 面的管理,本項(xiàng)目的CMS系統(tǒng)不去管理每個(gè)子網(wǎng)站的全部資源,比如:圖片、CSS、html頁(yè)面等,主要管理由于運(yùn) 營(yíng)需要而經(jīng)常變動(dòng)的頁(yè)面,從而滿足根據(jù)運(yùn)營(yíng)需要快速開(kāi)發(fā)、上線的需求。
功能包括:
1、站點(diǎn)管理,站點(diǎn)就是本項(xiàng)目各各子網(wǎng)站,站點(diǎn)信息包括:站點(diǎn)名稱(chēng)、站點(diǎn)域名、端口、服務(wù)器物理路徑等
2、模板管理,由于要對(duì)頁(yè)面進(jìn)行靜態(tài)化,使用freemarker引擎技術(shù),所以需要定義模板。
3、頁(yè)面管理,包括:頁(yè)面添加、頁(yè)面修改、頁(yè)面刪除等操作。
4、頁(yè)面預(yù)覽,對(duì)頁(yè)面靜態(tài)化,在瀏覽器預(yù)覽頁(yè)面靜態(tài)化內(nèi)容。
5、頁(yè)面發(fā)布,將頁(yè)面靜態(tài)化后發(fā)布到所屬站點(diǎn)服務(wù)器。
4.1 GirdFS是什么?工作原理是什么?如何使用?
GridFS是MongoDB提供的用于持久化存儲(chǔ)文件的模塊,它可以作為分布式文件系統(tǒng)使用,CMS子系統(tǒng)將頁(yè)面文 件、模板文件存儲(chǔ)到GridFS中,由于本項(xiàng)目使用MongoDB,選用GridFS可以快速集成開(kāi)發(fā)。
它的工作原理是:
在GridFS存儲(chǔ)文件是將文件分塊存儲(chǔ),文件會(huì)按照256KB的大小分割成多個(gè)塊進(jìn)行存儲(chǔ),GridFS使用兩個(gè)集合 (collection)存儲(chǔ)文件,一個(gè)集合是chunks, 用于存儲(chǔ)文件的二進(jìn)制數(shù)據(jù);一個(gè)集合是?les,用于存儲(chǔ)文件的元數(shù) 據(jù)信息(文件名稱(chēng)、塊大小、上傳時(shí)間等信息)。
從GridFS中讀取文件要對(duì)文件的各各塊進(jìn)行組裝、合并。
使用方法是:
使用Spring data mongodb包下提供的GridFsTemplate訪問(wèn)GirdFS。
gridFsTemplate.findone() 查詢文件
gridFsTemplate.delete() 刪除文件
gridFsTemplate.store()存儲(chǔ)文件
4.2 MQ 是怎么使用的?
1、平臺(tái)包括多個(gè)站點(diǎn),頁(yè)面歸屬不同的站點(diǎn),需求是發(fā)布一個(gè)頁(yè)面應(yīng)將該頁(yè)面發(fā)布到所屬站點(diǎn)的服務(wù)器上。
2、每個(gè)站點(diǎn)服務(wù)部署CMS Client程序,并與交換機(jī)綁定,綁定時(shí)指定站點(diǎn)Id為routingKey。 指定站點(diǎn)id為routingKey就可以實(shí)現(xiàn)cms client只能接收到所屬站點(diǎn)的頁(yè)面發(fā)布消息。
3、頁(yè)面發(fā)布程序向MQ發(fā)布消息時(shí)指定頁(yè)面所屬站點(diǎn)Id為routingKey,根據(jù)routingKey將消息發(fā)給指定的 CMS Client。
4.3 頁(yè)面發(fā)布的結(jié)果如何收集?
每次發(fā)布會(huì)在數(shù)據(jù)庫(kù)記錄發(fā)布日志,每個(gè)CMS Client完成頁(yè)面發(fā)布會(huì)上報(bào)發(fā)布結(jié)果。
1、在站點(diǎn)管理中配置了每個(gè)站點(diǎn)的服務(wù)器信息
2、在每次發(fā)布頁(yè)面時(shí)會(huì)記錄發(fā)布日志(服務(wù)器ID、頁(yè)面ID、頁(yè)面名稱(chēng)、發(fā)布結(jié)果)
3、CMS Client完成頁(yè)面發(fā)布后會(huì)向數(shù)據(jù)上報(bào)發(fā)布結(jié)果。
4、用戶通過(guò)查詢發(fā)布日志表的信息就可以知道每一次的發(fā)布結(jié)果(哪些服務(wù)器頁(yè)面發(fā)布成功,哪些發(fā)布失敗)。
5 課程管理
5.1 為什么用多張表存儲(chǔ)課程信息?
1、課程信息比較復(fù)雜,為了方便教學(xué)機(jī)構(gòu)按步驟管理課程信息,并且也可以劃分權(quán)限管理課程信息,將課程信息 管理功能分為課程基本信息管理、課程圖片管理、課程營(yíng)銷(xiāo)信息管、課程計(jì)劃管理等模塊。
2、將課程信息分開(kāi)也是為了系統(tǒng)擴(kuò)展需要,如果將課程所有信息存儲(chǔ)在一張表中將不利于系統(tǒng)擴(kuò)展。
5.2 課程圖片是如何管理的?
見(jiàn)問(wèn)題“圖片服務(wù)器”。
6 媒資管理
每個(gè)教學(xué)機(jī)構(gòu)都可以在媒資系統(tǒng)管理自己的教學(xué)資源,包括:視頻、教案等文件。
媒資管理的主要管理對(duì)象是課程錄播視頻,包括:媒資文件的查詢、視頻上傳、視頻刪除、視頻處理等。
媒資查詢:教學(xué)機(jī)構(gòu)查詢自己所擁有的媒體文件。
視頻上傳:將用戶線下錄制的教學(xué)視頻上傳到媒資系統(tǒng)。
視頻處理:視頻上傳成功,系統(tǒng)自動(dòng)對(duì)視頻進(jìn)行編碼處理。
視頻刪除 :如果該視頻已不再使用,可以從媒資系統(tǒng)刪除。
6.1 如何上傳大文件?
前端使用WebUploader將文件分塊,調(diào)用服務(wù)端分塊上傳接口上傳分塊文件,分塊上傳完畢前端請(qǐng)求服務(wù)端進(jìn)行 合并,當(dāng)上傳過(guò)程中斷再次進(jìn)行上傳時(shí)服務(wù)端判斷分塊是否已經(jīng)上傳,已經(jīng)上傳的分塊不再重新上傳。
6.2 如何進(jìn)行視頻處理?
上圖所示,Java程序調(diào)用?mpeg及流媒體程序員提供的視頻處理類(lèi)庫(kù)(C程序)完成avi、mp4視頻轉(zhuǎn)成m3u8格式 的視頻。
Java程序使用Jdk提供的Process Builder調(diào)用?mpeg及C程序進(jìn)行視頻處理。
Process Builder可以調(diào)用第三方程序,在java程序運(yùn)行時(shí)啟動(dòng)第三方程序進(jìn)程。
視頻處理完成,Java程序捕獲第三方程序的輸出日志,解析出視頻處理完成標(biāo)記,更新視頻處理狀態(tài)為已完成。
6.3 CDN 內(nèi)容分發(fā)是什么?
視頻處理完成會(huì)在中心媒體服務(wù)器保存一份,另外通過(guò)CDN程序?qū)⒁曨l發(fā)布到邊緣媒體服務(wù)器,用戶點(diǎn)播視頻通 過(guò)CDN請(qǐng)求邊緣媒體服務(wù)器中的視頻,提高了視頻播放速度。
具體使用的是第三方公司的CDN服務(wù)。
7 搜索
項(xiàng)目中課程搜索采用ElasticSearch來(lái)完成。
實(shí)現(xiàn)方法是:
1、使用 Logstash(logstash是ES下的一款開(kāi)源軟件,它能夠同時(shí) 從多個(gè)來(lái)源采集數(shù)據(jù)、轉(zhuǎn)換數(shù)據(jù))將MySQL中 的課程信息讀取到ES中創(chuàng)建索引,使用IK分詞器進(jìn)行分詞。
2、使用 Java High Level REST Client完成搜索。
3、生產(chǎn)環(huán)境使用ES部署為集群。
8 圖片服務(wù)器
本項(xiàng)目采用fastDFS分布式系統(tǒng)作為圖片服務(wù)器。
FastDFS是用c語(yǔ)言編寫(xiě)的一款開(kāi)源的分布式文件系統(tǒng),適合小文件的存儲(chǔ)。
FastDFS包括 Tracker server和Storageserver。客戶端請(qǐng)求Tracker server進(jìn)行文件上傳、下載,通過(guò)Tracker server調(diào)度向Storage server完成文件上傳和下載。
使用FastDSF官方提供的Java API實(shí)現(xiàn)。
圖片服務(wù)使用Nginx作為代理服務(wù)器,對(duì)Storage上部署的Nginx完成負(fù)載均衡請(qǐng)求。
8.1 使用FastDFS的好處是什么?
FastDFS相比其它的分布式文件系統(tǒng)它適用小文件存儲(chǔ),它不對(duì)文件進(jìn)行分塊存儲(chǔ),也不用對(duì)文件進(jìn)行合并處理, 所以性能比GFS、HDFS等通用文件系統(tǒng)的性能要高。
8.2 圖片上傳流程?
執(zhí)行流程如下:
1、管理員進(jìn)入教學(xué)管理前端,點(diǎn)擊上傳圖片
2、圖片上傳至文件系統(tǒng)服務(wù),文件系統(tǒng)請(qǐng)求fastDFS上傳文件
3、文件系統(tǒng)將文件入庫(kù),存儲(chǔ)到文件系統(tǒng)服務(wù)數(shù)據(jù)庫(kù)中
4、文件系統(tǒng)服務(wù)向前端返回文件上傳結(jié)果,如果成功則包括文件的Url路徑
5、課程管理前端請(qǐng)求課程管理進(jìn)行保存課程圖片信息到課程數(shù)據(jù)庫(kù)
6、課程管理服務(wù)將課程圖片保存在課程數(shù)據(jù)庫(kù)
8.3 FastDFS 支持?jǐn)帱c(diǎn)續(xù)傳嗎?
FastDFS支付斷點(diǎn)續(xù)傳,在Api中有append_?le1方法就是用來(lái)實(shí)現(xiàn)斷點(diǎn)續(xù)傳的,本項(xiàng)目沒(méi)有使用FastDFS的斷點(diǎn)續(xù) 傳功能。
9 認(rèn)證授權(quán)是如何實(shí)現(xiàn)的?
本項(xiàng)目采用 Spring security + Oauth2完成用戶認(rèn)證及用戶授權(quán)。認(rèn)證授權(quán)流程如下:
1、用戶請(qǐng)求認(rèn)證服務(wù)完成身份認(rèn)證。
2、認(rèn)證服務(wù)下發(fā)用戶身份令牌和JWT令牌,擁有身份令牌表示身份合法,Jwt令牌用于完成授權(quán)。
3、用戶攜帶jwt令牌請(qǐng)求資源服務(wù)。
4、網(wǎng)關(guān)校驗(yàn)用戶身份令牌的合法,不合法表示用戶沒(méi)有登錄,如果合法則放行繼續(xù)訪問(wèn)。
5、資源服務(wù)獲取jwt令牌,根據(jù)jwt令牌完成授權(quán)。
10 事務(wù)是怎么控制的?用到分布式事務(wù)控制了嗎?如何做的?
此問(wèn)題考察對(duì)事務(wù)的理解和應(yīng)用程度。
1、在微服務(wù)中使用Spring 聲明式事務(wù)控制方式進(jìn)行控制,在Service方法上添加@Transctional注解即可實(shí)現(xiàn)事務(wù) 控制,它控制的是MySQL的本地事務(wù)。
2、項(xiàng)目中大量存在分布式事務(wù)控制,比如下單支付、課程發(fā)布等地址都用到了分布式事務(wù)。
本項(xiàng)目實(shí)現(xiàn)分布式事務(wù)控制實(shí)現(xiàn)最終數(shù)據(jù)一致性,做法是:
a、將分布式事務(wù)拆分為多個(gè)本地事務(wù)。
b、提交事務(wù)前每個(gè)參與者要通過(guò)數(shù)據(jù)校驗(yàn),和資源預(yù)留。
c、由消息隊(duì)列去通知多個(gè)事務(wù)參與者完成本地事務(wù)的提交。
d、提交失敗的本地事務(wù)會(huì)重試。
11 一個(gè)接口出現(xiàn)Bug你是怎么調(diào)試的?
1、接口的開(kāi)發(fā)需要前端和服務(wù)端共同調(diào)試,要仔細(xì)閱讀測(cè)試人員反映的bug信息,判斷這個(gè)bug是服務(wù)端的bug還 是前端的bug。通常服務(wù)接口開(kāi)發(fā)完成會(huì)使用postman工具進(jìn)行測(cè)試,測(cè)試沒(méi)有問(wèn)題再提交到Git或SVN。
2、找到bug的出錯(cuò)點(diǎn)就可以根據(jù)bug信息進(jìn)行修改。
3、修改完成需要前后端再次連調(diào)測(cè)試,按照測(cè)試人員提交的測(cè)試流程重新進(jìn)行測(cè)試,測(cè)試通過(guò)將此bug置為已解 決。
12 做過(guò)支付接口嗎?你是如何做的?遇到什么問(wèn)題嗎?
根據(jù)自己的實(shí)際情況回答是否做過(guò)。
如果做過(guò)支付接口則要回答實(shí)現(xiàn)過(guò)程:
1、系統(tǒng)中收費(fèi)的課程需要用戶在線支付,支付接口采用微信的掃碼支付。
2、拿到需求后,確定使用微信支付,首先去閱讀微信的接口文檔,這里重點(diǎn)閱讀統(tǒng)一下單、支付結(jié)果通知、支付 結(jié)果查詢?nèi)齻€(gè)接口。
3、下載官方提供的sdk編寫(xiě)單元測(cè)試用例測(cè)試每個(gè)接口。測(cè)試時(shí)沒(méi)有使用微信的沙箱測(cè)試,直接使用正式接口,我 們將金額改的小一些進(jìn)行測(cè)試。
4、單元測(cè)試通過(guò)后開(kāi)發(fā)整個(gè)支付功能,最終集成測(cè)試通過(guò)。
根據(jù)自己的實(shí)際情況回答開(kāi)發(fā)中遇到的問(wèn)題:
例子:
接口參數(shù)的簽名問(wèn)題,當(dāng)時(shí)是因?yàn)樽约簺](méi)有仔細(xì)看接口文檔導(dǎo)致少寫(xiě)一個(gè)必填參數(shù)一直報(bào)簽名失敗,隨后將所有必 填參數(shù)填寫(xiě)完成,最終解決問(wèn)題。
13系統(tǒng)的異常是怎么處理的?
系統(tǒng)對(duì)異常的處理使用統(tǒng)一的異常處理流程。
1、自定義異常類(lèi)型。
2、自定義錯(cuò)誤代碼及錯(cuò)誤信息。
3、對(duì)于可預(yù)知的異常由程序員在代碼中主動(dòng)拋出自定義異常類(lèi)型的異常,拋出異常時(shí)需要指定錯(cuò)誤代碼。
4、對(duì)于不可預(yù)知的異常(運(yùn)行時(shí)異常)由SpringMVC統(tǒng)一捕獲Exception類(lèi)型的異常,由統(tǒng)一的異常捕獲類(lèi)來(lái)解析 處理,并轉(zhuǎn)換為與自定義異常類(lèi)型一致的信息格式(錯(cuò)誤代碼+錯(cuò)誤信息)。
5、可預(yù)知的異常及不可預(yù)知的運(yùn)行時(shí)異常最終會(huì)采用統(tǒng)一的信息格式(錯(cuò)誤代碼+錯(cuò)誤信息)來(lái)表示,最終也會(huì)隨 請(qǐng)求響應(yīng)給客戶端。
14 使用消息隊(duì)列了嗎?如何使用的?有哪些應(yīng)用場(chǎng)景?
項(xiàng)目使用RabbitMQ消息隊(duì)列。
RabbitMQ提供很多的工作模式,如下:
1、Work queues 2、Publish/Subscribe 3、Routing 4、Topics 5、Header 6、RPC
項(xiàng)目主要使用了Routing模式。
Routing模式即路由模式,使用方法是:
1、每個(gè)消費(fèi)者監(jiān)聽(tīng)自己的隊(duì)列,并且設(shè)置routingkey。
2、生產(chǎn)者將消息發(fā)給交換機(jī),由交換機(jī)根據(jù)routingkey來(lái)轉(zhuǎn)發(fā)消息到指定的隊(duì)列。
有哪些應(yīng)用場(chǎng)景?
1 、任務(wù)異步處理。
將不需要同步處理的并且耗時(shí)長(zhǎng)的操作由消息隊(duì)列通知消息接收方進(jìn)行異步處理。提高了應(yīng)用程序的響應(yīng)時(shí)間。
2、應(yīng)用程序解耦合
MQ相當(dāng)于一個(gè)中介,生產(chǎn)方通過(guò)MQ與消費(fèi)方交互,它將應(yīng)用程序進(jìn)行解耦合。
15 視頻點(diǎn)播功能是怎么實(shí)現(xiàn)的?
本項(xiàng)目采用 HLS 技術(shù)實(shí)現(xiàn)視頻點(diǎn)播。
1、使用FFmpeg對(duì)視頻進(jìn)行編碼處理,生成m3u8文件及ts文件。
2、使用Nginx作為媒體服務(wù)器。
3、客戶端使用video.js播放視頻。
16 你在開(kāi)發(fā)中遇到什么問(wèn)題?是怎么解決的?
此問(wèn)題考察開(kāi)發(fā)人員的問(wèn)題描述及問(wèn)題解決能力,可列舉開(kāi)發(fā)中實(shí)際的技術(shù)問(wèn)題。
回答此問(wèn)題要從兩個(gè)方面來(lái)回答:
1、問(wèn)題的描述
2、問(wèn)題的解決方案
例子:
在處理訂單時(shí)要用到定時(shí)任務(wù),當(dāng)時(shí)采用的是Spring Task來(lái)完成,由于一個(gè)訂單服務(wù)會(huì)部署多個(gè),多個(gè)訂單服務(wù) 同時(shí)去處理任務(wù)會(huì)造成任務(wù)被重復(fù)處理的情況,如何解決任務(wù)的重復(fù)處理。
解決:
采用樂(lè)觀鎖解決,在任務(wù)表中設(shè)置一個(gè)version字段記錄版本號(hào),取出任務(wù)記錄同時(shí)拿到任務(wù)的版本號(hào),執(zhí)行前對(duì) 任務(wù)進(jìn)行鎖定,具體的做法是執(zhí)行update根據(jù)當(dāng)前版本號(hào)將版本號(hào)加1,update成功表示鎖定任務(wù)成功,即可開(kāi)始執(zhí)行任務(wù)。
總結(jié)
以上是生活随笔為你收集整理的Day20_学成在线项目就业指导的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中用于获取当前目录的是_py
- 下一篇: 《饥困荒野》暗影操控器制作配方及作用-饥