其他分享
首页 > 其他分享> > SpringCloud Gateway基础应用

SpringCloud Gateway基础应用

作者:互联网

1.网关介绍

2.Gateway介绍

3.Gateway工作流程

核心流程图如下:

image

核心概念:客户端向 Spring Cloud Gateway 发出请求。如果Gateway Handler Mapping确定请求与路由匹配,则将其发送到Gateway Web Handler 处理程序。此处理程序通过特定请求的Fliter链运行请求。Fliter被虚线分隔的原因是Fliter可以在发送代理请求之前(pre)和之后(post)运行逻辑。执行所有pre过滤器逻辑。然后进行代理请求。发出代理请求后,将运行“post”过滤器逻辑。

过滤器作用:

  • Filter在pre类型的过滤器可以做参数效验、权限效验、流量监控、日志输出、协议转换等。
  • Filter在post类型的过滤器可以做响应内容、响应头的修改、日志输出、流量监控等
  • 这两种类型的过滤器有着非常重要的作用

三个核心点:

  • Route(路由)
    路由是构建网关的基础模块,它由ID,目标URI,包括一些列的断言和过滤器组成,如果断言为true则匹配该路由
  • Predicate(断言)
    参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),请求与断言匹配则进行路由
  • Filter(过滤)
    指的是Spring框架中GateWayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
  • 三个核心点连起来:
    当用户发出请求到达GateWay,GateWay会通过一些匹配条件定位到真正的服务节点,并在这个转发过程前后,进行一些及细化控制。其中Predicate就是我们匹配的条件,而Filter可以理解为一个过滤器,有了这两个点,再加上目标URI,就可以实现一个具体的路由了。

总结:GateWay核心的流程就是:路由转发+执行过滤器链

4.Gateway路由配置

5.Gateway断言Predicate

Predicate(断言):可以理解为当满足条件后才会进行转发,如果是多个条件那就是满足所有条件才会转发

断言种类:

  1. After:匹配在指定日期时间之后发生的请求。
  2. Before:匹配在指定日期之前发生的请求。
  3. Between:需要指定两个日期参数,设定一个时间区间,匹配此时间区间内的请求。
  4. Cookie:需要指定两个参数,分别为name和regexp(正则表达式),也可以理解Key和Value,匹配具有给定名称且其值与正则表达式匹配的Cookie。
  5. Header:需要两个参数header和regexp(正则表达式),也可以理解为Key和Value,匹配请求携带信息。
  6. Host:匹配当前请求是否来自于设置的主机。
  7. Method:可以设置一个或多个参数,匹配HTTP请求,比如GET、POST
  8. Path:匹配指定路径下的请求,可以是多个用逗号分隔
  9. Query:需要指定一个或者多个参数,一个必须参数和一个可选的正则表达式,匹配请求中是否包含第一个参数,如果有两个参数,则匹配请求中第一个参数的值是否符合正则表达式。
  10. RemoteAddr:匹配指定IP或IP段,符合条件转发。
  11. Weight:需要两个参数group和weight(int),实现了路由权重功能,按照路由权重选择同一个分组中的路由

官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

6.Gateway路由配置

gateway路由配置有两种方式,一种是上面说的yml配置文件方式,还有一直是硬编码方式(不推荐使用)

硬编码方式:

 @Bean
 public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
     /*
     配置了一个id为path_test的路由规则,当访问地址http://localhost:9999/**
     就会转发到http://localhost:9001任何地址
      */
     // 构建多个路由routes
     RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
     // 具体路由地址
     routes.route("path_test", r -> r.path("/**").uri("http://localhost:9001")).build();
     // 返回所有路由规则
     return routes.build();
 }

测试:

image

7.Gateway负载均衡

8.Gateway的Filter

开发中可以通过filter实现日志,权限认证,限流,监控等功能。

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

image

内置Filter:

  1. GateWay内置的Filter生命周期为两种:pre(业务逻辑之前)、post(业务逻辑之后),客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,比如上图中的user-service,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端
  2. GateWay本身自带的Filter分为两种: GateWayFilter(单一)、GlobalFilter(全局)
  3. 单一的有32种,全局的有9种
  4. 官方网址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters

引入依赖:

   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
   </dependency>

yml配置:

server:port: 9999spring:application:name: gateway-serviceredis:database: 0host: 127.0.0.1port: 6379password: 123456cloud:nacos:  discovery:    server-addr: 127.0.0.1:8848gateway:  routes:        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名          uri: lb://nacos-provider # 匹配提供服务的路由地址          predicates: # 断言            - Path=/nacos-provider/** # 断言,路径相匹配进行路由          filters:            - StripPrefix=1            - name: RequestRateLimiter              args:                key-resolver: '#{@userKeyResolver}' #限流依据的条件bean对象id                redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率                redis-rate-limiter.burstCapacity: 3 #令牌桶总容量

定义RateLimitConfig:

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import reactor.core.publisher.Mono;@Componentpublic class RateLimitConfig {    @Bean    KeyResolver userKeyResolver() {        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));    }}

测试:一秒内多次请求http://127.0.0.1:9999/nacos-provider/nacosdemo?user=1 会出现如下限流效果:

image

标签:请求,SpringCloud,nacos,Gateway,cloud,应用,provider,gateway,路由
来源: https://www.cnblogs.com/ZT-666/p/16294836.html