菜鸟的springcloud学习总结(五):服务网关

  • 说明
  • 一、服务网关
  • 二、Gateway
  • (1)配置文件配置路由
  • (2)动态路由
  • (3)Pridicate断言
  • (4)filter


说明

更新时间:2020/10/02 23:09,更新到了Gateway

本文主要对springcloud中的服务网关进行学习与记录,主要偏向于实战,本文会持续更新,不断地扩充

本文仅为记录学习轨迹,如有侵权,联系删除

一、服务网关

springboot网关设置超时时间 网关 springboot_网关


按照上面的图进行学习,现在进行到了服务网关这一个模块,主要重点学gateway

二、Gateway

概述
SpringCloud Gateaway 是spring Coud的一个全新项目,基于Spring5.0+springBoot 2.0 和Project 、Reactor等技术开发的网关。它旨在为微服务架构提供一种简单有效的同意的API路由管理方式。

SpringCloud Gatteway作为springcloud生态系统中的网关,目标是替代zuul,在spring Cloud2.0的版本中,没有zuul2.0以上的高性能的版本进行集成,仍然还是采用zull1.x非Reactor模式的老版本。而为了提升网关的性能,spring cloud Gateway 是基于WebFlux框架实现的,而WebFlux框架底层是使用了高性能的Reactor模式通信框架Netty。

spring cloud Gateway 的目标是提供统一的额路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标和限流等。

特性

springboot网关设置超时时间 网关 springboot_Gateway_02

(1)配置文件配置路由

创建服务网关模块cloud-gateway-gateway9527,引入pom坐标依赖,因为这个要注册在eureka服务中心,所以还需要引入eureka

<dependencies>

        <!--引入公共包-->
        <dependency>
            <groupId>com.zsc</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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>
    </dependencies>

然后是主启动类,该加的注解直接加上去

springboot网关设置超时时间 网关 springboot_ide_03

重点是eureka和gateway依赖,然后是配置yml文件

server:
  port: 9527
spring:
  application:
    name: cloud-gateway-gateway9527
  cloud:
    gateway:
      routes:
        # 这里如果访问http://localhost:9527/payment/paymentInfoOk/**
        # 实际跟访问http://localhost:8003/payment/paymentInfoOk/**一样
        # 达到隐藏原来服务器和端口号的目的
        - id: payment_routh1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8003   #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/paymentInfoOk/**   #断言,路径相匹配的进行路由

        # 这里如果访问http://localhost:9527/payment/hello
        # 实际上跟访问http://localhost:8003/payment/hello一样
        # 达到隐藏原来服务器和端口号的目的
        - id: payment_routh2
          uri: http://localhost:8003
          predicates:
            - Path=/payment/hello   #断言,路径相匹配的进行路由




#服务中心注册
eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://localhost:7001/eureka

上面重点是routes配置,这里如果访问ttp://localhost:9527/payment/paymentInfoOk/ 实际跟访问http://localhost:8003/payment/paymentInfoOk/**一样,这样达到隐藏原来服务器和端口号的目的

这样可以测试了,开启项目,这里需要开启3个项目

springboot网关设置超时时间 网关 springboot_Gateway_04


springboot网关设置超时时间 网关 springboot_spring_05

(2)动态路由

当服务是集群的时候,我们可以用动态路由的方式进行路由的转发,同时实现负载均衡

修改cloud-gateway-gateway9527配置文件

server:
  port: 9527
spring:
  application:
    name: cloud-gateway-gateway9527
  cloud:
    gateway:
      #动态路由配置
      discovery:
        locator:
          enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由

        
      routes:
            #动态路由配置
         - id: payment_routh3
          uri: lb://cloud-provider-payment
          predicates:
            - Path=/payment/** #断言,路径相匹配的进行路由

#服务中心注册
eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://localhost:7001/eureka

启动项目如下

springboot网关设置超时时间 网关 springboot_spring_06


springboot网关设置超时时间 网关 springboot_Gateway_07


同时实现了负载均衡的效果。

(3)Pridicate断言

上面的项目我们用到了pridecate里面的path关键字,实际上还有其他的关键字

springboot网关设置超时时间 网关 springboot_springboot网关设置超时时间_08


其余关键字

springboot网关设置超时时间 网关 springboot_springboot网关设置超时时间_09


After,Before,Between

After后面加时间串,时间串可以用ZonedDateTime.now()获取,表示只有过了这个设置的时间后才可以访问,Before表示某个时间之前,Between则是再某一个时间段

springboot网关设置超时时间 网关 springboot_ide_10

springboot网关设置超时时间 网关 springboot_ide_11

Cookie

Cookie表示只有带有cookie,且键值对为username为zs的才可以访问

springboot网关设置超时时间 网关 springboot_spring_12


带cookie访问,由于浏览器无法带cookie,这里用curl进行访问,访问成功

springboot网关设置超时时间 网关 springboot_springboot网关设置超时时间_13

Header

表示只有带有相应的请求头才能访问

springboot网关设置超时时间 网关 springboot_Gateway_14


成功访问

springboot网关设置超时时间 网关 springboot_spring_15


还有其他的可以自己百度

(4)filter

Gatewa三个核心功能:路由、断言和过滤链(Filter),现在是最后一个核心功能,过滤链Filter,功能跟之前学过的过滤链一样的,在请求进来的时候进行拦截,进行处理,从而进行过滤。

实现的方式也简单,只要创建一个全局的过滤类即可

springboot网关设置超时时间 网关 springboot_Gateway_16


代码如下:

@Component
public class GatewayFilter implements GlobalFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("****************come in GatewayFilter: " + "****************come in GatewayFilter:"+new Date());
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if (username==null) {
            System.out.println("**************用户名为null");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }


        return chain.filter(exchange);
    }

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

上面配置类中拦截,并且判断是否带有username参数,没有的话无法访问,配置完就可以直接启动了

springboot网关设置超时时间 网关 springboot_ide_17


springboot网关设置超时时间 网关 springboot_spring_18