简单尝试Spring Cloud Gateway

简介

Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的。Spring Cloud Gateway构建于Spring生态系统之上,包括Spring5,SpringBoot2等。它的目标是提供简单、有效的方式路由你的API。

Spring Cloud Gateway不能在传统的Servlet容器中工作,也不能构建成一个war包工作。这一点很重要。

重要概念

  • 路由:Gateway的基础构建模块。它包括一个ID,一个目标URL,一个断言集合和一个过滤器集合。如果断言判断为真,则路由匹配。
  • 断言:这是Java8的新增功能,输入的类型为Spring框架的ServerWebExchange。它可以匹配HTTP请求中的任何东西,比如:请求头或者参数。
  • 过滤器:是Spring框架的GatewayFilter,请求和响应都可以被Filter修改。

  Spring Cloud Gateway的流程图如下:

创建一个简单的路由

首先我们使用IDEA创建Spring-boot项目,并选择spring-cloud-starter-gateway依赖,请注意,这里千万不能选择spring-boot-starter-web,它们两个不能同时存在。然后我们在启动类中,增加如下代码:

  @Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri("http://httpbin.org"))
.build();
}

  myRoutes方法的输入参数类型为RouteLocatorBuilder,它可以非常简单的向路由中增加断言和过滤器。上例中,我们的断言为“/get”,凡是访问路由网关中的“/get”路径,都会在请求头中增加“Hello”—“World”键值对,并且会转发到http://httpbin.org。我们启动项目,并在浏览器中访问http://localhost:8080/get,结果如下:

  当我们访问http://localhost:8080/get时,Gateway首先会判断路径/get,确定路径/get符合条件后,在请求头中添加“Hello”—“World”。然后会转发请求到http://httpbin.org/get,然后返回上图的响应。

使用Hystrix熔断

我们还可以在Gateway中,使用熔断机制,当我们转发请求,获取的响应超时(504错误)时,可以唤起我们设置的熔断措施,并返回预设的结果。代码如下:

  @Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri("http://httpbin.org:80"))
.route(p -> p
.host("*.hystrix.com")
.filters(f -> f.hystrix(config -> config
.setName("myHystrix")
.setFallbackUri("forward:/fallback")))
.uri("http://httpbin.org"))
.build();
} @RequestMapping("fallback")
public String fallback() {
return "Hello,Hystrix fallback";
}

  我们看方法中的第二个route,断言的判断为Host=*.hystrix.com,当请求头中的Host为*.hystrix.com,进入此路由,然后再过滤器中,设置Hystrix熔断,当请求超时时,请求转发到Gateway中的“/fallback”,"/fallback"我们将返回“Hello,Hystrix fallback”。我们启动Gateway,并通过Postman配置请求头Host=www.hystrix.com,访问http://localhost:8080/delay/3。结果如下:

Spring Cloud Gateway就先介绍到这里,当然它还有很多强大的功能,在这里并没有一一展开的去讲。如有疑问,欢迎评论区留言哦~

简单尝试Spring Cloud Gateway的更多相关文章

  1. Spring Cloud Gateway实战之一:初探

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<Spring Cloud Gateway实 ...

  2. Spring Cloud Gateway的断路器(CircuitBreaker)功能

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单

    一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...

  4. spring cloud Gateway简单使用

    一.引子 2年前有幸使用过一次Spring Cloud (1.5.9),那次用的是ZUUL做网关,没有使用Gateway做网关,一直是个小遗憾.终于在2年后的19年底再次使用Spring Cloud, ...

  5. Spring Cloud Gateway简单入门,强大的微服务网关

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 见名知义,Spring Cloud Gateway是用于微服务场景的网关组件,它是基于Spring WebFlu ...

  6. Spring Cloud Gateway + Nacos(1)简单配置

    当初我学习时候就是参考这位大佬的博客: Nacos集成Spring Cloud Gateway 基础使用 现在学习到spring cloud alibaba 使用nacos做服务中心,dubbo做通信 ...

  7. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  8. API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd API 网关出现的原因

    API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd http://www.infoq.com/cn/articles/compa ...

  9. Spring Cloud Gateway入坑记

    Spring Cloud Gateway入坑记 前提 最近在做老系统的重构,重构完成后新系统中需要引入一个网关服务,作为新系统和老系统接口的适配和代理.之前,很多网关应用使用的是Spring-Clou ...

随机推荐

  1. [C#] 動的にアセンブリをロードする

    アプリケーション ドメインにおいて起動時に読み込まれない別のアセンブリ (.dll や .exe) を読み込む場合.System.Reflection.Assemby クラスの Load メソッドを使 ...

  2. PostgreSQL自学笔记:9 索引

    9 索引 9.1 索引简介 索引是对数据库表中一列或多列值进行排序的一种结构,使用 索引可提高数据库中特定数据的查询速度 9.1.1 索引的含义和特点 索引是一种单独的.存储在磁盘上的数据库结构,他们 ...

  3. C语言编译器CL.exe

    下载地址CL.7z版权问题:仅供学习交流,请于24小时内删除,本人不承担版权问题… 基本使用: 1.解压缩,例如解压缩到E盘根目录下 2.打开cmd命令行界面(快捷方式win+R输入cmd回车)cd命 ...

  4. NOIP2017 d1t2 时间复杂度

    题目传送门:洛谷P3952 大模拟不解释 #include<iostream> #include<cstdio> #include<cmath> #include& ...

  5. (Android UI)Android应用程序中资源:图片、字符串、颜色、布局等

    Android系统设计采用代码和布局分离的设计模式,因此在设计Android应用程序时需要遵循该设计模式. “把非代码资源(如图片和字符串常量)和代码分离开来始终是一种很好的做法.”---<An ...

  6. 关于*.ashx 处理程序调试时 未能创建类型 错误

    出现改问题的根本原因是因为,我更改过改类型的名字,而IDE并没有更改  ***.ashx. 注册类型名字. 所更改的类的名字应该是  "项目名字.文件名字“ 例如下图 应该更改类为 ”Wx_ ...

  7. /var/spool/clientmqueue目录~清理

    今天nagios报警,一台服务器的disk满了,使用du -sh * 或 du -sh /* 查看目录的大小,查找占用空间大的目录/var/spool/clientmqueue.... 然后我就想/v ...

  8. Docker ElK安装部署使用教程

    一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...

  9. 关于SQLite3笔记

    sq .help .quit .exit 创建和连接数据库:在linux中 sqlite3 数据库名 没有就创建 有就连接 .show 显示各种设置的当前值. .echo ON|OFF echo命令 ...

  10. myeclipse连接mysql失败出错,已解决问题

    问题描述: 解决方案: