当前位置:   article > 正文

【SpringCloud系列】Gateway网关简介及使用_filter(过滤) - 指的是spring框架中gatewayfilter的实例,使用过滤器,可以

filter(过滤) - 指的是spring框架中gatewayfilter的实例,使用过滤器,可以在请求被

一、Gateway是什么

Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用Zuul网关;但在2.x版本中,zuul的升级就是一直跳票,SpringCloud最后自己研发了一个网关代替Zuul。那就是 SpringCloud Gateway  ,gateway是zuul 1.x版本的替代。

Gateway是在Spring生态系统之上架构的API网关服务,基于Spring 5,Spring Boot2 和Project Reactor技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。

SpringCloud Gateway作为Spring cloud生态系统中的网关,目标是代替 Zuul,在SpringCloud2.0以上版本中,没有对新版本的Zuul 2.0以上实现最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty,【说穿了就是 SpringCloud Gateway是异步非阻塞式】。其实打个比方:gateway相当于医院大厅的挂号台,对病人进行引流

1113901-20190905235033263-554928445.png

 

二、Gateway都有些什么功能

1、反向代理

(1)传统反向代理

在传统部署架构中,反向代理,大多是用于多个系统模块间的聚合,实现负载均衡,外网向内网的转发。通过修改配置文件的方式来进行增加或删除节点,并重启服务才可生效。通常来说,反向代理服务器只具备负载均衡、转发基本功能,若要需要其他功能,需要增加扩展或提供脚本来实现。

(2)API Gateway

在API Gateway部署模式中,API Gateway可以看作特殊的反向代理,是对反向代理服务器功能的扩充,同时API Gateway仅局限于服务API层面,对API做进一步的管理,保护。API Gateway不仅提供了负载均衡,转发功能,还提供了灰度发布,统一认证,熔断,消息转换,访问日志等丰富的功能。

(3)如何选择

倘若我们实际运用中,不需要服务发现,服务动态扩容,服务熔断,统一认证,消息转换等一系列API Gateway功能,我们完全可以使用反向代理服务器来部署微服务架构,当然如果这样做,如遇到增加或减少服务节点时,需要修改反向代理服务器配置,重启服务才可以生效。而当我们可能不仅仅需要负载均衡,内外网转发,还需要其他功能,又同时想实现一些各服务都需要的通用的功能时,这时候就改考虑API Gateway了。

2、鉴权

通过APIGateway对访问进行统一鉴权,不需要每个应用单独对调用方进行鉴权,应用可以专注业务。

3、流量控制

在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。常见的限流方式,比如Hystrix适用线程池隔离,超过线程池的负载,走熔断的逻辑。在一般应用服务器中,比如tomcat容器也是通过限制它的线程数来控制并发的;也有通过时间窗口的平均速度来控制流量。常见的限流纬度有比如通过Ip来限流、通过uri来限流、通过用户访问频次来限流。一般限流都是在网关这一层做,比如Nginx、Openresty、kong、zuul、Spring Cloud Gateway等;也可以在应用层通过Aop这种方式去做限流。

GateWay限流是采用的令牌桶的方式进行限流的,需要配合redis来使用,他有以下几种限流方式:1.根据URI限流;2.根据参数限流;3.根据IP限流;

Gateway默认使用org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter 限流器。 现在,如通过模拟Http请求,则会收到以下响应。它包括一些特定的header,其前缀为x-ratelimit。

x-ratelimit-burst-capacity:最大令牌值,

x-ratelimit-replenish-rate:填充的速率值,

x-ratelimit-remaining:剩下可请求数。

4、熔断

可以用家里的保险丝来理解熔断. 如果电流大了, 保险丝就会断掉, 以避免电器烧毁. 网关的熔断同理, 如果不断掉, 大量的请求会堆积在某个服务, 前端用户长时期得不到反馈. 断掉之后, 用户立即得到"xx服务不可用, 请稍候再试" 的提示. 他可以先去干点别的....

5、日志监控

