SpringCloudGateway的基础使用

SpringCloudGateway的基础使用

一、gateway和zuul的区别

(1)Zuul1.x和Zuul2.x是netflix的项目。Zuul1.x是基于Servlet2.5的阻塞I/O设计的。
(2)Zuul2.x虽然理念很先进,想基于netty实现长连接和非堵塞,但目前springcloud并没有集成。
(3)Gateway是基于Spring Framework5、Project Reactor和Spring Boot2的非阻塞API。每秒请求数是Zuul的1.6倍。

二、gateway的引入

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

由于对版本进行的统一管理,需要的版本信息,请参考HystrixBoard那一节

注意:引入该依赖的项目,一定不能引入spring-boot-starter-web,否则日志中会出现如下情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcYSkU25-1646100649655)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220228182027418.png)]

三、gateway的三大组件

(1)Routes路由

路由可以通过二种方式进行配置,更常用的是第一种

a.第一种:配置文件的方式
spring: 
    cloud:
        gateway:
          routes:
            - id: payment_routh1
              uri: lb://cloud-payment    //使用lb搭配服务名进行访问
              predicates:
                - Path=/payment/lb/**
          discovery:
            locator:
              enabled: true      //开启负载均衡的功能

在配置中一定要注意数组的yaml格式,如果Path和前面的中划线-之间忘记预留空格,会出现如下的错误:

Unable to find RoutePredicateFactory with name -Path

b. 第二种:配置类的方式
@Configuration
public class GatewayConfiguration {

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder){
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("baidu-test",r->r.path("/test").uri("https://www.baidu.com")).build();
        return routes.build();
    }
}
(2)Predicate 断言

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBKWS0tj-1646100749429)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220301083432491.png)]

通过Spring官网可以看到断言总共有12种,每一种的含义在这里不过多解释。下面我们随便挑一两种进行演示。

a.After

在这里插入图片描述

获取以上After的时间方式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IaiIQlOt-1646100649659)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220301085252825.png)]

当前时间如果在After之前,可以正常访问,如果在After之后,就会导致访问出现以下错误:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OKH4QUI-1646100649659)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220301085402648.png)]

b. Between和Cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZnEltkW-1646100649660)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220301092323522.png)]

使用curl的方式进行访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EssqT4HC-1646100649660)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220301092646930.png)]

**如果提示curl非内部命令,需要对curl进行安装,并在Path环境变量中进行配置。**本步骤自行操作。

(3)Filters 过滤器

过滤器分为:GatewayFilterGolbal Filters

a.GatewayFilter网关过滤器

举例如下:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: lb://cloud-payment
        predicates:
        	- Path=/cad-plot/payment/lb/**
        	- Cookie=username,yyzz
        filters:
        - AddRequestHeader=X-Request-red, blue

可以使用curl进行访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DPKon0Iv-1646100649661)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220301095716976.png)]

b.Golbal Filters全局过滤器

举例如下:

package com.telit.forest.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class GatewayGolbalFilter implements GlobalFilter, Ordered {
    @Override
    public int getOrder() {
        return 0;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("GatewayGolbalFilter come in.......");
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if(StringUtils.isEmpty(username)){
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
}

访问url:

http://localhost:9527/cad-plot/payment/lb?username=abc

可以获取到正确的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值