【spring cloud】gateway组件基本使用

gateway组件是spring cloud框架中负责网关层的,下面简单介绍一下gateway的基本使用:

1,引入依赖

        <!--actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--gateway-->
        <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>

2,基本配置

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      discovery:
        locator:
          #使eureka能通过服务发现定位到这个服务
          enabled: true
          #对于gateway自动创建的路由规则,默认只能用大写的服务名称去调用。
          #这是因为,eureka注册中心默认的服务名是大写的,在调用的时候也要是大写的。用小写的名称调用服务会404
          #这个属性可以让用户通过小写的服务名称调用服务,不过用大写的名称去调用,会404
          lower-case-service-id: true

3,配置路由规则
路由规则的 配置有 两种方式,代码config配置类或者配置文件中配置。
3.1,config配置类
通过返回一个RouteLocater,可以自定义gateway的路由规则,包括对什么样的uri做拦截并转发到哪个service,转发后在请求或响应中加header,或者应该具备什么样的header才能被拦截等等很多规则。
其中通过TimerFilter可以指定自定义规则的过滤器。

@Configuration
public class GatewayConfiguration {

    @Autowired
    private TimerFilter timerFilter;

    @Bean
    @Order
    public RouteLocator customizedRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r ->
                        //该path断言要求路径匹配到/java/**
                        r.path("/java/**")
                                //该method断言要求方法为GET
                                .and().method(HttpMethod.GET)
                                //该header断言要求header中包括"name"
                                .and().header("name")
                                //类似于配置文件中的StripPrefix
                                .filters(f -> f.stripPrefix(1)
                                        //给响应中添加header
                                        .addResponseHeader("java-param", "gateway-config")
                                        //指定自定义的filter
//                                        .filter(timerFilter)
                                )
                                .uri("lb://FEIGN-CLIENT")
                )
                .route(r -> r.path("/seckill/**")
                                //after断言可以让gateway的路由规则只在某个时间点以后生效(推迟一分钟)
                                .and().after(ZonedDateTime.now().plusMinutes(1))
//                        .and().before()
                                .filters(f -> f.stripPrefix(1))
                                .uri("lb://FEIGN-CLIENT")
                )
                .build();
    }
}

3.2,配置文件配置路由规则
routes节点下,开始进行路由规则的配置。

spring:
      routes:
      - id: feignclient
        #如果匹配上了断言,转发到FEIGN-CLIENT
        uri: lb://FEIGN-CLIENT
        #断言(谓词)
        predicates:
        #所有匹配到/yml的都转发到这里
        - Path=/yml/**
        filters:
        #意为匹配port后的第一个单词,
        #也就是localhost:65000/yml/sayHi,路由后为localhost:65000/FEIGN-CLIENT/sayHi
        - StripPrefix=1

4,自定义过滤器
通过实现Orderd、GlobalFilter(全局过滤)或GatewayFilter(按路由规则过滤),可以自定义过滤规则。
代码示例如下:

@Slf4j
@Component
//实现GlobalFilter,不用注入Config类,即可实现全局过滤。
//实现GatewayFilter,需要注入Config类并使用,实现gateway过滤。
public class TimerFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        StopWatch timer = new StopWatch();
        timer.start(exchange.getRequest().getURI().getRawPath());
        return chain.filter(exchange).then(
                Mono.fromRunnable(() -> {
                    timer.stop();
                    log.info(timer.prettyPrint());
                })
        );
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

另外还可以通过配置文件的方式进行配置,此处省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值