我們還是先來(lái)看看新增功能,然后再講故事。
- 完全的插件化架構(gòu)設(shè)計(jì),插件熱插拔。
- 完整支持dubbo所有版本,alibaba-dubbo ,Apache-dubbo。
- 支持dubbo泛化調(diào)用,多參數(shù),復(fù)雜參數(shù)接口。
- 增強(qiáng)monitor插件,移除influxdb支持,新增內(nèi)存,CPU,QPS,TPS,響應(yīng)遲延等metrics,支持接入Prometheus。
- springCloud插件支持eureka與nacos二種注冊(cè)中心。
- waf插件增強(qiáng),支持黑白名單,以及混合模式。
- 抽離Hystrix熔斷功能,獨(dú)立成插件支持。
- 修護(hù)Zookeeper數(shù)據(jù)同步方式bug,新增nacos同步數(shù)據(jù)方式。
- 多種soul-client支持,提供傳統(tǒng)spring,以及springboot等方式接入。
- 優(yōu)化 soul-admin后臺(tái)控制界面。
- 負(fù)載均衡算法bug修護(hù)。
- 修護(hù)大文件上傳時(shí)候的bug。
- .......太多了不一一列舉了。
體驗(yàn)新架構(gòu),10分鐘搞定一個(gè)高可用高性能網(wǎng)關(guān)。
啟動(dòng) soul-admin
- 下載soul-admin.jar包,并啟動(dòng).
> wget https://yu199195.github.io/jar/soul-admin.jar
> JAVA -jar soul-admin.jar --spring.datasource.url="jdbc:MySQL://你的url:3306/soul?useUnicode=true&characterEncoding=utf-8&useSSL=false"
--spring.datasource.username='you username' --spring.datasource.password='you password'
- 訪問(wèn) http://localhost:9095/index.html 默認(rèn)的用戶名:admin 密碼:123456。
搭建屬于你的網(wǎng)關(guān)
- 首先你新建一個(gè)空的springboot項(xiàng)目,可以參考 soul-bootstrap. 也可以在spring官網(wǎng):[https://spring.io/quickstart]
- 引入如下jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.2.2-RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.2.2-RELEASE</version>
</dependency>
<!--soul gateway start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-gateway</artifactId>
<version>2.2.0</version>
</dependency>
<!--soul data sync start use websocket-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-websocket</artifactId>
<version>2.2.0</version>
</dependency>
- 在你的 Application.yaml 文件中加上如下配置:
spring:
main:
allow-bean-definition-overriding: true
management:
health:
defaults:
enabled: false
soul :
sync:
websocket :
urls: ws://localhost:9095/websocket //設(shè)置成你的soul-admin地址
- 這樣網(wǎng)關(guān)的環(huán)境就已經(jīng)搭建完成。
體驗(yàn)新架構(gòu)下的插件熱插拔
- 問(wèn):我想使用熔斷功能,應(yīng)該如何做呢?
- 答:你可以在pom.xml文件 引入以下依賴,更多的還請(qǐng)看:https://dromara.org/zh-cn/docs/soul/soul.html
<!-- soul hystrix plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-hystrix</artifactId>
<version>2.2.0</version>
</dependency>
<!-- soul hystrix plugin end-->
- 問(wèn):我怎么接入dubbo服務(wù)呢?
- 答:1)如果你使用的是alibaba-dubbo,那么你應(yīng)該引入如下:
<!--soul alibaba dubbo plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-alibaba-dubbo</artifactId>
<version>2.2.0</version>
</dependency>
<!-- soul alibaba dubbo plugin end-->
2) 如果你使用apache-dubbo,那么你應(yīng)該引入如下:
<!--soul apache dubbo plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-apache-dubbo</artifactId>
<version>2.2.0</version>
</dependency>
<!-- soul apache dubbo plugin end-->
- 更多的使用請(qǐng)你參考:https://dromara.org/zh-cn/docs/soul/user-dubbo.html
- 問(wèn):如果我想使用限流功能呢?
- 答:你可以引入以下依賴,具體的參考:https://dromara.org/zh-cn/docs/soul/plugin-rateLimiter.html
<!-- soul ratelimiter plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-ratelimiter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- soul ratelimiter plugin end-->
- 總而言之,你想要使用什么插件,你就新增該插件的依賴。就這?是熱插拔么。。
- 問(wèn):那有些插件我不想用了怎么辦?
- 答:在soul-admin后臺(tái)禁用該插件即可,想用就開(kāi)啟。
Soul網(wǎng)關(guān)的特性
- 我覺(jué)得最大的特色是在流量篩選和管控方面。無(wú)論多復(fù)雜的請(qǐng)求,可以根據(jù)各種條件,規(guī)則,匹配方式,來(lái)進(jìn)行流量過(guò)濾,篩選,處理。這個(gè)過(guò)程完全是可視化,自定義,即時(shí)生效的,程序無(wú)需任何更改。
- 每個(gè)配置都在soul-admin 控制臺(tái)配置,會(huì)同步到每個(gè)Soul網(wǎng)關(guān)節(jié)點(diǎn)的JVM內(nèi)存,這也是Soul集群高性能的關(guān)鍵之一,在soul網(wǎng)關(guān)內(nèi)部,使用了http長(zhǎng)輪詢,websocket,zookeeper等方式,獨(dú)立實(shí)現(xiàn)了分布式配置中心的功能。
- Soul網(wǎng)關(guān)使用Reactor編程方式來(lái)實(shí)現(xiàn),獨(dú)立了線程調(diào)度,低消耗,經(jīng)過(guò)網(wǎng)關(guān)的流量,我們?cè)陂_(kāi)啟10個(gè)插件都處理的情況下,延遲是1~2ms。
- 插件機(jī)制,默認(rèn)提供了限流,熔斷,黑白名單,認(rèn)證等等插件。
- 支持A/B test,藍(lán)綠發(fā)布(因?yàn)檎瓶亓怂辛髁窟@個(gè)很容易做)。
Soul網(wǎng)關(guān)有哪些使用場(chǎng)景,又有哪些值得你關(guān)注或者學(xué)習(xí)的?
首先我覺(jué)得還是實(shí)用主義,需要用到,才會(huì)去了解。那么在什么場(chǎng)景下,你需要用到呢?
后臺(tái)管理web
- 首先隨著微服務(wù)的流行,我們的后臺(tái)都劃分成很多的微服務(wù),我相信你們每個(gè)公司都有一個(gè)后臺(tái)管理系統(tǒng)吧,如果我沒(méi)猜錯(cuò)的話,他們大體上是如下架構(gòu)。
- 它會(huì)有什么問(wèn)題呢?大家思考一下。
- 每個(gè)微服務(wù)項(xiàng)目的開(kāi)發(fā)人員都在這上面進(jìn)行開(kāi)發(fā),會(huì)越來(lái)越笨重。
- 如何發(fā)現(xiàn)的問(wèn)題?你要發(fā)布商品模塊的接口,會(huì)造成所有其他的模塊使用不了。
- 假如某一個(gè)模塊接口的請(qǐng)求量很大(需要部署多個(gè)),另一個(gè)模塊而不需要,你又怎么做?
- 有人又會(huì)說(shuō),那我把他們拆處理,拆成一個(gè)一個(gè)web不就行了么?但是這樣又會(huì)帶來(lái)一個(gè)新的問(wèn)題,負(fù)載均衡在哪里做?統(tǒng)一的認(rèn)證在哪里做?
- Soul網(wǎng)關(guān)就很好了解決了以上所有問(wèn)題,只需要把你的微服務(wù)注冊(cè)到Soul網(wǎng)關(guān)。你想怎么玩都可以,不重樣的.. 比如 order模塊有2個(gè)應(yīng)用,你要發(fā)布新的版本,你可以在網(wǎng)關(guān)里面,把流量先打到其中一個(gè),另一個(gè)進(jìn)行更新,更新完了以后,再把流量放過(guò)去。改變了以前運(yùn)維掌控一切的觀念,java程序員,也可以玩的更好,運(yùn)維都省了,向老板申請(qǐng)加薪指日可待。
- 需要統(tǒng)一鑒權(quán)?你只需要在網(wǎng)關(guān)新增一個(gè)適合自己業(yè)務(wù)的鑒權(quán)插件就OK。
公司入口網(wǎng)關(guān)(開(kāi)放平臺(tái))
- 如果一個(gè)公司要做開(kāi)放平臺(tái)或者入口網(wǎng)關(guān),鑒權(quán),限流,監(jiān)控,熔斷肯定少不了。
- 如果貴公司是dubbo體系,開(kāi)發(fā)人員寫(xiě)了dubbo服務(wù)后,還要傻乎乎的新增一個(gè)web項(xiàng)目,來(lái)提供接口給別人調(diào)用嗎?
- 如果一個(gè)接口被攻擊,你怎么處理呢?如果被大流量攻擊,你怎么處理呢?
- 不巧,soul 在設(shè)計(jì)之初就是來(lái)干這種事情的,我們來(lái)看一下整體的架構(gòu)圖。

