日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java开发实战项目分享之学成在线v1.0项目总结

發布時間:2024/5/14 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java开发实战项目分享之学成在线v1.0项目总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

學成在線項目是傳智燕青老師研發的JavaEE分布式微服務架構項目,采用SpringCloud框架研發,課程共20天,應廣大學員的建議現將整個項目的技術點以問題的形式進行總結,方便大家學習總結。

1 學成在線是個什么樣的項目?

從兩個方面進行闡述:

1)項目的功能(業務)

? 學成在線是一個在線教育平臺,提供IT職業課程在線學習,平臺包括:門戶、學習中心、教學管理中心、系統管理中心、社交系統等子系統,如下圖:

門戶是整個平臺的入口,功能包括:門戶首頁、注冊/登錄、課程搜索、職業規劃,客服等。

? 學習中心為用戶提供在線學習服務,包括:我的課程、視頻點播、視頻直播、在線考試、在線答疑、學習統計等功能;

? 教學管理中心為教育機構或個人講師提供教學管理功能,包括:課程管理、媒資管理、考試管理、問答管理等功能;

? 系統管理中心提供系統參數配置、CMS、數據字典、分類管理等功能。

2)項目采用的技術架構

項目采用前后端分離的技術架構,前端采用vue.js技術棧,服務端采用Spring Cloud構建各各微服務。

具體見問題2.

2 項目采用什么技術架構?

? 項目采用前后端分離的技術架構,前端采用vue.js構建,服務端采用Spring Cloud微服務架構,系統分為用戶層、CDN、負載均衡、前端UI、微服務層、數據層、接口層及DevOps等部分組成,如下圖:

1、用戶層

用戶層描述了本系統所支持的客戶端用戶有哪些,本項目目前為各用戶提供服務,包括H5、PC、Android和IOS等。

2 CDN全稱Content Delivery Network,即內容分發網絡,本系統所有靜態資源全部通過CDN加速來提高訪問速度。系統靜態資源包括:html頁面、js文件、css文件、image圖片、pdf和ppt及doc教學文檔、video視頻等。

3 負載均衡 系統的CDN層、UI層、服務層及數據層均設置了負載均衡服務,系統采用LVS+Nginx實現負載均衡均衡。

4 UI層 UI層描述了系統向pc用戶、app用戶、h5用戶提供的產品界面。本項目在PC和H5端采用vue.js+elementUI實現。

5 微服務層將系統服務分類三類:前端服務、后端服務及系統服務。 前端服務:主要為學習用戶提供學習服務。 后端服務:主要為管理用戶提供教學管理服務。 系統服務:公共服務,為系統的所有微服務提供公共服務功能。

7 外部系統接口 包括如下接口:

1)第三方登錄接口,如QQ、微博、微信等。 2)支付寶、微信支付接口 3)短信接口 (阿里大于)4)郵件接口,通過smpt郵件服務器對外發送電子郵件。 5)微信公眾號 6)點播、直播。 7)OSS存儲 8)CDN,使用最里云CDN服務加速視頻訪問速度。

8 DevOps提供了本系統開發、運營、維護支撐的系統,包括如下內容:

Eureka服務治理中心:提供服務治理服務,包括:服務注冊、服務獲取等。

Docker容器化部署服務:將本系統所有服務采用容器化部署方式。

Maven項目管理工具:提供管理項目所有的Java包依賴、項目工程打包服務。

Git/GitLab代碼管理服務:提供git代碼管理服務。

Spring Boot Admin服務健康監控:監控微服務的健康狀態、會話數量、并發數等。

2.1 微服務技術棧

所有微服務基于Spring Boot、Spring Cloud構建

1)控制層:

Spring MVC、Spring Security Oauth2 、Swagger

2)業務層:

事務控制:Spring

任務處理:Spring Task

數據緩存:Spring Data Redis

消息隊列:Spring RabbitTemplate

