Spring Cloud Gateway -- 基础入门

作者: BeautifulHao | 来源:发表于2019-05-07 13:30 被阅读73次

    Spring Cloud Gateway 是什么

    Gateway是Spring Cloud 第二代网关,第一代是Zuul。

    • Spring Cloud Gateway是Spring官网基于Spring 5.0、 Spring Boot 2.0、Project Reactor等技术开发等网关。
    • Spring Cloud Gateway为微服务架构提供简单、有效且统一的API路由管理方式。
    • Spring Cloud Gateway基于Filter链提供网关基本功能:安全、监控/埋点、限流等。
    • Spring Cloud Gateway是替代Netflix Zuul的一套解决方案。

    Spring Cloud Gateway 核心概念

    Spring Cloud Gateway设计以降低管理成本和安全风险,包含协议适配协议转发、安全策略(WAF)、防刷、流量、监控日志等功能。
    Spring Cloud Gateway中重要的概念:

    1.png
    • 路由(route)
      路由信息的组成:
      由一个ID、一个目的URL、一组断言工厂、一组Filter组成。
      如果路由断言为真,说明请求URL和配置路由匹配。
    • 断言(Predicate)
      Java 8中的断言函数。
      Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何信息比如请求头和参数。
    • 过滤器(Filter)
      一个标准的Spring WebFilter。
      Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

    Spring Cloud Gateway 工作原理

    2.png

    如上图所示,有几个知识点:
    Gateway的客户端会向Spring Cloud Gateway发送请求,请求
    首先被HttpWebHandlerAdapter进行提取组装成网关上下文.
    然后网关的上下文会传递到DispatcherHandler。 DispatcherHandler是所有请求的分发处理器.

    • DispatcherHandler

    DispatcherHandler主要负责分发请求对应的处理器,比如将请求分发到对应RoutePredicate-HandlerMapping(路由断言处理映射器)。

    • RoutePredicate-HandlerMapping(路由断言处理映射器)

    路由断言处理映射器主要用于路由的查找,以及找到路由返回对应的FilteringWebHandler。

    • FilteringWebHandler

    FilteringWebHandler主要负责组装Filter链表并调用Filter执行一系列Filter处理,然后把请求转到后端对应的代理服务处理,处理完毕之后将Response返回到Gateway客户端。

    • Filter类型

    Spring Cloud Gateway和Zuul类似,有pre和post两种方式的filter。客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,比如一个service,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。类似在zuul中指定入口filter和出口filter。

    注:在配置路由的时候,如果不指定端口的话,http默认设置端口为80,https默认设置端口为443。Spring Cloud Gateway的启动容器目前只支持Netty。

    Spring Cloud Gateway 案例

    网关最重要的功能是协议适配和协议转发,协议转发即基本的路由信息转发,本节演示最简单的Spring Cloud Gateway协议转发的实现。

    使用Application.java与yml两种方式分别展示基础路由

    Application.java 创建项目spring-cloud-application

    • pom
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
    </dependencies>
    
    • yml
    server:
      port: 8080
    spring:
      application:
        name: spring-cloud-gateway
    # Spring Cloud Gateway 日志配置
    logging:
      level:
        org.springframework.cloud.gateway: TRACE
        org.springframework.http.server.reactive: DEBUG
        org.springframework.web.reactive: DEBUG
        reactor.ipc.netty: DEBUG
    
    

    JAVA API方式

    @SpringBootApplication
    public class CloudGatewayBasic1Application {
    
        /**
         * 通过JAVA流式API自定义RouteLocatorBuilder方式定义Spring Cloud Gateway路由
         * @param builder
         * @return
         */
        @Bean
        public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
            return builder.routes()
                    // basic proxy
                    .route(r -> r.path("/jd")
                                    .uri("http://jd.com:80/")
                                        .id("jd_route")
                            ).build();
        }
        
        public static void main(String[] args) {
            SpringApplication.run(CloudGatewayBasic1Application.class, args);
        }
    }
    

    服务启动,访问 http://localhost:8080/jd 会自动跳转到https://www.jd.com/

    yml方式

    基本与上方代码一致,Application和yml有所变化:

    • Application(只是一个启动程序,没有特殊东西)
    @SpringBootApplication
    public class CloudGatewayBasic2Application {
        public static void main(String[] args) {
            SpringApplication.run(CloudGatewayBasic2Application.class, args);
        }
    }
    
    • yml
    server:
      port: 8080
    spring:
      application:
        name: spring-cloud-gateway
      cloud:
        gateway:
          routes:
          - id: baidu_route
            uri: http://www.baidu.com
            predicates:
            - Path=/baidu
    
    # Spring Cloud Gateway 日志配置
    logging:
      level:
        org.springframework.cloud.gateway: TRACE
        org.springframework.http.server.reactive: DEBUG
        org.springframework.web.reactive: DEBUG
        reactor.ipc.netty: DEBUG
    

    yml中体现了Spring Cloud Gateway的配置

    路由端点监控

    Spring Cloud Gateway提供gateway actuator,该EndPiont提供关于Filter及routes的信息查询及指定route信息更新的Rest API接口。配置后即可查看路由情况
    需在yml中添加如下配置:

    ......
    management:
      endpoints:
        web:
          exposure:
            include: '*'
        enabled: false
    
    # Spring Cloud Gateway 日志配置
    logging:
     ......
    
    

    新增management这段代码,然后访问地址:
    http://localhost:8080/actuator/gateway/routes 查看到路由情况

    3.png

    参考:
    https://blog.csdn.net/Cy_LightBule/article/details/86578772#

    相关文章

      网友评论

        本文标题:Spring Cloud Gateway -- 基础入门

        本文链接:https://www.haomeiwen.com/subject/majeoqtx.html