Gateway

SpringGateway网关

奈非框架简介

早期(2020年前)奈非提供的微服务组件和框架受到了很多开发者的欢迎

这些框架和SpringCloud Alibaba的对应关系我们要了解

现在还有很多旧项目维护是使用奈非框架完成的微服务架构

Nacos对应Eureka都是注册中心

Dubbo对应Ribbon+feign都是实现微服务远程RPC调用的组件

Sentinel对应Hystrix都是做项目限流熔断降级的组件

Gateway对应Zuul都是网关组件

Gateway框架不是阿里写的,是Spring提供的

什么是网关

"网"指网络,"关"指关口或关卡

网关:就是指网络中的关口\关卡

网关就是当前微服务项目的"统一入口"

程序中的网关就是当前微服务项目对外界开放的统一入口

所有外界的请求都需要先经过网关才能访问到我们的程序

提供了统一入口之后,方便对所有请求进行统一的检查和管理
在这里插入图片描述
网关项目git地址

https://gitee.com/jtzhanghl/gateway-demo.git

网关的主要功能有

  • 将所有请求统一经过网关
  • 网关可以对这些请求进行检查
  • 网关方便记录所有请求的日志
  • 网关可以统一将所有请求路由到正确的模块\服务上

路由的近义词就是"分配"

Spring Gateway简介

我们使用Spring Gateway作为当前项目的网关框架

Spring Gateway是Spring自己编写的,也是SpringCloud中的组件

SpringGateway官网

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

网关项目git地址

https://gitee.com/jtzhanghl/gateway-demo.git

简单网关演示

SpringGateway网关是一个依赖,不是一个软件

所以我们要使用它的话,必须先创建一个SpringBoot项目

这个项目也要注册到Nacos注册中心,因为网关项目也是微服务项目的一个组成部分

beijing和shanghai是编写好的两个项目

gateway项目就是网关项目,需要添加相关配置

<dependencies>
    <!--   SpringGateway的依赖   -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!--   Nacos依赖   -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--   网关负载均衡依赖    -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

我们从yml文件配置开始添加

