客戶端向 Spring Cloud Gateway 發出請求,若是請求與網關程序定義的路由匹配,則將其發送到網關 Web 處理程序,此處理程序運行特定的請求過濾器鏈。html
過濾器之間用虛線分開的緣由是過濾器可能會在發送代理請求以前或以後執行邏輯。全部 "pre" 過濾器邏輯先執行,而後執行代理請求,代理請求完成後,執行 "post" 過濾器邏輯。java
一、新建 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>
二、添加啓動類 Application.javaspring
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); } }
三、啓動 Application(和 Spring Boot 項目同樣)apache
訪問 http://localhost:8080/
報錯 404,同時日誌輸出:json
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 來路由到這兩個服務。segmentfault
一、在 resources
路徑下添加配置文件 application.yml
app
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
二、重啓 Gateway 服務框架
三、測試maven
訪問 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
實現如上服務路由,還能夠經過編碼的方式實現。
一、刪除配置文件 application.yml
二、修改 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...
官方提供了大量的路由規則,好比Time、Host、Header 等等,同時也提供了大量的過濾器,好比AddRequestHeader、AddRequestParameter、AddResponseHeader 等等。僅經過簡單的配置便可實現功能強大的網關服務。
© 著做權歸做者全部,轉載或內容合做請聯繫做者
● APM工具尋找了一圈,發現SkyWalking纔是個人真愛
● Spring Boot 注入外部配置到應用內部的靜態變量
● Java 使用 UnixSocket 調用 Docker API
● Service Mesh - gRPC 本地聯調遠程服務
● Spring Security 實戰乾貨:如何保護用戶密碼
● Spring Boot RabbitMQ - 優先級隊列
本文由博客一文多發平臺 OpenWrite 發佈!