采用2W2H学习模式,让我们一起探索gateway是什么吧

一、是什么

  它是一种为微服务架构提供的一种简单而有效的统一API路由管理方式, spring cloud gateway 作为 spring cloud 生态系的网关,目标是替代 ZUUL,其不仅提供统一的路由方式,且基于filter链的方式提供了网关的基本功能,如:安全,监控/埋点,和限流等。
  它的基础概念又分为:Route路由、Predicate 断言、Filter过滤器三个部分。当断言为true后就会匹配到相应的路径上。过滤器上可以做断路器的功能。

二、它是怎么工作的

关于此问题,我们先来看看为什么我们需要网关或者说网关到底是什么。

1,为什么需要网关

  在微服务架构中,服务粒度被进一步细分,各个服务都可以独立、设计、测试、部署和管理,每个服务都可以用不同的测试团队和语言及技术,这个时候就需要一种与语言和平台无关的协议来作为他们之间的通讯方式。

2,网关的定义

  网关的角色是作为一个API架构的,是用来保护、增强、控制对于API的访问的。它是一个在应用程序之前的系统,用来管理授权、访问控制和流量限制等,这样rest api接口服务就被保护起来了。对所有的调用者透明。

3,工作流程

在这里插入图片描述
工作流程:
   客户端向spring cloud gateway发送一个请求,gateway Handler Mapping确定请求与路由相匹配,就会将请求发送到gateway web handler,此handler就会根据过滤器链处理请求,上图中过滤器链是虚线的原因是因为filter可以在代理发送请求之前或者之后执行逻辑。

三、如何在项目中使用

1, 引入pom

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

2, 新建一个gateway模块

然后配置,我们用的是path断言,这个模块 的内容有如下三部分:

2.1 配置了跨域
@Configuration
public class DtcCorsConfiguration {
    @Bean
    public CorsWebFilter corsWebFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        CorsConfiguration corsConfiguration = new CorsConfiguration();

        //1、配置跨域
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);

        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsWebFilter(source);
    }
}
2.2 bootstrap.yml文件
# 注册中心配置
server:
  port: 9527
spring:
  profiles:
    active: @profileActive@
  application:
    name: dtc-gateway

#nacos 日志输出级别
logging:
  level:
    com.alibaba.nacos.client.*: error
    root: info
---
spring:
  profiles: test
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.60.116:80
        group: prod
        namespace: 0a473aec-5b87-4183-869a-b42c7f097ee9
      config:
        server-addr: 192.168.60.116:80
        file-extension: yaml
        namespace: 6d068a34-2c8d-46bf-ad3a-73259da4baae
        prefix: ${spring.application.name}
        group: test
---
spring:
  profiles: dev
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.60.116:80
        group: dev
        namespace: 9fb5d795-efc4-48a5-90bb-a8e3068e4239
      config:
        server-addr: 192.168.60.116:80
        file-extension: yaml
        namespace: 9fb5d795-efc4-48a5-90bb-a8e3068e4239
        prefix: ${spring.application.name}
        group: dev
---
spring:
  profiles: prod
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.60.116:80
        group: prod
        namespace: 0a473aec-5b87-4183-869a-b42c7f097ee9
      config:
        server-addr: 192.168.60.116:80
        file-extension: yaml
        namespace: 0a473aec-5b87-4183-869a-b42c7f097ee9
        prefix: ${spring.application.name}
        group: prod

2.3 application.yml (做了断路器和限流功能)
server:
  port: 9527
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          # lowerCaseServiceId: true
      routes:
        - id: feign-client
          uri: lb://feign-client
          predicates:
            - Path=/feign-client2/**
          filters:
            - StripPrefix=2

注:gateway的断言机制有10种,path只是其中一种;filter分为内置filter和全局filter。

2.3.1 可采用gateway+hystrix的方式实现断路器,其配置可如下所示:
 routes:
      - id: ingredients
        uri: lb://ingredients
        predicates:
        - Path=//ingredients/**
        filters:
        - name: Hystrix
          args:
            name: fetchIngredients
            fallbackUri: forward:/fallback
      - id: ingredients-fallback
        uri: http://localhost:9994
        predicates:
        - Path=/fallback

在HystrixCommand发生异常后,则将请求转到http://localhost:9994的应用程序中的fallback终端或程序。

2.3.2 使用gateway做限流

  springCloud gateway官网就提供了RequestRateLimiterGatewayFilterFactory这个类,是用redis+lua脚本的方式 来实现的令牌桶的方式。其源码如下所示:
这里只截了部分图,具体的大家可自行下去查看。
在这里插入图片描述
使用filter过滤器做限流,除了上面引入的gateway依赖外,还需要引入如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>

在上面的application.yml文件中需要添加如下配置:

   filters:
        - name: RequestRateLimiter
          args:
            key-resolver: '#{@hostAddrKeyResolver}'
            redis-rate-limiter.replenishRate: 1
            redis-rate-limiter.burstCapacity: 3
redis:
      host: localhost
      port: 6379
      database: 0

其appplication.yml文件的含义就死:在端口号为9527 的指定程序中,配置了redis的信息和RequestRateLimiter 的限流过滤器,该过滤器需要配置的三个参数的含义:

burstCapacity:令牌桶总容量
replenishRate:令牌桶每秒填充平均速率
key-resolver :用于限流的键解析器的bean对象的名字。

  keyResolve需要实现resove方法,其有三种方式进行限流,可根据hostname、uri、用户维度进行限流。这里讲解根据uri进行限流,我们项目用的是uri进行的限流:

public class UriKeyResolver  implements KeyResolver {

    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getURI().getPath());
    }

}

 @Bean
    public UriKeyResolver uriKeyResolver() {
        return new UriKeyResolver();
    }

然后就可以用jemeter进行压测。到这里gateway的限流方式就介绍完了,当然还有其他的限流方式。

说到这里,我的建议呢是大家也可以思考和回顾一下:application和bootstrap的不同,程序启动时的加载顺序,这里就不再过多赘述。

三、跟它相关功能有哪些?它们之间选型的区别和对比

  zuul也是网关,不过zuul是netflix公司的项目,只是spring将zuul集成在了spring-cloud中使用而已;gateway则是spring cloud下的一个子项目,由于zuul 1.x的性能不佳和2.x的跳票问题,催生了spring团队开发出了gateway项目。

1,相同点

1)都是web网关,处理的都是http请求
2)底层都是servlet

2,不同点

2.1 内部实现

  比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,支持限流、负载均衡等,但它只适合于spring cloud套件。
zuul可扩展至其他微服务框架,其内部没有实现限流、负载均衡等。

2.2 框架设计角度

gateway具有更好的扩展性,其已经发布到了3.x 的稳定版本了,稳定性也比较好

2.3 性能

  spring Webflux有一个全新的非阻塞的函数式Reactive web框架,可以用来构建异步的、非阻塞的、事件驱动的服务,在伸缩性方面表现非常好,使用非阻塞API,websockets得到支持,且由于它与spring紧密继承,所以将会是一个更好的开发体验。
zuul 1.x是一个阻塞io的API gateway,虽然已经发布了2.x,是基于Netty,也是非阻塞的,支持长连接,但spring clous暂时还没有整合计划。




参考的资料:
   官网
   自定义动态配置限流
   gateway限流

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值