SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关:SpringCloud Gateway核心技术 上

简介: SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关:SpringCloud Gateway核心技术

大家好,我是冰河~~

一不小心《SpringCloud Alibaba实战》专栏都更新到第14章了,再不上车就跟不上了,小伙伴们快跟上啊!

注意:本项目完整源码加入 冰河技术 知识星球即可获取,文末有入场方式。

在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。

同时,简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务,另外,也能够SpringCloud Gateway整合Sentinel实现了网关的限流功能。今天,我们再进一步介绍下SpringCloud Gateway网关的核心技术。

本章总览

12.pngimage.gif


本章概述

SpringCloud Gateway能够实现多种网关功能,比如路由转发、断言、过滤器、熔断、限流、降级、自定义谓词配置、自定义过滤器等等多种功能。今天,我们就一起来聊聊SpringCloud Gateway中的断言、过滤器与熔断机制。

网关断言

断言的英文是Predicate,也可以翻译成谓词。主要的作用就是进行条件判断,可以在网关中实现多种条件判断,只有所有的判断结果都通过时,也就是所有的条件判断都返回true,才会真正的执行路由功能。

SpringCloud Gateway内置断言

SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。

基于日期时间类型的断言

基于日期时间类型的断言根据时间做判断,主要有三个:

  • AfterRoutePredicateFactory:接收一个日期时间参数,判断当前请求的日期时间是否晚于指定的日期时间。
  • BeforeRoutePredicateFactory:接收一个日期时间参数,判断当前请求的日期时间是否早于指定的日期时间。
  • BetweenRoutePredicateFactory:接收两个日期时间参数,判断当前请求的日期时间是否在指定的时间时间段内。

使用示例

- After=2022-05-10T23:59:59.256+08:00[Asia/Shanghai]

基于远程地址的断言

RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断发出请求的客户端的IP地址是否在指定的IP地址段内。

使用示例

- RemoteAddr=192.168.0.1/24

基于Cookie的断言

CookieRoutePredicateFactory:接收两个参数, Cookie的名称和一个正则表达式。判断请求的Cookie是否具有给定名称且值与正则表达式匹配。

使用示例

- Cookie=name, binghe.

基于Header的断言

HeaderRoutePredicateFactory:接收两个参数,请求Header的名称和正则表达式。判断请求Header中是否具有给定的名称且值与正则表达式匹配。

使用示例

- Header=X-Request-Id, \d+

基于Host的断言

HostRoutePredicateFactory:接收一个参数,这个参数通常是主机名或者域名的模式,例如**.binghe.com这种格式。判断发出请求的主机是否满足匹配规则。

使用示例

- Host=**.binghe.com

基于Method请求方法的断言

MethodRoutePredicateFactory:接收一个参数,判断请求的类型是否跟指定的类型匹配,通常指的是请求方式。例如,POST、GET、PUT等请求方式。

使用示例

- Method=GET

基于Path请求路径的断言

PathRoutePredicateFactory:接收一个参数,判断请求的链接地址是否满足路径规则,通常指的是请求的URI部分。

使用示例

- Path=/binghe/{segment}

基于Query请求参数的断言

QueryRoutePredicateFactory :接收两个参数,请求参数和正则表达式, 判断请求的参数是否具有给定的名称并且参数值是否与正则表达式匹配。

使用示例

- Query=name, binghe.

基于路由权重的断言

WeightRoutePredicateFactory:接收一个[组名,权重]格式的数组,然后对于同一个组内的路由按照权重转发。

使用示例

