1.网关的由来
微服务提出后,单体应用被拆分成多个服务,为了对外提供统一入口,解耦客户端与内部服务。
2.网关的作用
网关能做统一的路由转发、熔断、限流、安全认证、日志监控等。
3.网关zuul与Spring Cloud Gateway对比
4.Spring Cloud Gateway核心概念
1.路由(route) 路由是网关最基础的部分,路由信息由一个ID、一个目的URL、一组断言工厂和一组Filter组成。如果断言为真,则说明请求URL和配置的路由匹配。
2.断言(predicates) Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自Http Request中的任何信息,比如请求头和参数等。
3.过滤器(filter) 一个标准的Spring webFilter,Spring Cloud Gateway中的Filter分为两种类型,分别是Gateway Filter和Global Filter。过滤器Filter可以对请求和相应进行处理。
5.Spring Cloud Gateway工作原理
Spring Cloud Gateway核心处理流程如上图所示,Gateway的客户端向Spring Cloud Gateway发送请求,请求首先被HttpWebHandlerAdapter进行提取组装成网关上下文,然后网关的上下文会传递到DispatcherHandler。DispatcherHandler是所有请求的分发处理器,DispatcherHandler主要负责分发请求对应的处理器。比如请求分发到对应的RoutePredicateHandlerMapping(路由断言处理映射器)。路由断言处理映射器主要作用用于路由查找,以及找到路由后返回对应的FilterWebHandler。FilterWebHandler主要负责组装Filter链并调用Filter执行一系列的Filter处理,然后再把请求转到后端对应的代理服务处理,处理完毕之后将Response返回到Gateway客户端。
6.Spring Cloud Gateway代码实践
pom.xml增加Spring Cloud依赖和Gateway依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.8.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
代码方式配置网关
@SpringBootApplication
@RestController
public class DemoGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(DemoGatewayApplication.class, args);
}
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r
.path("/refund/**")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri("http://manage-test.payplatform.speiyou.cn/")
).build();
}
}
yml方式配置网关
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: pay-merchant
uri: http://merchant-beta.payplatform.speiyou.cn/
predicates:
- Path=/pay-merchant/**
- id: peiyou-finance
uri: http://peiyou-finance.test.speiyou.cn/
predicates:
- Path=/peiyou-finance/**
#filters:
# 进行token过滤
#- TokenAuthenticationFilter
#- StripPrefix=1
测试结果:
自定义GlobalFilter
@Component
public class LogGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest serverHttpRequest= exchange.getRequest();
String url = serverHttpRequest.getURI().toString();
System.out.println("url ------>: " + url);//打印每次请求的url
return chain.filter(exchange);
}
}
7.Spring Cloud Gateway参考资料
Spring Cloud Gateway官方文档
Spring Cloud Gateway断言匹配
Spring Cloud Gateway之Filter使用
Spring Cloud Gateway 动态路由