01 基础环境准备
02 一文读懂Eureka
03 Zookeeper注册中心
04 Consule注册中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息总线

1 GateWay简介

Spring Cloud Gateway是 Spring Cloud的个全新项目,基于 Spring5.0+ Spring Boot2.0和 Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。
Spring Cloud Gateway作为 Spring Cloud生态系统中的网关,目标是替代Zuul,在 Spring Cloud2.0以上版本中,没有对新版本的Zuul2.0以上最新高性能版本进行集成,仍然还是使用的Zu1x非 Reactor模式的老版本。而为了提升网关的性能, Spring Cloud Gateway是基于 Webfluxi框架实现的,而 Nebflux框架底层则使用了高性能的 Reactor模式通信框架Netty。Spring Cloud Gatewayf的目标提供统一的路由方式目基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

2 三大核心概念

路由:路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配。
断言:Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。
过滤器:一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
在这里插入图片描述

3 新建工程

在这里插入图片描述
(1) pom

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</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>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>com.zrs.springcloud</groupId>
        <artifactId>commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

(2) application.yml

server:
  port: 9002
spring:
  application:
    name: gateway-cloud
  cloud:
    gateway:
      routes:
        #id:实例唯一ID;uri:真实服务地址;predicates:断言匹配;
        - id: provider-route
          uri: http://localhost:9000
          predicates:
            - Path=/ribbon/**
eureka:
  instance:
    #服务名称
    hostname: gateway-cloud
  client:
    serviceUrl:
      #eureka注册中心地址
      defaultZone: http://localhost:7000/eureka/  #配置URL
    #是否将自己注册到EurekaServer
    register-with-eureka: true
    #是否从EurekaServer获取已有的注册服务
    fetch-registry: true

(3) 启动类

@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class);
    }
}

(4) 启动 Eureka、payment、paymentSlave、gateway
在这里插入图片描述

在这里插入图片描述
(5) 测试
在这里插入图片描述

4 路由编码实现

创建GatewayConfig配置文件,实现访问跳转腾讯Nba

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder builder){
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("nba",r->r.path("/nba").uri("https://sports.qq.com/nba/")).build();
        return routes.build();
    }
}

在这里插入图片描述
在这里插入图片描述

5 动态路由

5.1 修改网关的application.yml

server:
  port: 9002
spring:
  application:
    name: gateway-cloud
  cloud:
    #从注册中心动态创建路由
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        #id:实例唯一ID;uri:真实服务地址;predicates:断言匹配;
        - id: provider-route
          uri: lb://PROVIDER-PAYMENT-SERVICE
          predicates:
            - Path=/ribbon/**
eureka:
  instance:
    #服务名称
    hostname: gateway-cloud
  client:
    serviceUrl:
      #eureka注册中心地址
      defaultZone: http://localhost:7000/eureka/  #配置URL
    #是否将自己注册到EurekaServer
    register-with-eureka: true
    #是否从EurekaServer获取已有的注册服务
    fetch-registry: true

5.2 启动provider-slave、gateway服务

在这里插入图片描述
在这里插入图片描述

5.3 测试

在这里插入图片描述

在这里插入图片描述

6 predicates配置

6.1 时间

(1) 配置解析

-After : 之后访问  例:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
-Before: 之前访问  例:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
-Between: 之间访问 例:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

(2) 编写中文获取时间测试类

public class TimeTest {
    public static void main(String[] args) {
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);
    }
}

在这里插入图片描述
(3) 测试Before
修改application.yml配置文件

predicates:
  - Path=/ribbon/**
  - Before=2020-03-15T14:06:31.701+08:00[Asia/Shanghai]

6.2 Cookie

(1) 配置,此规则会根据Cookie name的值和正则表达式去匹配,匹配上执行路由,匹配不上不执行。
在这里插入图片描述
(2) 修改application.yml

predicates:
  - Path=/ribbon/**
  - Cookie=username,zrs

(3) 测试

curl http://localhost:9002/ribbon/server --cookie "username=zrs"
curl http://localhost:9002/ribbon/server

在这里插入图片描述

6.3 Header

(1) 如果请求有一个名为X-request-Id的头,并且该头的值与\d+正则表达式匹配
在这里插入图片描述
(2) 修改application.yml

predicates:
  - Path=/ribbon/**
  - Header=X-Request-Id, \d+

(3) 测试

curl http://localhost:9002/ribbon/server  -H "X-Request-Id:1234"

curl http://localhost:9002/ribbon/server  

在这里插入图片描述

7 过滤器

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滅器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由 Gateway Filterf的工厂类来产生。

7.1 创建配置文件

@Component
public class GatewayFilterConfig implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if (StringUtils.isBlank(username)){
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 0;
    }
}

7.2 重启测试

在这里插入图片描述
在这里插入图片描述

GITHUB

#分支Gateway-enviroment-release-v1.0  
https://github.com/zhurongsheng666/spring-cloud-hoxton
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