[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ow0KO8iV-1686286922163)(null)]
GateWay是zuul的替代品,由于Zuul2.0迟迟没有出来,SpringCloud社区推出了gateWay网关来替代zuul1.x版本。提供了以下功能: 底层使用netty通讯
反向代理
鉴权
安全
监控、指标
限流
GateWay具有以下特征: 基于Spring,PR,SpringBoot构建
动态路由
集成hystrix断路器功能
路径重写
请求限流等功能
断言和过滤器
Getway是基于异步非阻塞模型上进行开发,性能更优秀。
阻塞处理模型就是: 当请求进入ServletContainer,它就会为之绑定一个线程,这种模型只适合用于并发不高的情况。Zuul1.x就是基于这么一个阻塞式处理模型。
Servlet3.1之后有异步非阻塞的支持,webFlux就是基于这么个框架,他的核心就是基于Reactor相关的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wm6RKKXq-1686286919028)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128170458657.png)]
路由是构建网关的基本模块,由ID,和目标URI,和一系列断言和过滤器组成,如果断言为True则匹配该路由。
浅浅可以与Vue的路由概念相理解
断言就是Java8中Java.utils.function.Predicate,匹配Http请求中的内容,如果请求与断言相互匹配,则进行路由转发到微服务。
GatewayFilter的实例,使用过滤器,在请求被路由转发之前或者之后对请求进行修改
like ServletFilter: beforeFilter doAction afterFilter
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hx3i9eBP-1686286922136)(null)]
总结gateway的作用就是路由转发+执行过滤链
使用gatway网关,来访问8001的微服务
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
由于网关也是一种微服务,因此也需要注册进入服务注册中心;
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/circuitBreak/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/ok/** # 断言,路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateway-service
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8wVKlev-1686286922174)(null)]
通过上面的案例中,出现了两个问题
我们可以通过修改Yaml,实现动态路由来解决以上两个问题。
cloud:
gateway:
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-HYSTRIX-PAYMENT/
predicates:
- Path=/payment/circuitBreak/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-HYSTRIX-PAYMENT/
predicates:
- Path=/payment/ok/** # 断言,路径相匹配的进行路由
discovery:
locator:
enabled: true #开启识别动态路由
在官方自带的断言有11种
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VlMwvJvV-1686286922187)(null)]
以上各种RoutePredicateFactory都代表了HTTP请求中不同属性值,之间都可以进行组合,并且通过逻辑AND进行断言匹配。
匹配时间: ZonedDateTime
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EuUVhQu-1686286919029)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128211153223.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNvO7sFW-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213157753.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JON9M7x9-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213331414.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NpDwlLJb-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213426307.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69ll88c0-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213459763.png)]
predicate就是为了实现一组匹配规则,让请求过来找到对应的route进行处理。
使用过滤器,可以在路由转发请求前,或者请求后,对请求进行一定的修改,也就是可以修改进入的HTTP请求和返回的HTTP相应,路由过滤器只能指定路由进行使用。
根据官网文档,添加配置:
简单实例:
yaml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgQUxGVh-1686286922201)(null)]
可以进行全局日志记录,同一网关鉴权等…
@Component
public class MyLoagGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if(uname == null){
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
/**
* 优先级
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
测试:
不带uname访问:
带着uname访问成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiEmVJhl-1686286922148)(null)]