1. 程式人生 > >SpringCloud -- Hystrix 熔斷機制實現(基於 Ribbon、Feign)

SpringCloud -- Hystrix 熔斷機制實現(基於 Ribbon、Feign)

一、基於 Ribbon + Hystrix

  在入口類 中 加上@EnableHystrix   //表示載入熔斷器功能

package com.springcloud.ribbon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * 本例中使用Eureka服務中心所以用@EnableEurekaClient
 * 如果註冊中心是zookeeper或其它,建議使用@EnableDiscoveryClient
 **/
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix   //表示載入熔斷器功能
public class RibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }

    //宣告RestTemplate並新增@Bean和@LoadBalanced, @LoadBalance表示支援Ribbon的負載均衡。
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

  修改service層 增加

@HystrixCommand(fallbackMethod = "errCallBack") //被呼叫服務出現異常時,執行回撥函式
package com.springcloud.ribbon.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * Created by joe強 on 2018/9/27 20:01
 */
@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "errCallBack") //被呼叫服務出現異常時,執行回撥函式
    public String doSomething(String parm){
        String result;
        result=restTemplate.getForObject("http://server1/ribbon?parm="+parm,String.class);//呼叫server1客戶端 de  ribbon介面
        System.out.println(result);
        return  result;
    }

    /**
     *  回撥函式  返回值型別和原函式相同
     *  回撥函式引數型別和原函式相同
     * @param parm
     * @return
     */
    public String errCallBack(String parm){
        return "Sorry,"+parm+",server1 not responde";
    }
}

啟動Ribbon服務 和 server1 ,呼叫介面

此時 介面呼叫沒有問題 ,現在 關閉server1 服務,再次呼叫介面:

呼叫發生異常時,熔斷機制生效了!

二、Feign +Hystrix

   

第一步:首先開啟Feign對Hystrix的支援,在properties檔案中新增以下配置:

feign.hystrix.enabled=true.

第二部 修改 Server1Service 介面

新增Server1Service實現類:

package com.springcloud.feign.service;

import org.springframework.stereotype.Component;

/**
 * Created by joe強 on 2018/9/28 15:34
 */
@Component
public class Server1ServiceImpl implements Server1Service {

    @Override
    public String callribbonByFegin(String parm) {        //引數不需要@RequestParm
        return "Sorry," + parm + "server1 not responde";
    }
}

啟動 Feign服務,此時 開啟server1 客戶端,呼叫介面:

呼叫沒有任何問題,此時關閉server1 客戶端 再次呼叫介面:

發生異常,熔斷機制生效!