SpringCloud Zuul實(shí)現(xiàn)負(fù)載均衡和熔斷機(jī)制方式
一、場(chǎng)景
筆者就Zuul網(wǎng)關(guān)下實(shí)現(xiàn)其負(fù)載均衡與熔斷機(jī)制(雪崩)進(jìn)行實(shí)踐,前提是已經(jīng)導(dǎo)入zuul相關(guān)依賴
springboot版本:1.5.9.RELEASE
springcloud版本:Dalston.SR5
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>com.netflix.zuul</groupId> <artifactId>zuul-core</artifactId> <version>1.3.0</version> </dependency> </dependencies>
二、場(chǎng)景實(shí)現(xiàn)
1、在網(wǎng)關(guān)的配置文件中配置ribbon(負(fù)載均衡)和hystrix(熔斷機(jī)制)
#熔斷機(jī)制 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 6000 #負(fù)載均衡 ribbon: ConnectionTimeout: 500 ReadTimeout: 2000 #端口 server: port: 8080 spring: #該配置文件中的配置,對(duì)應(yīng)的服務(wù)名稱是wc-gateway application: name: wc-gateway profiles: active: dev #服務(wù)網(wǎng)關(guān)配置 zuul: host: connect-timeout-millis: 60000 socket-timeout-millis: 60000 #路由規(guī)則 routes: api: path: /api/user/** serviceId: wc-client-user
其實(shí)ribbon的真實(shí)值=(ConnectionTimeout+ReadTimeout)*2,該值最好小于hystrix的timeoutInMilliseconds的值,因?yàn)槿绻笥谄渲禃?huì)失去負(fù)載均衡(ribbon)的重試機(jī)會(huì),而直接熔斷
2、驗(yàn)證負(fù)載均衡
因?yàn)閦uul下自帶了hystrix,ribbon相關(guān)jar包,所有現(xiàn)在已經(jīng)實(shí)現(xiàn)了負(fù)載均衡和熔斷機(jī)制,接下來(lái)進(jìn)行驗(yàn)證
在client服務(wù)下編寫(xiě)controller,測(cè)試負(fù)載均衡
package top.wingcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author: linjie * @description: 用戶服務(wù)請(qǐng)求處理控制器 * @create: 2018/11/06 09:16 */ @RestController public class UserController { @Value("${server.port}") private int port; @RequestMapping("index") public String index(){ return "Hello World!"+port; } }
依次啟動(dòng)注冊(cè)中心、配置中心、client服務(wù)、修改端口再次啟動(dòng)client服務(wù)、服務(wù)網(wǎng)關(guān)
根據(jù)網(wǎng)關(guān)的路由,訪問(wèn)同一個(gè)路由,發(fā)現(xiàn)啟動(dòng)的兩個(gè)不同端口的client服務(wù)交替執(zhí)行
出現(xiàn)該情況即實(shí)現(xiàn)了負(fù)載均衡
3、驗(yàn)證熔斷機(jī)制
在網(wǎng)關(guān)服務(wù)中需要寫(xiě)ZuulFallbackProvider的實(shí)現(xiàn)類
package top.wingcloud.filter; import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; /** * @author: linjie * @description:錯(cuò)誤攔截回顯,熔斷 * @create: 2018/10/11 20:01 */ @Component public class ApiFallbackProvider implements ZuulFallbackProvider{ @Override public String getRoute() { //設(shè)置熔斷的服務(wù)名 //如果是所有服務(wù)則設(shè)置為* return "wc-client-user"; } @Override public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return 200; } @Override public String getStatusText() throws IOException { return "{code:0,message:service error =_=}"; } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream(getStatusText().getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } }
這個(gè)時(shí)候關(guān)閉client所有服務(wù),再次訪問(wèn)之前的網(wǎng)關(guān)路由
出現(xiàn)了getStatusText()中的提示,即實(shí)現(xiàn)了熔斷機(jī)制
好了,zuul下的負(fù)載均衡和熔斷已經(jīng)實(shí)現(xiàn)!
zuul網(wǎng)關(guān)配置+限流熔斷
被調(diào)方:延時(shí)600ms
ahas:
user限流:
trade熔斷:(3秒內(nèi)請(qǐng)求數(shù)>4)&&(3s內(nèi)慢調(diào)用/請(qǐng)求數(shù)>50%) -》》開(kāi)啟熔斷
慢調(diào)用標(biāo)準(zhǔn):響應(yīng)時(shí)間大于500ms
20個(gè)請(qǐng)求測(cè)試:
測(cè)試限流:
測(cè)試限流和rt熔斷
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章

Java?代碼本地設(shè)置Hadoop用戶名密碼的方法

解決springboot jpa @Column columnDefinition等屬性失效問(wèn)題

elasticsearch集群發(fā)現(xiàn)zendiscovery的Ping機(jī)制分析

基于Spring Cloud Zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)

SpringBoot整合mybatis-generator插件流程詳細(xì)講解

Java實(shí)現(xiàn)的兩個(gè)線程同時(shí)運(yùn)行案例