学习SpringCloud(5)路由网关 Gateway

1,096 阅读2分钟

一、简介

1、Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

2、

  • Zuul构建于 Servlet 2.5,兼容 3.x,使用的是阻塞式的 API,不支持长连接,比如 websockets。

  • Spring Cloud Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成,开发体验相对来说十分不错。具体哪个好咱也不知道了,不过毕竟Gateway是Spring Cloud 自己推出的服务网关,应该比zuul靠谱些。

二、创建项目

直接copy一个之前的项目,进行修改

pom文件:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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

这里注意不要引入“spring-boot-starter-web”,不然会冲突。原因:Spring Cloud Gateway 是使用 netty+webflux 实现因此不需要再引入 web 模块

三、Gateway 路由、以及结合Hystrix 实现熔断

这里有两种方式来做,一种是通过配置类,一种是通过配置文件,这里都实践一下

3.1、配置类的方式:

新建配置类

@Configuration
public class GatewayRoutes {
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r ->
                        r.path("/api/**")
                        .filters( f -> f.stripPrefix(1)
                                .hystrix(config -> config
                                .setName("root")
                                .setFallbackUri("forward:/fallback")))
                        .uri("lb://spring-cloud-eureka-pro") //uri:lb表示从注册中心订阅服务。
                ).build();
    }
}

新建降级服务类,供fallback 使用

@RestController
public class GateFilter {

    @RequestMapping("/fallback")
    public Mono<String> fallback() {
        return Mono.just("服务不可用");
    }
}

另外启动注册中心,和 prodiver 进行测试

关闭prodiver

测试结果和预期一样,实现了路由和熔断

3.1、配置文件的方式

这里就不需要上面的配置类了,直接通过配置文件进行配置

application.yml

spring:
  application:
    name: spring-cloud-eureka-cus

  #gateway配置
  cloud:
    gateway:
      routes:
      - id: root
        # uri:lb表示从注册中心订阅服务。
        uri: lb://spring-cloud-eureka-pro
        predicates:
          - Path=/api/**
        filters:
          - StripPrefix=1
          #熔断过滤器
          - name: Hystrix
            args:
              name: fallback
              fallbackUri: forward:/fallback

重启项目进行测试,测试结果跟上面是一样的,就不放截图了,个人感觉使用上比zuul方便一些,至于性能可以看看网上的评测。