2--SpringCloud熔斷器hystrix

什麼是斷路器

  「斷路器」自己是一種開關裝置,用於在電路上保護線路過載,當線路中有電器發生短路時,「斷路器」可以及時的切斷故障電路,防止發生過載、發熱、甚至起火等嚴重後果。html

  在分佈式架構中,斷路器模式的做用也是相似的,當某個服務單元發生故障(相似用電器發生短路)以後,經過斷路器的故障監控(相似熔斷保險絲),向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間佔用不釋放,避免了故障在分佈式系統中的蔓延。java

  在Spring Cloud中使用了Hystrix 來實現斷路器的功能。Hystrix是Netflix開源的微服務框架套件之一,該框架目標在於經過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具有擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能。git

 

使用斷路器

  首先在上一文中已經實現了github

  eureka.server工程:服務註冊中心  端口1111web

  eureka.provider工程:服務提供者  端口2222spring

  eureka.customer工程:服務消費者  端口3333緩存

  若您尚未使用Spring Cloud的經驗 請先閱讀 1--SpringCloud的服務註冊與發現Eureka架構

 

  首先咱們在eureka.customer工程服務的消費者的pom文件裏面加上hystrix依賴app

<!-- 新增斷路器hystrix的依賴 -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

  而後咱們在啓動主類上面添加@EnableCircuitBreaker註解開啓斷路器功能:負載均衡

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker//開啓斷路器
public class RibbonApplication {

    @Bean
    @LoadBalanced//負載均衡的開啓
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

}

  新增server業務處理類去調用COMPUTE-SERVICE裏面的add方法,在處理方法上面加上@HystrixCommand註解 裏面的addServiceFallback表示出錯後回調的方法,回調方法必須和調用者在同一類中。

 

package com;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@Service
public class ConsumerService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "addServiceFallback")//若是調用服務失敗的話,調用方法addServiceFallback
    public String addService() {
        return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
    }
    
    public String addServiceFallback() {
        return "error";
    }
}

  修改ConsumerController

  咱們直接調用業務層的方法。

package com;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

    @Autowired
    private ConsumerService server;

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String add() {
        return server.addService();
    }
//
}

斷路器的測試

  這樣依次啓動按道理說應該就實現了hystrix的斷路器的功能。

  可是個人 服務提供者並無下線,中間也沒有拋錯,也順利的執行了add方法,可是返回的確實錯誤回調方法的error

  而後我想到多是服務在調用的時候發生了超時,hystrix的默認超時時間是1秒鐘,多是機器太慢發生超時。

  能夠在配置文件裏面設置超時時間,單位是毫秒

#設置斷路器超時時間
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

  這下就正常了。

  源碼下載:2--SpringCloud熔斷器hystrix

相關文章
相關標籤/搜索