1. 程式人生 > >zuul動態路由整合hystrix實現熔斷保護並整合feign實現宣告式服務呼叫

zuul動態路由整合hystrix實現熔斷保護並整合feign實現宣告式服務呼叫

上一篇中。將userService提供服務的返回時間延遲4000ms。導致feign在呼叫時候出發熔斷。直接返回fallback回撥。

這一篇中加入zuul實現動態路由功能。並加入ZuulFilter的前置過濾功能。zuul整合hystrix預設在早期版本是開啟的。但在後期

版本就關閉了自動開啟功能,需要手動配置開啟。這一點需要注意

測試程式碼如下:

1:引入相關的依賴:

<dependency>
			    <groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zuul</artifactId>
		</dependency>

2:配置路由檔案:

zuul:
  routes:
    #serviceId可以隨便寫只要唯一就行。一般寫呼叫的服務的spring.application.name對應的值
    microservice-consumer-movie-feign:
      #攔截的url
      path: /feign/**
      #去掉字首,例如請求的url:/fegin/user/1,那麼請求的http://xxxx:xx/feigin/user/1,如果沒有下面的**/fegin/fegin/user/1
      stripPrefix: false

 3:zuul整合hystrix預設的超時時間是1s。所以這裡要配置相應的超時時長

#zuul整合hystrix預設1s.這裡如果不設定超時時間就會報錯
ribbon:
  ReadTimeout: 1000
  ConnectTimeout: 500

#熔斷機制
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 25000

上面兩個配置。同時起作用。一般hystrix的超時時間要大於ribbon的時間。如果超時就回觸發zuul的回撥機制。下面編寫zuul

的回撥函式

package com.itmuch.cloud.microserviceconsumermoviezuul.controller;

import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

/**
 * : 描述資訊
 *
 * @author liyy
 * @date 2018-12-03 20:03
 */
@Component
public class UserServiceFallbackProvider implements ZuulFallbackProvider {
    @Override
    public String getRoute() {
        return "microservice-consumer-movie-feign";
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return this.getStatusCode().value();
            }

            @Override
            public String getStatusText() throws IOException {
                return this.getStatusCode().getReasonPhrase();
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("Service-user不可用".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));
                headers.setContentType(mt);
                return headers;
            }
        };
    }
}

springboot2.0版本以後。ZuulFallbackProvider 這個類已經沒喲了。但是FallbackProvider這個類還是可以用。

如果出現超時。這回觸發回到。返回

Service-user不可用的結果。