server:
  port: 9000
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        # 网关也是微服务项目的一个模块,需要注册到Nacos才能生效
        server-addr: localhost:8848
    gateway:
      # route是路由的意思,下面的内容就是配置路由,因为一个网关项目可能配置很多路由,所以设计为了一个List集合
      routes:
        # List类型赋值时,每个元素都要以"-"开头,在一个"-"之后的所有内容,是同一个元素的属性值
          # id表示当前路由的唯一标识名称,和其他名称的配置没有关联,唯一的要求就是不能和路由名称重复
        - id: gateway-beijing
          # uri属性配置路由目标服务器,beijing指注册到nacos名称为beijing的项目
          # lb就是LoadBalance的缩写,表示支付负载均衡调用
          uri: lb://beijing
          # predicate是断言的意思,断言就是满足某些条件时执行某些操作的设置
          predicates:
            # predicates也是一个List,赋值要以"-"开头
            # 断言配置的含义是如果访问网关项目的请求路径以/bj/开头,就路由到上面配置的beijing服务器
            # ↓ P要大写!!!!!!    **是通配任何路径
            - Path=/bj/**

先启动nacos

再启动beijing

最后启动gateway

网关多路由配置

上面只配置了一个beijing的路由设置

下面我们修改yml文件也实现shanghai的路由设置

gateway:
  # route是路由的意思,下面的内容就是配置路由,因为一个网关项目可能配置很多路由,所以设计为了一个List集合
  routes:
    - id: gateway-shanghai
      uri: lb://shanghai
      predicates:
        - Path=/sh/**
    # List类型赋值时,每个元素都要以"-"开头,在一个"-"之后的所有内容,是同一个元素的属性值
      # id表示当前路由的唯一标识名称,和其他名称的配置没有关联,唯一的要求就是不能和路由名称重复
    - id: gateway-beijing
      # uri属性配置路由目标服务器,beijing指注册到nacos名称为beijing的项目
      # lb就是LoadBalance的缩写,表示支付负载均衡调用
      uri: lb://beijing
      # predicate是断言的意思,断言就是满足某些条件时执行某些操作的设置
      predicates:
        # predicates也是一个List,赋值要以"-"开头
        # 断言配置的含义是如果访问网关项目的请求路径以/bj/开头,就路由到上面配置的beijing服务器
        # ↓ P要大写!!!!!!    **是通配任何路径
        - Path=/bj/**

在保证nacos启动的情况下

beijing服务器如果启动无需重启

启动shanghai项目

最后重启网关

测试网关路由到两个模块的效果

http://localhost:9000/bj/show可以访问beijing服务器的资源

http://localhost:9000/sh/show可以访问shanghai服务器的资源

以此类推,再有很多服务器时,我们都可以仅使用9000端口号来将请求路由到正确的服务器

就实现了gateway成为项目的统一入口的效果

动态路由

网关项目的配置会随着微服务模块数量增多而变得复杂,维护的工作量也会越来越大

所以我们希望gateway能够设计一套默认情况下自动路由到每个模块的路由规则

这样的话,不管当前项目有多少个路由目标,都不需要维护yml文件了

这就是我们SpringGateway的动态路由功能

配置文件中开启即可

server:
  port: 9000
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        # 网关也是微服务项目的一个模块,需要注册到Nacos才能生效
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 开启动态路由的配置
          # 默认的路由规则:在网关端口号后,先编写要路由到的目标服务器注册到Nacos的名称
          #                           然后再写这个模块具体访问的路径
          # 例如 localhost:9001/bj/show  -> localhost:9000/beijing/bj/show
          enabled: true

按上面修改完配置之后

我们可以重启gateway来测试动态路由路径是否生效

动态路由生成规则为:在网关端口号后先写要路由到的目标服务器在nacos注册的名称,再编写具体路径

内置断言

我们上次课在网关配置中使用了predicates(断言)的配置

断言的意思就是判断某个条件是否满足

我们之前使用了Path断言,判断请求的路径是不是满足条件,例如是不是/sh/** /bj/**

如果路径满足这个条件,就路由到指定的服务器

但是Path实际上只是SpringGateway提供的多种内置断言中的一种

还有很多其它断言

  • after
  • before
  • between
  • cookie
  • header
  • host
  • method
  • path
  • query
  • remoteaddr

时间相关

after,before,between

判断当前时间在指定时间之前,之后或之间的操作

如果条件满足可以执行路由操作,否则拒绝访问

表示时间的格式比较特殊,先使用下面代码获得时间

ZonedDateTime.now()

运行程序输出,可获得当前时间,这个时间的格式可能是

2023-02-22T16:17:12.619+08:00[Asia/Shanghai]

下面在yml配置中添加新的断言配置

使用After设置必须在指定时间之后访问

routes:
  - id: gateway-shanghai
    uri: lb://shanghai
    predicates:
      - Path=/sh/**
      # After是时间断言,判断当前访问时间是否晚于配置的时间
      # 如果时间早于配置的时间,会发生404,只有晚于这个时间才能正常访问
      # 所有断言配置都是"与"的关系
      - After=2023-02-22T16:27:10.619+08:00[Asia/Shanghai]

必须在指定时间之后才能访问服务

否则发生404错误拒绝访问

需要注意测试时,先启动Nacos,再启动shanghai之后启动gateway

测试时必须通过9000端口访问才能有效果

使用Before设置必须在指定时间之前访问

predicates:
  - Path=/sh/**
  - Before=2023-02-22T16:31:00.619+08:00[Asia/Shanghai]

使用Between设置必须在指定时间之间访问

predicates:
  - Path=/sh/**
  - Between=2023-02-22T16:33:00.619+08:00[Asia/Shanghai],2023-02-22T16:33:30.619+08:00[Asia/Shanghai]

要求指定参数的请求

Query断言,判断是否包含指定的参数名称,包含参数名称才能通过路由

predicates:
  - Path=/sh/**
  # Query断言判断请求中是否包含参数名称为username的参数,如果不包含发生404错误
  - Query=username

重启gateway测试

必须是包含username参数的请求才能访问到指定的页面

例如:http://localhost:9000/sh/show?username=tom

路由配置的设计规则

路由规则解释

路由规则一定是在开发之前就设计好的

一般可以使用约定好的路径开头来实现的

例如

gateway项目

如果路径以 /bj开头,就是要访问beijing项目

如果路径以 /sh开头.就是养访问shanghai项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java开发_Fan Ruiqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值