Java

Spring Cloud GateWay 入门(一)

2019-07-18  本文已影响0人  gmdqtd

Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接,如 WebSockets,Spring Cloud Gateway 使用非阻塞 API,支持 WebSockets,支持限流等新特性。

Spring Cloud Gateway介绍


Spring Cloud Gateway 是 是基于 Spring 5.0,Spring Boot 2.0, Project Reactor和WebFlux等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

相关概念:

工作流程:

image

客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

Spring Cloud Gateway 的特征:

快速上手


Spring Cloud Gateway 网关路由有两种配置方式:

配置服务的路由:配置文件方式
新建spring cloud项目,在项目中添加spring cloud gateway的依赖包

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

Spring Cloud Gateway 是使用 netty+webflux 实现因此不需要再引入 web 模块。
在.yml或.properties文件中添加如下配置:

server:
  port: 8081

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://www.baidu.com
        predicates:
        - Path=/a/**
        filters:
        - StripPrefix=1
      - id: host_route
        uri: http://www.ityouknow.com
        predicates:
        - Path=/springcloud
#        filters:
#        - StripPrefix=1

配置服务的路由:代码方式
1、删除配置文件中的路由配置
2、修改 Application.java, 添加自定义路由配置

@SpringBootApplication
public class CloudgatewayApplication {

    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p -> p
                        .path("/a/**")
//                        .filters(f -> f.addRequestHeader("Hello", "World"))
                        .filters(f -> f.stripPrefix(1))
                        .uri("https://www.baidu.com"))
                .build();
    }

    public static void main(String[] args) {
        SpringApplication.run(CloudgatewayApplication.class, args);
    }
}

当访问地址 http://localhost:8081/a时会自动转发到地址:https://www.baidu.com

路由规则


Spring Cloud Gateway 内置了很多 Predicates 工厂,这些 Predicates 工厂通过不同的 HTTP 请求参数来匹配,多个 Predicates 工厂可以组合使用。
Spring Cloud Gateway 的功能很强大,我们仅仅通过 Predicates 的设计就可以看出来,前面我们只是使用了 predicates 进行了简单的条件匹配,其实 Spring Cloud Gataway 帮我们内置了很多 Predicates 功能。

Spring Cloud Gateway 是通过 Spring WebFlux 的 HandlerMapping 做为底层支持来匹配到转发路由,Spring Cloud Gateway 内置了很多 Predicates 工厂,这些 Predicates 工厂通过不同的 HTTP 请求参数来匹配,多个 Predicates 工厂可以组合使用。

Predicate 介绍
Predicate 来源于 Java 8,是 Java 8 中引入的一个函数,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。如果对Predicate不了解的,可以先了解一下JAVA 8函数式编程。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。具体可以查看可参考 官方文档,网上有一张图总结了 Spring Cloud 内置的几种 Predicate 的实现。

image.png
说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理。具体的配置可以参考官方文档。
上一篇下一篇

猜你喜欢

热点阅读