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

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#

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351