學生會管理系統後端-k8s,redis,mysql,springboot,dubbo

學生會管理系統後端架構

一、引言

1.0 項目最後源代碼整合:

  • 學生會管理系統app:

  • 學生會管理系統後端:https://github.com/zhang-wangz/ruangong-backen

  • 學生會管理系統web端:https://github.com/LinXS597/SUManager

  • 學生會管理系統小程序端:https://github.com/fireworks-EX/StudentUnion

  • 前期接口文檔以及需求文檔:https://www.showdoc.cc/531866446040267?page_id=3144694473293441

  • 後端後期spring整合swagger文檔:http://api.wangz.online/api/swagger-ui.html

    分佈式部分

  • k8s管理界面:https://139.9.90.185:31175/

  • dubbo管理界面:http://139.159.248.231:8080/dubbo-admin-2.6.0/

1.1 編寫目的

  • 描述整個軟工項目下來自己親身感受,和對課程的意見和建議,以及這一學期在課程中學到的東西,和遇到的問題以及對各種問題進行的解決描述。

1.2 編寫背景

  • 在此之前學習了java的springboot項目編寫語法,並且有過3個有關的編寫經驗,所以主動承擔了整個小組的後端編寫任務,在此過程中因爲興趣學習了kotlin語法,所以一部分功能使用kotlin進行編寫完成以加快編寫速度和代碼篇幅,過程中也加入了swagger進行調整接口文檔(因爲最後編寫任務的繁重),並且同時系統作爲分佈式系統,配置了k8s和dubbo進行完善分佈式架構,同時對數據庫進行配置爲分佈式mysql,以防mysql宕機使得整個系統掛掉。因爲獲取速度的關係,配置了redis作爲整個後臺的緩存機制。最後,配置成多模塊,分佈在不同的雲服務器中緩解單服務器的壓力,同時使用zookeeper作爲註冊中心進行多個模塊間的通訊交互。

二、後端編寫總結

2.0 後端中的java部分

  • 因爲最熟練並且嘗試最多的是java語言,所以最開始就使用了java語言,依據之前的經驗和編寫的工具類,前期的進度一直很迅速,但同時也因爲進度不同步使得那個階段整個小組的編寫十分的痛苦,所以在寫的過程中,逐漸開始放緩了編寫的步伐,並且開始去注重整個後端源代碼的細節和註釋部分,顧及大家的平均速度,使得整個項目進入飛速進展期。

2.1 後端中的kotlin部分

  • 這是寫到程序中期的時候,因爲進入核心功能邏輯編寫區,並且java代碼處理邏輯的逐漸複雜,同時又因爲kotlin的便捷和簡便性,在中期的時候使用kotlin進行改寫(真的悔恨當初),但我其實也不清楚應該說這個改寫是好是壞,好的一方面是使用kotlin之後代碼的邏輯編寫的確十分的簡潔,無論是kotlin的高級擴展方法apply,use,let,alse,還是空值處理的 ‘?’ 形式,都極大的促進了項目的速度,壞的一面也很明顯,因爲是中期進行的改寫,所以在兼容性上的處理花費了我大量的精力,並且其作爲一門新晉語言,在後期分佈式的兼容性上也很讓人頭疼,中間遇到了很多問題,比如,lateinit初始化,在分佈式dubbo中,會報一個反序列錯誤問題,這個反序列報錯最後只能通過java反射機制進行重新映射才解決, 還有map沒有繼承Serizable,使得傳輸一直報錯,直到最後重寫了原生類繼承這個接口,才終於沒報錯。

2.2 後端中的swagger部分

  • 由於初期使用showoc進行需求填寫,爲了統一也使用其進行了api接口編寫,但是後期細節化的時候,一下子二三十個接口的加入便使得維護起來十分的麻煩,不僅需要添加新的,還要對之前的進行修改,所以爲了便捷,後端加入了生產期間使用的動態接口swagger文檔。而且在開發完成後也可以隨時進行關閉,推薦使用,開發利器。
    在這裏插入圖片描述

2.3 後端中的dubbo部分

  • 因爲考慮到工業使用問題,進行了分佈式整合(又是後端的活!-.-),先是對springboot進行dubbo進行整合,所以得對原先的所有工程進行模塊化,而且最重要的是dubbo是alibaba的aop架構,結果最顯然的就是我的後臺項目需要進行徹底的重構(說實話,當時人傻了),還好最開始的springboot結構劃分寫的與之要求不大,新增了dto,exception(自定義運行錯誤類),vo層之後,並且對之前的service進行完整的重構,終於滿足了需求,現在的缺點就是導致repo(dao層內容)與數據庫的交互顯得有些繁瑣(就是請求的時候可能速度會慢一點)。但也完成了初步的分佈式架構,分成了common,provider,consumer三個模塊。同時使用docker配置zookeepr組件進行三個模塊間的通訊,最後的成果就是可以使用dubbo進行負載均衡,訪問請求等容錯配置,而且不用擔心服務會宕機。
    在這裏插入圖片描述
    在這裏插入圖片描述

2.4 後端中的Kubernetes(k8s)部分

  • 這個模塊也是實現起來最麻煩的一個部分,因爲k8s的鏡像源是在國外,所以國內下載服務器需要配置科學上網進行下載處理(但說實話,服務器配置代理實在太麻煩了),所以我最後選擇的是切換成國內的鏡像源進行下載,但是其中也找了好長時間,(包括docker打包,上傳,下拉,個人倉庫等一系列,真的很頭禿,googlemirror這是我找到的最終的鏡像倉庫,萬分感謝維護這個倉庫的社區大佬),並且配置了dashborad進行可視化管理。其中mysql和redis也處於這個架構組件中,最後是兩個service暴露給外部進行訪問。redis-cluster(配置使用k8s的cm(configMap)爲集羣的config)的配置難點主要在於密碼的設置部分,如果不設置密碼就進行配置的話,會使得外部無法訪問這些k8s中的pods,設置密碼的話會拋出no auth的error,最後的解決方案是進行無密碼配置,然後通過k8s dash-board可視化配置所有實例的集羣密碼(’人工‘智能-.-),mysql則是爲了方便沒有使用k8s裏的cm組件,而是docker build了一個自己的image進行配置,最後終於完成了,順便也學習了springboot的type爲redis的cache機制。

在這裏插入圖片描述

2.5 總結最後部分

  • 寫到這邊其實就想說,整個項目下來,學到了很多,也犯了很多不該犯的錯誤,吃了很多苦,但最後這個苦是甜的,所以don‘t give up,maybe now you aren’t the brightest star, but work it,we finally will succeed.加油!

二、對課程的建議和意見

  • 不得不說,朱勇老師的軟工課是一段讓人很享受的時光,不僅學到了很多(我想這就是一種試錯),但也因爲享受,在我看來,課程還是存在有一些小問題。

  • 例如,在進行需求開會的問題上,理論上,從軟件需求的角度看,應該不止有老師,本組成員參與,可能在進行小組抽選後,讓被選中的小組進行課堂展示,從而進行加減分,這會是一個更好的選擇,這樣不僅各個小組都會爲此準備,並且各個小組的選擇和做法也會被所有學生進行學習交流。現在的機制雖然滿足了所有小組討論需求都有老師參與,但同時換一個角度看,這樣做不僅使得老師十分的疲憊,而且需求有時候也並不是十分的完善。

  • 此外,在課程中,最讓我感到點睛的一段經歷就是團體項目之前的那一個較完善的個人項目體驗,但同時這也花去了大量的時間,如果可以縮短這個過程(比如說開課的時候便說明個人小項目的立意,讓學生進行思考),我覺得可能會是個更好的選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章