简介
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Netflix Zuul网关。网关作为流量入口,在微服务系统中有着非常重要的作用,网关常见的功能有路由转发、权限校验、限流控制等。
用户的请求首先经过gateway,根据路径由gateway的predict 去断言进到哪一个 router, router经过各种过滤器处理后,最后路由到具体的业务服务,如图:

核心概念
Route Predicate
Route Predicate负责路由匹配,Spring Cloud Gateway内置了许多Predicate,我们可以直接使用。
GatewayFilter
GatewayFilter路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应, 路由过滤器适用于特定路由。
Global Filters
Global Filters全局路由过滤器和GatewayFilter类似,不同的是它作用于所有路由。
核心处理流程
Spring Cloud Gateway 的核心处理流程如下,Gateway的客户端回向Spring Cloud Gateway发起请求,请求首先会被HttpWebHandlerAdapter进行提取组装成网关的上下文,然后网关的上下文会传递到DispatcherHandler。DispatcherHandler是所有请求的分发处理器,DispatcherHandler主要负责分发请求对应的处理器,比如将请求分发到对应RoutePredicateHandlerMapping(路由断言处理器映射器)。路由断言处理映射器主要用于路由的查找,以及找到路由后返回对应的FilteringWebHandler。FilteringWebHandler主要负责组装Filter链表并调用Filter执行一系列Filter处理,然后把请求转到后端对应的代理服务处理,处理完毕后,将Response返回到Gateway客户端。

上代码
新建四个模块,工程目录结构如下:

新建spring父项目
新建maven项目,pom如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
添加eureka模块
新建eureka service模块,pom如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置文件如下:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eurka-server
添加两个server模块
新建eureka client模块,pom如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置文件如下:
server:
port: 8762
spring:
application:
name: service-hi
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
添加服务:
@RequestMapping(value = "/hi", method = RequestMethod.GET)
public String getPort(@RequestParam(value = "name") String name) {
StringBuilder stringBuilder = new StringBuilder();
Enumeration<String> headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String headName = headers.nextElement();
stringBuilder.append(headName + ":" + request.getHeader(headName) + "<br/>");
}
return "Hi," + name + ",我的port是:" + port + ",<br/> header:<br/>" + stringBuilder.toString();
}
访问地址http://localhost:8762/hi?name=randy,结果如图:
image.png
添加gateway模块
新建eureka client模块,pom如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置文件如下:
server:
port: 8081
spring:
application:
name: sc-gateway-service
cloud:
gateway:
actuator:
verbose:
enabled: true
discovery:
locator:
enabled: true
lowerCaseServiceId: true
routes:
- id: path-route
uri: lb://service-hi
predicates:
- Path=/demo/{segment}
filters:
- AddRequestHeader=GatewayFilter,myfilter
- StripPrefix=1
访问http://localhost:8081/get,结果如图:
image.png

