上一篇文章中我们学习了 sign 插件是如何实现请求鉴权的,今天我们来试试 Soul 的Spring Cloud 插件。
流程演示
先解除soul-bootstrap Spring Cloud 依赖部分的如下注释:
<!--soul springCloud plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-springcloud</artifactId>
<version>${project.version}</version>
</dependency>
<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>
<!--soul springCloud plugin start end-->
<!-- springCloud if you config register center is nacos please dependency this-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>2.1.0.RELEASE</version>-->
<!-- </dependency>-->
<!-- springCloud if you config register center is eureka please dependency end-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
Spring Cloud 插件支持 Nacos 或者 Eureka作为服务注册中的,这一次我们选择Eureka。
在 soul-bootstrap 的 application.yml 中添加Eureka 相关依赖:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
在 soul-admin 中开启Spring Cloud 插件支持。
直接启动 soul-examples-springcloud 和 soul-examples-eureka,打开Eureka的页面可以看到已经把我们的应用注册好了。
再回到 soul-admin,发现我们的 Spring Cloud 服务的相关 endpoints 已经加到了选择器和规则列表中:
接下来我们用 curl 来测试下:
➜ ~ curl "localhost:9195/springcloud/order/findById?id=1"
{"id":"1","name":"hello world spring cloud findById"}
成功返回数据。现在我们使用wrk执行一下压测,以下是不适用soul网关
➜ ~ wrk -t8 -c200 -d30s --latency "http://localhost:8884/order/findById?id=1"
Running 30s test @ http://localhost:8884/order/findById?id=1
8 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 8.21ms 6.05ms 155.20ms 92.54%
Req/Sec 2.95k 703.14 15.51k 79.58%
Latency Distribution
50% 7.27ms
75% 9.19ms
90% 11.65ms
99% 33.06ms
700305 requests in 30.07s, 119.00MB read
Requests/sec: 23285.91
Transfer/sec: 3.96MB
使用soul网关
➜ ~ wrk -t8 -c200 -d30s --latency "http://localhost:9195/springcloud/order/findById?id=1"
Running 30s test @ http://localhost:9195/springcloud/order/findById?id=1
8 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 47.59ms 37.60ms 294.45ms 80.29%
Req/Sec 592.92 129.17 0.97k 70.40%
Latency Distribution
50% 36.84ms
75% 61.51ms
90% 99.43ms
99% 176.76ms
141697 requests in 30.10s, 28.13MB read
Requests/sec: 4707.18
Transfer/sec: 0.93MB
可能跟笔者机器有关,网关在8个线程200个连接测试30秒的情况,延迟有比较明显的提升,初步怀疑受到了日志输出的影响,调整日志输出级别后再进行测试:
➜ ~ wrk -t8 -c200 -d30s --latency "http://localhost:9195/springcloud/order/findById?id=1"
Running 30s test @ http://localhost:9195/springcloud/order/findById?id=1
8 threads and 200 connections
^C Thread Stats Avg Stdev Max +/- Stdev
Latency 39.94ms 26.08ms 218.19ms 71.90%
Req/Sec 657.54 122.81 0.91k 78.91%
Latency Distribution
50% 35.04ms
75% 53.40ms
90% 74.22ms
99% 122.25ms
33581 requests in 6.44s, 6.67MB read
Requests/sec: 5214.23
Transfer/sec: 1.04MB
设置日志输出级别为error后性能损耗要小一些。