这篇文章讲述了如何简单地使用Spring Cloud Gateway,来源于Spring Cloud官方案例,地址https://spring.io/guides/gs/gateway 。
简介:
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的入口,在微服务系统中有着非常重要的作用,网关常见的功能有路由转发、权限校验、限流控制等作用。本文首先用官方的案例带领大家来体验下Spring Cloud的一些简单的功能,在后续的文章中我会使用详细的案例和源码解析来详细讲解Spring Cloud Gateway。
创建工程:
新建一个工程,取名为sc-f-gateway-first-sight,工程使用的Spring Boot版本为2.0.5.RELEASE,Spring Cloud版本为Finchley.SR1。完整的工程目录图和pom.xml内容如图所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<name>sc-f-gateway-first-sight</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
创建一个简单的路由:
在Spring Cloud Gateway中使用RouteLocator的Bean进行路由转发,将请求进行处理,最后转发到目标的下游服务。在本案例中,会将请求转发到http://httpbin.org:80这个地址上。代码如下:
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@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")).build();
}
}
在上面的myRoutes方法中,使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由外RouteLocatorBuilder可以让你添加各种predicates和filters,predicates是断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。
上面创建的route可以让请求”/get“请求都转发到“http://httpbin.org/get”。在route配置上,我们添加了一个filter,该filter会将请求添加一个header,key为hello,value为world。
启动springboot项目,在浏览器上http://localhost:8080/get,浏览器显示如下:
可见当我们向gateway工程请求”/get”,gateway会将工程的请求转发到“http://httpbin.org/get”,并且在转发之前,加上一个filter,该filter会将请求添加一个header,key为hello,value为world。注意HTTPBin展示了请求的header hello和值world。
使用Hystrix
在Spring Coud Gateway中可以使用Hystrix。Hystrix是Spring Cloud中一个服务熔断降级的组件,在微服务系统有着十分重要的作用。Hystrix是SpringCloud Gateway中是以filter的形式使用的,代码如下:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
String httpUri = "http://httpbin.org:80";
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri(httpUri))
.route(p -> p
.host("*.hystrix.com")
.filters(f -> f
.hystrix(config -> config.setName("mycmd")
.setFallbackUri("forward:/fallback")))
.uri(httpUri)).build();
}
在上面的代码中,我们使用了另外一个router,该router使用host去断言请求是否进入该路由,当请求的host有“*.hystrix.com”,都会进入该router,该router中有一个hystrix的filter,该filter可以配置名称、和指向性fallback的逻辑的地址,比如本案例中重定向到了“/fallback”,Mono是一个Reactive stream,对外输出一个“fallback”字符串。
@RequestMapping("/fallback")
public Mono<String> fallback() {
return Mono.just("fallback");
}
使用curl执行以下命令:
curl --dump-header - --header Host:www.hystrix.com http://localhost:8080/delay/3
返回的结果为:
可见,带hostwww.hystrix.com的请求执行了hystrix的fallback的逻辑。