码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微服务实战 07Spring Cloud Gateway 入门与实战


    在这里插入图片描述

    Spring Cloud Gateway

    • API网关
      • 微服务架构中存在的问题
      • API网关
    • Spring Cloud Gateway
      • Spring Cloud Gateway 中的几个概念
      • Gataway 工作流程
      • Gataway 实战
      • Gateway 原理
        • Route Predicate Factory.
        • GatewayFilter Factory.
          • 常见的GatewayFilter
          • GlobalFilter

    API网关

    微服务架构中存在的问题

    在微服务架构中,一个系统往往由多个微服务组成,每个服务都只会完成特定领域的功能,在这种情况下就产生了一些问题

    • 所有微服务分布在不同的服务器,可能是不同的ip、不同的端口
    • 服务的鉴权会分布在每个微服务中处理,对于每个服务的调用都需要重复的鉴权
    • 在后端的微服务架构中,可能采用不同的协议,比如HTTP\RPC等。客户端调用不多个服务,需要对不同服务协议进行适配
      在这里插入图片描述

    API网关

    API网关就是为了解决上述问题, 在客户端与服务端增肌了一个API网关。
    在这里插入图片描述

    API网关有如下几个作用

    1. 请求接入,作为所有API接口服务的请求接入点,聚合所有后端业务服务
    2. 针对所有请求进行统一的鉴权,限流,熔断,日志记录
    3. 对所有Api 进行管理,统一的错误码处理
    4. 灰度发布,对较大功能性改动版本一般采用灰度发布(金丝雀发布),在网关层可以通过灰度规则进行部分流量的路由

    Spring Cloud Gateway

    Spring Cloud Gateway 旨在提供一种简单而有效的途径来发送 API,并为它们提供横切关注点,例如:安全性,监控/指标和弹性。

    Spring Cloud Gateway功能:

    • 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上
    • 能够匹配任何请求属性上的路由。
    • 断言和过滤器特定于路由。
    • 断路器集成。
    • Spring Cloud DiscoveryClient集成
    • 易于编写的谓词和过滤器
    • 请求速率限制
    • 路径改写

    Spring Cloud Gateway 中的几个概念

    • Route (路由):网关最基本的模块。它由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成。
    • Predicate(谓词):路由转发的判断条件,我们可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。
    • Filter(过滤器):过滤器,我们可以使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理

    Gataway 工作流程

    在这里插入图片描述

    Gataway 实战

    1. 创建一个springboot 工程增加如下依赖
      采用nacos为注册中心,配置中心,sentinel进行流控

      <!-- SpringCloud Gateway -->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-gateway</artifactId>
          </dependency>
      
          <dependency>
              <groupId>com.alibaba.csp</groupId>
              <artifactId>sentinel-datasource-nacos</artifactId>
          </dependency>
      
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>
      
          <!--Nacos Config-->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
          </dependency>
          <!--SpringBoot Test-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>
      
      
          <!-- SpringCloud Alibaba Sentinel -->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
          </dependency>
      
          <!--        hutool-->
          <dependency>
              <groupId>cn.hutool</groupId>
              <artifactId>hutool-all</artifactId>
              <version>5.8.5</version>
          </dependency>
      
          <dependency>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
          </dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
    2. 创建一个rest服务增加 如下接口 和配置

       ```java
       	@RestController
       	@RequestMapping("/order")
       	@RequiredArgsConstructor
       	public class OrderController {
       	    @GetMapping
       	    public ResponseEntity get () {
       	        Map map = new HashMap<>();
       	        map.put("name","zcct");
       	        return new ResponseEntity<>( map, HttpStatus.OK) ;
       	    }
       	}
       ```
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      	# Tomcat
      	server:
      	  port: 9002
      	
      	# Spring
      	spring: 
      	  application:
      	    # 应用名称
      	    name: zcct-rest
      	  profiles:
      	    # 环境配置
      	    active: dev
      	  cloud:
      	    nacos:
      	      discovery:
      	        # 服务注册地址
      	        server-addr: 127.0.0.1:8848
      	        namespace: zcctConfig
      	        group: zcct
      	      config:
      	        # 配置中心地址
      	        server-addr: 127.0.0.1:8848
      	        # 配置文件格式
      	        file-extension: yml
      	        # 共享配置
      	        namespace: zcctConfig
      	        group: zcct
      	        shared-configs:
      	          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
    3. gateway配置文件 增加如下配置

      spring:
        redis:
          host: localhost
          port: 6379
          password: 
        cloud:
          gateway:
            discovery:
              locator:
                lowerCaseServiceId: true
                enabled: true
            routes:
              - id: zcct-rest
                uri: lb://zcct-rest
                predicates:
                  - Path=/rest/**
                filters:
                  - StripPrefix=1  
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    4. 启动项目访问网关

    5. 在这里插入图片描述

      Gateway 原理

      Route Predicate Factory.

      Predicate 是 java8 提供的一个函数式接口,它允许接收一个参数并返回一个布尔值,可以用于条件过滤、请求参数的校验/
      在gateway中 Perdicate 提供了路由规则匹配机制。简单点说,Predicate 是路由转发的判断条件,请求只有满足了 Predicate 的条件,才会被转发到指定的服务上进行处理。

      在这里插入图片描述
      Spring Cloud Gateway中默认提供了很多 Route Predicate Factory.
      图片引用

      常见的 Predicate 断言

      断言示例
      Path- Path=/dept/list/**
      Before- Before=2021-10-20T11:47:34.255+08:00[Asia/Shanghai]
      After- After=2021-10-20T11:47:34.255+08:00[Asia/Shanghai]
      Between- Between=2021-10-20T15:18:33.226+08:00[Asia/Shanghai],2021-10-20T15:23:33.226+08:00[Asia/Shanghai]
      Cookie- Cookie=name,c.biancheng.net
      Header- Header=X-Request-Id,\d+
      Method- Method=GET

      GatewayFilter Factory.

      Filter分为Pre类型的过滤器和Post类型的过滤器

      • Pre类型的过滤器在请求转发到后端服务之前执行,在Pre类型的过滤器中可以做鉴权、限流等操作
      • Post类型的过滤器在请求执行完之后,将结果返回给客户端之前执行。

      在Spring Cloud Gateway中内置了很多Filter,Filter有两种实现,分别是GatewayFilter和GlobalFilter。
      GlobalFilter会应用在所有路由上,而GatewayFilter会应用在单个或者一个分组路由上

      常见的GatewayFilter

      1. AddRequerstParameter

      GlobalFilter

      GlobalFilter 是一种作用于所有的路由上的全局过滤器,通过它,我们可以实现一些统一化的业务功能,例如权限认证、IP 访问限制等。当某个请求被路由匹配时,那么所有的 GlobalFilter 会和该路由自身配置的 GatewayFilter 组合成一个过滤器链。

      • GatewayMetricsFilter,提供监控指标。
      • LoadBalancerClientFilter,整合Ribbon针对下游服务实现负载均衡
      • ForwardRoutingFilter,用本地Forwoard,请求不转发到下游服务器
      • NettyRoutingFilter,使用Netty和httpClient转发HTTP、HTTPS请求
    6. 相关阅读:
      MySQL单列索引和联合索引
      Redis-集群
      Oracle 误删表后数据恢复操作
      PHP代码审计17—CLTPHP代码审计
      USACO Training 1.3 Milking Cows
      oracle从入门到精通第五篇(视图|表空间|索引|存储过程|触发器|复制表)
      CDN的发展和作用。当前网站被攻击适用什么样的CDN。
      【Linux】第四站:Linux基本指令(三)
      binlog的三种格式
      nginx —— 搭建局域网nginx点播服务
    7. 原文地址:https://blog.csdn.net/qq_44808472/article/details/126531899
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号