GateWay总结

本文介绍了Spring Cloud Gateway的核心概念,包括断言、路由和过滤器。通过实例展示了如何配置路由规则,如Path断言,并通过过滤器实现访问控制,如检查Cookie和Header。此外,还提供了自定义路由配置的方法。

一、介绍

GateWay三大核心概念:

断言、路由、过滤

举个例子:我要进学校,门口保安需要判断我是否是这里的学生,这个过程就是断言,如果我是,则可以进去,相当于进入了路由,但是进入学校之后我没有穿校服,老师不让进教室,这就是过滤。他们三者是逐步判断的过程。

当使用GateWay时,相当于对一个微服务进行了保护,把它包裹起来。先做一下对比,在不使用GateWay的时候,启动8001服务,可以查询出信息。

当使用GateWay的时候,将端口号改为GateWay的端口号 (9527),则也可以查询出8001中的信息。

 

二、实战

接下来是GateWay的使用,首先建一个module,然后修改pom,pom如下 :

 <dependencies>
        <!--引入gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        <!--一般基础配置类-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

接下来新建yml,文件内容如下:


server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh      #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址,使用eureka上的地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/get/**         # 断言,路径相匹配的进行路由

        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            #- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #可以设置访问页面的时间,after表示在什么时间之后进行访问
#            - Cookie=username,zzyy
            #- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式

eureka:
  instance:
    hostname: cloud-gateway-service
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka


1、路由

yml文件中路由的代码如下:

 routes:
      - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#     uri: http://localhost:8001          #匹配后提供服务的路由地址,使用eureka上的地址
      uri: lb://cloud-payment-service #匹配后提供服务的路由地址

上面的id是对路由的唯一标识即可,uri是要保护的地址。

2、断言

yml文件中断言的代码如下:

predicates:
   - Path=/payment/get/**         # 断言,路径相匹配的进行路由

判断匹配的路径是否正确,**代表参数。

如下的断言意思是在此时间之后才可以访问页面

  - After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #可以设置访问页面的时间,after表示在什么时间之后进行访问

下面的两个断言可以通过cmd中curl指令进行查看是否有效

- Cookie=username,zzyy
#- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式

如下是没有加上cookie断言的

当加上cookie断言时候会进行报错,无法进行访问

当在后面输入cookie之后可以正常访问:

Header断言要求Id为整数,使用如下:

断言也可以通过手写配置来操作,代码和注释如下:

@Configuration
public class GateWayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        /**
         * id是唯一的标识
         * patterns:是通过 访问9527+后置guonei就可以访问下面的地址了。
         * .uri是进行断言,如果匹配则进入这个网站
         */
        routes.route("path_route_atguigu",
                r -> r.path("/guonei")
                        .uri("http://news.baidu.com/guonei")).build();

        return routes.build();
    }
}

访问方式如下:

3、过滤器

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        log.info("***********come in MyLogGateWayFilter:  "+new Date());

        String uname = exchange.getRequest().getQueryParams().getFirst("uname");

        if(uname == null)
        {
            log.info("*******用户名为null,非法用户,o(╥﹏╥)o");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }

        return chain.filter(exchange);
    }

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

如果在地址上没有输入uname则无法访问,加上uname即可访问,无论uname后面的值是什么都可以

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值