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方便一些,至於性能能夠看看網上的評測。