SpringCloud Zuul實現(xiàn)負載均衡和熔斷機制方式
一、場景
筆者就Zuul網(wǎng)關下實現(xiàn)其負載均衡與熔斷機制(雪崩)進行實踐,前提是已經(jīng)導入zuul相關依賴
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>
二、場景實現(xiàn)
1、在網(wǎng)關的配置文件中配置ribbon(負載均衡)和hystrix(熔斷機制)
#熔斷機制
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
#負載均衡
ribbon:
ConnectionTimeout: 500
ReadTimeout: 2000
#端口
server:
port: 8080
spring:
#該配置文件中的配置,對應的服務名稱是wc-gateway
application:
name: wc-gateway
profiles:
active: dev
#服務網(wǎng)關配置
zuul:
host:
connect-timeout-millis: 60000
socket-timeout-millis: 60000
#路由規(guī)則
routes:
api:
path: /api/user/**
serviceId: wc-client-user
其實ribbon的真實值=(ConnectionTimeout+ReadTimeout)*2,該值最好小于hystrix的timeoutInMilliseconds的值,因為如果大于其值會失去負載均衡(ribbon)的重試機會,而直接熔斷
2、驗證負載均衡
因為zuul下自帶了hystrix,ribbon相關jar包,所有現(xiàn)在已經(jīng)實現(xiàn)了負載均衡和熔斷機制,接下來進行驗證
在client服務下編寫controller,測試負載均衡
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: 用戶服務請求處理控制器
* @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;
}
}
依次啟動注冊中心、配置中心、client服務、修改端口再次啟動client服務、服務網(wǎng)關
根據(jù)網(wǎng)關的路由,訪問同一個路由,發(fā)現(xiàn)啟動的兩個不同端口的client服務交替執(zhí)行


出現(xiàn)該情況即實現(xiàn)了負載均衡
3、驗證熔斷機制
在網(wǎng)關服務中需要寫ZuulFallbackProvider的實現(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:錯誤攔截回顯,熔斷
* @create: 2018/10/11 20:01
*/
@Component
public class ApiFallbackProvider implements ZuulFallbackProvider{
@Override
public String getRoute() {
//設置熔斷的服務名
//如果是所有服務則設置為*
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;
}
};
}
}
這個時候關閉client所有服務,再次訪問之前的網(wǎng)關路由
出現(xiàn)了getStatusText()中的提示,即實現(xiàn)了熔斷機制
好了,zuul下的負載均衡和熔斷已經(jīng)實現(xiàn)!
zuul網(wǎng)關配置+限流熔斷
被調(diào)方:延時600ms

ahas:

user限流:

trade熔斷:(3秒內(nèi)請求數(shù)>4)&&(3s內(nèi)慢調(diào)用/請求數(shù)>50%) -》》開啟熔斷
慢調(diào)用標準:響應時間大于500ms

20個請求測試:

測試限流:

測試限流和rt熔斷

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot結合JWT登錄權限控制的實現(xiàn)
本文主要介紹了SpringBoot結合JWT登錄權限控制的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
Java處理Markdown格式轉(zhuǎn)換為Word文檔
這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)處理Markdown格式轉(zhuǎn)換為Word文檔,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下2025-03-03
Springboot Websocket Stomp 消息訂閱推送
本文主要介紹了Springboot Websocket Stomp 消息訂閱推送,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07
Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼
本篇文章主要介紹了Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01

