category
学习思考
date
Jul 26, 2022
icon
Origin
password
slug
gateWay
status
Published
summary
关于服务网关的一些理解
tags
Tags
type
Post

简介:

gateway是zuul1.x版本的替代
SpringCloud GateWay使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯组件。
Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心,综合很多方面考虑,Gateway是十分理想的网关选择。

SpringCloud Gateway具有以下特性:

基于springFramework 5 、project reactor和Springboot2.0进行构建
动态路由:能够匹配任何请求属性;
可以对路由指定 Predicate(断言)和Filter(过滤器)
继承Hystrix的断路器功能
继承SpringCloud服务发现功能
易于编写的Predicate(断言)和Filter(过滤器)
请求限流功能
支持路径重写

三大核心概念:

Route(路由):

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。

Predicate(断言):

参考的是 java8 的java.util.function.Predicate
开发人员可以匹配 HTTP 请求中的所有内容(例如请求头或者请求参数),如果请求与断言匹配则进行路由

Filter(过滤器):

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求在路由前和之后对请求进行修改。

核心逻辑:

路由转发+执行过滤链

配置:

yml文件配置:

spring: application: name: cloud-gateway-service cloud: gateway: routes: - id: payment_routh#payment_route路由id,没有固定的规则,但是要求id唯一,建议配合服务名 uri: http://localhost:8001#匹配后提供路由的地址 predicates: - Path=/payment/get/** - id: payment_routh2 uri: http://localhost:8001 predicates: - Path=/payment/lb/**

代码中注入LoadLocator的Bean

以转发百度国内新闻为例,代码如下:
@Configuration public class GateWayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes(); routes.route("path_route_atliujixue1",r -> r.path("/guonei").uri("https://news.baidu.com/guonei")).build(); return routes.build(); } }

GateWay配置动态路由:

默认情况下GateWay会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由并进行转发,从而实现动态路由的功能。
新增yml配置如下:
cloud: gateway: discovery: locator: enabled: true#开启注册中心动态配置路由的功能,利用微服务名进行路由 routes: - id: payment_routh#payment_route路由id,没有固定的规则,但是要求id唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供路由的地址 uri: lb://cloud-payment-service predicates: - Path=/payment/get/** - id: payment_routh2 #uri: http://localhost:8001 uri: lb://cloud-payment-service predicates: - Path=/payment/lb/**
开启注册中心动态配置路由功能,更改uri,lb是负载均衡的意思,cloud-payment-service是在Eureka注册中心的服务名称。

Predicate的使用:

Spring Cloud GateWay将路由匹配作为Spring WebFlux HandlerMapping 基础架构的一部分
Spring Cloud GateWay包括很多内置的Route Predicate 工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate 工厂可以进行组合
Spring Cloud GateWay 创建Route对象时,使用RoutePredicateFactory创建Predicate对象,Predicate可以赋值给Route。Spring CLoud GateWay包含许多内置的RoutePredicateFactory。

常用的RoutePredicate:

After Route Predicate:
在predicate配置下新增:
- After=2022-07-27T15:47:01.216+08:00[Asia/Shanghai]这样的时间格式配置,如下
routes: - id: payment_routh#payment_route路由id,没有固定的规则,但是要求id唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供路由的地址 uri: lb://cloud-payment-service predicates: - Path=/payment/get/** - After=2022-07-27T15:47:01.216+08:00[Asia/Shanghai]
Before Route Predicate:
在predicate配置下新增:
- Before=2022-07-27T15:47:01.216+08:00[Asia/Shanghai]这样的时间格式配置
Between Route Predicate:
两个时间之间使用” , ”进行隔离
Cookie Route Predicate:
需要两个参数,一个是Cookie name 一个是 正则表达式。路由规则会根据对应的Cookie name和正则表达式去匹配,如果匹配上就会执行路由,如果没匹配上则不执行
predicates: - Path=/payment/get/** - After=2022-07-27T15:47:01.216+08:00[Asia/Shanghai] - Cookie=username,liujixue
Header Route Predicate:
和cookie差不多,一个是名字,一个是正则表达式
- Header=X-Request-Id,\d+ #请求头要有X-Request-Id属性并且是整数

GateWay的filter:

路由过滤器可以用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类进行产生。

生命周期:

pre、post

种类:

GatewayFilter(单一的)、GlobalFilter(全局的)

自定义过滤器:

两个主要接口:GlobalFilter,Order
新建配置类,实现上述接口,代码如下:
@Component @Slf4j public class MylLogGateWayFilter implements GlobalFilter,Order { @Override public Class<? extends Annotation> annotationType() { return null; } @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,非法用户😠"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int value() { return 0; } }
 
 
 
 
 
 
Nacos配置Mysql数据源(Mysql和Nacos同为Docker启动)-No DataSource set的解决方法Hystrix服务降级框架

  • Twikoo
  • Giscus