SpringCloud 之Gateway组件详解(上)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: SpringCloud 之Gateway组件详解

1.网关

1.1 网关简介

大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。


这样的架构,会存在着诸多的问题:

1.客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性

2.认证复杂,每个服务都需要独立认证。

3.存在跨域请求,在一定场景下处理相对复杂。

上面的这些问题可以借助API网关来解决。所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。架构如下图所示:


ff77e8e22cad44df9f9d369fae8e9ed8.png



1.2 网关组件

在业界比较流行的网关,有下面这些:

Ngnix+lua

使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用,lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本

Kong

基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。

问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。Zuul 1.0

Netflix开源的网关,功能丰富,使用JAVA开发,易于二次开发

问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器。

SpringCloud Gateway

Spring公司为了替换Zuul而开发的网关服务,将在下面具体介绍。


1.2.1 Gateway介绍

Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的APl路由管理方式。它的目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控和限流。

优点:

1·性能强劲:是第—代网关Zuul的1.6倍。

2·功能强大:内置了很多实用的功能,例如转发、监控、限流等。

3.设计优雅,容易扩展。

缺点:

1.其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,学习成本高。

2.不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行。

3.需要Spring Boot 2.0及以上的版本,才支持。


1.2.2 Gateway实践

这里模拟通过浏览器访问网关,然后网关将请求转发到订单微服务,通过查询订单返回订单信息,在其中过程中订单中有用户信息,需要根据订单中的用户id调用用户微服务进行查询然后进行赋值然后返回订单信息。


新建一个网关微服务


导入依赖

       //注意导入了gateway网关不要导入Spring-boot-starter-web依赖,有冲突
       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

配置application.yml

server:
  port: 7000
spring:
  rabbitmq:
    username: admin
    password: admin
    host: 182.92.167.13
    port: 5672
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes: #路由数组,指当请求满足什么样的条件转发到哪个微服务上
        - id: order_router #当前路由标识,要求唯一
          uri: lb://provider #请求最终要被转发的地址,lb指的是从nacos中按照名称获取微服务,并按照负载均衡策略
          order: 1 #路由的优先级,数字越小代表路由的优先级越高
          predicates: #断言(条件判断,返回值是boolean,转发请求要满足的条件)
            - Path=/orderservice/**
          filters:
            - StripPrefix=1 #在请求转发之前去掉一层路径,这里去掉orderservice
      discovery:
        locator:
          enabled: true #让gateway可以发现nacos中的微服务,这个必须配置

首先在运行我们的项目的时候访问订单微服务http://localhost:9200/order/2就可以获得订单信息,通过上述配置后我们通过网关访问http://localhost:7000/orderservice/order/2也可以获得订单信息,然后证明我们配置成功。其实在gateway中有一层默认的设置,当我们把yml中配置的路由全部注释掉后然后访问http://localhost:7000/provider/order/2依然可以获得订单信息,其中provider为订单微服务的名称,默认设置和我们的配置相对比就是把orderservice换成了provider微服务名称。

1.2.3 Gateway执行流程

3644f12c649a496891b3dbcecbc0dbb8.png

执行流程大体如下:

1.Gateway Client向Gateway Server发送请求

⒉.请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文

3.然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给RoutePredicateHandlerMapping

4.RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用

5.如果过断言成功,由FilteringWebHandler创建过滤器链并调用

6.请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应


1.2.4 断言工厂

这里摘用网上的相关内置断言工厂的描述

基于时间DateTime类型的断言工厂


此类型的断言根据时间做判断,主要有三个:

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


# 当前的请求必须要在下方指定的时间之后
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
# 当前的请求必须在下方指定的时间之前
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
# 当前的请求必须在下方指定的时间段之内
- Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver]

基于Cookie的断言工厂

判断请求Cookie中必须某个key对应的value必须为指定的值

1. # cookie中chocolate的值必须为ch.p   第二个参数的值可以使用正则表达式
2. - Cookie=chocolate,ch.p

基于请求头的断言工厂

根据请求头中的某一个参数来进行匹配

1. # 必须包含X-Request-Id请求头,第二个参数的值可以使用正则表达式
2. - Header=X-Request-Id,\d+

基于域名的断言工厂

多个域名使用逗号分隔,支持通配符

- Host=**.somehost.org,**.anotherhost.org

基于请求方法的断言工厂

支持GET请求或者POST请求,中间使用逗号分隔

- Method=GET,POST

于Path路径的断言工厂

也就是我们快速入门案例中使用的,也支持通配符,如果有多个path中间使用逗号分隔

- Path=/order_server/**


除了通配符的方式,它还支持占位符的方式就比如rest接口中在结尾携带一个请求参数的方式,就比如/get/user/{id},这个id在路由匹配中肯定不能写死,

- Path=/red/{segment},/blue/{segment}

如果请求路径是,则此路由匹配,例如:/red/1 or /red/1/ 或 /red/blue or /blue/green。

Path Route Predicate Factory 有两个参数:一个 Spring 列表PathMatcher patterns和一个名为matchTrailingSlash(默认为true)的可选标志。如果matchTrailingSlash设置为false,则请求路径/red/1/将不匹配。


基于请求参数的断言工厂

根据请求参数中必须包含某个请求参数,或者某个请求参数的值是XXX,这个请求参数只能满足GET请求的方式在URL后面进行?key=value拼接的方式

# 请求参数中包含green这个参数,则与前面的路由进行匹配
- Query=green
# 如果请求参数包含red其值与正则gree.表达式匹配的查询参数,则前面的路由匹配,因此red=green red=greet都会会匹配。
- Query=red,gree.

根据请求客户端Ip的断言工厂

例如,如果请求的远程地址是192.168.1.10 ,则此路由匹配。

- RemoteAddr=192.168.1.1/24

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
6月前
|
负载均衡 Java Nacos
Spring Cloud五大组件
Spring Cloud五大组件
|
2月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
156 0
|
3月前
|
缓存 监控 Java
说一说 SpringCloud Gateway 堆外内存溢出排查
我是小假 期待与你的下一次相遇 ~
418 5
|
3月前
|
Java API Nacos
|
5月前
|
JSON API Go
Golang工程组件:自定义HTTP规则的grpc-gateway选项
总的来说,grpc-gateway提供了一种简单有效的方式来为你的gRPC服务提供RESTful风格的API。通过自定义HTTP规则,你可以灵活地定义你的API的行为,以满足你的应用的需求。
128 27
|
9月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
643 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
5月前
|
负载均衡 前端开发 Java
SpringCloud调用组件Feign
本文深入探讨微服务Spring体系中的Feign组件。Feign是一个声明式Web服务客户端,支持注解、编码器/解码器,与Spring MVC注解兼容,并集成Eureka、负载均衡等功能。文章详细介绍了SpringCloud整合Feign的步骤,包括依赖引入、客户端启用、接口创建及调用示例。同时,还涵盖了Feign的核心配置,如超时设置、拦截器实现(Basic认证与自定义)和日志级别调整。最后,总结了`@FeignClient`常用属性,帮助开发者更好地理解和使用Feign进行微服务间通信。
439 1
|
7月前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
1065 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
9月前
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
1159 1
|
12月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway