Soul網關發佈2.2.0 | 讓高性能網關變得如此簡單!

點擊上方“朱小廝的博客”,選擇“設爲星標”

後臺回覆"加羣",加入新技術

本文來自:貓大人的Dromara分佈式事務

Soul發佈全新的架構2.2.0版本 讓網關變得如此簡單

我們還是先來看看新增功能,然後再講故事。

  • 完全的插件化架構設計,插件熱插拔。

  • 完整支持dubbo所有版本,alibaba-dubbo ,apache-dubbo。

  • 支持dubbo泛化調用,多參數,複雜參數接口。

  • 增強monitor插件,移除influxdb支持,新增內存,CPU,QPS,TPS,響應遲延等metrics,支持接入Prometheus。

  • springCloud插件支持eureka與nacos二種註冊中心。

  • waf插件增強,支持黑白名單,以及混合模式。

  • 抽離Hystrix熔斷功能,獨立成插件支持。

  • 修護Zookeeper數據同步方式bug,新增nacos同步數據方式。

  • 多種soul-client支持,提供傳統spring,以及springboot等方式接入。

  • 優化 soul-admin後臺控制界面。

  • 負載均衡算法bug修護。

  • 修護大文件上傳時候的bug。

…….太多了不一一列舉了。

體驗新架構,10分鐘搞定一個高可用高性能網關。

啓動 soul-admin

下載soul-admin.jar包,並啓動.

> 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'

訪問 http://localhost:9095/index.html 默認的用戶名:admin  密碼:123456。

搭建屬於你的網關

  • 首先你新建一個空的springboot項目,可以參考 soul-bootstrap. 也可以在spring官網:[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  //設置成你的soul-admin地址

這樣網關的環境就已經搭建完成。

體驗新架構下的插件熱插拔

問:我想使用熔斷功能,應該如何做呢?

答:你可以在pom.xml文件 引入以下依賴,更多的還請看: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-->

問:我怎麼接入dubbo服務呢?

答:1)如果你使用的是alibaba-dubbo,那麼你應該引入如下:

   <!--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,那麼你應該引入如下:

   <!--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-->
  1. 更多的使用請你參考:https://dromara.org/zh-cn/docs/soul/user-dubbo.html

問:如果我想使用限流功能呢?

答:你可以引入以下依賴,具體的參考: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-->

總而言之,你想要使用什麼插件,你就新增該插件的依賴。就這?是熱插拔麼。。

問:那有些插件我不想用了怎麼辦?

答:在soul-admin後臺禁用該插件即可,想用就開啓。

Soul網關的特性

我覺得最大的特色是在流量篩選和管控方面。無論多複雜的請求,可以根據各種條件,規則,匹配方式,來進行流量過濾,篩選,處理。這個過程完全是可視化,自定義,即時生效的,程序無需任何更改。

每個配置都在soul-admin 控制檯配置,會同步到每個Soul網關節點的JVM內存,這也是Soul集羣高性能的關鍵之一,在soul網關內部,使用了http長輪詢,websocket,zookeeper等方式,獨立實現了分佈式配置中心的功能。

Soul網關使用Reactor編程方式來實現,獨立了線程調度,低消耗,經過網關的流量,我們在開啓10個插件都處理的情況下,延遲是1~2ms。

插件機制,默認提供了限流,熔斷,黑白名單,認證等等插件。

支持A/B test,藍綠髮布(因爲掌控了所有流量這個很容易做)。

Soul網關有哪些使用場景,又有哪些值得你關注或者學習的?

首先我覺得還是實用主義,需要用到,纔會去了解。那麼在什麼場景下,你需要用到呢?

後臺管理web

首先隨便微服務的流行,我們的後臺都劃分成很多的微服務,我相信你們每個公司都有一個後臺管理系統吧,如果我沒猜錯的話,他們大體上是如下架構。

它會有什麼問題呢?大家思考一下。

  • 每個微服務項目的開發人員都在這上面進行開發,會越來越笨重。

  • 如何不停機發布的問題?你要發佈商品模塊的接口,會造成所有其他的模塊使用不了。

  • 假如某一個模塊接口的請求量很大(需要部署多個),另一個模塊不需要,你又怎麼拆分呢?

