1. 程式人生 > 程式設計 >Spring Cloud Gateway - 快速開始

Spring Cloud Gateway - 快速開始

Spring Cloud Gateway 工作原理

客戶端向 Spring Cloud Gateway 發出請求,如果請求與閘道器程式定義的路由匹配,則將其傳送到閘道器 Web 處理程式,此處理程式執行特定的請求過濾器鏈。

過濾器之間用虛線分開的原因是過濾器可能會在傳送代理請求之前或之後執行邏輯。所有 "pre" 過濾器邏輯先執行,然後執行代理請求,代理請求完成後,執行 "post" 過濾器邏輯。

如何啟動 Spring Cloud Gateway

1、新建 Maven 工程,新增相關依賴 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.anoyi</groupId>
    <artifactId>core-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>core-gateway</name>
    <description>gateway for miroservice</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-gateway</artifactId>
                <version>2.0.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>

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

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>複製程式碼

2、新增啟動類 Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;

@Configuration
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

}複製程式碼

3、啟動 Application(和 Spring Boot 專案一樣)

訪問 http://localhost:8080/ 報錯 404,同時日誌輸出:

2018-06-27 09:18:48.981  WARN 44156 --- [ctor-http-nio-2] .a.w.r.e.DefaultErrorWebExceptionHandler : 
Failed to handle request [GET http://localhost:8080/]: Response status 404複製程式碼

配置服務的路由:配置檔案方式

假設本地啟動了另外兩個 Spring Boot 服務,分別是 服務A( http://localhost:8081 )、服務B( http://localhost:8082 ),下面通過 Spring Cloud Gateway 來路由到這兩個服務。

1、在 resources 路徑下新增配置檔案 application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://localhost:8081
        predicates:
        - Path=/a/**
        filters:
        - StripPrefix=1
      - id: host_route
        uri: http://localhost:8082
        predicates:
        - Path=/b/**
        filters:
        - StripPrefix=1複製程式碼

  • id:固定,不同 id 對應不同的功能,可參考 官方檔案
  • uri:目標服務地址
  • predicates:路由條件
  • filters:過濾規則

2、重啟 Gateway 服務

3、測試

訪問 http://localhost:8080/a/ 路由到 服務A http://localhost:8081/

訪問 http://localhost:8080/b/ 路由到 服務B http://localhost:8082/

其他地址,例如 http://localhost:8080/a/user/all 路由到 服務A http://localhost:8081/user/all

配置服務的路由:編碼方式

實現如上服務路由,還可以通過編碼的方式實現。

1、刪除配置檔案 application.yml

2、修改 Application.java, 新增自定義路由配置

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.filter.factory.StripPrefixGatewayFilterFactory;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        StripPrefixGatewayFilterFactory.Config config = new StripPrefixGatewayFilterFactory.Config();
        config.setParts(1);
        return builder.routes()
                .route("host_route",r -> r.path("/a/**").filters(f -> f.stripPrefix(1)).uri("http://localhost:8081"))
                .route("host_route",r -> r.path("/b/**").filters(f -> f.stripPrefix(1)).uri("http://localhost:8082"))
                .build();
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

}複製程式碼

其他功能

http://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html

官方提供了大量的路由規則,比如Time、Host、Header 等等,同時也提供了大量的過濾器,比如AddRequestHeader、AddRequestParameter、AddResponseHeader 等等。僅通過簡單的配置即可實現功能強大的閘道器服務。

© 著作權歸作者所有,轉載或內容合作請聯絡作者

img

APM工具尋找了一圈,發現SkyWalking才是我的真愛

Spring Boot 注入外部配置到應用內部的靜態變數

將 HTML 轉化為 PDF新姿勢

Java 使用 UnixSocket 呼叫 Docker API

Fastjson致命缺陷

Service Mesh - gRPC 本地聯調遠端服務

使用 Thymeleaf 動態渲染 HTML

Fastjson致命缺陷

Spring Boot 2 整合log4j2日誌框架

Java面試通關要點彙總集之核心篇參考答案

Java面試通關要點彙總集之框架篇參考答案

Spring Security 實戰乾貨:如何保護使用者密碼

Spring Boot RabbitMQ - 優先順序佇列

本文由部落格一文多發平臺 OpenWrite 釋出!