一、简介
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方便一些,至于性能可以看看网上的评测。