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 日志如下