Hystrix整合Gateway
一、引入依賴
核心依賴:
<!-- 整合hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
完整依賴
<dependencies>
<!-- 網關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 服務注冊/發現-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 整合hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!-- jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
二、在啟動器添加注解
如果需要熔斷器,需要添加此注解到啟動器@EnableCircuitBreaker
三、修改yml
如果需要添加某個服務的熔斷,可以在某個route中配置
routes:
- id: hgk-admin
uri: lb://hgk-admin
predicates:
- Path=/api/admin/** #訪問 /api/thirdparty 這個路徑就路由到
filters: #路徑重寫 成一下 這里中間逗號, 前面是截取的路徑,后面是替換的路徑
#也就是你看以為你實際訪問是 /api/thirdparty/oss/policy,實際上它是吧 /api//api/thirdparty這一段給丟了,只要只要oss/policy
#
- RewritePath=/api/(?<segment>.*),/$\{segment}
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback #返回路徑
如果要添加全局配置
default-filters:
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback #返回路徑
配置熔斷:
#hystrix配置
hystrix:
command:
fallbackcmd:
execution:
isolation:
thread:
#斷路器的超時時間ms,默認1000
timeoutInMilliseconds: 2000
circuitBreaker:
#是否啟動熔斷器,默認為true,false表示不要引入Hystrix。
enabled: true
#當在配置時間窗口內達到此數量的失敗后,進行短路
requestVolumeThreshold: 20
#出錯百分比閾值,當達到此閾值后,開始短路。默認50%)
errorThresholdPercentage: 50%
#短路多久以后開始嘗試是否恢復,默認5s)-單位ms
sleepWindowInMilliseconds: 30000
四、添加熔斷時調用的接口
api代碼:
package com.sinosoft.api;
import com.sinosoft.entity.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @author rayfoo@qq.com
* @version 1.0
* <p></p>
* @date 2021/1/19 12:35
*/
@RestController
public class DefaultHystrixController{
@RequestMapping(value = "/fallback",method = RequestMethod.GET)
public Result fallback(){
System.out.println("fallback****************Gateway");
return Result.builder().code(500).msg("您訪問的接口超時。。。").build();
}
}
result代碼:
package com.sinosoft.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.http.HttpStatus;
/**
* @author rayfoo@qq.com
* @date 2020年8月6日
*/
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Result {
/**
* 狀態碼
*/
private Integer code;
/**
* 提示信息
*/
private String msg;
/**
* 數據記錄
*/
private Object data;
/**
* 構造方法
* @param code 狀態碼
* @param msg 提示信息
*/
public Result(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 默認的成功方法
*/
public static Result success(){
return Result.builder().code(HttpStatus.OK.value()).msg(HttpStatus.OK.name()).build();
}
/**
* 默認的成功方法
* @param msg 成功時提示的信息
*/
public static Result success(String msg){
return Result.builder().code(HttpStatus.OK.value()).msg(msg).build();
}
/**
* 默認的失敗方法
*/
public static Result error(){
return Result.builder().code(HttpStatus.INTERNAL_SERVER_ERROR.value()).msg(HttpStatus.INTERNAL_SERVER_ERROR.name()).build();
}
/**
* 默認的失敗方法
* @param msg 失敗時提示的信息
*/
public static Result error(String msg){
return Result.builder().code(HttpStatus.INTERNAL_SERVER_ERROR.value()).msg(msg).build();
}
}