[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阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353