SpringCloud Gateway网关

文章目录

SpringCloud Gateway

1.1 网关架构

  • (dubbo+nacos)当前架构可以实现服务注册抓取,实现内部的功能调用,但是无法解决外部调用问题

1.2微服务网关介绍

微服务网关是一个用于管理 和监控微服务的入口 ,用于转发和路由来自客户端的请求。微服务网关可以将来自客户端的请求转发给后端的多个微服务,同时也可以处理跨域、身份验证、限流、缓存、流量控制 等一系列与微服务相关的功能,从而简化了微服务架构的服务开发的复杂度。

总结网关功能,需求:

  • 集中管理:微服务很多,接口api也很多,所以通过网关为所有的微服务api接口提供统一管理维护的功能
  • 安全考虑:为了安全考虑,几乎绝大部分微服务都需要认证授权,和访问控制,网关可以提前完成这个任务,为微服务提供保障.
  • 流量控制限流:从网关层面对入口流量进行监控管理,一旦超出预计的请求数量,直接限制访问,防止后端微服务宕机.每一个微服务也要自行管理流量控制(sentinel)
    网关有多少中落地方案:
  1. Spring Cloud Gateway: Spring Cloud Gateway 是由 Spring Cloud 社区提供的一种基于 Spring 框架的全新微服务网关解决方案,它致力于为 Spring Boot 微服务应用提供简单、高效、可靠的路由服务。
  2. Netflix Zuul: Netflix Zuul 是一个轻量级的微服务网关,它能够为微服务应用提供负载均衡、路由、过滤等功能。Zuul 和 Eureka 之间的协作能够让 Zuul 帮助微服务应用自动处理负载均衡和服务发现。
  3. Kong: Kong 是一个企业级微服务 API 网关,它能够帮助开发者轻松创建、部署和管理微服务,同时提供灵活的路由、负载均衡、限流、监控、安全等功能。
  4. Istio: Istio 是一个开源的服务网格平台,它能够集成多种微服务网关、负载均衡、服务发现、流量控制等功能,以实现微服务之间的高效通信和流量管理。
  5. Nginx: Nginx 是一个轻量级的反向代理和负载均衡服务器,它可以充当微服务网关的角色。通过 Nginx 提供的路由和负载均衡功能,开发者可以为微服务提供一种快速、可靠的访问方式。

1.3Spring Cloud Gateway(技术选型)

SSM框架有什么优势: 开源 热度高 使用方便 springboot简化配置 缺点简化配置 封装了原理和底层逻辑.难以学透.

一切技术选型都来自: 需求.

  1. 技术栈更加完善。

Spring Cloud Gateway 是基于 Spring Boot 和 Spring Cloud 构建的微服务网关,和 Spring Cloud Alibaba 等一些组件相结合可以构建完整的微服务架构体系。同时,它还支持集成 Spring Cloud Config、Spring Security、Spring Cloud Sleuth 和 Spring Cloud Stream 等组件,为微服务应用提供更加全面的技术支持。

  1. 高性能。

Spring Cloud Gateway 整合了 Reactor 和 Netty 技术,提供了高效的异步转发能力,支持 WebFlux 进行非阻塞式处理,避免了潜在的 I/O 瓶颈,提高了请求响应效率。

  1. 易于扩展和定制。

Spring cloud Gateway内置了很多现成的路由,负载均衡,过滤器的配置逻辑,易于上手使用。

同时提供扩展的接口,和非常简便的整合的配置方式,提供多种不同过滤器供开发者选择和使用。

1.4依赖

xml 复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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>
        <!-- gateway: 网关核心依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>
  • 启动类(常规启动类)

1.5yaml配置(包含gateway相关配置,实现转发的功能)

yaml 复制代码
server:
  port: 8099
