您好,登錄后才能下訂單哦!
高并發(fā)的情況肯定是實(shí)際場(chǎng)景中經(jīng)常碰到的情況,那么這種情況下限流措施肯定是必須的,本文我們就來(lái)看看zuul中限流的處理
高并發(fā)的限流處理
??創(chuàng)建一個(gè)SpringCloud項(xiàng)目
??必須要添加 ratelimit依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.marcosbarbero.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
</dependencies>
??在配置文件中添加限流的屬性,分為具體限流和全局限流
server.port=9030
# eureka注冊(cè)中心的配置
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/
# 定義的兩個(gè)路由規(guī)則
zuul.routes.e-book-product.path=/product/**
zuul.routes.e-book-product.serviceId=e-book-product
zuul.routes.e-book-order.path=/order/**
zuul.routes.e-book-order.serviceId=e-book-order
??針對(duì)每一個(gè)服務(wù)都有效果
#全局配置限流
zuul.ratelimit.enabled=true
##60s 內(nèi)請(qǐng)求超過 3 次,服務(wù)端就拋出異常,60s 后可以恢復(fù)正常請(qǐng)求
zuul.ratelimit.default-policy.limit=3
zuul.ratelimit.default-policy.refresh-interval=60
##針對(duì) IP 進(jìn)行限流,不影響其他 IP
zuul.ratelimit.default-policy.type=origin
分別啟動(dòng)product和order兩個(gè)服務(wù),然后啟動(dòng)網(wǎng)關(guān)服務(wù),訪問測(cè)試如下
product服務(wù):
一分鐘訪問的第四次
order服務(wù):正常訪問
一分鐘內(nèi)訪問的第四次
全局限流配置對(duì)每個(gè)服務(wù)都有效果
??針對(duì)特定的服務(wù)指定的限流策略
# 局部限流:針對(duì)某個(gè)服務(wù)進(jìn)行限流
##開啟限流
zuul.ratelimit.enabled=true
##60s 內(nèi)請(qǐng)求超過 3 次,服務(wù)端就拋出異常,60s 后可以恢復(fù)正常請(qǐng)求
zuul.ratelimit.policies.e-book-product.limit=3
zuul.ratelimit.policies.e-book-product.refresh-interval=60
##針對(duì)某個(gè) IP 進(jìn)行限流,不影響其他 IP
zuul.ratelimit.policies.e-book-product.type=origin
以上配置只針對(duì)e-book-product的服務(wù)一分鐘內(nèi)最多訪問3次,超過就會(huì)限流,對(duì)其他服務(wù)就沒有影響。效果可自行演示。
增對(duì)error異常,我們可以提供一個(gè)全局異常處理器
@RestController
public class ExceptionHandler implements ErrorController{
@Override
public String getErrorPath() {
return "error";
}
@RequestMapping(value="/error")
public String error(){
return "{\"result\":\"訪問太多頻繁,請(qǐng)稍后再訪問!?。"}";
}
}
限流的提示如下:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。