城風(fēng)——基于SpringBoot2構(gòu)建社區(qū)商城系統(tǒng)開源

本項目是和小伙伴開發(fā)的一套基于SpringBoot2的社區(qū)商城系統(tǒng)。主要是為了方便用戶交友的同時拼單購物。本項目目前還屬于雛形,但基本的業(yè)務(wù)已經(jīng)實(shí)現(xiàn)了大概?;谠撓到y(tǒng)的前端采用Vue構(gòu)建。同時兼顧Android和小程序端,前端展示正在開發(fā)過程中,后續(xù)會展出。

項目地址:

https://github.com/fuyunwang/ChengFeng1.5

項目的緣由

在當(dāng)前互聯(lián)網(wǎng)飛速發(fā)展的大潮下,人們的生活也變的更加便捷。本項目就是在這一背景下產(chǎn)生的,為了方便同一個社區(qū)下的用戶交友、共享動態(tài)、獲得社區(qū)的幫助、了解社區(qū)新聞動態(tài)的同時享受到購物的便捷。用戶可以與同一個社區(qū)的用戶之間進(jìn)行拼團(tuán)購物,既能享受到購物的優(yōu)惠又能體驗(yàn)到物流的快捷。

項目的演進(jìn)

首先從框架上:

SpringBoot2的誕生已經(jīng)逐漸成為Java后端研發(fā)的主流解決方案,SpringBoot2提供了更多的第三方模塊支持、全面基于Java8、基于Servlet3.0,因而具有更好的性能。至于數(shù)據(jù)訪問層,為了更好的控制SQL語句的編寫,以及后期針對SQL進(jìn)行優(yōu)化我選擇了更為靈活小巧的MyBatis。

數(shù)據(jù)存儲上:

核心業(yè)務(wù)數(shù)據(jù),如用戶基礎(chǔ)信息、社區(qū)信息、訂單、拼單業(yè)務(wù)信息等,我這里采用關(guān)系型數(shù)據(jù)庫MySQL,Driud數(shù)據(jù)庫連接詞監(jiān)控SQL,從而監(jiān)控SQL的運(yùn)行狀況找出SQL的優(yōu)化方案。

首頁熱點(diǎn)數(shù)據(jù),首頁熱點(diǎn)數(shù)據(jù)因?yàn)樾枰?jīng)常查詢而且某些數(shù)據(jù)是基本不變的,故而針對不變的數(shù)據(jù)我這里采用SpringCache做緩存,針對經(jīng)常變的熱點(diǎn)數(shù)據(jù)我存入Redis,如首頁物業(yè)公告、社區(qū)公告、最近新聞等信息,采用Redis的Sorted Set和Hash來存儲,進(jìn)而提高性能。

新聞的具體信息,因?yàn)檫@里我更多的是文章的具體展示,Redis所提供的數(shù)據(jù)結(jié)構(gòu)以及MySQL關(guān)系型的特點(diǎn)對于文章內(nèi)容的存儲都不太友好,因此我這里采用了Mongodb這種文檔型數(shù)據(jù)庫存儲非結(jié)構(gòu)化數(shù)據(jù)。

商品信息,為了幫助商家更好的維護(hù)商品信息做商品推廣,需要收集用戶的行為、確定賣點(diǎn)、在用戶需要的地方進(jìn)行廣告推薦。這里的功能我采用了ELK技術(shù),在用戶添加商品入購物車、下單商品、拼單商品的同時,收集商品的銷售情況進(jìn)行導(dǎo)入ElasticSearch進(jìn)行數(shù)據(jù)的分析與聚合。但是因?yàn)槭占挠脩粜袨樾畔⑻珕我?、更多的用戶行為日志如用戶在某個頁面的停留時長、每個商品的UV與PV等信息還待處理、需要更多的推薦算法來豐富這塊內(nèi)容吧。后期希望可以加上。。。

關(guān)于吞吐量方面:

