高并發(fā)的情況肯定是實(shí)際場(chǎng)景中經(jīng)常碰到的情況,那么這種情況下限流措施肯定是必須的,本文我們就來(lái)看看zuul中限流的處理
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了曲水免費(fèi)建站歡迎大家使用!
高并發(fā)的限流處理
??創(chuàng)建一個(gè)SpringCloud項(xiàng)目
??必須要添加 ratelimit依賴
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-zuul
com.marcosbarbero.cloud
spring-cloud-zuul-ratelimit
1.3.4.RELEASE
??在配置文件中添加限流的屬性,分為具體限流和全局限流
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)求超過(guò) 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ù),訪問(wèn)測(cè)試如下
product服務(wù):
一分鐘訪問(wèn)的第四次
order服務(wù):正常訪問(wèn)
一分鐘內(nèi)訪問(wèn)的第四次
全局限流配置對(duì)每個(gè)服務(wù)都有效果
??針對(duì)特定的服務(wù)指定的限流策略
# 局部限流:針對(duì)某個(gè)服務(wù)進(jìn)行限流
##開啟限流
zuul.ratelimit.enabled=true
##60s 內(nèi)請(qǐng)求超過(guò) 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)最多訪問(wèn)3次,超過(guò)就會(huì)限流,對(duì)其他服務(wù)就沒(méi)有影響。效果可自行演示。
增對(duì)error異常,我們可以提供一個(gè)全局異常處理器
@RestController
public class ExceptionHandler implements ErrorController{
@Override
public String getErrorPath() {
return "error";
}
@RequestMapping(value="/error")
public String error(){
return "{\"result\":\"訪問(wèn)太多頻繁,請(qǐng)稍后再訪問(wèn)?。?!\"}";
}
}
限流的提示如下: