[Soul 源碼之旅] 1.2 集成 SpringCloud&RateLimiter

1.2.1 環境準備

我們使用SpringCloud 可以使用Nacos 或者 Eruka 作為注冊中心,筆者今天以Nacos為例。我們先到Nacos的官網 下載。到 nacos/bin 執行以下語句啟動單機版Nacos

Nacos 單機版使用到是內置數據庫,集群使用Mysql數據庫

sh startup.sh -m standalone

我們通過 http://localhost:8848/nacos/ nacos/nacos 登陸本地Nacos 。

image.png

1.2.1 配置 soul-bootstrap

首先我們需要在soul-bootstrp 的 application-local.yml 設置Nacos注冊中心地址

spring:
   main:
     allow-bean-definition-overriding: true
   application:
    name: soul-bootstrap
   cloud:
    nacos:
       discovery:
          server-addr: 127.0.0.1:8848

同時需要引入Nacos和SpringCloud的依賴,在pom文件中引入如下依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
    <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-springcloud</artifactId>
            <version>${project.version}</version>
        </dependency>

1.2.3 配置soul-test-springcloud

首先我們需要配置Nacos注冊中心和配置soul的admin地址,以及context-path

# nacos 配置
spring:
  application:
    name: springCloud-test
  cloud:
    nacos:
      discovery:
          server-addr: 127.0.0.1:8848
# soul 配置
soul:
  springcloud:
    admin-url: http://localhost:9095
    context-path: /springcloud

然后我們引入Soul的SpringCloud-Stater 和 Nacos 的Client 端以及基礎SpringCloud 的包。

        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-client-springcloud</artifactId>
            <version>${soul.version}</version>
        </dependency>

        <!--spring boot的核心啟動器-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

      <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

緊接著我們編寫一個簡單的SpringCloud的服務,這里主要使用一個注解 @SoulSpringCloudClient 定義暴露服務到路徑。

@RestController
@RequestMapping("/order")
@SoulSpringCloudClient(path = "/order")
public class OrderController {
    /**
     * Find by id order dto.
     *
     * @param id the id
     * @return the order dto
     */
    @GetMapping("/findById")
    @SoulSpringCloudClient(path = "/findById")
    public OrderDTO findById(@RequestParam("id") final String id) {
        OrderDTO orderDTO = new OrderDTO();
        orderDTO.setId(id);
        orderDTO.setName("hello world spring cloud findById");
        return orderDTO;
    }
}

1.2.3 啟動

首先我們啟動Soul-admin 和 Soul-BootStrap 然后開啟SpringCloud插件如圖:


image.png

接著我們啟動我們的SpringCloud項目,我們先查看Nacos,發現我們自己的項目和Soul-Bootstrap都已經注冊上去。

image.png

再查看soul-admin 發現元數據和插件都已經顯示注冊上去的路徑
image.png

緊接著我們訪問這個鏈接 http://localhost:9195/springcloud/order/findById?id=1

springcloud 為我們在yml定義的context-path

訪問情況

接著我們壓測以下,得到以下數據。

 mac@AndydeMacBook-Pro  ~/nacos/bin  wrk -t 4 -c 20 http://localhost:9195/springcloud/order/findById\?id\=1
Running 10s test @ http://localhost:9195/springcloud/order/findById?id=1
  4 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    12.47ms   15.02ms 119.39ms   88.13%
    Req/Sec   587.97    174.76     1.06k    70.50%
  23454 requests in 10.03s, 4.66MB read
Requests/sec:   2338.93
Transfer/sec:    475.56KB

我們嘗試直接訪問SpringCloud的服務器進行測試得到數據如下:

 mac@AndydeMacBook-Pro  ~  wrk -t 4 -c 20 http://localhost:8884/order/findById\?id\=1
Running 10s test @ http://localhost:8884/order/findById?id=1
  4 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     4.17ms   22.84ms 256.05ms   97.53%
    Req/Sec     5.44k   776.76     7.07k    84.18%
  213237 requests in 10.01s, 36.24MB read
Requests/sec:  21307.59
Transfer/sec:      3.62MB

以上所有壓測數據都經過預熱, 我們可以看出使用Dubbo的方式還是并發能力最高的

1.4.3 rateLimiter 插件

soul 限流插件設計如下,它處于最前面,使用的是令牌桶算法 +redis 存儲


image.png

首先我們可以先下載一個redis并啟動,mac 可以直接使用 HomeBrew 下載安裝,然后通過redis-server 啟動

brew install redis
redis-server server.conf

soul 支持單機版和集群版本Redis,我們先配置開啟rate_limiter


image.png

然后配置規則組和具體規則,如圖規則組配置 /SpringCloud/** 這個路徑

image.png

然后具體規則選擇具體路徑 /springcloud/order/findById。這里配置每秒最多一個請求。


image.png

然后我們并發請求試一下多出來的請求被攔截。

 mac@AndydeMacBook-Pro  ~  curl http://localhost:9195/springcloud/order/findById\?id\=1
{"code":429,"message":"您已經被限流,請稍后重試!","data":null}%

BootStrap 日志如下


image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379