SpringCloud學習筆記(6):使用Zuul構建服務網關

簡介

Zuul是Netflix提供的一個開源的API網關服務器,SpringCloud對Zuul進行了整合和加強。服務網關Zuul聚合了全部微服務接口,並統一對外暴露,外部客戶端只需與服務網關交互便可。相對於內部服務而言,可以防止其被外部客戶端直接訪問而暴露服務的敏感信息,起到了保護做用。除此以外,Zuul還能夠實現身份認證、數據監控、動態路由等功能。html

項目介紹

  1. sc-parent,父模塊(請參照SpringCloud學習筆記(1):Eureka註冊中心)
  2. sc-eureka,註冊中心(請參照SpringCloud學習筆記(1):Eureka註冊中心)
  3. sc-provider,提供者(請參照SpringCloud學習筆記(1):Eureka註冊中心)
  4. sc-gateway,服務網關

使用Zuul構建服務網關

1.在父模塊下建立子模塊項目sc-gateway,pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.cf</groupId>
    <artifactId>sc-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>sc-gateway</artifactId>
  
  <dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
  </dependencies>
</project>

2.建立啓動類gateway.GatewayApplication:

package gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

@EnableZuulProxyh和@EnableZuulServer:

  1. @EnableZuulProxy是@EnableZuulServer的超集,@EnableZuulProxy包含@EnableZuulServer導入的全部過濾器。java

  2. @EnableZuulProxy使用反向代理,@EnableZuulServer不使用任何代理。web

3.建立application.yml:

server:
  port: 8088

spring:
  application:
    name: sc-gateway
    
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/  

zuul:
  routes:
    sc-provider: /sp/** #將serviceId爲sc-provider的服務映射到/sp/**路徑

4.測試

依次啓動註冊中心sc-eureka、提供者sc-provider、網關sc-gateway,如下是經過Zuul訪問提供者和直接訪問提供者的結果:
spring

其餘經常使用配置

1.忽略指定服務

zuul:
  ignored-services: serviceId1,serviceId2 #忽略服務serviceId1,serviceId2

2.忽略全部服務,只代理指定的服務

zuul:
  ignored-services: '*' #*爲忽略全部服務,只代理sc-provider服務
  routes:
    sc-provider: /sp/**

3.指定訪問路徑前綴,設置以後只能經過帶前綴訪問

zuul:
  prefix: /yc 
  routes:
    sc-provider: /sp/**

4.指定服務的url

zuul:
  routes:
    sc-provider:
      path: /sp/**
      url: http://localhost:8081 #指定服務sc-provider的url,不從Eureka註冊中心獲取。

這種配置方式不會做爲HystrixCommand執行,也不會使用Ribbon來平衡多個url的負載。要實現這些目標,可使用靜態服務器列表(listOfServers)或者指定serviceId。apache

5.指定敏感Header,防止敏感Header外泄

zuul:
  routes:
    sc-provider:
      path: /sp/**
      sensitiveHeaders: Cookie,Set-Cookie,Authorization #將會覆蓋全局zuul.sensitiveHeaders的值
      url: http://localhost:8081

若是要設置全局的敏感Header能夠設置zuul.sensitiveHeaders的值。Cookie,Set-Cookie,Authorization爲sensitiveHeaders的默認值,若是不想設置敏感header,能夠把sensitiveHeaders設置成空列表:服務器

zuul:
  routes:
    sc-provider:
      path: /sp/**
      sensitiveHeaders: 
      url: http://localhost:8081

6.忽略Header

zuul:
  ignoredHeaders: Header1, Header2 #Header1和Header2將不會傳播到其餘的微服務中

Zuul的路由端點

當@EnableZuulProxy和Spring Boot Actuator配合使用時,Zuul會暴露一個路由管理端點/routes,經過這個路由端點能夠查看到Zuul當前映射的路由列表信息。app

1.修改sc-gateway的pom.xml,新增Spring Boot Actuator依賴:

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

2.修改sc-gateway的application.yml,開啓/routes端點的訪問:

management:
  endpoints:
    web:
      exposure:
        include: 'routes'

3.訪問/routes端點

依次啓動註冊中心sc-eureka、提供者sc-provider、網關sc-gateway,而後訪問http://localhost:8088/actuator/routes/details,顯示路由列表信息以下:框架

Zuul過濾器

Zuul的核心是一系列過濾器,它們可以在HTTP請求和響應路由期間執行一系列操做。Zuul提供了一個框架來動態讀取、編譯和運行這些過濾器,過濾器之間不直接通訊,它們經過對每一個請求唯一的RequestContext共享數據。maven

1.Zuul過濾器類型

  • PRE Filters:在請求路由到具體的服務以前執行。
  • ROUTING Filters:用於將請求路由到微服務。
  • POST Filters:在請求路由到微服務以後執行。
  • ERROR Filters:在其餘階段發生錯誤時執行。

2.Zuul過濾器特性

  • Type:Zuul過濾器的類型,決定過濾器在請求的哪一個階段起做用。
  • Execution Order:規定過濾器的執行順序,值越小,越先執行。
  • Criteria:Filter執行所需的條件。
  • Action:若是知足條件,則執行的操做。

3.Zuul請求生命週期圖

4.自定義Zuul過濾器

新建類gateway.filter.MyZuulFilter:ide

package gateway.filter;
import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

public class MyZuulFilter extends ZuulFilter{
    
    /**
     * 具體執行邏輯
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        if (request.getParameter("name") != null) {
            System.out.println("你好," + request.getParameter("name"));
        }
        return null;
    }

    /**
     * 判斷你該過濾器是否要執行
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 過濾器執行順序
     */
    @Override
    public int filterOrder() {
        return 1;
    }

    /**
     * 過濾器類型
     */
    @Override
    public String filterType() {
        return "pre";
    }
}

啓動類GatewayApplication中添加配置:

@Bean
    public MyZuulFilter MyZuulFilter(){
        return new MyZuulFilter();
    }

依次啓動註冊中心sc-eureka、提供者sc-provider、網關sc-gateway,而後訪問http://localhost:8088/sp/book/list?name=小明,MyZuulFilter過濾器將會執行,控制檯輸出:你好,小明。

相關文章
相關標籤/搜索