spring:
  application:
    name: csmall-gateway
  #由于gateway底层不是tomcat 和mvc有冲突的
  main:
    web-application-type: reactive
  #配置cloud gateway 逻辑,实现转发需求
  cloud:
    gateway:
      #路由转发配置 路由逻辑可以配置多个
      routes:
        # 一个- 是一个路由信息,配置一个路由的对象属性
        # id表示唯一的标识
        - id: stock-redirect
          # 目的地请求地址
          uri: http://127.0.0.1:20003
          # 断言,assert,判断进入网关的请求,哪些符合这个路由匹配
          # 所有请求都到网关转发给stock
          # /** 匹配所有请求 ** 代表多级路径,且每一级都可以是任意长度字符串
          # ant匹配规范 * ? **
          predicates:
            - Path=/**
            - Host=localhost:8099

1.6断言案例:

yaml 复制代码
predicates:
  - Path=/abc
yaml 复制代码
predicates:
  - Path=/abc/*

1.7断言详细介绍

springCloud gateway 内置很多断言规则. Path Host使用的比较多的.

微服务做网关配置,做匹配的时候,2种情况的匹配.

  • Path路径,Host域名.

    域名只有一个,请求路径可以以不同的服务约定的起始,做Path断言.
  • 除了主域名,还有二级,三级域名,可以使用host区分转发访问的微服务功能.
  • 内置的Path Host以外还有一些断言可以使用,但是不太常用
  • After
    使用时间匹配路由,在指定时间之后的请求,才会匹配到.
yaml 复制代码
  spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]
  • Before
    和After相反,在指定时间之前,才能匹配
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
  • Between
    在两个时间点之间,才能匹配路由
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
  • Cookie
    使用cookie断言可以通过请求携带cookie值实现匹配的逻辑计算
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=name,wanglaoshi

请求request 携带的cookie中 key1=value1;key2=value2 有没有name=wanglaoshi,有则匹配,没有则不匹配.

  • Method(案例中,要求request请求是get或者是post.)
    根据http请求,判断是否满足
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST
  • Path (通过路径匹配,/red/{segment} 变量, 匹配的判断和/red/*是一样的 )
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green

支持正则表达式判断参数的值的格式 gree. 以gree开始 后面有一个字符. greet green

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=red, gree.

上述案例要求 请求携带red参数,值满足 gree.正则

http://localhost:8099/doc.html?red=haha

http://localhost:8099/doc.html?red=green(√)

  • Remote
    根据请求 远程ip地址格式,判断匹配
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24

远程ip地址 192.168.1.100 √

远程ip地址 192.168.1.101 √

远程ip地址 192.168.2.101

  • Weight(同一分组的意思是,功能相同,路由指向的后端服务,功能完全一样的.按照8:2权重比例,分配请求.)
    权重断言,包含2个参数 - Weight=groupx,y,groupx表示分组x,y数字表示权重
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Path=/**
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Path=/**
        - Weight=group1, 2

1.8 整合nacos

  • 如果实现nacos整合,网关整体进程就可以看成是一个nacos的客户端,启动时候抓取了服务信息.

  • 请求进入网关,网关的路由配置uri不再指向一个具体的服务实例地址,而是使用服务名称.

  • 断言匹配路由,进行路由计算之后,再进入负载均衡计算,从抓取的服务信息中,先获取信息实例集群,在计算负载逻辑.最终转发出去,由本次计算的实例处理请求.

  • 问题1: uri配置的服务名称找不到,配置错误,或者没抓到

  • 问题2: 请求资源在实例中不存在 404

1.9 nacos整合网关案例

  • 依赖(nacos-discovery)
  • 修改yaml配置(还是用stock测试)
yaml 复制代码
server:
  port: 8099
spring:
  application:
    name: csmall-gateway
  #由于gateway底层不是tomcat 和mvc有冲突的
  main:
    web-application-type: reactive
  #配置cloud gateway 逻辑,实现转发需求
  cloud:
    nacos:
      #nacos中注册发现的功能
      discovery:
        #填写nacos的服务端地址
        server-addr: localhost:8848
        #命名空间
        namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
        #分组
        group: 1.0
    gateway:
      #路由转发配置 路由逻辑可以配置多个
      routes:
        # 一个- 是一个路由信息,配置一个路由的对象属性
        # id表示唯一的标识
        - id: stock-redirect
          # 负载均衡的访问服务名称csmall-stock
          uri: lb://csmall-stock
          # 断言,assert,判断进入网关的请求,哪些符合这个路由匹配
          # 所有请求都到网关转发给stock
          # /** 匹配所有请求 ** 代表多级路径,且每一级都可以是任意长度字符串
          # ant匹配规范 * ? **
          predicates:
            - Path=/**
            - Host=localhost:8099
  • 修改uri 配置负载均衡的访问 csmall-stock服务.
  • 前提是网关要到对应的namespace和group,抓取csmall-stock.nacos也要配置
  • 请求流程分析过程:
    http://localhost:8099/doc.html --> 进入网关 --> 使用路由断言匹配 --> Path匹配 Host匹配 --> uri转发 --> lb://csmall-stock --> loadbalancer 获取nacos抓取信息 --> csmall-stock注册信息 127.0.0.1:20003 --> 负载均衡访问 --> http://127.0.0.1:20003/doc.html

1.10动态路由

yaml 复制代码
server:
  port: 8099
spring:
  application:
    name: csmall-gateway
  #由于gateway底层不是tomcat 和mvc有冲突的
  main:
    web-application-type: reactive
  #配置cloud gateway 逻辑,实现转发需求
  cloud:
    nacos:
      #nacos中注册发现的功能
      discovery:
        #填写nacos的服务端地址
        server-addr: localhost:8848
        #命名空间
        namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
        #分组
        group: 1.0
    gateway:
      #动态路由
      discovery:
        locator:
          enabled: true

spring.cloud.gateway.discovery.locator.enabled=true 属性值开启发现动态路由逻辑.

会根据抓取的服务名称,配置Path=/{服务名称}/** 同时转发的时候,将一级路径过滤掉

按照当前服务逻辑 相当于人为配置路由

yaml 复制代码
routes:
 - id: stock
   uri: lb://csmall-stock
   predicates:
   - Path=/csmall-stock/**
   filters:
   #会在转发时,去掉拼接的1级路径
   - StrimFilter = 1
 - id: cart
   uri: lb://csmall-cart
   predicates:
   - Path=/csmall-cart/**
   filters:
   #会在转发时,去掉拼接的1级路径
   - StrimFilter = 1

当前服务有2个,动态路由内部有2个路由配置.

http://localhost:8099/{服务名称}/{资源路径}.按照这个逻辑,以下几个演示案例,可以预测结果:

  1. http://localhost:8099/csmall-stock/doc.html --> 进入网关 -->匹配动态路由-->负载均衡计算-->拼接服务实例ip:port-->过滤掉一级路径 -->转发访问--> http://127.0.0.1:20003/doc.html
  2. http://localhost:8099/csmall-cart/doc.html --> 进入网关 --> 匹配动态路由-->负载均衡计算-->拼接服务实例ip:port-->过滤掉一级路径 -->转发访问--> http://127.0.0.1:20014/doc.html
  3. http://localhost:8099/csmall-stock/base/stock/reduce/count
    总结动态路由:
  • 访问网关
  • 访问网关的资源路径,第一级必须是服务名称
  • 除了服务名称剩下的路径,一定保证服务可以处理的请求
相关推荐
萧瑟余晖7 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
Flittly13 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(二):执行隔离沙箱实战
java·spring boot·spring
智码看视界18 小时前
Day46—Spring Cloud Gateway:路由/过滤器/限流全攻略
java·gateway·限流·微服务网关·过滤器链
BUG指挥官1 天前
Sa-Token和Spring Security对比
java·后端·spring
geminigoth1 天前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring
xbgRS2 天前
spring整合mybaits
java·spring·mybatis
ruleslol2 天前
静态依赖注入 VS 动态依赖查询
spring
墨雨晨曦882 天前
Spring AI总结
java·人工智能·spring
用户3126874877202 天前
Spring Boot 异常处理到底怎么玩的?从 DispatcherServlet 到全局兜底的全链路拆解
spring
不才不才不不才2 天前
Spring 源码系列(17): HandlerMapping 与 HandlerAdapter 两大体系
java·后端·spring