前提知識:
spring cloud中:
- zuul 用來轉(zhuǎn)發(fā)請求的
- ribbon 是用來負(fù)載均衡的
- hystrix 是用來熔斷的
轉(zhuǎn)發(fā)請求就是一個請求過來为迈,要轉(zhuǎn)發(fā)到具體service中哪個接口上
所謂負(fù)載均衡拾枣,就是相同一個service服務(wù),可以部署多個實例薇溃,如果實例1不能用了菌赖,會自動切換到實例2上,或者很多請求過來了沐序,會均勻分布到多個實例上琉用,而不讓多個請求都在一個實例上執(zhí)行,拉慢效率策幼。
所謂熔斷邑时,比如請求用Feign去請求一個API,長時間請求沒響應(yīng)時特姐,則需要讓該API類似保險絲一樣熔斷晶丘,那么過來的請求就不會去call 該API,給出一個提示錯誤唐含,待API修好之后再重新接上保險絲浅浮,API正常通過。
那么到底ribbon和hystrix捷枯,feignClient怎么協(xié)調(diào)配合呢滚秩?
配置hystirx
統(tǒng)一配置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
ribbon:
ReadTimeout: 6000
ConnectTimeout: 200
以上的配置是說針對所有的feignClient做統(tǒng)一的配置,超時設(shè)置6s淮捆,超過6s熔斷郁油。
配置2: 用具體feignclient的方法名
可以直接在hystirx上指定對應(yīng)的feignClient方法:
@FeignClient(value = "user-client", fallback = .class)
public interface OtherFeignClient{
@GetMapping("/ids/{id}")
String getUserById(@PathVariable("id") String id);
@GetMapping
String getAllUsers();
}
## 配置:
hystrix:
command:
"OtherFeignClient#getUserById(String)": #針對getUserById
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
"OtherFeignClient#getAllUsers()": #針對getAllUser
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
配置3:用feignclient上的id
@FeignClient(value = "user-client", fallback = .class)
public interface OtherFeignClient{
@GetMapping("/ids/{id}")
@HystrixCommand(commandKey = "id-getUserById")
String getUserById(@PathVariable("id") String id);
}
## 配置:
hystrix:
command:
id-getUserById: #針對getUserById
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
配置zuul
zuul的配置分為2種,且不同的方式配置和效果不一樣:
- url方式配置攀痊,用不上ribbon和hystrix
These simple url-routes don’t get executed as a HystrixCommand nor do they loadbalance multiple URLs with Ribbon. To achieve this, you can specify a serviceId with a static list of servers #from
- service-id方式配置桐腌,可以用上ribbon和hystrix
用url配置
zuul:
routes:
userAPI:
path: /api-users/**
url: http://a.com/users
bookAPI:
path: /api-books/**
url: http://a.com/books
host:
connect-timeout-millis: 5000
socket-timeout-millis: 3000
用service-id配置
zuul:
routes:
userAPI:
path: /api-users/**
url: http://a.com/users
serviceId: id-get-user # 指定serviceId
id-get-user:
ribbon:
ConnectTimeout: 5000
ReadTimeout: 5000
hystrix:
command:
id-get-user:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
那么ribbon和hystrix配合起來怎么使用?
!!! hystrix起熔斷作用蚕苇,所以ribbon的各種配置超時時間加起來要小于hystrix的超時配置哩掺,不然ribbon還沒工作完就熔斷了
ribbon:
ReadTimeout: 5000
ConnectTimeout: 2000
MaxAutoRetries: 1 #同一臺實例最大重試次數(shù),不包括首次調(diào)用
MaxAutoRetriesNextServer: 2 #重試負(fù)載均衡其他的實例最大重試次數(shù),不包括首次調(diào)用
OkToRetryOnAllOperations: false #是否所有操作都重試?默認(rèn)get請求起作用,如果想其他類型的請求起作用涩笤,需要配置true嚼吞,但是! post請求一般是create蹬碧,如果接口沒做冪等性會有并發(fā)問題舱禽,所以慎重配置。
問題1:以上配置如果每次請求都掛了恩沽,會請求幾次誊稚?
答案是6次,
1(首次訪問) + 1(MaxAutoRetries一次) + 1 (負(fù)載到實例2之后請求一次) + 1 (實例2重試一次) + 1(負(fù)載到實例3之后請求一次)+ 1(實例3重試一次)= 6次
總結(jié)公式為:
1 + MaxAutoRetries + (MaxAutoRetriesNextServer * (1 + MaxAutoRetries))
首次訪問 + 本次實例重試次數(shù) + (切換實例次數(shù) * (進(jìn)入該實例請求的第一次 + 該實例重試次數(shù)))
問題2:以上為ribbon的請求超時時間,那么hystrix配置多長時間里伯?
(ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1) #from
該公式后面的(ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1)即訪問總次數(shù)城瞎,和以上推到的公式最后化簡是一樣的,可用初中數(shù)學(xué)自行推到
總共訪問次數(shù) * (ReadTimeout + connectTimeout)= 6 * (5000+2000) = 42000疾瓮,即42s脖镀。
完。