史上最簡單的 SpringCloud 教程 | 第四篇: 斷路器(Hystrix)

轉載請標明出處:
blog.csdn.net/forezp/arti…
本文出自方誌朋的博客javascript

在微服務架構中,咱們將業務拆分紅一個個的服務,服務與服務之間能夠相互調用(RPC)。爲了保證其高可用,單個服務又必須集羣部署。因爲網絡緣由或者自身的緣由,服務並不能保證服務的100%可用,若是單個服務出現問題,調用這個服務就會出現網絡延遲,此時如有大量的網絡涌入,會造成任務累計,致使服務癱瘓,甚至致使服務「雪崩」。html

爲了解決這個問題,就出現斷路器模型。java

1、斷路器簡介

Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls.git

. ----摘自官網 github

Netflix已經建立了一個名爲Hystrix的庫來實現斷路器模式。 在微服務架構中,多層服務調用是很是常見的。spring

HystrixGraph.png

較底層的服務若是出現故障,會致使連鎖故障。當對特定的服務的調用達到一個閥值(hystric 是5秒20次) 斷路器將會被打開。瀏覽器

HystrixFallback.png

斷路打開後,可用避免連鎖故障,fallback方法能夠直接返回一個固定值。網絡

2、準備工做

基於上一篇文章的工程,首先啓動:
基於上一節的工程,啓動eureka-server 工程;啓動service-hi工程,它的端口爲8762;架構

3、在ribbon使用斷路器

改造serice-ribbon 工程的代碼:app

在pox.xml文件中加入:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>複製代碼

在程序的入口類加@EnableHystrix:

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ServiceRibbonApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}複製代碼

改造HelloService類,加上@HystrixCommand,並指定fallbackMethod方法。

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }

    public String hiError(String name) {
        return "hi,"+name+",sorry,error!";
    }
}複製代碼

啓動:service-ribbon 工程,當咱們訪問http://localhost:8764/hi?name=forezp,瀏覽器顯示:

hi forezp,i am from port:8762

此時關閉 service-hi ,工程,當咱們再訪問http://localhost:8764/hi?name=forezp,瀏覽器會顯示:

hi ,forezp,orry,error!

這就證實斷路器起做用了。

4、Feign中使用斷路器

若是你使用了feign,feign是自帶斷路器的,而且是已經打開了。若是使用feign不想用斷路器的話,能夠在配置文件中關閉它,配置以下:

feign.hystrix.enabled=false

基於service-feign咱們在改造下,只須要在SchedualServiceHi接口的註解中加上fallback的指定類就好了:

@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}複製代碼

SchedualServiceHiHystric類:

@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}複製代碼

啓動四servcie-feign工程,打開http://localhost:8765/hi?name=forezp,注意此時service-hi還沒打開,網頁顯示:

sorry forezp

打開service-hi,網頁顯示;

>

hi forezp,i am from port:8762

這證實斷路器起到做用了。

5、Circuit Breaker: Hystrix Dashboard (斷路器:hystrix 儀表盤)

基於service-ribbon 改造下:

pom.xml加入:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>複製代碼

在主程序入口中加入@EnableHystrixDashboard註解,開啓hystrixDashboard:

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
public class ServiceRibbonApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}複製代碼

打開瀏覽器:訪問http://localhost:8764/hystrix,界面以下:

Paste_Image.png

點擊monitor stream,進入下一個界面,訪問:http://localhost:8764/hi?name=forezp

此時會出現監控界面:

Paste_Image.png

本文源碼下載:
github.com/forezp/Spri…

6、參考資料

circuit_breaker_hystrix

feign-hystrix

hystrix_dashboard

優秀文章推薦:

勘誤:有人反映feign的熔斷器不起做用,springcloud版本的問題,用這個:

<dependencyManagement>
   <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies>
</dependencyManagement>複製代碼
相關文章
相關標籤/搜索