Gateway

目录

概况

特性

Webflux

处理流程

动态路由配置方式

基于RUI路由配置

基于代码路由配置

和注册中心相结合的路由配置

Predicates匹配规则

熔断降级配置

分布式限流

源码分析

主流网关对比


概况

Git:https://github.com/spring-cloud/spring-cloud-gateway

在Spring Cloud 2.0以上版本中,不再对Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。因些为提升网关的性能,基于WebFlux框架实现了SpringCloud Gateway组件,WebFlux框架底层使用了高性能的Reactor模式Netty通信框架。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

特性

  • Filter:过滤器
  • Route:路由
  • Predicate:断言

Webflux

Webflux模式替换了旧的Servlet线程模型。用少量的线程处理request和response io操作,这些线程称为Loop线程,而业务交给响应式编程框架处理,响应式编程是非常灵活的,用户可以将业务中阻塞的操作提交到响应式框架的work线程中执行,而不阻塞的操作依然可以在Loop线程中进行处理,大大提高了Loop线程的利用率。官方结构图:

image

Netty是目前业界认可的最高性能的通信框架。而Webflux的Loop线程,正好就是著名的Reactor 模式IO处理模型的Reactor线程。

处理流程

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

image

 

动态路由配置方式

  • 基于RUI路由配置

spring:
  cloud:
    gateway:
      routes:
        -id: proxy-1
          uri: https://proxy-1
          predicates:
            -Path=/proxy-1
  • 基于代码路由配置

@SpringBootApplication
public class GatewayApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
 
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("path_route", r -> r.path("/proxy-1")
                        .uri("https://proxy-1"))
                .build();
    }
 
}
  • 和注册中心相结合的路由配置

server:
  port: 8088
spring:
  cloud:
    gateway:
      routes:
        -id: proxy-1
          uri: lb://proxy-1
          predicates:
            - Path=/proxy-1/**

        -id: proxy-2
          uri: lb://proxy-2
          predicates:
            -Path=/proxy-2/**

application:
  name: cloud-gateway

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://localhost:8080/eureka/

Predicates匹配规则

Predicate 来源于 Java 8,是 Java 8 中引入的一个函数,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。

image

熔断降级配置

spring:
  cloud:
    gateway:
      routes:
        - id: proxy-1
          uri: lb://proxy-1
          predicates:
            - Path=/proxy-1/**
          filters:
            - StripPrefix=1
      default-filters:
        - name: Hystrix
          args:
            name: default
            fallbackUri: 'forward:/fallback'

分布式限流

Spring Cloud Gateway官方就提供了RequestRateLimiterGatewayFilterFactory这个类,适用在Redis内的通过执行Lua脚本实现了令牌桶的方式。具体实现逻辑在RequestRateLimiterGatewayFilterFactory类中.

  • burstCapacity,令牌桶总容量。
  • replenishRate,令牌桶每秒填充平均速率。
  • key-resolver,用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。
spring:
  cloud:
    gateway:
      routes:
        - id: limit_route
          uri: http://httpbin.org:80/get
          predicates:
            - After=2017-01-20T17:42:47.789-07:00[America/Denver]
          filters:
            - name: RequestRateLimiter
              args:
                key-resolver: '#{@userKeyResolver}'
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 3
  redis:
    host: localhost
    port: 6379
    database: 0

源码分析

TODO

主流网关对比

 

Zuul(1.x)

Gateway

Kong

Nginx

开源

开源

开源

开源/企业版

开源

社区

https://github.com/Netflix/zuul

https://github.com/spring-cloud/spring-cloud-gatewa

https://konghq.com/

http://nginx.org/

协议

http,https

http,https.websocket

http,https,websocket

http,https

路由

path,method,header

before,after,host,path,method,header,cookie,Query...

host,path,method

正则

限流

需要开发

支持

支持

支持

熔断

需要开发

支持

支持

不支持或lua开发

重试

支持

支持

支持

不支持或lua开发

健康检查

支持

支持

支持

支持

负载均衡

轮询,随机,加权轮询,自定义

轮询,随机,加权轮询,自定义

轮询,哈希

轮询,随机,加权轮询

权限 

需要开发

需要开发

内置

不支持或lua开发

底层通信

Servert,IO阻塞

Netty

 

epoll模型,异步IO

 

### 网关 Gateway 技术介绍 网关Gateway),特别是指 API 网关,在分布式服务架构、微服务架构中扮演着至关重要的角色[^1]。作为系统的入口,API 网关负责接收所有的客户端请求并将其转发给适当的服务实例。这不仅简化了前端应用与后端多个微服务之间的交互过程,还允许开发者集中处理跨域资源共享(CORS)、身份验证(Authentication)等问题。 对于采用 Spring Cloud 的项目而言,Spring Cloud Gateway 成为了构建 API 网关的理想选择之一。该框架旨在提供一种简单且高效的方式来配置路由规则以及实现诸如安全性、监控/度量等功能,这一切都是通过强大的过滤器机制来完成的[^2]。 具体来说,当一个 HTTP 请求到达 Spring Cloud Gateway 后,它会依次经过三种类型的过滤器:特定于当前路由定义的过滤器、全局默认过滤器(`DefaultFilter`)和全局过滤器(`GlobalFilter`)[^4]。这些过滤器可以在请求被发送到目标服务之前或响应返回给客户端之后执行各种操作,比如修改请求头信息、记录日志等。 随着技术的发展趋势,越来越多的企业倾向于使用更现代化的技术栈来进行开发工作;因此,在许多情况下,相较于 Zuul 而言,Spring Cloud Gateway 显示出了更高的性能表现和发展潜力,逐渐成为事实上的标准解决方案[^3]。 ### 使用场景 - **统一接入层**:为所有外部调用者提供单一接口,隐藏内部复杂性的同时提高灵活性。 - **流量管理**:支持动态调整不同版本间的流量分配策略,便于灰度发布和服务治理。 - **协议转换**:能够将来自不同源的数据格式标准化后再传递给下游服务消费。 - **认证授权**:集成 OAuth2.0 或 JWT 等第三方鉴权组件,保护资源免受未授权访问威胁。 - **熔断降级**:设置合理的超时时间和重试次数,防止因单点故障引发连锁反应影响整体稳定性。 ```java // 示例代码展示如何创建简单的 Spring Cloud Gateway 应用程序 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值