本項目是和小伙伴開發(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)、例如緩存使用的策略、如何防止緩存穿透和緩存雪崩等問題
基本界面展示:
接口文檔:
文檔地址:
https://github.com/fuyunwang/ChengFeng1.5/wiki
例子:
基于Kibana進(jìn)行簡單的數(shù)據(jù)統(tǒng)計:
技術(shù)包括
- 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
要點(diǎn)
基于Redisson構(gòu)建分布式鎖
基于RabbitMQ實(shí)現(xiàn)延遲消息投遞,提高系統(tǒng)的吞吐量
-
數(shù)據(jù)庫層優(yōu)化
長sql加入ehcache緩存
用戶認(rèn)證信息加入memcached緩存
采用spring cache緩存熱點(diǎn)數(shù)據(jù)
熱點(diǎn)數(shù)據(jù)預(yù)加入Redis(如商品的庫存信息),采用Redis預(yù)減操作,然后采用定時任務(wù)同步緩存及數(shù)據(jù)庫
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。