java 网关正则表达式_Spring Could学习之网关(GateWay篇)

本文介绍了Spring Cloud Gateway作为服务网关的优势,对比了与Zuul的区别,强调了Gateway的异步支持和更好的扩展性。详细讲解了Gateway的配置,包括动态路由、Predicate匹配规则和过滤器(Filter)的使用,特别是如何利用正则表达式进行路径匹配和定制过滤逻辑。
摘要由CSDN通过智能技术生成

为什么出现了GateWay?

zuul是Netflix团队写的一套服务网关,Zuul 1 出现了一些问题准备出 Zuul 2

时候核心开发员工离开的团队,导致Zuul 2 一直是半残品。这时候spring团队吸收zuul的优点推出了GateWay。

GateWay与Zuul区别:

Zuul:

使用的是阻塞式的 API,不支持长连接,比如 websockets。

底层是servlet,Zuul处理的是http请求

没有提供异步支持,流控等均由hystrix支持。

依赖包spring-cloud-starter-netflix-zuul。

Gateway:

底层依然是servlet,但使用了webflux,多嵌套了一层框架

依赖spring-boot-starter-webflux和/ spring-cloud-starter-gateway

提供了异步支持,提供了抽象负载均衡,提供了抽象流控,并默认实现了RedisRateLimiter。

相同点:

底层都是servlet

两者均是web网关,处理的是http请求

不同点:

内部实现:

gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。

是否支持异步

zuul仅支持同步

gateway支持异步。理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定

框架设计的角度

gateway具有更好的扩展性,并且其已经发布了2.0.0的RELESE版本,稳定性也是非常好的

性能

WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API。 Websockets得到支持,并且由于它与Spring紧密集成,所以将会是一个更好的 开发 体验。

Zuul 1.x,是一个基于阻塞io的API Gateway。Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划。

实战

pom依赖

org.springframework.cloud

spring-cloud-starter-gateway

注意:gateway 不允许加入 spring-boot-starter-web依赖

7dc7f9cec01a6f0afd172e6c0422fa41.png

配置文件配置网关

spring:

application:

name: gateway-server

cloud:

gateway:

discovery:

locator:

enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由

routes:

- id: hystrix-order #hystrix-order #路由的ID,没有固定规则但要求唯一,简易配合服务名

#uri: http://localhost:8001 #匹配后提供服务的路由地址

uri: lb://hystrix-order #匹配后提供服务的路由地址

predicates:

- Path=/** #断言,路径相匹配的进行路由

#- After=2020-03-15T15:35:07.412+08:00[GMT+08:00]

#- Cookie=username,zzyy

#- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性并且值为整数的正则表达式

#- Host=**.atguigu.com

#- Method=GET

#- Query=username, \d+ #要有参数名username并且值还要啥整数才能路由

javaconfig配置网关

@Configuration

public class GateWayConfig {

/**

* 配置一个id为route-name的路由规则,

* 当访问地址http://localhost:8089/archives时会自动转发到地址:http://520htt.com/archives

* @param routeLocatorBuilder

* @return

*/

@SuppressWarnings("JavaDoc")

@Bean

public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){

RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();

routes.route("order",

r -> r.path("/archives")

.uri("http://520htt.com/archives")).build();

return routes.build();

}

}

关于配置文件三个重要概念

f272531bc12e8b8a16abba7d57243bcc.png

predicates

Spring Cloud Gateway matches routes as part of the Spring WebFlux HandlerMapping infrastructure. Spring Cloud Gateway includes many built-in route predicate factories. All of these predicates match on different attributes of the HTTP request. You can combine multiple route predicate factories with logical and statements.

大概意思:

说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理,接下来我们接下 Spring Cloud GateWay 内置几种 Predicate 的使用。

454659dd552902b90d6897d7610b582a.png

- After=2020-03-15T15:35:07.412+08:00[GMT+08:00] 使用ZonedDateTime时间控制访问时间

- Cookie=username,zzyy #关于Cookie的控制

- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性并且值为整数的正则表达式

- Host=**.baidu.com #关于域名的控制

- Method=GET #关于HTTP请求的控制

- Query=username, \d+ #要有参数名username并且值还要啥整数才能路由

Fliter

Filter 从作用范围可分为另外两种GatewayFilter 与 GlobalFilter。

GatewayFilter:应用到单个路由或者一个分组的路由上。

GlobalFilter:应用到所有的路由上。

过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。过滤器的作用域为特定路由。Spring Cloud Gateway包含许多内置的GatewayFilter工厂

3f1e1a2a4707ec09a4f0b9f48ba31f98.png

自定义过滤器

@Component

@Slf4j

public class MyLogGateWayFilter implements GlobalFilter, Ordered {

@Override

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {

log.info("***********come in MyLogGateWayFilter: "+new Date());

String uname = exchange.getRequest().getQueryParams().getFirst("uname");//每次进来后判断带不带uname这个key

if(uname == null){

log.info("*********用户名为null ,非法用户,o(╥﹏╥)o");

exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); //uname为null非法用户

return exchange.getResponse().setComplete();

}

return chain.filter(exchange);

}

@Override

public int getOrder() {

return 0;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值