天天看點

SpringCloud微服務(05):Zuul元件,實作路由網關控制

本文源碼:GitHub·點這裡 || GitEE·點這裡

一、Zuul元件簡介

1、基礎概念

Zuul 網關主要提供動态路由,監控,彈性,安全管控等功能。在分布式的微服務系統中,系統被拆為了多個微服務子產品,通過zuul網關對使用者的請求進行路由,轉發到具體的後微服務子產品中。

2、Zuul的作用

1)按照不同政策,将請求轉發到不同的服務上去;
2)聚合API接口,統一對外暴露,提高系統的安全性;
3)實作請求統一的過濾,以及服務的熔斷降級;

3、案例結構

SpringCloud微服務(05):Zuul元件,實作路由網關控制

啟動順序如下:

# 注冊中心
node05-eureka-7001
# 兩個服務提供者
node05-provider-6001
node05-provider-6002
# 網關控制
node05-zuul-7002
           

啟動成功後,注冊中心展示如下:

SpringCloud微服務(05):Zuul元件,實作路由網關控制

二、Zuul使用詳解

1、核心依賴

<!-- 路由網關 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
           

2、核心配置檔案

server:
  port: 7002
spring:
  application:
    name: cloud-node05-parent
eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://registry01.com:7001/eureka/
zuul:
  # 字首,可以用來做版本控制
  prefix: /v1
  # 禁用預設路由,執行配置的路由
  ignored-services: "*"
  routes:
    # 配置6001接口微服務
    pro6001:
      serviceId: node05-provider-6001
      path: /api-6001/**
    # 配置6002接口微服務
    pro6002:
      serviceId: node05-provider-6002
      path: /api-6002/**
           
  • 啟動類注解:@EnableZuulProxy

3、統一服務降級

實作FallbackProvider接口,自定義響應提示。

@Component
public class FallBackConfig implements FallbackProvider {
    private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ;
    @Override
    public ClientHttpResponse fallbackResponse(Throwable cause) {
        // 捕獲逾時異常,傳回自定義資訊
        if (cause instanceof HystrixTimeoutException) {
            return response(HttpStatus.GATEWAY_TIMEOUT);
        } else {
            return fallbackResponse();
        }
    }
    private ClientHttpResponse response(final HttpStatus status) {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() {
                return status;
            }
            @Override
            public int getRawStatusCode() {
                return status.value();
            }
            @Override
            public String getStatusText() {
                return status.getReasonPhrase();
            }
            @Override
            public void close() {
                LOGGER.info("close");
            }
            @Override
            public InputStream getBody() {
                String message =
                        "{\n" +
                            "\"code\": 200,\n" +
                            "\"message\": \"微服務飛出了地球\"\n" +
                        "}";
                return new ByteArrayInputStream(message.getBytes());
            }
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
    @Override
    public String getRoute() {
        return "*";
    }
    @Override
    public ClientHttpResponse fallbackResponse() {
        return response(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
           

4、統一過濾器

繼承ZuulFilter類,自定義過濾動作。

@Component
public class FilterConfig extends ZuulFilter {
    private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ;
    @Override
    public String filterType() {
        return "pre";
    }
    @Override
    public int filterOrder() {
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        return true;
    }
    @Override
    public Object run() {
        RequestContext requestContext = RequestContext.getCurrentContext() ;
        try {
            doBizProcess(requestContext);
        } catch (Exception e){
            LOGGER.info("異常:{}",e.getMessage());
        }
        return null;
    }

    public void doBizProcess (RequestContext requestContext) throws Exception {
        HttpServletRequest request = requestContext.getRequest() ;
        String reqUri = request.getRequestURI() ;
        if (!reqUri.contains("getAuthorInfo")){
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
            requestContext.getResponse().getWriter().print("Path Is Error...");
        }
    }
}
           

5、測試流程

1)測試網關配置

通路如下接口,響應正常,說明網關配置生效:

http://localhost:7002/v1/api-6001/getAuthorInfo/1
http://localhost:7002/v1/api-6002/getAuthorInfo/2
           

2)測試服務降級

關閉6001服務,再次通路接口,提示資訊如下,說明服務降級政策生效:

{
	"code": 200,
	"message": "微服務飛出了地球"
}
           

3)測試過濾器

因為請求URI不比對getAuthorInfo,是以被攔截,說明過濾器略生效:

http://localhost:7002/v1/api-6001/
響應提示:
Path Is Error...
           

三、源代碼位址

GitHub·位址
https://github.com/cicadasmile/spring-cloud-base
GitEE·位址
https://gitee.com/cicadasmile/spring-cloud-base
           
SpringCloud微服務(05):Zuul元件,實作路由網關控制

繼續閱讀