gateway网关基本使用

网关作为微服务中统一入口,只需要对外暴露网关的ip。另外网关可以做统一的鉴权、日志记录等统一操作

文章目录

    • 路由
      • predicate
        • 权重
      • filter
      • 配置方式
    • 自定义过滤器
      • 全局过滤器
      • 局部过滤器
    • 网关限流
      • 自定义返回

路由

predicate

根据配置的内容将请求转发到对应的服务上
配置

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true #默认大写匹配服务名
      routes:
        - id: xx
          uri: lb://CLOUD #使用loadbalancer
          #uri: http://localhost:8080
          predicates:
            - Path=/provide/**
          filters:
            - StripPrefix=1

Path:PathRoutePredicateFactory
当请求地址为:/provide/**,网关会将请求转发到CLOUD服务上

权重

场景:当一个服务可能会部署V1、V2两个版本,可能会希望有的请求打到V1,有的打到V2上
使用

	routes:
        #权重
        #灰度服务:服务CLOUD可能会部署V1和V2两个版本
        #这里求根据设置的weight将有的请求打到V1有的打到V2上
        - id: CLOUD_V1
          uri: lb://CLOUD
          predicates:
            - Path=/weight/**
            - Weight=GROUP,8
          filters:
            - StripPrefix=1
        - id: CLOUD_V2
          uri: lb://CLOUD2
          predicates:
            - Path=/weight/**
            - Weight=GROUP,2
          filters:
            - StripPrefix=1

通过predicates配置Weight:第一个参数:对不同版本的统一名称,用于做负载使用;第二个参数:权重
当有uri为/provide/**时会负载到CLOUD和CLOUD2两个服务上

filter

对请求做一些过滤操作
StripPrefix:StripPrefixGatewayFilterFactory
在转发请求时会去掉一级uri:如请求是 /provide/user,过滤后变为 /user

配置方式

上面用的配置方式:

routes:
   - id: xx
     uri: lb://CLOUD #使用loadbalancer
     predicates:
        - Path=/provide/**
     filters:
        - StripPrefix=1
routes:
   - id: xx
     uri: lb://CLOUD #使用loadbalancer
     predicates:
        - Path=/provide/**
     filters:
        - name: StripPrefix
          args:
             patterns:
                - 1

name:过滤器PathRoutePredicateFactory的前缀Path
args:PathRoutePredicateFactory类的config
gateway网关基本使用_第1张图片

自定义过滤器

全局过滤器

实现GlobalFilter接口

public class MyFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        return null;
    }
}

局部过滤器

继承AbstractGatewayFilterFactory类或者其他相关类

public class MyFilter extends AbstractGatewayFilterFactory<MyFilter.Config> {
    @Override
    public GatewayFilter apply(Config config) {
        return null;
    }
    static class Config{
    }
}

网关限流

导入redis-reactive依赖

	<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redis-reactiveartifactId>
        dependency>

配置redis连接信息

spring:
  redis:
    host: localhost
    port: 6379

过滤器配置:

	routes:
        - id: xx
          uri: lb://CLOUD
          predicates:
            - Path=/provide/**
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}'
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 2

过滤器名称:RequestRateLimiter
keyResolver:根据什么限流,取值为代码中定义的对象,这里根据请求uri限流

@Configuration
public class Config {
    @Bean
    public KeyResolver myKeyResolver(){
        return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                return Mono.just(exchange.getRequest().getPath().value());
            }
        };
    }
}

这里用的是令牌桶算法
redis-rate-limiter.replenishRate:装桶的速率,也就是令牌生成的速率(每秒)
redis-rate-limiter.burstCapacity:一秒内允许的最大流量也就是是令牌桶可以装下的令牌数

请求如果超过限制默认返回429状态码
gateway网关基本使用_第2张图片

自定义返回

gateway网关基本使用_第3张图片
自定义继承AbstractGatewayFilterFactory:除了返回值处理其他都可以与RequestRateLimiterGatewayFilterFactory保持相同
配置中filterName换成自定义的类

你可能感兴趣的:(笔记,spring,cloud)