一路繁花似锦绣前程
失败的越多,成功才越有价值

导航

 

一、spring-cloud-alibaba-gateway

1、pom.xml
<!-- gateway 路由网关依赖 webflux-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- gateway 结合 Redis 实现限流 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

<!-- nacos 客户端 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- nacos 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、application.yml
server:
  port: 6001

spring:
  application:
    name: gateway-server # 应用名
  redis:
    host: 172.21.25.56 # Redis服务器地址
    port: 6379 # Redis服务器连接端口
    # Redis 服务器连接密码(默认为空),注释放到上面来,不然控制台可能会一直打印日志
    password:
  cloud:
    nacos:
      discovery:
        server-addr: 172.21.25.56:8848 # 注册中心地址
    gateway:
      discovery:
        locator:
          # true 开启以服务名称调用目标服务
          enabled: true
      routes:
        # 路由唯一标识
        - id: blog-article
          # 目标服务地址
          # uri: http://localhost:8001
          # 目标微服务名称 lb://目标服务名
          uri: lb://article-server
          # 断言,路由条件
          predicates:
            # 匹配访问路由,以 /article开头的请求代理到
            # 访问 http://localhost:6001/article/api/article/1 代理到 http://localhost:8001/article/api/article/1
            - Path=/article/**
          filters:
            # 代理转发去掉路径, /article/** ,会将 每个 /article 在过滤器中截取掉
            # - StripPrefix=1
            # 开启限流
            - name: RequestRateLimiter
              args:
                # 限制过滤器bean名称
                key-resolver: '#{@uriKeyResolver}'
                # 希望每个用户每秒执行多少个请求。令牌桶填充的速率
                redis-rate-limiter.replenishRate: 2
                # 允许用户在一秒种内完成最大请求数。令牌桶最多可以容纳的令牌数量 。如果设置为0将阻止所有请求
                redis-rate-limiter.burstCapacity: 4
        # 路由唯一标识
        - id: blog-question
          # 目标微服务名称 lb://目标服务名
          uri: lb://question-server
          # 断言,路由条件
          predicates:
            # 匹配访问路由,以 /question 开头的请求代理到
            - Path=/question/**
          filters:
            # 开启限流
            - name: RequestRateLimiter
              args:
                # 限制过滤器bean名称
                key-resolver: '#{@uriKeyResolver}'
                # 希望每个用户每秒执行多少个请求。令牌桶填充的速率
                redis-rate-limiter.replenishRate: 2
                # 允许用户在一秒种内完成最大请求数。令牌桶最多可以容纳的令牌数量 。如果设置为0将阻止所有请求
                redis-rate-limiter.burstCapacity: 4
      globalcors: # 网关cors跨域设置
        cors-configurations:
          '[/**]': # gateway网关上所有的uri都应用下面的跨域设置
            allowed-credentials: true # 允许携带认证信息
            allowed-origins:
              - "*" # 允许所有来源进行跨域访问
            allowed-headers: "*" # 允许跨域请求里的head字段,设置为*是全部
            allowed-methods: # 允许跨域的方法
              - GET
              - POST
              - PUT
              - DELETE
              - OPTIONS
            max-age: 3600
3、网关限流(定义组件uriKeyResolver)
@Component("uriKeyResolver")
public class UriKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        // 针对微服务的每个请求进行限流
        return Mono.just(exchange.getRequest().getURI().getPath());
    }
}
posted on 2021-06-15 13:35  一路繁花似锦绣前程  阅读(101)  评论(0编辑  收藏  举报