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 等等。僅通過簡單的配置即可實現功能強大的閘道器服務。
© 著作權歸作者所有,轉載或內容合作請聯絡作者
● APM工具尋找了一圈,發現SkyWalking才是我的真愛
● Spring Boot 注入外部配置到應用內部的靜態變數
● Java 使用 UnixSocket 呼叫 Docker API
● Service Mesh - gRPC 本地聯調遠端服務
● Spring Security 實戰乾貨:如何保護使用者密碼
● Spring Boot RabbitMQ - 優先順序佇列
本文由部落格一文多發平臺 OpenWrite 釋出!