Amazon API Gateway 开发人员可以使用 AWS X-Ray、AWS CloudTrail 和 Amazon CloudWatch 来跟踪、记录和监控 API 执行和管理操作。

  • AWS X-Ray 是一种 AWS 服务,允许您借助 Amazon API Gateway API 来跟踪延迟问题。X-Ray 从 API Gateway 服务和组成您的 API 的所有下游服务中收集元数据。X-Ray 使用这些元数据生成详细的服务图形,用于说明延迟峰值以及影响您的 API 性能的其他问题。
  • Amazon CloudWatch 记录 API 执行操作,这是客户或客户端应用程序针对 API Gateway execute-api 组件进行的调用。CloudWatch 指标包括有关缓存、延迟和检测错误的统计数据。您可以使用 API Gateway 控制台中的 API 控制面板或 CloudWatch 控制台,检查 CloudWatch 日志用于排除 API 实施或执行中的问题。
  • AWS CloudTrail 记录 API Gateway API 管理操作,这是 API 开发人员或所有者针对 API Gateway apigateway 组件进行的 REST API 调用。您可以使用 CloudTrail 日志对 API 创建、部署和更新进行故障排除。您还可使用 Amazon CloudWatch 监控 CloudTrail 日志。

 

架构图.png

三、gateway中几个重要的概念

  1. Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由,目标URI会被访问。
  2. Predicate(断言):这是一个java 8的Predicate,可以使用它来匹配来自HTTP请求的任何内容,如:请求头和请求参数。断言的输入类型是一个ServerWebExchange。
  3. Filter(过滤器):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者后对请求进行修改。

11.jpg

  • web 请求,通过一些匹配条件,定位到真正的服务节点,并在这个转发过程的前后,进行一些精细化控制
  • predicate 就是我们的匹配条件
  • filter:就可以理解为一个无所不能的拦截器,有了这两个元素,再加上目标的uri,就可以实现一个具体的路由了。

四、Gateway在微服务架构中的什么位置

gateway在微服务中的位置.png

 

五、Gateway工作流程是什么

gateway执行流程.png

1、首先客户端发送请求过来的时候,会通过GateWay Handler Mapping去对请求进行路由route的映射;

2、如果映射到了,就会再调用网关处理程序GateWay Web Handler进行处理;

3、那么Handler就会通过这个route的一系列Filter对该请求进行pre处理,处理完成以后最终路由到一个具体的服务上去;

4、当请求从该服务返回的时候,又会通过这一系列Filter对请求进行post处理,再从handler到Mapping进行返回给该客户端。

六、如何在我们的项目中使用

1、引入pom文件

这里只是一般情况下,当然根据微服务的不同需要配置不同的pom文件

  1. <dependencies>
  2. <!--新增gateway-->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-gateway</artifactId>
  6. </dependency>
  7. <!--引入commons包-->
  8. <dependency>
  9. <groupId>com.make.com.make.springcloud</groupId>
  10. <artifactId>cloud-api-commons</artifactId>
  11. <version>${project.version}</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.cloud</groupId>
  19. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-devtools</artifactId>
  24. <scope>runtime</scope>
  25. <optional>true</optional>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.projectlombok</groupId>
  29. <artifactId>lombok</artifactId>
  30. <optional>true</optional>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>

 

2、gateway的yaml配置

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. eureka:
  7. instance:
  8. hostname: cloud-getway-service
  9. client:
  10. fetch-registry: true
  11. register-with-eureka: true
  12. service-url:
  13. # defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  14. defaultZone: http://eureka7001.com:7001/eureka

 

