客户端向 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 发布!