• SpringCloud&Gateway理论与实践




    在这里插入图片描述

    网关介绍

    Spring Cloud Gateway 是一个基于Spring Framework 5,由Spring Cloud团队开发的全新的API网关服务。它旨在为微服务架构提供统一的路由解决方案,以便管理和控制微服务之间的通信。Spring Cloud Gateway支持动态路由、请求过滤、负载均衡等功能,可以灵活地对请求进行处理和转发。

    Spring Cloud Gateway使用了WebFlux,基于异步非阻塞的编程模型,提供了高性能和可伸缩性。它还支持自定义的过滤器链,可以在路由请求前、后对请求进行修改或处理,以满足特定的业务需求。

    通过Spring Cloud Gateway,开发者可以轻松地构建和管理微服务的路由规则,实现服务的动态发现和负载均衡,提供统一的API入口,同时还可以实现访问控制、安全认证和请求转发等功能。Spring Cloud Gateway与Spring Cloud Eureka、Spring Cloud LoadBalancer等组件配合使用,可以构建强大的微服务架构。


    简单点说就是:

    Spring Cloud GatewaySpring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

    为什么需要网关

    Gateway网关是我们服务的守门神,所有微服务的统一入口。

    网关的核心功能特性

    • 请求路由
    • 权限控制
    • 限流

    架构图

    在这里插入图片描述
    作用:

    权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。

    路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。

    限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。


    在SpringCloud中网关的实现包括两种:

    • gateway
    • zuul

    Zuul 是基于 Servlet 的实现,属于阻塞式编程。而 SpringCloudGateway 则是基于 Spring5 中提供的 WebFlux,属于响应式编程的实现,具备更好的性能。


    Gateway 使用

    Gateway 本身也是一个微服务,所以我们要在工程里创建一个微服务. 项目结构可以参考下图:

    在这里插入图片描述

    可以看到 gateway 本身也是一个微服务.

    gateway pom依赖

        <dependencies>
            
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
    
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-gatewayartifactId>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    yml 配置

    server:
      port: 10010 # 网关端口
    spring:
      application:
        name: gateway # 服务名称
      cloud:
        nacos:
          server-addr: ip:8848 # nacos地址
        gateway:
          routes: # 网关路由配置
            - id: user-server # 路由id,自定义,只要唯一即可
              # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
              uri: lb://user-server # 路由的目标地址 lb就是负载均衡,后面跟服务名称
              predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
                - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。

    本例中,我们将 /user/**开头的请求,代理到lb://user-server,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。


    重启测试

    我们之前的 user 服务可以通过 http://localhost:20242/user/2 访问到 user 的服务. 启动了 网关服务后 我们用 http://localhost:10010/user/2 也可以访问到我们的 user 服务. 至此 网关的初始入门就OK了.


    总结

    总结:

    网关搭建步骤:

    1. 创建项目,引入nacos服务发现和gateway依赖

    2. 配置application.yml,包括服务基本信息、nacos地址、路由

    路由配置包括:

    1. 路由id:路由的唯一标示

    2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

    3. 路由断言(predicates):判断路由的规则,

    4. 路由过滤器(filters):对请求或响应做处理


    断言

    我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

    例如 Path=/user/** 是按照路径匹配,这个规则是由

    org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来

    处理的,像这样的断言工厂在SpringCloudGateway还有十几个:

    名称说明示例
    After是某个时间点后的请求- After=2037-01-20T17:42:47.789-07:00[America/Denver]
    Before是某个时间点之前的请求- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
    Between是某两个时间点之前的请求- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
    Cookie请求必须包含某些cookie- Cookie=chocolate, ch.p
    Header请求必须包含某些header- Header=X-Request-Id, \d+
    Host请求必须是访问某个host(域名)- Host=.somehost.org,.anotherhost.org
    Method请求方式必须是指定方式- Method=GET,POST
    Path请求路径必须符合指定规则- Path=/red/{segment},/blue/**
    Query请求参数必须包含指定参数- Query=name, Jack或者- Query=name
    RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
    Weight权重处理

    我们只需要掌握Path这种路由工程就可以了。


    过滤器工厂

    GatewayFilter 是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

    在这里插入图片描述

    路由过滤器的种类

    Spring提供了31种不同的路由过滤器工厂。例如:

    名称说明
    AddRequestHeader给当前请求添加一个请求头
    RemoveRequestHeader移除请求中的一个请求头
    AddResponseHeader给响应结果中添加一个响应头
    RemoveResponseHeader从响应结果中移除有一个响应头
    RequestRateLimiter限制请求的流量

    请求头过滤器

    下面我们以 AddRequestHeader 为例来讲解。

    需求:给所有进入 user-aever 的请求添加一个请求头:Truth=xixixixixixi!

    只需要修改 gateway服务的 application.yml 文件,添加路由过滤即可:

    spring:
      cloud:
        gateway:
          routes:
          - id: user-server
            uri: lb://user-server
            predicates: 
            - Path=/user/** 
            filters: # 过滤器
            - AddRequestHeader=Truth, xixixixixixi! # 添加请求头
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当前过滤器写在 user-server路由下,因此仅仅对访问 user-server 的请求有效。

    可以在 userController 方法中 注入请求头信息,进行测试

    @GetMapping("/{id}")
        public User queryById(@PathVariable("id") Long id,
                              @RequestHeader(value = "Truth",required = false) String name) {
            System.out.println("请求头中携带的name = " + name);
            return userService.queryById(id);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    默认过滤器

    如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

    spring:
      cloud:
        gateway:
          routes:
          - id: user-server 
            uri: lb://user-server 
            predicates: 
            - Path=/user/**
          default-filters: # 默认过滤项
          - AddRequestHeader=Truth, xiixixii! 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    总结

    过滤器的作用是什么?

    ① 对路由的请求或响应做加工处理,比如添加请求头

    ② 配置在路由下的过滤器只对当前路由的请求生效

    defaultFilters 的作用是什么?

    ① 对所有路由都生效的过滤器


    全局过滤器下章再写吧…累了…

    在这里插入图片描述



  • 相关阅读:
    微软发布2023年10月补丁,修复了103个缺陷,包括2个活跃的漏洞利用
    Spring源码--Bean的加载
    【C语言】归并排序
    就是把一个数组中相同类别数据,组成新的数组
    蚁群算法(ant system,AS)
    读后:水浒的水有多深
    【回归预测-LSTM预测】基于麻雀算法优化LSTM时间序列实现预测(含前后对比)附Matlab代码
    【ESP 保姆级教程】疯狂ESP32Cam篇 —— 案例: Esp32Cam拍照存储到SD卡,做个迷你小相机
    使用纯c#在本地部署多模态模型,让本地模型也可以理解图像
    主流的CPU架构
  • 原文地址:https://blog.csdn.net/2301_78386975/article/details/136498802