3、静态路由配置

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
  10. uri: http://localhost:8001 #匹配后提供服务的路由地址
  11. predicates:
  12. - Path=/payment/get/** #断言,路径相匹配的进行路由
  13. - id: payment_routh2
  14. uri: http://localhost:8001
  15. predicates:
  16. - Path=/get/lb/** #断言,路径相匹配的进行路由

 

4、yaml文件熔断配置

  1. spring:
  2. application:
  3. name: cloud-gateway
  4. cloud:
  5. gateway:
  6. default-filters:
  7. - name: CircuitBreaker
  8. args:
  9. name: myCircuitBreaker #熔断的名字,可以随便命名
  10. fallbackUri: forward:/fallback # 如果触发了熔断,自动跳转到这个URI里面,在任务一个controller里面有这个URI即可。
  11. statusCodes:
  12. - 500
  13. - "NOT_FOUND"

 

5、常用的断言配置

(1)After Route Predicate

匹配某个时间段之后的uri请求

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: after_route
  6. uri: https://example.org
  7. predicates:
  8. - After=2017-01-20T17:42:47.789-07:00[America/Denver]

(2)Before Route Predicat

匹配某个时间段之前的断言

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: before_route
  6. uri: https://example.org
  7. predicates:
  8. - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

(3)Between Route Predicate

匹配两个时间段之内的uri其你去

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: between_route
  6. uri: https://example.org
  7. predicates:
  8. - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

(4)Cookie Route Predicate

cookie 名称和正则表达式。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。以下示例配置 cookie 路由谓词工厂

并且Cookie是username=zhangshuai才能访问

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: cookie_route
  6. uri: https://example.org
  7. predicates:
  8. - Cookie=username,zhangshuai

此路由匹配具有名称为chocolatech.p正则表达式匹配的cookie的请求。

 

(5)Header Route Predicate

两个参数:一个是属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行;

请求头中要有X-Request-Id属性并且值为整数的正则表达式

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: header_route
  6. uri: https://example.org
  7. predicates:
  8. - Header=X-Request-Id, \d+

如果请求的标头名称X-Request-Id\d+正则表达式匹配(即,它的值为一位或多位数字),则此路由匹配。

 

(6)Host Route Predicate

配置主机路由匹配

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: host_route
  6. uri: https://example.org
  7. predicates:
  8. - Host=**.somehost.org,**.anotherhost.org

(7)Method Route Predicate

匹配请求的方法类型

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: method_route
  6. uri: https://example.org
  7. predicates:
  8. - Method=GET,POST

(8)Path Route Predicate

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: host_route
  6. uri: https://example.org
  7. predicates:
  8. - Path=/red/{segment},/blue/{segment}

(9)Query Route Predicate

请求参数名为red,值要正整数才能路由

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: query_route
  6. uri: https://example.org
  7. predicates:
  8. - Query=red, \d+

(10)Weight Route Predicate

该路由会将约 80% 的流量转发到weighthigh.org,将约 20% 的流量转发weightlow.org

 

6、跨域配置

  1. spring:
  2. application:
  3. name: cloud-gateway
  4. cloud:
  5. gateway:
  6. # 服务跨域配置
  7. globalcors:
  8. cors-configurations:
  9. '[/**]':
  10. allowedOrigins: "*"
  11. allowedHeaders: "*"
  12. allowedMethods: "*"

 

7、普通项目实战配置

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. cloud:
  7. gateway:
  8. discovery:
  9. locator:
  10. enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
  11. # 配置静态路由
  12. routes:
  13. - id: payment_routh #payment_routh #路由的ID,没有固定规则但要求唯一,简易配合服务名
  14. uri: lb://cloud-provider-service #匹配后提供服务的路由地址
  15. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  16. predicates:
  17. - Path=/payment/get/** #断言,路径相匹配的进行路由
  18. - id: payment_routh2 #payment_routh #路由的ID,没有固定规则但要求唯一,简易配合服务名
  19. uri: lb://cloud-provider-service #匹配后提供服务的路由地址
  20. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  21. predicates:
  22. - Path=/payment/lb/** #断言,路径相匹配的进行路由
  23. #- After=2020-03-15T15:35:07.412+08:00[GMT+08:00]
  24. #- Cookie=username,zzyy
  25. #- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性并且值为整数的正则表达式
  26. #- Host=**.atguigu.com
  27. #- Method=GET
  28. #- Query=username, \d+ #要有参数名username并且值还要啥整数才能路由
  29. eureka:
  30. instance:
  31. hostname: cloud-gateway-service
  32. client:
  33. register-with-eureka: true
  34. fetch-registry: true
  35. service-url:
  36. defaultZone: http://eureka7001.com:7001/eureka

 

七、思维导图

12.Gateway新一代网关.png

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/415018
推荐阅读
相关标签
  

闽ICP备14008679号