简单尝试Spring Cloud Gateway
简单尝试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的更多相关文章
- Spring Cloud Gateway实战之一:初探
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<Spring Cloud Gateway实 ...
- Spring Cloud Gateway的断路器(CircuitBreaker)功能
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单
一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...
- spring cloud Gateway简单使用
一.引子 2年前有幸使用过一次Spring Cloud (1.5.9),那次用的是ZUUL做网关,没有使用Gateway做网关,一直是个小遗憾.终于在2年后的19年底再次使用Spring Cloud, ...
- Spring Cloud Gateway简单入门,强大的微服务网关
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 见名知义,Spring Cloud Gateway是用于微服务场景的网关组件,它是基于Spring WebFlu ...
- Spring Cloud Gateway + Nacos(1)简单配置
当初我学习时候就是参考这位大佬的博客: Nacos集成Spring Cloud Gateway 基础使用 现在学习到spring cloud alibaba 使用nacos做服务中心,dubbo做通信 ...
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...
- 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 ...
- Spring Cloud Gateway入坑记
Spring Cloud Gateway入坑记 前提 最近在做老系统的重构,重构完成后新系统中需要引入一个网关服务,作为新系统和老系统接口的适配和代理.之前,很多网关应用使用的是Spring-Clou ...
随机推荐
- iphone手机浏览器文本框不触发输入中文的keyup事件
问题描述:iphone手机浏览器文本框不触发输入中文的keyup事件,在输入中文之后需要点击回退按键,才会开始搜索.问题分析:iphone手机的输入法(不管是第三方还是自带)能检测到英文或者数字的ke ...
- Python基础——切片实例
切片实例 L = list(range(100)) print(L, end=' ') [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1 ...
- Python-Django学习
1,安装Django与python版本的对应1.8 2.7,3.2--3.51.9,1.10 2.7,3.4,3.51.11 2.7,3.4,3.5,3.62.0 2.1 第一种安装:pip inst ...
- HDFS基础配置
HADOOP-3.1.0-----HDFS基础配置 执行步骤:(1)配置集群(2)启动.测试集群增.删.查(3)执行wordcount案例 一.配置集群 1.在 hadoop-env.sh配置文件添加 ...
- Servlet.service() for servlet [jsp] in context with path [/Healthy_manager] threw exception [Unable to compile class for JSP] with root cause java.lang.IllegalArgumentException: Page directive: inval
严重: Servlet.service() for servlet [jsp] in context with path [/Healthy_manager] threw exception [Una ...
- ASP.NET 创建WebService——简单例子
Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...
- :before和::before的区别
单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素.伪元素和伪类之所以这么容易混淆,是因为他们的效果类似而且写法相仿,但实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示, ...
- python基础5 while循环
一.while循环: while 条件: 代码块 例: n=0 while n<10: print(n) n=n+1 #n自加1 ,满足n<10,继续循环 输出结果: 1 2 3 4 ...
- uCOS-II
/****************************************************/ **关于移植,ucos官网上给的有template,主要思想是实现任务切换的两个函数(任务 ...
- csrf jsonp
网站b中包含向网站a发送的请求,那么网站b就会获得网站a的cookie,网站a登录了则网站b的cookie中会有网站a的sessionid,此时如果网站a对外提供需要sessionid的jsonp接口 ...