使用Hystrix實現斷路器處理

在以前的架構的基礎上咱們會發現,一旦級別低的服務宕了,會致使調用它的服務也掛掉,這樣容易產生級聯效應(雪崩效應),爲了防止這種狀況的出現,我引入了Hystrix來處理,先介紹ribbon使用Hystrixjava

首先引入以來pom.xml:git

<!-- Hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.hystrix</groupId>
            <artifactId>hystrix-javanica</artifactId>
        </dependency>
        <!-- spring boot低版本使用上面的,高版本使用下面註釋的內容,由於最新的hystrix隸屬於netfix下 -->
<!--         <dependency> -->
<!--             <groupId>org.springframework.cloud</groupId> -->
<!--             <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> -->
<!--         </dependency> -->
<!--         <dependency> -->
<!--             <groupId>org.springframework.cloud</groupId> -->
<!--             <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> -->
<!--         </dependency> -->

接着在啓動類的上面加入Hystrix的註解@EnableCircuitBreakergithub

最後在MovieController中加入以下代碼spring

@HystrixCommand(fallbackMethod = "fallbackfindUserByNameEn") //ribbon使用Hystrix
@ApiOperation(value = "查詢用戶ByName", notes = "查詢用戶By中文名")//方法說明
@ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Movie.class)})//響應數聽說明,能夠有多個
@ApiImplicitParam(name = "name", value = "用戶名", paramType = "path", required = true, dataType = "String")
@GetMapping(value = "/findUserByName/{name}",produces = { "application/json;charset=UTF-8" })
public User findUserByName(@PathVariable String name) {
return this.restTemplate.getForObject("http://xing-user/user/findByName/"+name, User.class);
}json

這裏解釋一下@HystrixCommand(fallbackMethod = "fallbackfindUserByNameEn")是調用服務異常那就去執行fallbackfindUserByNameEn方法,固然你可能在別的博客裏看到有以下的寫法:服務器

@HystrixCommand(fallbackMethod = "fallbackfindUserByNameEn",commandProperties = {)@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")},可是官方文檔裏面推薦寫成我上面的代碼中的格式,不要寫commandProperties屬性,
findUserByNameEn方法在同一個線程中執行,官方不推薦添加這一段,官方文檔推薦出現運行時找不到上下文異常的時候再加上這段代碼,下面是官方文檔的截圖commandProperties這段屬性的意思是調用fallbackfindUserByNameEn方法和執行

記錄一個異常,今天啓動movie1的時候出現網絡

org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration': Singleton bean creation not allowed while the singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)的異常,找了好久才發現是我開了IDEA,IDEA中我啓動了一個項目,致使了端口占用,關閉IDEA中的項目就行。架構

 

下面咱們介紹Feign中使用Hystrixapp

參照以前博客中的movie服務中的UserInterface(使用Feign調用user服務的接口類),在這個類的註解中加入標紅的代碼@FeignClient(name = "xing-user" ,fallback = UserInterfaceFallback.class)//服務名,以後在UserInterface這個java類的下面加一個類ide

@Component
class UserInterfaceFallback implements UserInterface {
    @Override
    public User findByNameEn(String nameEn) {
        User user = new User();
        user.setName("");
        user.setNameEn("");
        user.setId(0);
        return user;
    }
固然UserInterfaceFallback這個類也能夠是單獨寫成一個java文件,沒有非要寫在UserInterface類同一個java文件中。測試成功能夠實現斷路功能。若是想在Feign中禁用Hystrix能夠在yml中加入這個配置便可feign.hystrix.enabled=false
注意:這裏提醒一點必定要加@Component這個註解,我看官方文檔裏面好像沒有加,不加的話會有以下異常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.xing.movie.FeignInteface.UserInterface':
FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: No fallback instance of type class com.xing.movie.FeignInteface.UserInterfaceFallback found for feign client xing-user

使用Hystrix Dashboard
Hystrix Dashboard,它主要用來實時監控Hystrix的各項指標信息。經過Hystrix Dashboard反饋的實時信息,能夠幫助咱們快速發現系統中存在的問題,下面我把它引入到個人項目中,使用很簡單隻要兩步就行
第一步: 在pom.xml文件中加入Dashboard的依賴
<!-- Hystrxi dashboard的依賴,實時監控Hystrix的各項指標反饋實時信息 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            </dependency>
 

第二步: 在啓動類中加入@EnableHystrixDashboard註解就好了,以後啓動你的項目,訪問http://127.0.0.1:8081/hystrix/會看到下面這個界面

經過Hystrix Dashboard主頁面的文字介紹,咱們能夠知道,Hystrix Dashboard共支持三種不一樣的監控方式

  默認的集羣監控:經過URL:http://turbine-hostname:port/turbine.stream開啓,實現對默認集羣的監控。

  指定的集羣監控:經過URL:http://turbine-hostname:port/turbine.stream?cluster=[clusterName]開啓,實現對clusterName集羣的監控。

  單體應用的監控:經過URL:http://hystrix-app:port/hystrix.stream開啓,實現對具體某個服務實例的監控。(我這裏輸入的是個人服務實例)

  Delay:控制服務器上輪詢監控信息的延遲時間,默認爲2000毫秒,能夠經過配置該屬性來下降客戶端的網絡和CPU消耗。

  Title:該參數能夠展現合適的標題。

這個界面就能夠看到你個人服務調用的成功和失敗的狀況了

 

 
源碼地址:https://github.com/OnlyXingxing/SpringCloud
相關文章
相關標籤/搜索