本專案是和小夥伴開發的一套基於SpringBoot2的社群商城系統。主要是為了方便使用者交友的同時拼單購物。本專案目前還屬於雛形,但基本的業務已經實現了大概。基於該系統的前端採用Vue構建。同時兼顧Android和小程式端,前端展示正在開發過程中,後續會展出。
專案地址:
專案的緣由
在當前網際網路飛速發展的大潮下,人們的生活也變的更加便捷。本專案就是在這一背景下產生的,為了方便同一個社群下的使用者交友、共享動態、獲得社群的幫助、瞭解社群新聞動態的同時享受到購物的便捷。使用者可以與同一個社群的使用者之間進行拼團購物,既能享受到購物的優惠又能體驗到物流的快捷。
專案的演進
首先從框架上:
SpringBoot2的誕生已經逐漸成為Java後端研發的主流解決方案,SpringBoot2提供了更多的第三方模組支援、全面基於Java8、基於Servlet3.0,因而具有更好的效能。至於資料訪問層,為了更好的控制SQL語句的編寫,以及後期針對SQL進行優化我選擇了更為靈活小巧的MyBatis。
資料儲存上:
核心業務資料,如使用者基礎資訊、社群資訊、訂單、拼單業務資訊等,我這裡採用關係型資料庫MySQL,Driud資料庫連線詞監控SQL,從而監控SQL的執行狀況找出SQL的優化方案。
首頁熱點資料,首頁熱點資料因為需要經常查詢而且某些資料是基本不變的,故而針對不變的資料我這裡採用SpringCache做快取,針對經常變的熱點資料我存入Redis,如首頁物業公告、社群公告、最近新聞等資訊,採用Redis的Sorted Set和Hash來儲存,進而提高效能。
新聞的具體資訊,因為這裡我更多的是文章的具體展示,Redis所提供的資料結構以及MySQL關係型的特點對於文章內容的儲存都不太友好,因此我這裡採用了Mongodb這種文件型資料庫儲存非結構化資料。
商品資訊,為了幫助商家更好的維護商品資訊做商品推廣,需要收集使用者的行為、確定賣點、在使用者需要的地方進行廣告推薦。這裡的功能我採用了ELK技術,在使用者新增商品入購物車、下單商品、拼單商品的同時,收集商品的銷售情況進行匯入ElasticSearch進行資料的分析與聚合。但是因為收集的使用者行為資訊太單一、更多的使用者行為日誌如使用者在某個頁面的停留時長、每個商品的UV與PV等資訊還待處理、需要更多的推薦演算法來豐富這塊內容吧。後期希望可以加上。。。
關於吞吐量方面:
主要是訊息佇列的應用、分散式鎖的應用。為了保證資料庫資料的正確性、我們需要在使用者進行某些操作之後進行資料狀態的同步,簡單的更新操作容易造成業務的阻塞、降低併發量,此外過多的事務容易產生更多的資料庫級別表鎖、行鎖,降低資料庫的效能我這裡採用Redisson來代替事務的使用,在系統啟動的過程中、拼單、下單等過程中採用Rabbitmq、Kafka收集資料的流動情況,非同步更新。
認證方面:
此係統將用於Android、小程式,前端也將採用Vue,故而這裡不再採用傳統的Cookie、Session維護使用者狀態資訊。JWT生成Token的方式也算是一個應用多年的行業標準、這裡採用與SpringBoot結合更友好的SpringSecurity來進行許可權的控制與管理。為了更好的擴充套件、這裡最好還是應該採用RBAC的許可權模型。
總結:
該專案屬於雛形階段可以滿足常用的業務併發量、更多的應該考慮業務功能的豐富(希望各位能給出建議)、考慮業務的拆分、分散式環境下專案的部署與執行(如分散式一致性、分散式事務)、環境的部署(遷移到Docker、K8S的雲環境中)、資料的拆分(分庫分表)。更大的業務量,這裡應該採用分流、限流演算法,SpringCloud下服務的熔斷降級等等。例外針對已有的部分還待改進、例如快取使用的策略、如何防止快取穿透和快取雪崩等問題
基本介面展示:
介面文件:
文件地址:
例子:
基於Kibana進行簡單的資料統計:
技術包括
- SpringBoot 2.1.3
- Spring Security+JWT
- Spring Boot Cache
- Spring Boot Mail
- MyBatis+PageHelper
- MySQL+Druid
- Spring Data Mongodb
- Spring Data ElasticSearch
- Redis+Redisson
- RabbitMQ
- Kafka
- Memcached
- FastDFS
- Quartz
- Ehcache
- Thymeleaf
- Hibernate Validator
- Guava+apache commons+jackson+joda time
- Swagger
- Tomcat+Nginx
- CentOS 7
要點
-
基於Redisson構建分散式鎖
-
基於RabbitMQ實現延遲訊息投遞,提高系統的吞吐量
-
資料庫層優化
-
長sql加入ehcache快取
-
使用者認證資訊加入memcached快取
-
採用spring cache快取熱點資料
-
熱點資料預加入Redis(如商品的庫存資訊),採用Redis預減操作,然後採用定時任務同步快取及資料庫
-
-
Kafka收集訂單資訊,ElasticSearch進行資料分析,產生熱賣商品並推薦
寫在後面
本專案多處使用Java8提供的新特性。包括lambda表示式、Stream流程式設計,並結合Guava的工具類庫,恩,it is very nice.
自己以前做過一段時間的Android開發,因而對於後臺方面完全是初窺門徑,開發本系統主要還是希望能夠維護一個完整專案的同時學習更多的知識。
自己對於後端的許多技術仍然屬於懵懂階段、對於一些技術的學習還是泛而不精。因此該專案必然存在諸多問題,希望各位不吝賜教。
本專案仍然屬於單體架構,後續會推出SpringCloud版本
本專案持續維護,感謝各位提出的issues。