[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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。