有人又會說,那我把他們拆處理,拆成一個一個web不就行了麼?但是這樣又會帶來一個新的問題,負載均衡在哪裏做?統一的認證在哪裏做?

Soul網關就很好了解決了以上所有問題,只需要把你的微服務註冊到Soul網關。你想怎麼玩都可以,不重樣的.. 比如 order模塊有2個應用,你要發佈新的版本,你可以在網關裏面,把流量先打到其中一個,另一個進行更新,更新完了以後,再把流量放過去。改變了以前運維掌控一切的觀念,java程序員,也可以玩的更好,運維都省了,向老闆申請加薪指日可待。

需要統一鑑權?你只需要在網關新增一個適合自己業務的鑑權插件就OK。

公司入口網關(開放平臺)

如果一個公司要做開放平臺或者入口網關,鑑權,限流,監控,熔斷肯定少不了。

如果貴公司是dubbo體系,開發人員寫了dubbo服務後,還要傻乎乎的新增一個web項目,來提供接口給別人調用嗎?

如果一個接口被攻擊,你怎麼處理呢?如果被大流量攻擊,你怎麼處理呢?

不巧,soul 在設計之初就是來幹這種事情的,我們來看一下整體的架構圖。

Soul網關是使用響應式編程實現的,響應式編程絕對是未來 java鄰域的重要方向,看風向標Spring體系就好了。我在14年的時候,天天寫for循環操作集合,溜的一筆。領導對我說,要使用lambda表達式,這是未來的重點,今天來看,如果你是java程序員,你不會lambda函數式編程,你好意思麼。從發佈2.2.0,談談近幾年的開源體會。

我是17年左右的時候,開始寫開源項目的,最開始我和王亮一起討論設計了LCN分佈式事務,後面自己又陸續寫了Hmily,Raincat,Myth等分佈式事務中間件,再後來寫了Soul網關,這一路走來,遇到很多很有意思的事,也遭受很多小白用戶的摧殘。總的感覺,一個好的開源項目,高擴展,可插拔的設計實在太重要了。

  • 案例一:Soul網關剛開始數據同步只支持Zookeeper方式,有些用戶反饋,我們沒有zk,那怎麼辦?

  • 案例二 :Soul網關是支持Dubbo的,但是有些用戶是alibaba-dubbo,有些用戶apache-dubbo,你又怎麼說?

  • 案例三 :soul剛開始提供的客戶端都是基於Springboot的,有些用戶是傳統的Spring,你又怎麼說?

所以插件化設計,SPI可插拔設計勢在必行。

SPI VS 可插拔

誠然SPI擴展方式,是可插拔的基石,但是他們又不完全等同。舉個列子:假如我們先存儲一條數據,你定好了SPI接口,也有Mysql,mongodb,elasticseach,zookeeper等等多種方式實現,現在你要考慮的是把它組合在一起項目裏面,還是放在不同的項目,按需打包和加載呢?這些都是要考慮的,所以不能一股腦的SPI方式。

checkStyle

嚴格的代碼規範,是對源碼學習中,框架使用者的尊重,更是一種開源的態度。

嚴格的代碼規範,讓人看起來舒服,也更容易讓人理解整個代碼。

也希望各位小夥伴提交PR的時候,至少本地要Install成功,之前有些PR,爲了不打擊他們的積極性,合併之後流着淚修改。

參與開源

目前我主要專注於Apache ShardingSphere,這是中國人在apache組織的第一個關於數據庫分庫分表的頂級項目,歡迎大家參與進來。https://github.com/apache/shardingsphere。

國人在開源方面,技術方面大到芯片,小到MATLAB ,都落後挺多的,也希望大家擁有開源的心態,多參與開源,學習技術,宣傳思想,爲往聖繼絕學!

想知道更多?描下面的二維碼關注我

後臺回覆”加羣“獲取公衆號專屬羣聊入口

【精彩推薦】

點個在看少個 bug ????

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章