- Soul網(wǎng)關(guān)是使用響應(yīng)式編程實(shí)現(xiàn)的,響應(yīng)式編程絕對(duì)是未來(lái) java領(lǐng)域的重要方向,看風(fēng)向標(biāo)Spring體系就好了。我在14年的時(shí)候,天天寫(xiě)for循環(huán)操作集合,溜的一筆。領(lǐng)導(dǎo)對(duì)我說(shuō),要使用lambda表達(dá)式,這是未來(lái)的重點(diǎn),今天來(lái)看,如果你是java程序員,你不會(huì)lambda函數(shù)式編程,你好意思么。
從發(fā)布2.2.0,談?wù)劷鼛啄甑拈_(kāi)源體會(huì)。
我是17年左右的時(shí)候,開(kāi)始寫(xiě)開(kāi)源項(xiàng)目的,最開(kāi)始我和王亮一起討論設(shè)計(jì)了LCN分布式事務(wù),后面自己又陸續(xù)寫(xiě)了Hmily,Raincat,Myth等分布式事務(wù)中間件,再后來(lái)寫(xiě)了Soul網(wǎng)關(guān),這一路走來(lái),遇到很多很有意思的事,也遭受很多小白用戶的摧殘。總的感覺(jué),一個(gè)好的開(kāi)源項(xiàng)目,高擴(kuò)展,可插拔的設(shè)計(jì)實(shí)在太重要了。
- 案例一 : Soul網(wǎng)關(guān)剛開(kāi)始數(shù)據(jù)同步只支持Zookeeper方式,有些用戶反饋,我們沒(méi)有zk,那怎么辦?
- 案例二 :Soul網(wǎng)關(guān)是支持Dubbo的,但是有些用戶是alibaba-dubbo,有些用戶apache-dubbo,你又怎么說(shuō)?
- 案例三 :soul剛開(kāi)始提供的客戶端都是基于Springboot的,有些用戶是傳統(tǒng)的Spring,你又怎么說(shuō)?
所以插件化設(shè)計(jì),SPI可插拔設(shè)計(jì)勢(shì)在必行。
SPI VS 可插拔
誠(chéng)然SPI擴(kuò)展方式,是可插拔的基石,但是他們又不完全等同。舉個(gè)例子:假如我們先存儲(chǔ)一條數(shù)據(jù),你定好了SPI接口,也有Mysql,mongodb,elasticseach,zookeeper等等多種方式實(shí)現(xiàn),現(xiàn)在你要考慮的是把它組合在一起項(xiàng)目里面,還是放在不同的項(xiàng)目,按需打包和加載呢?這些都是要考慮的,所以不能一股腦的SPI方式。
checkStyle
- 嚴(yán)格的代碼規(guī)范,是對(duì)源碼學(xué)習(xí)中,框架使用者的尊重,更是一種開(kāi)源的態(tài)度。
- 嚴(yán)格的代碼規(guī)范,讓人看起來(lái)舒服,也更容易讓人理解整個(gè)代碼。
- 也希望各位小伙伴提交PR的時(shí)候,至少本地要Install成功,之前有些PR,為了不打擊他們的積極性,合并之后流著淚修改。