Hystrix整合Gateway


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();
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM