09-Getway
本笔记来源于:尚硅谷SpringCloud框架开发教程(SpringCloudAlibaba微服务分布式架构丨Spring Cloud)
b站视频
文章来自:
https://github.com/OT-mt/cloud2020/tree/master/springcloud-2%E5%B0%9A%E7%A1%85%E8%B0%B7%E5%91%A8%E9%98%B3-2020
脑图
概述
官网
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/
结构
三大核心概念
- Route(路由)
网关的基本构建块。它由ID,目标URI,谓词集合和过滤器集合定义。如果断言为true,则匹配路由。 - Predicate(断言)
这是Java 8 Function谓词。输入类型是Spring FrameworkServerWebExchange。这使您可以匹配HTTP请求中的所有内容,例如标头或参数。 - Filter(过滤器)
这些是使用特定工厂构造的Spring FrameworkGatewayFilter实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。
工作流程
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链来运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。
实践
建模块:cloud-gateway-gateway9527
- pom
1
2
3
4
5<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 注意不要添加 web的依赖,与gateway里的web flux冲突 --> - yml
1
2
3
4
5
6
7
8
9
10
11
12
13server:
port: 9527
spring:
application:
name: cloud-gateway
eureka:
instance:
hostname: cloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka - 启动类
1
2
3@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient测试
- 9527中配置路由
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15spring:
application:
name: cloud-gateway
cloud:
gateway:
routes: # 可以配置多个路由
- id: payment_routh # 路由id,没有固定规则但要求唯一
uri: http://localhost:8001 # 匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** # 路径相匹配的进行路由
- id: payment_routh2 # 路由id,没有
uri: http://localhost:8001 # 匹配后提供服务的路由地址
predicates:
- Path=/payment/payment # 路径相匹配的进行路由 - 配置后可以通过以下路径访问8001中的信息
http://localhost:9527/payment/get/31
不再暴露8001的端口 - 配置路由的另一种方法,9527注入 RouteLocator的Bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16@Configuration
public class GateWayConfig {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
/*
* 代表访问http://localhost:9527/guonei
* 跳转到http://news.baidu.com/guonei
* */
routes.route("route1",
r->r.path("/guonei")
.uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
}
动态路由
- 9527yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 1.开启从服务在注册中心动态创建路由的功能
routes:
- id: payment_routh
# uri: http://localhost:8001 # 匹配后提供服务的路由地址
uri: lb://cloud-payment-service # 2.输入服务名,lb代表负载均衡
predicates:
- Path=/payment/get/**
- id: payment_routh2
# uri: http://localhost:8001 # 匹配后提供服务的路由地址
uri: lb://cloud-payment-service # 2.输入服务名,lb代表负载均衡
predicates:
- Path=/payment/createPredicate的使用
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#the-between-route-predicate-factory
全部在 yml的Predicate之下 - After获取当前时区的时间
1
2# 在该时间之后可以使用
- After=2020-05-26T17:07:03.043+08:00[Asia/Shanghai]1
ZonedDateTime z = ZonedDateTime.now();// 默认时区
- Before
1
2# 之前
- Before=2017-01-20T17:42:47.789-07:00[America/Denver] - Between
1
2# 之间
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] - Cookie
1
2# 查看有没有指定kv的cookie
- Cookie=username,wxh - Header
1
# 请求头,跟cookie一样指定kv键值对
- Host
1
#
- Method
1
#
- Path
1
#
- Query
1
#
- ReadBodyPredicateFactory
1
#
- RemoteAddr
1
#
- Weight
1
#
- CloudFoundryRouteService
1
#
过滤器 Filter
单一过滤器
全局过滤器
请求头过滤器
自定义过滤器
- 实现接口GlobalFilter,Ordered
- 能干嘛
- 全局日志记录
- 统一网关鉴权
- 案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26@Component
@Slf4j
public class MyLogFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 判断有没有 uname 这个参数
log.info("自定义全局日志过滤器");
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname==null){
log.info("用户名非法");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
/*
* int HIGHEST_PRECEDENCE = -2147483648;
int LOWEST_PRECEDENCE = 2147483647;
* 加载过滤器顺序
* 数字越小优先级越高
* */
@Override
public int getOrder() {
return 0;
}
}
09-Getway
http://yuanql.top/2023/06/27/13_SpringCloud/springcloud-2尚硅谷周阳-2020/09-Getway/