搜索: Elasticsearch

  • 持久層:
  • 操作MySQL:MyBatis、com.alibaba.druid(采用druid-spring-boot-starter)Spring Data Jpa

    操作MongoDB:Spring Data Mongodb

  • 數據層,采用MySQL和MongoDb存儲數據,MySQL存儲用戶、課程等系統核心信息,MongoDb存儲
  • cms、配置信息等。

    2.2 接口定義規范

    項目架構設立接口層,接口層使用swagger注解描述接口的內容,接口定義規范如下:

    1、請求

    get 請求時,前端請求key/value串,SpringMVC采用基本數據類型(String、Integer等)或自定義類型接收。

    Post請求時,前端請Form表單數據(application/x-www-form-urlencoded)和Json數據(Content-Type=application/json)、多部件類型數據(multipart/form-data),對于Json數據SpringMVC使用@RequestBody注解解析請求的json數據。

    2、響應

    響應結果統一信息為:是否成功、操作代碼、提示信息及自定義數據。

    響應結果統一格式為json。

    2.3 注冊中心

    兩臺Eureka Server互相注冊,組成高可用。

    微服務向Eureka Server注冊自己,并在遠程調用時從微服務發現目標服務地址。


    微服務遠程調用采用客戶端負載均衡技術,使用Feign Client。

    2.4 網關

    網關的作用是負載均衡、路由轉發、請求過慮等。

    項目中網關與Nginx配合使用。

    2.5 項目使用Spring了嗎?用了它的哪些東西?

    項目是基于Spring進行構建的:

    1、所有的微服務開發采用Spring Boot開發

    3、數據層使用Spring Data JPA、Spring Data MongoDB、Spring Data redis。

    4、業務層使用Spring來控制本地事務,還使用了Spring Task任務調度框架、Spring AMQP組件等。

    5、控制使用SpringMVC、Sprnig Security Oauth2。

    6、微服務管理使用Spring Cloud的Eureka注冊中心,微服務之間調用使用Ribbon和Feign Client完成。

    7、使用Zuul網關完成微服務安全驗證

    2.6 Spring Cloud是怎么使用的?

    此問題通常是在回答了項目的技術架構后被問及,根據具體的使用Spring Cloud完成微服務開發的步驟來回答即可。

    1、每個微服務使用Spring Boot開發,每個微服務工程包括了web、service、dao三層,這和開發一般的項目沒有區別:

    ? a、web層使用Spring MVC實現,對外暴露API接口給前端調用。

    ? b、service層就是根據業務邏輯編寫JavaBean,并使用Spring的聲明式事務控制方式來控制事務。

    ? c、dao層就是數據訪問接口,來訪問MySQL和Mongodb,訪問MySQL使用Spring Data JPA和Mybatis,訪問mongodb使用Spring data mongodb。

    2、微服務開發完成要向Eureka注冊中心注冊,以便被其它微服務查找和訪問。

    3、微服務與微服務之間使用feign來調用,feign Client具有負載均衡的作用。只需要在接口上聲明@FeignClient注解,Spring底層會產生動態代理對象,使用ribbon客戶端完成調用。

    4、前端訪問微服務需要通過網關,網關使用Nginx和Zuul來實現,Nginx是最前邊的負載均衡,通過Nginx之后便到達了Zuul,項目中Zuul的功能是過慮用戶請求,判斷用戶身份,對于一些對外公開的微服務則需要經過Zuul,直接通過Nginx負載均衡即可訪問。

    2.7 Spring Data JPA 和 MyBatis為什么兩個都用?具體怎么用的?

    此問題是考察對數據訪問接口的使用程度。

    項目中使用Spring Data JPA和MyBatis都是用來訪問MySQL,但是它們的分工不同:

    Spring Data JPA是Spring 提供的一套JPA接口,使用Spring Data JPA主要完成一些簡單的增、刪、改、查功能。

    對于復雜的查詢功能會使用MyBatis編寫SQL語言來實現,因為使用Spring Data JPA來做一些復雜的查詢是沒有MyBatis方便的,Spring Data JPA是面向的對象,而MyBatis直接面向SQL語句。

    2.8 什么雪崩?如何解決?

    ? 容錯保護是指微服務在執行過程中出現錯誤并從錯誤中恢復的能力。微服務容錯性不好很容易導致雪崩效應,什么是雪崩效應?摘自百度百科中的定義:

    微服務的雪崩效應表現在服務與服務之間調用,當其中一個服務無法提供服務可能導致其它服務也死掉,比如:單點登錄服務調用用戶信息服務查詢用戶信息,由于用戶信息服務無法提供服務導致單點登錄服務一直等待,從而導致用戶登錄、用戶退出功能無法使用,像這樣由一個服務所引起的一連串的多個服務無法提供服務即是微服務的雪崩效應。

    Spring Cloud Hystrix 是基于Netflix的開源框架Hystrix的整合,它實現了斷路保護、線程隔離、信號隔離等容錯功能。

    ? 斷路保護:

    ? 斷路保護就類似家庭電路中的保險絲,當電路過載時保險絲會自動切斷,保護整個電路的安全。微服務的斷路保護的工作原理是當請求微服務失敗的數量達到一定比例時會切換為開路狀態,當請求微服務時就直接返回結果不再請求微服務,當保持開路狀態一段時間后判斷微服務是否可以正常請求,如果正常則切換到半開路狀態,最后切換到哪閉路狀態。


    具體的操作方法可以采用 Fallback,會每個FeignClient方法調用Fallback,當出現開路則調用Fallback方法返回錯誤結果。

    ? 線程隔離:

    ? 調用微服務使用不同的線程池,線程池之間互不影響,即使某個服務不可用也不影響其它服務的調用,比如:對商品服務的調用使用一個線程池,對用戶服務的調用使用另一個線程池,即使用戶服務不可用也不影響商品服務的調用。

    ?

    2.9 視圖層用什么技術實現?

    此問題問的較模糊,沒有問是客戶端的視圖還是服務端的視圖,所以此問題不光是視圖技術還是考察你對前后端分離的理解。

    1、視圖層在前端和服務端都存在。

    2、前端視圖采用vue.js+elementUI產品界面。

    3、服務端都是暴露的rest接口,統一用json展示數據。

    2.10 接口是怎么定義的?采用什么數據格式?如何實現?
    本問題考察前后端分離開發中接口定義技能。

    1、接口定義

    使用SpringMVC編寫Controller方法,對外暴露Http接口,在Controller方法上使用RequestMapping、PostMapping、GetMapping等注解定義Http接口。

    2、采用什么數據格式?

    分別說明請求和響應:

    請求:

    ? get 請求時,前端請求key/value串,SpringMVC采用基本數據類型(String、Integer等)或自定義類型接收。

    Post請求時,前端請Form表單數據(application/x-www-form-urlencoded)和Json數據(Content-Type=application/json)、多部件類型數據(multipart/form-data),對于Json數據SpringMVC使用@RequestBody注解解析請求的json數據。

    響應:

    ? 統一響應json格式。

    3、如何實現的?

    json格式數據SpringMVC采用FastJson解析為對象。

    非json格式數據SpringMVC提供參數綁定的方法,將key/value或Form-Data數據轉換為對象或基本數據類型的變量。

    3 前后端開發時具體流程是什么?

    ? 前后端分離開發模式在互聯網公司最常見,特別是一些大型的互聯網公司,但是一些傳統的軟件開發企業仍然是采用傳統開發模式,此問題被問及是考察你有沒有真正體會前端開發的好處。

    1、前端與后端開發人員討論確定接口。

    接口討論通過,形成接口文檔 。

    本項目專門設立一個api工程,在此工程定義接口,Spring Boot 集成Swagger,生成Swagger接口,前后端 開發人員通過html查看接口文檔的內容。

    2、前端與后端開發人員按照接口文檔進行開發。

    開發過程中各自進行單元測試。

    前端人員怎么進行單元測試?

    前端人員可以通過一些工具生成一些模擬數據,比如:EasyMock。

    有興趣的同學可自行查閱資料研究。

    3、雙方功能開發完成進行前后端聯調。

    閱讀:https://github.com/phodal/fe/blob/master/chapters/chapter-13.md

    4 CMS頁面管理

    ? CMS (Content Management System)即內容管理系統,本項目對CMS系統的定位是對各各網站(子站點)頁面的管理,本項目的CMS系統不去管理每個子網站的全部資源,比如:圖片、CSS、html頁面等,主要管理由于運營需要而經常變動的頁面,從而滿足根據運營需要快速開發、上線的需求。

    功能包括:

    1、站點管理,站點就是本項目各各子網站,站點信息包括:站點名稱、站點域名、端口、服務器物理路徑等。

    2、模板管理,由于要對頁面進行靜態化,使用freemarker引擎技術,所以需要定義模板。

    3、頁面管理,包括:頁面添加、頁面修改、頁面刪除等操作。

    4、頁面預覽,對頁面靜態化,在瀏覽器預覽頁面靜態化內容。

    5、頁面發布,將頁面靜態化后發布到所屬站點服務器。

    4.1 GirdFS是什么?工作原理是什么?如何使用?

    ? GridFS是MongoDB提供的用于持久化存儲文件的模塊,它可以作為分布式文件系統使用,CMS子系統將頁面文件、模板文件存儲到GridFS中,由于本項目使用MongoDB,選用GridFS可以快速集成開發。

    ? 它的工作原理是:

    ? 在GridFS存儲文件是將文件分塊存儲,文件會按照256KB的大小分割成多個塊進行存儲,GridFS使用兩個集合(collection)存儲文件,一個集合是chunks, 用于存儲文件的二進制數據;一個集合是files,用于存儲文件的元數據信息(文件名稱、塊大小、上傳時間等信息)。

    ? 從GridFS中讀取文件要對文件的各各塊進行組裝、合并。

    使用方法是:

    ? 使用Spring data mongodb包下提供的GridFsTemplate訪問GirdFS。

    gridFsTemplate.findone() 查詢文件
    gridFsTemplate.delete() 刪除文件
    gridFsTemplate.store()存儲文件

    4.2 MQ是怎么使用的?


    1、平臺包括多個站點,頁面歸屬不同的站點,需求是發布一個頁面應將該頁面發布到所屬站點的服務器上。

    2、每個站點服務部署CMS Client程序,并與交換機綁定,綁定時指定站點Id為routingKey。

    指定站點id為routingKey就可以實現cms client只能接收到所屬站點的頁面發布消息。

    3、頁面發布程序向MQ發布消息時指定頁面所屬站點Id為routingKey,根據routingKey將消息發給指定的

    CMS Client。

    4.3 頁面發布的結果如何收集?

    每次發布會在數據庫記錄發布日志,每個CMS Client完成頁面發布會上報發布結果。

    1、在站點管理中配置了每個站點的服務器信息

    2、在每次發布頁面時會記錄發布日志(服務器ID、頁面ID、頁面名稱、發布結果)

    3、CMS Client完成頁面發布后會向數據上報發布結果。

    4、用戶通過查詢發布日志表的信息就可以知道每一次的發布結果(哪些服務器頁面發布成功,哪些發布失敗)。

    5 課程管理

    5.1 為什么用多張表存儲課程信息?

    1、課程信息比較復雜,為了方便教學機構按步驟管理課程信息,并且也可以劃分權限管理課程信息,將課程信息管理功能分為課程基本信息管理、課程圖片管理、課程營銷信息管、課程計劃管理等模塊。

    2、將課程信息分開也是為了系統擴展需要,如果將課程所有信息存儲在一張表中將不利于系統擴展。

    5.2 課程圖片是如何管理的?
    見問題“圖片服務器”。

    6 媒資管理

    每個教學機構都可以在媒資系統管理自己的教學資源,包括:視頻、教案等文件。

    媒資管理的主要管理對象是課程錄播視頻,包括:媒資文件的查詢、視頻上傳、視頻刪除、視頻處理等。

    媒資查詢:教學機構查詢自己所擁有的媒體文件。

    視頻上傳:將用戶線下錄制的教學視頻上傳到媒資系統。

    視頻處理:視頻上傳成功,系統自動對視頻進行編碼處理。

    視頻刪除 :如果該視頻已不再使用,可以從媒資系統刪除。

    6.1 如何上傳大文件?

    ? 前端使用WebUploader將文件分塊,調用服務端分塊上傳接口上傳分塊文件,分塊上傳完畢前端請求服務端進行合并,當上傳過程中斷再次進行上傳時服務端判斷分塊是否已經上傳,已經上傳的分塊不再重新上傳。

    6.2 如何進行視頻處理?

    上圖所示,Java程序調用ffmpeg及流媒體程序員提供的視頻處理類庫(C程序)完成avi、mp4視頻轉成m3u8格式的視頻。

    Java程序使用Jdk提供的Process Builder調用ffmpeg及C程序進行視頻處理。

    Process Builder可以調用第三方程序,在java程序運行時啟動第三方程序進程。

    視頻處理完成,Java程序捕獲第三方程序的輸出日志,解析出視頻處理完成標記,更新視頻處理狀態為已完成。

    6.3 CDN 內容分發是什么?

    ? 視頻處理完成會在中心媒體服務器保存一份,另外通過CDN程序將視頻發布到邊緣媒體服務器,用戶點播視頻通過CDN請求邊緣媒體服務器中的視頻,提高了視頻播放速度。

    ? 具體使用的是第三方公司的CDN服務。

    7 搜索

    項目中課程搜索采用ElasticSearch來完成。

    實現方法是:

    1、使用 Logstash(logstash是ES下的一款開源軟件,它能夠同時 從多個來源采集數據、轉換數據)將MySQL中的課程信息讀取到ES中創建索引,使用IK分詞器進行分詞。

    2、使用 Java High Level REST Client完成搜索。

    3、生產環境使用ES部署為集群。

    8 圖片服務器

    本項目采用fastDFS分布式系統作為圖片服務器。

    FastDFS是用c語言編寫的一款開源的分布式文件系統,適合小文件的存儲。

    FastDFS包括 Tracker server和Storageserver。客戶端請求Tracker server進行文件上傳、下載,通過Tracker server調度向Storage server完成文件上傳和下載。

    使用FastDSF官方提供的Java API實現。

    圖片服務使用Nginx作為代理服務器,對Storage上部署的Nginx完成負載均衡請求。

    8.1 使用FastDFS的好處是什么?

    ? FastDFS相比其它的分布式文件系統它適用小文件存儲,它不對文件進行分塊存儲,也不用對文件進行合并處理,所以性能比GFS、HDFS等通用文件系統的性能要高。

    ?

    8.2 圖片上傳流程?


    執行流程如下:

    1、管理員進入教學管理前端,點擊上傳圖片

    2、圖片上傳至文件系統服務,文件系統請求fastDFS上傳文件

    3、文件系統將文件入庫,存儲到文件系統服務數據庫中。

    4、文件系統服務向前端返回文件上傳結果,如果成功則包括文件的Url路徑。

    5、課程管理前端請求課程管理進行保存課程圖片信息到課程數據庫。

    6、課程管理服務將課程圖片保存在課程數據庫。

    8.3 FastDFS支持斷點續傳嗎?

    FastDFS支付斷點續傳,在Api中有append_file1方法就是用來實現斷點續傳的,本項目沒有使用FastDFS的斷點續傳功能。

    9 認證授權是如何實現的?

    本項目采用 Spring security + Oauth2完成用戶認證及用戶授權。認證授權流程如下:

    1、用戶請求認證服務完成身份認證。

    2、認證服務下發用戶身份令牌和JWT令牌,擁有身份令牌表示身份合法,Jwt令牌用于完成授權。

    3、用戶攜帶jwt令牌請求資源服務。

    4、網關校驗用戶身份令牌的合法,不合法表示用戶沒有登錄,如果合法則放行繼續訪問。

    5、資源服務獲取jwt令牌,根據jwt令牌完成授權。

    10 事務是怎么控制的?用到分布式事務控制了嗎?如何做的?

    此問題考察對事務的理解和應用程度。

    1、在微服務中使用Spring 聲明式事務控制方式進行控制,在Service方法上添加@Transctional注解即可實現事務控制,它控制的是MySQL的本地事務。

    2、項目中大量存在分布式事務控制,比如下單支付、課程發布等地址都用到了分布式事務。

    本項目實現分布式事務控制實現最終數據一致性,做法是:

    a、將分布式事務拆分為多個本地事務。

    b、提交事務前每個參與者要通過數據校驗,和資源預留。

    c、由消息隊列去通知多個事務參與者完成本地事務的提交。

    d、提交失敗的本地事務會重試。

    11系統的異常是怎么處理的?

    系統對異常的處理使用統一的異常處理流程。

    1、自定義異常類型。

    2、自定義錯誤代碼及錯誤信息。

    3、對于可預知的異常由程序員在代碼中主動拋出自定義異常類型的異常,拋出異常時需要指定錯誤代碼。

    4、對于不可預知的異常(運行時異常)由SpringMVC統一捕獲Exception類型的異常,由統一的異常捕獲類來解析處理,并轉換為與自定義異常類型一致的信息格式(錯誤代碼+錯誤信息)。

    5、可預知的異常及不可預知的運行時異常最終會采用統一的信息格式(錯誤代碼+錯誤信息)來表示,最終也會隨請求響應給客戶端。

    總結

    以上是生活随笔為你收集整理的Java开发实战项目分享之学成在线v1.0项目总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。