lamp-cloud微服務(wù)開發(fā)框架
lamp-cloud的前身是zuihou-admin-cloud,從3.0.0版本開始,改名為lamp-cloud,它是lamp項(xiàng)目的其中一員。
lamp-cloud 基于SpringCloud(Hoxton.SR9) + SpringBoot(2.3.6.RELEASE) 的微服務(wù)快速開發(fā)平臺(tái),其中的可配置的SaaS功能尤其閃耀, 具備RBAC功能、網(wǎng)關(guān)統(tǒng)一鑒權(quán)、Xss防跨站攻擊、自動(dòng)代碼生成、多種存儲(chǔ)系統(tǒng)、分布式事務(wù)、分布式定時(shí)任務(wù)等多個(gè)模塊,支持多業(yè)務(wù)系統(tǒng)并行開發(fā), 支持多服務(wù)并行開發(fā),可以作為后端服務(wù)的開發(fā)腳手架。代碼簡(jiǎn)潔,注釋齊全,架構(gòu)清晰,非常適合學(xué)習(xí)和企業(yè)作為基礎(chǔ)框架使用。
核心技術(shù)采用Spring Cloud Alibaba、SpringBoot、Mybatis、Seata、Sentinel、RabbitMQ、FastDFS/MinIO、SkyWalking等主要框架和中間件。 希望能努力打造一套從 JavaWeb基礎(chǔ)框架 - 分布式微服務(wù)架構(gòu) - 持續(xù)集成 - 系統(tǒng)監(jiān)測(cè) 的解決方案。本項(xiàng)目旨在實(shí)現(xiàn)基礎(chǔ)能力,不涉及具體業(yè)務(wù)。
lamp 項(xiàng)目名字由來
敘事版:
在一個(gè)夜黑風(fēng)高的晚上,小孩吵著要出去玩,于是和程序員老婆一起帶小孩出去放風(fēng),路上順便討論起項(xiàng)目要換個(gè)什么名字,在各自想出的名字都被對(duì)方一一否決后,大家陷入了沉思。
走著走著,在一盞路燈下,孩砸盯著路燈打破寧靜,喊出:燈燈~ 我和媳婦愣了一下,然后對(duì)視著一起說:哈哈,這個(gè)名字好~
解釋版:
燈燈: 是我小孩學(xué)說話時(shí)會(huì)說的第一個(gè)詞,也是我在想了很多項(xiàng)目名后,小孩一語點(diǎn)破的一個(gè)名字,燈燈象征著光明,給困境的我們帶來希望,給加班夜歸的程序員們指引前方~
燈燈(簡(jiǎn)稱燈, 英文名:lamp),他是一個(gè)項(xiàng)目的統(tǒng)稱,包含以下幾個(gè)子項(xiàng)目
lamp 項(xiàng)目組成
| 項(xiàng)目 | gitee | github | 備注 |
| 工具集 | https://gitee.com/zuihou111/lamp-util | https://github.com/zuihou/lamp-util | 業(yè)務(wù)無關(guān)的工具集,cloud和boot 項(xiàng)目都依賴它 |
| 微服務(wù)版 | https://gitee.com/zuihou111/lamp-cloud | https://github.com/zuihou/lamp-cloud | SpringCloud 版 |
| 單體版 | https://gitee.com/zuihou111/lamp-boot | https://github.com/zuihou/lamp-boot | SpringBoot 版(和lamp-cloud功能基本一致) |
| 管理后臺(tái) | https://gitee.com/zuihou111/lamp-web | https://github.com/zuihou/lamp-web | PC端管理系統(tǒng) |
| 代碼生成器 | https://gitee.com/zuihou111/lamp-generator | https://github.com/zuihou/lamp-generator | 給開發(fā)人員使用 |
| 定時(shí)調(diào)度器 | https://gitee.com/zuihou111/lamp-job | https://github.com/zuihou/lamp-job | 尚未開發(fā) |
lamp 租戶模式介紹
本項(xiàng)目可以通過配置,輕松切換項(xiàng)目的租戶模式
| 租戶模式 | 描述 | 優(yōu)點(diǎn) | 缺點(diǎn) |
| NONE(非租戶模式) | 沒有租戶 | 簡(jiǎn)單、適合獨(dú)立系統(tǒng) | 缺少租戶系統(tǒng)的優(yōu)點(diǎn) |
| COLUMN(字段模式) | 租戶共用一個(gè)數(shù)據(jù)庫,在業(yè)務(wù)表中增加字段來區(qū)分 | 簡(jiǎn)單、不復(fù)雜、開發(fā)無感知 | 數(shù)據(jù)隔離性差、安全性差、數(shù)據(jù)備份和恢復(fù)困難 |
| SCHEMA(獨(dú)立schema) | 每個(gè)租戶獨(dú)立一個(gè) 數(shù)據(jù)庫(schema),執(zhí)行sql時(shí),動(dòng)態(tài)在表名前增加schema | 簡(jiǎn)單、開發(fā)無感知、數(shù)據(jù)隔離性好 | 配置文件中必須配置數(shù)據(jù)庫的root賬號(hào)、不支持復(fù)雜sql和 sql嵌套自定義函數(shù) |
| DATASOURCE(獨(dú)立數(shù)據(jù)源) | 每個(gè)租戶獨(dú)立一個(gè) 數(shù)據(jù)庫(數(shù)據(jù)源),執(zhí)行代碼時(shí),動(dòng)態(tài)切換數(shù)據(jù)源 | 可獨(dú)立部署數(shù)據(jù)庫,數(shù)據(jù)隔離性好、擴(kuò)展性高、故障影響小 | 相對(duì)復(fù)雜、開發(fā)需要注意切換數(shù)據(jù)源時(shí)的事務(wù)問題、需要較多的數(shù)據(jù)庫 |
lamp 會(huì)員版項(xiàng)目演示地址
- 地址: https://tangyh.top
- 以下內(nèi)置賬號(hào)僅限于內(nèi)置的0000租戶
- 平臺(tái)管理員: lamp_pt/lamp (內(nèi)置給公司內(nèi)部運(yùn)營人員使用)
- 超級(jí)管理員: lamp/lamp
- 普通管理員: general/lamp
- 普通賬號(hào): normal/lamp
ps: 演示環(huán)境中內(nèi)置租戶沒有寫入權(quán)限,若要在演示環(huán)境測(cè)試增刪改,請(qǐng)使用lamp_pt賬號(hào)查詢租戶管理員賬號(hào)后,登錄新租戶測(cè)試
lamp-cloud + lamp-web 功能介紹:
1. 租戶管理:運(yùn)營人員管理所有的租戶創(chuàng)建
2. 工作臺(tái):普通用戶常用功能
3. 組織管理:組織、崗位、用戶數(shù)據(jù)維護(hù)、重置用戶密碼等
4. 資源中心:消息、短信、附件管理
5. 流程管理:流程部署、模型管理、流程示例
6. 系統(tǒng)設(shè)置:菜單、資源配置、角色管理、給角色綁定用戶、給角色授權(quán)菜單和資源、字典、地區(qū)、系統(tǒng)參數(shù)、操作日志、登錄日志、應(yīng)用管理等
7. 網(wǎng)關(guān)設(shè)置:限流和阻止訪問
8. 開發(fā)者管理:定時(shí)任務(wù)、接口文檔、注冊(cè)&配置中心、服務(wù)監(jiān)控、數(shù)據(jù)庫監(jiān)控、zipkin監(jiān)控、SkyWalking監(jiān)控
lamp-cloud 項(xiàng)目亮點(diǎn)功能介紹:
-
服務(wù)注冊(cè)&發(fā)現(xiàn)與調(diào)用:
基于Nacos來實(shí)現(xiàn)的服務(wù)注冊(cè)與發(fā)現(xiàn),使用使用Feign來實(shí)現(xiàn)服務(wù)互調(diào), 可以做到使用HTTP請(qǐng)求遠(yuǎn)程調(diào)用時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請(qǐng)求。
-
負(fù)載均衡:
將服務(wù)保留的rest進(jìn)行代理和網(wǎng)關(guān)控制,除了平常經(jīng)常使用的node.js、nginx外,Spring Cloud系列的zuul和ribbon,可以幫我們進(jìn)行正常的網(wǎng)關(guān)管控和負(fù)載均衡。其中擴(kuò)展和借鑒國外項(xiàng)目的擴(kuò)展基于JWT的Zuul限流插件,方面進(jìn)行限流。
-
服務(wù)鑒權(quán):
通過JWT的方式來加強(qiáng)服務(wù)之間調(diào)度的權(quán)限驗(yàn)證,保證內(nèi)部服務(wù)的安全性。
-
熔斷機(jī)制:
因?yàn)椴扇×朔?wù)的分布,為了避免服務(wù)之間的調(diào)用“雪崩”,采用了Hystrix的作為熔斷器,避免了服務(wù)之間的“雪崩”。
-
監(jiān)控:
利用Spring Boot Admin 來監(jiān)控各個(gè)獨(dú)立Service的運(yùn)行狀態(tài);利用turbine來實(shí)時(shí)查看接口的運(yùn)行狀態(tài)和調(diào)用頻率;通過Zipkin來查看各個(gè)服務(wù)之間的調(diào)用鏈等。
-
鏈路調(diào)用監(jiān)控:
同時(shí)實(shí)現(xiàn)了Zipkin和SkyWalking作為本項(xiàng)目的全鏈路性能監(jiān)控, 從整體維度到局部維度展示各項(xiàng)指標(biāo),將跨應(yīng)用的所有調(diào)用鏈性能信息集中展現(xiàn),可方便度量整體和局部性能,并且方便找到故障產(chǎn)生的源頭,生產(chǎn)上可極大縮短故障排除時(shí)間。
-
數(shù)據(jù)權(quán)限
利用基于Mybatis的DataScopeInnerInterceptor攔截器實(shí)現(xiàn)了數(shù)據(jù)權(quán)限功能
-
SaaS(多租戶)的無感解決方案
本項(xiàng)目支持3種常見的租戶解決方案和無租戶方案,同一套代碼,修改一個(gè)配置即可實(shí)現(xiàn)租戶模式只有切換。
-
緩存抽象
采用CacheOps操作緩存,內(nèi)置2種實(shí)現(xiàn):Caffeine、 Redis,可以讓項(xiàng)目應(yīng)急時(shí)在無Redis環(huán)境正常運(yùn)行
-
優(yōu)雅的Bean轉(zhuǎn)換
采用Dozer、BeanUtil等組件來對(duì) DTO、DO、PO等對(duì)象的優(yōu)化轉(zhuǎn)換
-
前后端統(tǒng)一表單驗(yàn)證
嚴(yán)謹(jǐn)?shù)谋韱悟?yàn)證通常需要 前端+后端同時(shí)驗(yàn)證, 但傳統(tǒng)的項(xiàng)目,均只能前后端各做一次檢驗(yàn), 后期規(guī)則變更,又得前后端同時(shí)修改。 故在
hibernate-validator的基礎(chǔ)上封裝了lamp-validator-starter起步依賴,提供一個(gè)通用接口,可以獲取需要校驗(yàn)表單的規(guī)則,然后前端使用后端返回的規(guī)則, 以后若規(guī)則改變,只需要后端修改即可。 -
防跨站腳本攻擊(XSS)
- 通過過濾器對(duì)所有請(qǐng)求中的 表單參數(shù) 進(jìn)行過濾
- 通過Json反序列化器實(shí)現(xiàn)對(duì)所有 application/json 類型的參數(shù) 進(jìn)行過濾
-
當(dāng)前登錄用戶信息注入器
- 通過注解實(shí)現(xiàn)用戶身份注入
-
在線API
由于原生swagger-ui某些功能支持不夠友好,故采用了國內(nèi)開源的
knife4j,并制作了stater,方便springboot用戶使用。 -
代碼生成器
基于Mybatis-plus-generator自定義了一套代碼生成器, 通過配置數(shù)據(jù)庫字段的注釋,自動(dòng)生成枚舉類、數(shù)據(jù)字典注解、SaveDTO、UpdateDTO、表單驗(yàn)證規(guī)則注解、Swagger注解等。
-
定時(shí)任務(wù)調(diào)度器:
基于xxl-jobs進(jìn)行了功能增強(qiáng)。(如:指定時(shí)間發(fā)送任務(wù)、執(zhí)行器和調(diào)度器合并項(xiàng)目、多數(shù)據(jù)源)
-
大文件/斷點(diǎn)/分片續(xù)傳
前端采用webupload.js、后端采用NIO實(shí)現(xiàn)了大文件斷點(diǎn)分片續(xù)傳,啟動(dòng)Eureka、Zuul、File服務(wù)后,直接打開docs/chunkUploadDemo/demo.html即可進(jìn)行測(cè)試。 經(jīng)測(cè)試,本地限制堆棧最大內(nèi)存128M啟動(dòng)File服務(wù),5分鐘內(nèi)能成功上傳4.6G+的大文件,正式服耗時(shí)則會(huì)受到用戶帶寬和服務(wù)器帶寬的影響,時(shí)間比較長(zhǎng)。
-
分布式事務(wù)
集成了阿里的分布式事務(wù)中間件:seata,以 高效 并且對(duì)業(yè)務(wù) 0侵入 的方式,解決 微服務(wù) 場(chǎng)景下面臨的分布式事務(wù)問題。
-
跨表、跨庫、跨服務(wù)的關(guān)聯(lián)數(shù)據(jù)自動(dòng)注入器
用于解決跨表、跨庫、跨服務(wù)分頁數(shù)據(jù)的屬性或單個(gè)對(duì)象的屬性 回顯關(guān)聯(lián)數(shù)據(jù)之痛, 支持對(duì)靜態(tài)數(shù)據(jù)屬性(數(shù)據(jù)字典)、動(dòng)態(tài)主鍵數(shù)據(jù)進(jìn)行自動(dòng)注入。
-
灰度發(fā)布
為了解決頻繁的服務(wù)更新上線,版本回退,快速迭代,公司內(nèi)部協(xié)同開發(fā),本項(xiàng)目采用修改ribbon的負(fù)載均衡策略來實(shí)現(xiàn)來灰度發(fā)布。
lamp-cloud 技術(shù)棧/版本介紹:
- 所涉及的相關(guān)的技術(shù)有:
- JSON序列化:Jackson
- 消息隊(duì)列:RabbitMQ
- 緩存:Redis
- 數(shù)據(jù)庫: MySQL 5.7.9 或者 MySQL 8.0.19
- 定時(shí)器:采用xxl-jobs項(xiàng)目進(jìn)行二次改造
- 前端:vue + element-ui
- 持久層框架: Mybatis-plus
- 代碼生成器:基于Mybatis-plus-generator自定義
- API網(wǎng)關(guān):Gateway/zuul
- 服務(wù)注冊(cè)&發(fā)現(xiàn)和配置中心: Nacos
- 服務(wù)消費(fèi):OpenFeign
- 負(fù)載均衡:Ribbon
- 服務(wù)熔斷:Hystrix
- 項(xiàng)目構(gòu)建:Maven
- 分布式事務(wù): seata
- 分布式系統(tǒng)的流量防衛(wèi)兵: Sentinel
- 監(jiān)控: spring-boot-admin
- 鏈路調(diào)用跟蹤: zipkin/SkyWalking
- 文件服務(wù)器:FastDFS 5.0.5/阿里云OSS/本地存儲(chǔ)/MinIO
- Nginx
- 部署方面:
- 服務(wù)器:CentOS
- Jenkins
- Docker
- Kubernetes
