Gateway

什么是Gateway

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

什么是api网关

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

网关的三个核心概念

路由(Route)

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

断言(Predicate)

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

过滤(Filter)

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

gateway的工作流程

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

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

如何使用Gateway

gateway路由转发

使用配置文件

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

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

  第二步: 配置文件

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

  第三步: 现在我们想在支付微服务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_routh2 #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]

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

使用代码配置

  使用代码配置的话就需要使用到自定义配置类了,将上面的第三步由配置文件配置修改为自定义配置类,前两步要保持一致。其中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();
    }
}

路由实现负载均衡

  之前都是通过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_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service   #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/create/**         # 断言,路径相匹配的进行路由

gateway九种断言

  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过滤修改

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

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

  但是一般不这么使用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内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringCloud服务网关Gateway的使用教程详解的更多相关文章

  1. SpringCloud超详细讲解微服务网关Zuul基础

    这篇文章主要介绍了SpringCloud Zuul微服务网关,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. SpringCloud gateway+zookeeper实现网关路由的详细搭建

    这篇文章主要介绍了SpringCloud gateway+zookeeper实现网关路由,本文通过图文实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. SpringCloud OpenFeign 服务调用传递 token的场景分析

    这篇文章主要介绍了SpringCloud OpenFeign 服务调用传递 token的场景分析,本篇文章简单介绍 OpenFeign 调用传递 header ,以及多线程环境下可能会出现的问题,其中涉及到 ThreadLocal 的相关知识,需要的朋友可以参考下

  4. Springcloud Stream消息驱动工具使用介绍

    SpringCloud Stream由一个中间件中立的核组成,应用通过SpringCloud Stream插入的input(相当于消费者consumer,它是从队列中接收消息的)和output(相当于生产者producer,它是发送消息到队列中的)通道与外界交流

  5. SpringCloud中Gateway的使用教程详解

    SpringCloud Gateway是Spring体系内的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。本文就来为大家详细讲讲Gateway的使用教程,需要的可以参考一下

  6. SpringCloud 客户端Ribbon负载均衡的实现方法

    Ribbon 是 Netflix 提供的一个基于 Http 和 TCP 的客户端负载均衡工具,且已集成在 Eureka 依赖中,这篇文章主要介绍了SpringCloud 客户端Ribbon负载均衡的实现方法,需要的朋友可以参考下

  7. SpringCloud服务网关Gateway的使用教程详解

    SpringCloud Gateway是Spring体系内的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。本文就来为大家详细讲讲Gateway的使用教程,需要的可以参考一下

  8. SpringCloud 分布式微服务架构操作步骤

    SpringCloud是一种微服务的框架,利用它我们可以去做分布式服务开发,这篇文章主要介绍了SpringCloud 分布式微服务架构,需要的朋友可以参考下

  9. SpringCloud迈向云原生的步骤

    这篇文章主要介绍了SpringCloud怎么迈向云原生,通过本文我们来梳理一下Spring Cloud的前世今生,以及未来云原生发展的趋势,可以给这些RPC框架的演进带来一些启发,感兴趣的朋友跟随小编一起看看吧

  10. Spring Cloud Alibaba微服务组件Sentinel实现熔断限流

    这篇文章主要为大家介绍了Spring Cloud Alibaba微服务组件Sentinel实现熔断限流过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  4. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  5. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  6. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  7. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  8. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

返回
顶部