Spring Cloud Gateway -- 基础入门

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中重要的概念:

  • 路由(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 工作原理

如上图所示,有几个知识点:
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 查看到路由情况

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



作者:BeautifulHao
链接:https://www.jianshu.com/p/0fe5b864ab53
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/lgxzzz/article/details/121198636
今日推荐