Java 界最好的 API 網關 Soul
- 2019 年 12 月 27 日
- 筆記
soul網關發佈2.1.0版本 (做Java界最好的API-Gateway)
- 這是soul網關開源以來的最大的一次更新,收集了很多社區反饋的問題,進行了更新.
- 之前的文檔不是很完善,使用成本較高,這裡先說聲抱歉,這一個版本中,同時更新了相關文檔.
- 在這個版本中,提供 http,dubbo,springcloud等服務快速接入網關的功能.
- 在這個版本中一切都是可擴展的,具體的可以看開發者文檔.
- 修護了很多問題,優化了很多性能,包括線程模型,異步模型等等.
- 新增一個元數據的概念。
- 以後的版本更新,基本上以這個版本為基礎原型,來進行更新了.
- 使用之前版本的用戶,如果要升級的話,可以在群里問。。
- 更新了太多太多地方,無法一一列舉,大家只能去看文檔了.
快速啟動 soul-admin
> 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&zeroDateTimeBehavior=CONVERT_TO_NULL&failOverReadOnly=false&autoReconnect=true&useSSL=false" --spring.datasource.username='you username' --spring.datasource.password='you password'
快速啟動 soul-bootstrap
> wget https://yu199195.github.io/jar/soul-bootstrap.jar > java -jar soul-bootstrap.jar
- 這樣soul網關就啟動了
springMvc服務接入
參考文檔: https://dromara.org/zh-cn/docs/soul/joinUp-mvc.html
dubbo服務接入
參考文檔: https://dromara.org/zh-cn/docs/soul/joinUp-dubbo.html
springCloud服務接入
參考文檔: https://dromara.org/zh-cn/docs/soul/joinUp-springcloud.html
代碼與文檔
github : https://github.com/Dromara/soul
gitee : https://gitee.com/shuaiqiyu/soul
文檔: https://dromara.org/zh-cn/docs/soul/soul.html
Soul網關發佈2.1.X之後,它到底有多方便?
Soul 網關自從去年10月我開源以來,經歷了一年的事情,接受到了來自社區很多朋友的建議,並進行持續不斷的優化,已經提供了非常豐富的功能,很多功能都是高度自定義,可視化,高度可擴展的,現在做一個歸納總結。
插件
- 提供了系統自帶的各種插件,比如簽名,監控,限流,熔斷,http代理,dubbo代理,websocket等等。
- 支持用戶快速的進行插件的自定義開發。
- 插件的所有數據,開關狀態支持動態變更。
數據同步
- 提供了
http長輪詢
,zookeeper
,websocket
三種不同的數據同步策略,讓用戶自由選擇。 - 推薦用戶使用websocket方式,最輕量,在集群環境下,效率更高。
對於用戶
- 首先我們提供了便於用戶接入的
client
包,用戶可以把快速的把自己的項目接入到soul
網關。 - 默認情況下,用戶完全不用關心
soul
網關的選擇器,規則等配置。 - 用戶之前的接口完全是零侵入,不需要任何更改,只是需要把訪問域名改成網關的域名即可。
- 比如 dubbo用戶,幾乎就是http的方式完成了 http協議到 dubbo協議的互相轉換。
soul
使用的是http協議,那麼註定它就是跨語言的,net程序員,php程序員等等,要和java進行數據交互,那麼就大大的可行了。 舉個列子 ,比如你有一個 dubbo接口 參數定義是一個java bean,public
void
insert(final DubboTest dubboTest)
{
}
public
class
DubboTest
implements
Serializable
{
private String id;
private String name;
}
如果你使用 soul網關要發起對它的調用,你的http傳參數 就是在 body 裏面 傳一個json字符串 ,和普通的http調用無差別。{"id":"123","name":"xiaoyu"}
對於開發者(程序員)
- 隨着使用者越來越多,每個公司使用情況又不一樣,
soul
網關在2.1.X版本,處處留出來更多的高度自定義擴展性,讓開發者,更加方便或者有信心融入進來。 - 比如,自定義插件,過濾器,dubbo參數解析器,iphost解析器,返回結果等等。。這裡我着重說一下自定義返回結果。 我們知道,
soul
網關默認的返回結果是:{"code":200, "message ": "成功!","data" :"helloWorld!"}
但是,在運用soul
網關對你的業務系統進行調用的時候,你的業務系統可能定義的結果並不是上述結構,可能你的 字段叫msg
,這樣就會造成結構不一樣,給前端處理帶來了困擾。我們注意到了這個事情 :https://github.com/Dromara/soul/issues/109 , 現在已經優化,用戶可以定製化的來定義返回結果,具體的要看soul
文檔。
說了這麼多,吹了這麼多牛逼,那麼我們來看看 soul網關到底可以在什麼場景下能發揮大作用。
後台管理web
- 首先隨便微服務的流行,我們的後台都劃分成很多的微服務,我相信你們每個公司都有一個後台管理系統吧,如果我沒猜錯的話,他們大體上是如下架構。

- 很簡單對吧,就是有個運營管理平台的web項目,去調用每個微服務,來進行後台的查看等等。隨着你們業務需要的加大,可能這裡需要調用的微服務越來越多,你的
controller
越來越多,現在比如你修改了 商品模塊的 接口,你要發版會造成所有其他的模塊也操作不了(就是你發版影響了其他模塊的使用,別杠這裡只是比方,不要整藍綠髮版啥的,明白意思吧)。 如果有運營人員在操作其他模塊,會不會吐槽你? 假如你是公司架構師,我說的是假如,那麼你要怎麼解決這個問題呢?當然,我們把這樣一個大的web系統,拆分成很多小web系統,單獨的進行發佈,但是這樣會引入一個問題,怎麼統一登陸,鑒權?(很多後台管理系統還有權限的劃分) ,這個時候,soul
網關 就能發揮重要的作用了,下面我只是列舉了一下簡單的調用圖。

- 這樣多方便,集成了網關,每個微服務註冊到網關,網關根據路由規則來進行調用。自動發現服務,連運維配置 nginx的工作都省了,把運維的工資給你,美滋滋。
公司入口網關(開放平台)
- 如果一個公司要做開放平台或者入口網關,鑒權,限流,監控,熔斷肯定少不了。
- 如果貴公司是dubbo體系,開發人員寫了dubbo服務後,還要傻乎乎的新增一個web項目,來提供接口給別人調用嗎?
- 如果一個接口被攻擊,你怎麼處理呢?如果被大流量攻擊,你怎麼處理呢?
- 不巧,
soul
在設計之初就是來幹這種事情的,我們來看一下整體的架構圖。

零零總總還有很多其他功能
- 比如支持
websocket
代理。 - 比如支持文件上傳下載。
- 比如你可以自定義的開發你的插件啊。