一、介绍
GateWay三大核心概念:
断言、路由、过滤

举个例子:我要进学校,门口保安需要判断我是否是这里的学生,这个过程就是断言,如果我是,则可以进去,相当于进入了路由,但是进入学校之后我没有穿校服,老师不让进教室,这就是过滤。他们三者是逐步判断的过程。
当使用GateWay时,相当于对一个微服务进行了保护,把它包裹起来。先做一下对比,在不使用GateWay的时候,启动8001服务,可以查询出信息。

当使用GateWay的时候,将端口号改为GateWay的端口号 (9527),则也可以查询出8001中的信息。

二、实战
接下来是GateWay的使用,首先建一个module,然后修改pom,pom如下 :
<dependencies>
<!--引入gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--一般基础配置类-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
接下来新建yml,文件内容如下:
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址,使用eureka上的地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** # 断言,路径相匹配的进行路由
#- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #可以设置访问页面的时间,after表示在什么时间之后进行访问
# - Cookie=username,zzyy
#- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
eureka:
instance:
hostname: cloud-gateway-service
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka
1、路由
yml文件中路由的代码如下:
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址,使用eureka上的地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
上面的id是对路由的唯一标识即可,uri是要保护的地址。
2、断言
yml文件中断言的代码如下:
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
判断匹配的路径是否正确,**代表参数。
如下的断言意思是在此时间之后才可以访问页面
- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #可以设置访问页面的时间,after表示在什么时间之后进行访问
下面的两个断言可以通过cmd中curl指令进行查看是否有效
- Cookie=username,zzyy
#- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
如下是没有加上cookie断言的
![]()
当加上cookie断言时候会进行报错,无法进行访问

当在后面输入cookie之后可以正常访问:

Header断言要求Id为整数,使用如下:
![]()
断言也可以通过手写配置来操作,代码和注释如下:
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
RouteLocatorBuilder.Builder routes = builder.routes();
/**
* id是唯一的标识
* patterns:是通过 访问9527+后置guonei就可以访问下面的地址了。
* .uri是进行断言,如果匹配则进入这个网站
*/
routes.route("path_route_atguigu",
r -> r.path("/guonei")
.uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
}
访问方式如下:

3、过滤器
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
{
log.info("***********come in MyLogGateWayFilter: "+new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if(uname == null)
{
log.info("*******用户名为null,非法用户,o(╥﹏╥)o");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder()
{
return 0;
}
如果在地址上没有输入uname则无法访问,加上uname即可访问,无论uname后面的值是什么都可以

本文介绍了Spring Cloud Gateway的核心概念,包括断言、路由和过滤器。通过实例展示了如何配置路由规则,如Path断言,并通过过滤器实现访问控制,如检查Cookie和Header。此外,还提供了自定义路由配置的方法。
479





