本項目是和小伙伴開發(fā)的一套基于SpringBoot2的社區(qū)商城系統(tǒng)异赫。主要是為了方便用戶交友的同時拼單購物椅挣。本項目目前還屬于雛形头岔,但基本的業(yè)務已經(jīng)實現(xiàn)了大概∈笾ぃ基于該系統(tǒng)的前端采用Vue構建峡竣。同時兼顧Android和小程序端,前端展示正在開發(fā)過程中量九,后續(xù)會展出适掰。
項目地址:
https://github.com/fuyunwang/ChengFeng1.5
項目的緣由
在當前互聯(lián)網(wǎng)飛速發(fā)展的大潮下,人們的生活也變的更加便捷。本項目就是在這一背景下產(chǎn)生的荠列,為了方便同一個社區(qū)下的用戶交友类浪、共享動態(tài)、獲得社區(qū)的幫助肌似、了解社區(qū)新聞動態(tài)的同時享受到購物的便捷费就。用戶可以與同一個社區(qū)的用戶之間進行拼團購物,既能享受到購物的優(yōu)惠又能體驗到物流的快捷川队。
項目的演進
首先從框架上:
SpringBoot2的誕生已經(jīng)逐漸成為Java后端研發(fā)的主流解決方案力细,SpringBoot2提供了更多的第三方模塊支持、全面基于Java8固额、基于Servlet3.0眠蚂,因而具有更好的性能。至于數(shù)據(jù)訪問層斗躏,為了更好的控制SQL語句的編寫逝慧,以及后期針對SQL進行優(yōu)化我選擇了更為靈活小巧的MyBatis。
數(shù)據(jù)存儲上:
核心業(yè)務數(shù)據(jù),如用戶基礎信息瑟捣、社區(qū)信息馋艺、訂單、拼單業(yè)務信息等,我這里采用關系型數(shù)據(jù)庫MySQL迈套,Driud數(shù)據(jù)庫連接詞監(jiān)控SQL捐祠,從而監(jiān)控SQL的運行狀況找出SQL的優(yōu)化方案。
首頁熱點數(shù)據(jù),首頁熱點數(shù)據(jù)因為需要經(jīng)常查詢而且某些數(shù)據(jù)是基本不變的桑李,故而針對不變的數(shù)據(jù)我這里采用SpringCache做緩存踱蛀,針對經(jīng)常變的熱點數(shù)據(jù)我存入Redis,如首頁物業(yè)公告、社區(qū)公告贵白、最近新聞等信息率拒,采用Redis的Sorted Set和Hash來存儲,進而提高性能禁荒。
新聞的具體信息,因為這里我更多的是文章的具體展示,Redis所提供的數(shù)據(jù)結構以及MySQL關系型的特點對于文章內(nèi)容的存儲都不太友好,因此我這里采用了Mongodb這種文檔型數(shù)據(jù)庫存儲非結構化數(shù)據(jù)猬膨。
商品信息,為了幫助商家更好的維護商品信息做商品推廣,需要收集用戶的行為、確定賣點呛伴、在用戶需要的地方進行廣告推薦勃痴。這里的功能我采用了ELK技術谒所,在用戶添加商品入購物車、下單商品沛申、拼單商品的同時劣领,收集商品的銷售情況進行導入ElasticSearch進行數(shù)據(jù)的分析與聚合。但是因為收集的用戶行為信息太單一铁材、更多的用戶行為日志如用戶在某個頁面的停留時長尖淘、每個商品的UV與PV等信息還待處理、需要更多的推薦算法來豐富這塊內(nèi)容吧著觉。后期希望可以加上村生。。固惯。
關于吞吐量方面:
主要是消息隊列的應用梆造、分布式鎖的應用。為了保證數(shù)據(jù)庫數(shù)據(jù)的正確性葬毫、我們需要在用戶進行某些操作之后進行數(shù)據(jù)狀態(tài)的同步镇辉,簡單的更新操作容易造成業(yè)務的阻塞、降低并發(fā)量,此外過多的事務容易產(chǎn)生更多的數(shù)據(jù)庫級別表鎖贴捡、行鎖忽肛,降低數(shù)據(jù)庫的性能我這里采用Redisson來代替事務的使用,在系統(tǒng)啟動的過程中、拼單烂斋、下單等過程中采用Rabbitmq屹逛、Kafka收集數(shù)據(jù)的流動情況,異步更新。
認證方面:
此系統(tǒng)將用于Android汛骂、小程序,前端也將采用Vue罕模,故而這里不再采用傳統(tǒng)的Cookie、Session維護用戶狀態(tài)信息帘瞭。JWT生成Token的方式也算是一個應用多年的行業(yè)標準淑掌、這里采用與SpringBoot結合更友好的SpringSecurity來進行權限的控制與管理。為了更好的擴展蝶念、這里最好還是應該采用RBAC的權限模型抛腕。
總結:
該項目屬于雛形階段可以滿足常用的業(yè)務并發(fā)量、更多的應該考慮業(yè)務功能的豐富(希望各位能給出建議)媒殉、考慮業(yè)務的拆分担敌、分布式環(huán)境下項目的部署與運行(如分布式一致性、分布式事務)廷蓉、環(huán)境的部署(遷移到Docker全封、K8S的云環(huán)境中)、數(shù)據(jù)的拆分(分庫分表)。更大的業(yè)務量,這里應該采用分流刹悴、限流算法给猾,SpringCloud下服務的熔斷降級等等。例外針對已有的部分還待改進颂跨、例如緩存使用的策略、如何防止緩存穿透和緩存雪崩等問題
基本界面展示:
接口文檔:
文檔地址:
https://github.com/fuyunwang/ChengFeng1.5/wiki
例子:
基于Kibana進行簡單的數(shù)據(jù)統(tǒng)計:
技術包括
- 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實現(xiàn)延遲消息投遞,提高系統(tǒng)的吞吐量
-
數(shù)據(jù)庫層優(yōu)化
長sql加入ehcache緩存
用戶認證信息加入memcached緩存
采用spring cache緩存熱點數(shù)據(jù)
熱點數(shù)據(jù)預加入Redis(如商品的庫存信息),采用Redis預減操作,然后采用定時任務同步緩存及數(shù)據(jù)庫
Kafka收集訂單信息,ElasticSearch進行數(shù)據(jù)分析,產(chǎn)生熱賣商品并推薦
寫在后面
本項目多處使用Java8提供的新特性扯饶。包括lambda表達式恒削、Stream流編程,并結合Guava的工具類庫尾序,恩钓丰,it is very nice.
自己以前做過一段時間的Android開發(fā),因而對于后臺方面完全是初窺門徑每币,開發(fā)本系統(tǒng)主要還是希望能夠維護一個完整項目的同時學習更多的知識携丁。
自己對于后端的許多技術仍然屬于懵懂階段、對于一些技術的學習還是泛而不精兰怠。因此該項目必然存在諸多問題梦鉴,希望各位不吝賜教。
本項目仍然屬于單體架構揭保,后續(xù)會推出SpringCloud版本
本項目持續(xù)維護肥橙,感謝各位提出的issues。