温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringCloud服务网关Gateway如何使用

发布时间:2022-09-15 10:19:27 来源:亿速云 阅读:186 作者:iii 栏目:开发技术

这篇文章主要讲解了“SpringCloud服务网关Gateway如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud服务网关Gateway如何使用”吧!

    Gateway

    什么是Gateway

      由于Netflix的zuul发生问题,spring公司自己研发了一套网关框架Gateway用于取代zuul的使用。什么是gateway呢?spring cloud Gateway是使用Webflux中的reactor-netty响应式编程组件,底层使用的是netty通讯框架。

    什么是api网关

      API gateway 处于客户端与各个微服务之间,它担任了反向代理的角色,将不同的请求路由到相对应的微服务中去。与此同时,它还有以下功能:安全,限流,缓存,日志,监控,重试,熔断等。网关就是所有项目的一个统一入口,也可以说是进入系统的唯一节点。

    SpringCloud服务网关Gateway如何使用

    网关的三个核心概念

    路由(Route)

      路由是构建网关的基本模块,它由ID、目标URI、一系列的断言和过滤器组成,如果断言为真则匹配该路由。就是根据断言和过滤器提供的某些规则,将请求发送到指定服务上

    断言(Predicate)

      开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由,就是定义匹配规则,只有满足断言的请求才会继续进行路由

    过滤(Filter)

      指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。当请求进行断言之前,或者满足断言后会继续进行路由,但是由于过滤的存在请求会再次被过滤条件进行指定的修改操作

    gateway的工作流程

      客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到GatewayWeb Handler。Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。

      过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

    SpringCloud服务网关Gateway如何使用

    如何使用Gateway

    gateway路由转发

    使用配置文件

      第一步: 创建一个子模块用于配置gateway,导入相关依赖,其中最重要的就是gateway的启动器。一定不能引入web场景启动器依赖,否则gateway模块将无法启动

    <!--gateway-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    &emsp;&emsp;第二步: 配置文件

    server:
      port: 9527

    spring:
      application:
        name: cloud-gateway

    eureka:
      instance:
        hostname: cloud-gateway-service
      client: #服务提供者provider注册进eureka服务列表内
        service-url:
          register-with-eureka: true
          fetch-registry: true
          defaultZone: http://localhost:7001/eureka

    &emsp;&emsp;第三步: 现在我们想在支付微服务8001之前使用gateway网关,让请求在访问8001微服务之前先经过gateway网关。于是我们需要先配置配置文件

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

            - id: payment_routh3 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
              #uri: http://localhost:8001          #匹配后提供服务的路由地址
              uri: lb://cloud-payment-service #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/create/**         # 断言,路径相匹配的进行路由
                - After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]

    &emsp;&emsp;经过如上操作,即可实现如果通过9527端口也可以访问8001的接口,也就是说请求先是通过9527网关,将符合yml配置文件中配置的请求进行路由转发至8001端口

    SpringCloud服务网关Gateway如何使用

    使用代码配置

    &emsp;&emsp;使用代码配置的话就需要使用到自定义配置类了,将上面的第三步由配置文件配置修改为自定义配置类,前两步要保持一致。其中route方法的第一个参数相当于id配置,r.path相当于predicates断言,r.path.uri就是请求将要路由到的地址

    @Configuration
    public class GateWayConfig {
        @Bean
        public RouteLocator customRouteLocatorBuilder(RouteLocatorBuilder routeLocatorBuilder) {
            RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
            routes.route("path_route_atguigu",
                            r -> r.path("/guonei")
                                    .uri("http://news.baidu.com/guonei"))
                    .build();
            return routes.build();
        }
    }
    路由实现负载均衡

    &emsp;&emsp;之前都是通过ribbon来实现请求的负载均衡,其实gateway网关也可以通过注册中心的微服务名来实现负载均衡,也就是动态路由的功能。这里我们先通过以下配置开启从注册中心动态创建路由的功能

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

    然后将原先写死的路径改为微服务名,通过这个实现对微服务的轮询

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

            - id: payment_routh3 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
              #uri: http://localhost:8001          #匹配后提供服务的路由地址
              uri: lb://cloud-payment-service   #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/create/**         # 断言,路径相匹配的进行路由

    gateway九种断言

    &emsp;&emsp;gateway的断言实际上就是配置文件中的predicates配置项,既然这个单词是复数,那就意味着它不仅仅可以配置一种断言,实际上断言的类型有九种,它们的意思以及使用方式我都写在了下面

    predicates:
        - Path=/payment/create/**         # 路径断言,路径相匹配的进行路由
        - Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]   # 时间断言,时间Before、After、Between指定时间的请求进行路由
        - After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
        - Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] ,  2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
        - Cookie=username,zzyy            # cookie断言,携带名为username且值为zzyy的请求进行路由(zzyy可以替换为正则)
        - Header=X-Request-Id, \d+        # header断言,请求头携带X-Request-Id且值满足正则"\d+"的请求进行路由
        - Host=**.atguigu.com, **.atg.com # host断言,请求格式符合的请求进行路由
        - Method=GET                      # method断言,请求方式为get的请求进行路由
        - Query=username, \d+             # query断言,有参数名为username且值满足正则"\d+"的请求进行路由

    gateway过滤修改

    &emsp;&emsp;使用配置文件实现filter过滤修改很简单,类似于断言的使用,在配置文件直接配置即可

    filters:
        - AddRequestParameter=X-Request-Id,1024

    &emsp;&emsp;但是一般不这么使用filter,我们都是自定义一个全局GlobalFilter,重点就是@Component注解,类实现GlobalFilter, Ordered接口重写方法,设置过滤规则和优先级

    @Component
    @Slf4j
    public class MyLogGateWayFilter implements GlobalFilter, Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            /**
             * 判断请求中包含uname参数且它的值不为空,否则拒绝请求
             */
            String uname = exchange.getRequest().getQueryParams().getFirst("uname");
            if (uname == null) {
                log.info("*******用户名为null,非法用户,o(╥﹏╥)o");
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }
        /**
         * 加载过滤器顺序,数字越小优先级越高
         * @return
         */
        @Override
        public int getOrder() {
            return 0;
        }
    }

    感谢各位的阅读,以上就是“SpringCloud服务网关Gateway如何使用”的内容了,经过本文的学习后,相信大家对SpringCloud服务网关Gateway如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI