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 。
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插件如图:
接着我们启动我们的SpringCloud项目,我们先查看Nacos,发现我们自己的项目和Soul-Bootstrap都已经注册上去。
再查看soul-admin 发现元数据和插件都已经显示注册上去的路径
紧接着我们访问这个链接 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 存储
首先我们可以先下载一个redis并启动,mac 可以直接使用 HomeBrew 下载安装,然后通过redis-server 启动
brew install redis
redis-server server.conf
soul 支持单机版和集群版本Redis,我们先配置开启rate_limiter
然后配置规则组和具体规则,如图规则组配置 /SpringCloud/** 这个路径
然后具体规则选择具体路径 /springcloud/order/findById。这里配置每秒最多一个请求。
然后我们并发请求试一下多出来的请求被拦截。
mac@AndydeMacBook-Pro ~ curl http://localhost:9195/springcloud/order/findById\?id\=1
{"code":429,"message":"您已经被限流,请稍后重试!","data":null}%
BootStrap 日志如下