1、简介web
一、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链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。spring
二、api
Zuul构建于 Servlet 2.5,兼容 3.x,使用的是阻塞式的 API,不支持长链接,好比 websockets。安全
Spring Cloud Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成,开发体验相对来讲十分不错。具体哪一个好咱也不知道了,不过毕竟Gateway是Spring Cloud 本身推出的服务网关,应该比zuul靠谱些。bash
2、建立项目websocket
直接copy一个以前的项目,进行修改架构
pom文件:app
<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 模块框架
3、Gateway 路由、以及结合Hystrix 实现熔断socket
这里有两种方式来作,一种是经过配置类,一种是经过配置文件,这里都实践一下
3.一、配置类的方式:
新建配置类
@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.一、配置文件的方式
这里就不须要上面的配置类了,直接经过配置文件进行配置
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方便一些,至于性能能够看看网上的评测。