这篇文章讲述了如何简单地使用Spring Cloud Gateway,来源于Spring Cloud官方案例,地址https://spring.io/guides/gs/gateway 。

简介:

       Spring Cloud GatewaySpring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的入口,在微服务系统中有着非常重要的作用,网关常见的功能有路由转发权限校验限流控制等作用。本文首先用官方的案例带领大家来体验下Spring Cloud的一些简单的功能,在后续的文章中我会使用详细的案例和源码解析来详细讲解Spring Cloud Gateway。

创建工程:

       新建一个工程,取名为sc-f-gateway-first-sight,工程使用的Spring Boot版本为2.0.5.RELEASESpring Cloud版本为Finchley.SR1。完整的工程目录图和pom.xml内容如图所示:

springboot项目配置网关转发地址实现 springboot 网关 作用_spring

<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中使用RouteLocatorBean进行路由转发,将请求进行处理,最后转发到目标的下游服务。在本案例中,会将请求转发到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方法中,使用了一个RouteLocatorBuilderbean去创建路由,除了创建路由外RouteLocatorBuilder可以让你添加各种predicatesfilterspredicates是断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。

       上面创建的route可以让请求”/get“请求都转发到“http://httpbin.org/get”。在route配置上,我们添加了一个filter,该filter会将请求添加一个headerkeyhellovalueworld

启动springboot项目,在浏览器上http://localhost:8080/get,浏览器显示如下:

springboot项目配置网关转发地址实现 springboot 网关 作用_spring_02

       可见当我们向gateway工程请求”/get”gateway会将工程的请求转发到“http://httpbin.org/get”,并且在转发之前,加上一个filter,该filter会将请求添加一个headerkeyhellovalueworld。注意HTTPBin展示了请求的header hello和值world

使用Hystrix

       在Spring Coud Gateway中可以使用HystrixHystrixSpring Cloud中一个服务熔断降级的组件,在微服务系统有着十分重要的作用。HystrixSpringCloud 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中有一个hystrixfilter,该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

返回的结果为:

springboot项目配置网关转发地址实现 springboot 网关 作用_spring_03

       可见,带hostwww.hystrix.com的请求执行了hystrixfallback的逻辑。