主要是消息隊列的應(yīng)用、分布式鎖的應(yīng)用。為了保證數(shù)據(jù)庫數(shù)據(jù)的正確性、我們需要在用戶進(jìn)行某些操作之后進(jìn)行數(shù)據(jù)狀態(tài)的同步,簡單的更新操作容易造成業(yè)務(wù)的阻塞、降低并發(fā)量,此外過多的事務(wù)容易產(chǎn)生更多的數(shù)據(jù)庫級別表鎖、行鎖,降低數(shù)據(jù)庫的性能我這里采用Redisson來代替事務(wù)的使用,在系統(tǒng)啟動的過程中、拼單、下單等過程中采用Rabbitmq、Kafka收集數(shù)據(jù)的流動情況,異步更新。

認(rèn)證方面:

此系統(tǒng)將用于Android、小程序,前端也將采用Vue,故而這里不再采用傳統(tǒng)的Cookie、Session維護(hù)用戶狀態(tài)信息。JWT生成Token的方式也算是一個應(yīng)用多年的行業(yè)標(biāo)準(zhǔn)、這里采用與SpringBoot結(jié)合更友好的SpringSecurity來進(jìn)行權(quán)限的控制與管理。為了更好的擴(kuò)展、這里最好還是應(yīng)該采用RBAC的權(quán)限模型。

總結(jié):

該項目屬于雛形階段可以滿足常用的業(yè)務(wù)并發(fā)量、更多的應(yīng)該考慮業(yè)務(wù)功能的豐富(希望各位能給出建議)、考慮業(yè)務(wù)的拆分、分布式環(huán)境下項目的部署與運(yùn)行(如分布式一致性、分布式事務(wù))、環(huán)境的部署(遷移到Docker、K8S的云環(huán)境中)、數(shù)據(jù)的拆分(分庫分表)。更大的業(yè)務(wù)量,這里應(yīng)該采用分流、限流算法,SpringCloud下服務(wù)的熔斷降級等等。例外針對已有的部分還待改進(jìn)、例如緩存使用的策略、如何防止緩存穿透和緩存雪崩等問題

基本界面展示:

image
image
image

image
image
image

接口文檔:

文檔地址:

https://github.com/fuyunwang/ChengFeng1.5/wiki

例子:

image

基于Kibana進(jìn)行簡單的數(shù)據(jù)統(tǒng)計:

image

技術(shù)包括

  1. SpringBoot 2.1.3
  2. Spring Security+JWT
  3. Spring Boot Cache
  4. Spring Boot Mail
  5. MyBatis+PageHelper
  6. MySQL+Druid
  7. Spring Data Mongodb
  8. Spring Data ElasticSearch
  9. Redis+Redisson
  10. RabbitMQ
  11. Kafka
  12. Memcached
  13. FastDFS
  14. Quartz
  15. Ehcache
  16. Thymeleaf
  17. Hibernate Validator
  18. Guava+apache commons+jackson+joda time
  19. Swagger
  20. Tomcat+Nginx
  21. CentOS 7

要點(diǎn)

  1. 基于Redisson構(gòu)建分布式鎖

  2. 基于RabbitMQ實(shí)現(xiàn)延遲消息投遞,提高系統(tǒng)的吞吐量

  3. 數(shù)據(jù)庫層優(yōu)化

    1. 長sql加入ehcache緩存

    2. 用戶認(rèn)證信息加入memcached緩存

    3. 采用spring cache緩存熱點(diǎn)數(shù)據(jù)

    4. 熱點(diǎn)數(shù)據(jù)預(yù)加入Redis(如商品的庫存信息),采用Redis預(yù)減操作,然后采用定時任務(wù)同步緩存及數(shù)據(jù)庫

  4. Kafka收集訂單信息,ElasticSearch進(jìn)行數(shù)據(jù)分析,產(chǎn)生熱賣商品并推薦

寫在后面

本項目多處使用Java8提供的新特性。包括lambda表達(dá)式、Stream流編程,并結(jié)合Guava的工具類庫,恩,it is very nice.

自己以前做過一段時間的Android開發(fā),因而對于后臺方面完全是初窺門徑,開發(fā)本系統(tǒng)主要還是希望能夠維護(hù)一個完整項目的同時學(xué)習(xí)更多的知識。

自己對于后端的許多技術(shù)仍然屬于懵懂階段、對于一些技術(shù)的學(xué)習(xí)還是泛而不精。因此該項目必然存在諸多問題,希望各位不吝賜教。

本項目仍然屬于單體架構(gòu),后續(xù)會推出SpringCloud版本

本項目持續(xù)維護(hù),感謝各位提出的issues。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容