scservers(六) 网关-路由

前言

前面的五篇内容已经构成了微服务的基本核心框架,已经可以结合业务,加上存储提供服务,并且整个系统内部服务之间也具备相互识别调用路由能力,那么再将这些服务汇总提供给其他第三方(不管是自己客户端(如h5,mobile app)还是作为开放平台供第三方使用),还是需要一个汇总的接口出口点。网关的需求自然形成。我们需要再提供了一个外部路由的能力。

业务网关

网关我们可以分位接入网关(连接的保持、消息的解析(卸载证书等)、消息的分发)+应用网关(路由,鉴权,限流等功能性网关的能力基础安全通用能力)。方案挺多:

* nginx(f5) + zuul(or) gateway:

nginx卸载https安全证书,高并发连接能力,反向代理能力。

gateway 功能路由鉴权,限流等包含业务功能的网关能力。

* kong(nginx基础上的包含功能性网关及业务网关能力)

nginx 我们应该用得多,比较熟悉,这里主要讲gateway的业务网关附带的一些其他能力。

sprincloud gateway

之前springcloud 一直使用zuul1.0作为其网关,后来鉴于性能(同步模型)及zuul2跳票等可能原因,社区推出了自己的网关,名字直接明了,gateway,同时还支持webflux,整合stream流等功能特性。那么我们就直接使用它来讲解吧。

  • 配置

    依赖

    <!--api网关-->
        <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!--redis限流-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

    属性配置(静态路由配置):

    spring: 
      cloud:
    gateway:
    discovery:
    locator:
    enabled: true
    routes:
    #网关路由到订单服务order-service
    - id: demo-ribbon-consumer
    uri: lb://center-ribbon-demo
    predicates:
    - Path=/test/ribbon/**
    default-filters:
    - name: Retry
    args:
    retries: 3
    statuses: BAD_GATEWAY
    - AddResponseHeader=X-Response-Default-Foo, Default-Bar
    - name: RequestRateLimiter
    args:
    redis-rate-limiter.replenishRate: 1 #令牌桶的容积
    redis-rate-limiter.burstCapacity: 1 #流速 每秒
    rate-limiter: "#{@defaultRedisRateLimiter}" #SPEL表达式去的对应的bean
    key-resolver: "#{@remoteAddressKeyResolver}" #SPEL表达式去的对应的bean
  • 使用

    限流

    限流可以在nginx接入就做.gateway 也提供了限流的组件集成,基于redis做的。基本使用:

    主要查看属性配置中的:

    default-filters:
    - name: RequestRateLimiter   
    

    限流基于令牌桶算法,参数有

    * 令牌桶总容量:redis-rate-limiter.replenishRate

    * 令牌桶每秒填充平均速率:流速 每秒:redis-rate-limiter.burstCapacity

    上面两个参数只需要配置,下面两个这两个参数

    * 限流关键字对应:key-resolver:

    * 限流

    需要编写类代码:

    @Component
    public class RequestRateLimiterConfig {
    
  • 令牌桶算法

    令牌桶算法(Token Bucket)和 Leaky Bucket 效果一样但方向相反的算法,更加容易理解。随着时间流逝,系统会按恒定 1/QPS 时间间隔(如果 QPS=100,则间隔是 10ms)往桶里加入 Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了。新请求来临时,会各自拿走一个 Token,如果没有 Token 可拿了就阻塞或者拒绝服务。

令牌桶的另外一个好处是可以方便的改变速度。一旦需要提高速率,则按需提高放入桶中的令牌的速率。一般会定时(比如 100 毫秒)往桶中增加一定数量的令牌,有些变种算法则实时的计算应该增加的令牌的数量。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>