天天看點

SpringCloud - Hystrix(一)

Hystrix 觸發降級

1. 引入POM依賴 spring-cloud-starter-hystrix

2. 在OrderApplication,加注解@EnableCircuitBreaker

Order 微服務項目

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>      
package com.imooc.order;

import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@EnableFeignClients(basePackages = "com.imooc.product.client")
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class OrderApplication {

  public static void main(String[] args) {
    SpringApplication.run(OrderApplication.class, args);
  }
}      
  • @SpringCloudApplication(看源碼發現也包括了@EnableCircuitBreaker、@SpringBootApplication、@EnableDiscoveryClient等注解)
package com.imooc.order.controller;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.Arrays;

@RestController
public class HystrixController {

  @HystrixCommand(fallbackMethod = "fallback")
  @GetMapping("/getProductInfoList")
  public String getProductInfoList() {
                // product 微服務并未啟動
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);


    // 降級不一定用在調用目标服務失敗,也可能用于目前服務降級;即:并發數如果太高我們自己手動抛出異常,那麼它也會進入服務降級的方法中去
//    throw new RuntimeException("發送異常了");
  }

  private String fallback() {
    return "太擁擠了, 請稍後再試~~";
  }
}      

繼續閱讀