简单尝试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的流程图如下:

                                  简单尝试Spring Cloud Gateway-LMLPHP

 

创建一个简单的路由

首先我们使用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,结果如下:

简单尝试Spring Cloud Gateway-LMLPHP

  当我们访问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-LMLPHP

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

 

01-11 22:33