简单尝试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的动态路由怎样做?集成Nacos实现很简单

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

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

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

  3. 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 ...

  4. Spring Cloud Gateway入坑记

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

  5. Spring Cloud Gateway中异常处理

    最近我们的项目在考虑使用Gateway,考虑使用Spring Cloud Gateway,发现网关的异常处理和spring boot 单体应用异常处理还是有很大区别的.让我们来回顾一下异常. 关于异常 ...

  6. api网关揭秘--spring cloud gateway源码解析

    要想了解spring cloud gateway的源码,要熟悉spring webflux,我的上篇文章介绍了spring webflux. 1.gateway 和zuul对比 I am the au ...

  7. SpringCloud无废话入门05:Spring Cloud Gateway路由、filter、熔断

    1.什么是路由网关 截至目前为止的例子中,我们创建了一个service,叫做:HelloService,然后我们把它部署到了两台服务器(即提供了两个provider),然后我们又使用ribbon将其做 ...

  8. Spring Cloud Gateway入门

    1.什么是Spring Cloud GatewaySpring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技 ...

  9. Spring Cloud Gateway服务网关

    原文:https://www.cnblogs.com/ityouknow/p/10141740.html Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gatewa ...

随机推荐

  1. 策划编写一个新的Helper类

    https://code.csdn.net/jy02305022/blqw-data 有朋友看见的话给点意见呗

  2. JSON.stringify////////////////////////////////zzzzzzzzzzzzzz

    JSON.stringify 语法实例讲解 可能有些人对系列化这个词过敏,我的理解很简单.就是说把原来是对象的类型转换成字符串类型(或者更确切的说是json类型的).就这么简单.打个比方说,你有一个类 ...

  3. android 资讯阅读器(二)

    接着上次的博客,上次移植完了tab以后整个app的框架就算是定下来了. 本次目标: 1.数据的获取与展示(ListView) 2.官方的下拉刷新效果(SwipeRefreshLayout) 3.数据接 ...

  4. Java Concurrency - Semaphore 信号量

    Semaphore 是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得 semaphore.如果 semaphore 的内部计数器的值大于 0,那么 semapho ...

  5. select count(*)和select count(1)的区别 (转)

    A 一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 如果有主键 ...

  6. jquery创始人

    http://developer.51cto.com/art/201102/244898.htm jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多javascript高手加 ...

  7. C#语音录制

    客服小妹是如何泡到手的——C#定时提醒·语音录制·语音播放·文件转录Demo——倾情奉献!   一.需求提出 客服小妹跟我说,每天要统计新加好友数,得先记下昨天的数目,然后查看今天的数目,还要相减,打 ...

  8. Sql Server 复制数据库

    确实很实用 https://www.cnblogs.com/ggll611928/p/7451558.html

  9. Python爬虫11-XML与XPath概述及lxml库的应用

    GitHub代码练习地址:用lxml解析HTML,文件读取,etree和XPath的配合使用:https://github.com/Neo-ML/PythonPractice/blob/master/ ...

  10. pragma警告处理

    使用pragma消除警告 (绝不可强行消除,因为有可能是个运行时错误) #pragma clang diagnostic push #pragma clang diagnostic ignored & ...