【黑马-SpringCloudAlibaba】学习笔记04-Gateway:服务网关组件

本文介绍了SpringCloud Gateway作为服务网关的作用,如解除客户端与微服务耦合、处理鉴权和跨域问题。详细讲解了如何配置Gateway,包括路由转发、断言工厂和过滤器的使用。同时,文章还探讨了Sentinel在Gateway中的应用,实现了基于route和自定义API的限流策略。
摘要由CSDN通过智能技术生成

三 Gateway服务网关组件

网关的作用:解除客户端与微服务的耦合,方便微服务访问地址的维护;处理鉴权认证跨域问题。
网关也是一个微服务注册在nacos上,作为客户端和其他微服务的中转点,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。
  • 相关技术栈有:
    • Nginx+lua :使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用;lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本
    • Kong : 基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。
      问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。
    • Zuul : Netflix开源的网关,功能丰富,使用JAVA开发,易于二次开发
      问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如NginxSpring Cloud Gateway
    • Gateway : Spring公司为了替换Zuul而开发的网关服务;设计优雅,容易扩展
注意: SpringCloud alibaba技术栈中并没有提供自己的网关,我们可以采用Spring Cloud Gateway来做网关
Gateway配置详解
  • id:自定义不重复
  • uri:转发的目标地址
  • order:可能有很多路由的path一样,这时候根据order值选择先去哪个路由。
  • predicates:断言,这里可以配置很多规则,判断path值是否符合规则,如果符合则转发请求。
  • filters:可以对请求做一些手脚(增加headers,修改请求uri)
1 测试:通过网关访问商品微服务
 <dependencies>
    <!--gateway网关-->
    <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.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
server:
  port: 7000
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 让gateway从nacos中获取服务信息
      routes:    #路由数组〔路由就是指当请求满足什么样的条件的时候转发到哪个微服务上]
        - id: product_route       #当前路由发的标识,要求唯—
          uri: http://localhost:8081    #lb://service-product      #请求最终要被转发到的地址
          order: 1   #路由的优先级,数字越小代表路由的优先级越高
          predicates:  #断言(条件判断,返回值是boolean转发请求要满足的条件)。集合
            - Path=/product-serv/**   #当请求路径满足Path指定的规则时,此路由信息才会正常转发(以product-serv开头)
          # 上面路径是 uri+predicates=》http://localhost:7000/product-serv/product/1
          filters:     #过滤器(在请求传递过程中对请求做一些手脚)
            - StripPrefix=1  #在请求转发之前去掉第一层路径=》http://localhost:8081/product/1
测试:原测试接口:http://localhost:8081/product/1;使用网关后访问http://localhost:7000/product-serv/product/1如果能访问通即整合成功
不写gateway.routes配置,默认 uri: lb://service-product==》http://localhost:7000/service-product/product/1
---------------------------------
2 请求最终要被转发到的地址,写死:http://localhost:8081=>从nacos获取lb://
1,注册nacos=> cloud.nacos.discovery.server-addr: localhost:8848
2,改写规则=>  gateway.routes.uri: lb://service-product     #从nacos获取lb://
server:
  port: 7000
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 将gateway注册到nacos   等同  127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true # 让gateway从nacos中获取服务信息
      routes:    #路由数组〔路由就是指当请求满足什么样的条件的时候转发到哪个微服务上]
        - id: product_route       #当前路由发的标识,要求唯—
          uri: lb://service-product      #请求最终要被转发到的地址,写死:http://localhost:8081=>从nacos获取lb://
          order: 1   #路由的优先级,数字越小代表路由的优先级越高
          predicates:  #断言(条件判断,返回值是boolean转发请求要满足的条件)。集合
            - Path=/product-serv/**   #当请求路径满足Path指定的规则时,此路由信息才会正常转发(以product-serv开头)
          # 上面路径是 uri+predicates=》http://localhost:7000/product-serv/product/1(访问)
          filters:     #过滤器(在请求传递过程中对请求做一些手脚)
            - StripPrefix=1  #在请求转发之前去掉第一层路径=》http://localhost:8081/product/1
        - id: order_route
          uri: lb://service-order   #lb是负载均衡,后面是微服务在nacos上的标识
          order: 1
          predicates:
            - Path=/order-serv/**
          filters:
            - StripPrefix=1
测试:原测试接口:http://localhost:8081/product/1;使用网关后访问http://localhost:7000/product-serv/product/1如果能访问通即整合成功
测试:原测试接口:http://localhost:8091/order/prod/1;使用网关后访问http://localhost:7000/service-order/order/prod/1如果能访问通即整合成功
端口统一了

----------------------------

3 predicates内置断言工厂
Predicate(断言,谓词)用于进行条件判断,只有断言都返回真,才会真正执行路由。
断言就是说:在什么条件下才能进行路由转发
  • 基于Datetime类型的断言工厂,此类型的断言根据时间做判断,主要有三个:
    • AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
    • BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
    • BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内
- After=2021-08-01T23:59:59.789+08:00[Asia/Shanghai] #在2020-08-01时间后才可以访问
- Before=2021-08-25T23:59:59.789+08:00[Asia/Shanghai] #在2020-08-01时间后之前才可以访问
- Between=2020-08-03T23:59:59.789+08:00[Asia/Shanghai],2023-08-05T23:59:59.789+08:00[Asia/Shanghai]

  • 基于远程地址的断言工厂
    • RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中
-RemoteAddr=192.168.1.1/24 
  • 基于Cookie的断言工厂
    • CookieRoutePredicateFactory:接收两个参数, cookie 名字和一个正则表达式。 判断请求cookie是否具有给定名称且值与正则表达式匹配。
-Cookie=chocolate, ch.
  • 基于Header的断言工厂
    • HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否具有给定名称且值与正则表达式匹配。
-Header=X-Request-Id, \d+
  • 基于Host的断言工厂
    • HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。
-Host=**.testhost.org
  • 基于Method请求方法的断言工厂
    • MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。
-Method=GET
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值