- id: weight1
  uri: http://localhost:8080
  predicates:
    - Path=/api/**
    - Weight=group1,2
  filters:
    - StripPrefix=1
- id: weight2
  uri: http://localhost:8081
  predicates:
    - Path=/api/**
    - Weight=group1,8
  filters:
    - StripPrefix=1

演示内置断言

在演示的示例中,我们基于Path请求路径的断言判断请求路径是否符合规则,基于远程地址的断言判断请求主机地址是否在地址段中,并且限制请求的方式为GET方式。整个演示的过程以访问用户微服务的接口为例。

(1)由于在开发项目时,所有的服务都是在我本地启动的,首先查看下我本机的IP地址,如下所示。

图片.pngimage.gif


可以看到,我本机的IP地址为192.168.0.27,属于192.168.0.1/24网段。

(2)在服务网关模块shop-gateway中,将application.yml文件备份成application-sentinel.yml文件,并将application.yml文件中的内容修改成application-simple.yml文件中的内容。接下来,在application.yml文件中的spring.cloud.gateway.routes节点下的- id: user-gateway下面进行断言配置,配置后的结果如下所示。

spring:
  cloud:
    gateway:
      routes:
        - id: user-gateway
          uri: http://localhost:8060
          order: 1
          predicates:
            - Path=/server-user/**
            - RemoteAddr=192.168.0.1/24
            - Method=GET
          filters:
            - StripPrefix=1

注意:完整的配置参见案例完整源代码。

(3)配置完成后启动用户微服务和网关服务,通过网关服务访问用户微服务,在浏览器中输入http://localhost:10001/server-user/user/get/1001,如下所示。

图片.png


可以看到通过http://localhost:10001/server-user/user/get/1001链接不能正确访问到用户信息。

接下来,在浏览器中输入http://192.168.0.27:10001/server-user/user/get/1001,能够正确获取到用户的信息。

图片.png


(4)停止网关微服务,将基于远程地址的断言配置成- RemoteAddr=192.168.1.1/24,也就是将基于远程地址的断言配置成与我本机IP地址不在同一个网段,这样就能演示请求主机地址不在地址段中的情况,修改后的基于远程地址的断言配置如下所示。

- RemoteAddr=192.168.1.1/24

(5)重启网关服务,再次在浏览器中输入http://localhost:10001/server-user/user/get/1001,如下所示。

图片.pngimage.gif


可以看到通过http://localhost:10001/server-user/user/get/1001链接不能正确访问到用户信息。

接下来,在浏览器中输入http://192.168.0.27:10001/server-user/user/get/1001,也不能正确获取到用户的信息了。

图片.pngimage.gif



相关文章
|
8月前
|
存储 缓存 负载均衡
Gateway 网关坑我! 被这个404 问题折腾了一年?
小富分享了一个困扰团队一年多的 SpringCloud Gateway 路由 404 问题。通过日志追踪和源码分析,发现是网关在 Nacos 配置更新后未能正确清理旧的路由权重缓存,导致负载均衡时仍使用已删除的路由数据。最终通过监听路由刷新事件并手动更新缓存,成功解决了问题。
1236 125
Gateway 网关坑我! 被这个404 问题折腾了一年?
|
7月前
|
机器学习/深度学习 Kubernetes API
【Azure APIM】自建网关(self-host gateway)收集请求的Header和Body内容到日志中的办法
在Azure API Management中,通过配置trace策略可完整记录API请求的Header和Body信息。在Inbound和Outbound策略中分别使用context.Request/Response.Headers和Body.As<string>方法捕获数据,并写入Trace日志,便于排查与审计。
240 8
|
8月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
517 1
|
9月前
|
API
使用Gateway with Inference Extension路由外部MaaS服务
本文介绍如何通过Gateway with Inference Extension对接百炼服务,实现请求路由时自动添加API Key并重写路径,包含操作步骤及验证方法。
|
8月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
714 0
|
9月前
|
安全 虚拟化
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
194 0
|
11月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
544 14
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
安全 5G 网络性能优化
深入理解5G中的SAEGW:服务网关边界
【10月更文挑战第9天】
642 0
|
运维 Kubernetes 安全
利用服务网格实现全链路mTLS(一):在入口网关上提供mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,用于简化服务治理,包括流量管理和拆分、安全认证及网格可观测性,有效减轻开发运维负担。ASM支持通过mTLS提供服务,要求客户端提供证书以增强安全性。本文介绍如何在ASM入口网关上配置mTLS服务并通过授权策略实现特定用户的访问限制。首先需部署ASM实例和ACK集群,并开启sidecar自动注入。接着,在集群中部署入口网关和httpbin应用,并生成mTLS通信所需的根证书、服务器证书及客户端证书。最后,配置网关上的mTLS监听并设置授权策略,以限制特定客户端对特定路径的访问。
534 2

热门文章

最新文章