zuul核心人員走了兩個,zuul2的研發太久,spring公司等不及,本身研發的Gateway網關。html
Cloud全家桶有個狠重要的組件就是網關,在1.x版本中都是採用Zuul網關;可是在2.x版本中,zuul的升級一致跳票,SpringCloud最後本身研發了一個網關替代Zuul, 那就是SpringCloud Gatewayjava
sadareact
Gateway是在Spring生態之上構建的API網關服務,基於Spring 5,Spring Boot 2和Project Reactor 等技術。web
Gateway旨在提供一種簡單而有效 等方式來對API 進行路由,以及提供一些強大對過濾器,例如:熔斷、限流、重試等正則表達式
Gateway 做爲SpringCloud 等目標提供統一等路由方式且基於Filter 鏈的方式提供了網關基本的功能,例如:安全,監控。限流spring
SpringCloud Gateway 使用的Webflux中的 reactor-netty 響應式的編程,底層使用了Netty通信框架編程
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/api
由於Zuul1.0 進入了維護階段,並且Gateway 是SpringCloud 團隊開發,比Zuul更加的便捷安全
Gateway 是基於異步非阻塞模型上進行開發的,性能方面不須要擔憂cookie
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
(官網總結)
<dependencies> <!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- 引用本身定義的api通用包,可使用Payment支付Entity --> <dependency> <groupId>com.angenin.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!--eureka client(經過微服務名實現動態路由)--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--熱部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency></dependencies>
server: port: 9527
spring: application: name: cloud-gateway cloud: gateway: routes: - id: payment_route # 路由的id,沒有規定規則但要求惟一,建議配合服務名 uri: http://localhost:8001 predicates: - Path=/payment/get/** # 斷言,路徑相匹配的進行路由 - id: payment_route2 uri: http://localhost:8001 predicates: Path=/payment/lb/** #斷言,路徑相匹配的進行路由
eureka: instance: hostname: cloud-gateway-service client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://eureka7001.com:7001/eureka/
@SpringBootApplication@EnableEurekaClientpublic class GatewayMain9527 { public static void main(String[] args) { SpringApplication.run(GatewayMain9527.class, args); }}
經過咱們 9527 網關訪問 8001的接口
這裏起到了做用
在配置文件中配置 在配置文件yml中配置
在配置類中配置 代碼中注入RouteLocator的Bean
新建config.GatewayConfig
package com.yxl.cloud.config;
import org.springframework.cloud.gateway.route.RouteLocator;import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
@Configurationpublic class GatewayConfig {
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_angenin", //id r -> r.path("/guonei") //訪問 http://localhost:9527/guonei .uri("http://news.baidu.com/guonei")); //就會轉發到 http://news.baidu.com/guonei routes.route("path_route_angenin2", //id r -> r.path("/guoji") //訪問 http://localhost:9527/guoji .uri("http://news.baidu.com/guoji")); //就會轉發到 http://news.baidu.com/guonji
return routes.build();
}}
訪問:http://localhost:9527/guonei
server: port: 9527
spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #開啓從註冊中心動態建立路由的功能,利用微服務名稱進行路由(默認false) routes: - id: payment_route #路由的id,沒有規定規則但要求惟一,建議配合服務名 # uri: http://localhost:8001 #匹配後提供服務的路由地址 uri: lb://cloud-provider-hystrix-payment predicates: - Path=/payment/get/** #斷言,路徑相匹配的進行路由
- id: payment_route2 # uri: http://localhost:8001 uri: lb://cloud-provider-hystrix-payment predicates: - Path=/payment/lb/** #斷言,路徑相匹配的進行路由
eureka: instance: hostname: cloud-gateway-service client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://eureka7001.com:7001/eureka/
官網:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories
SpringCloud Gateway 將路由匹配做爲Spring WebFlux HandlerMapping 基礎架構的一部分。
SpringCloud Gateway 包括許多內置的Route Predicate工廠。全部這些Predicate 都與HTTP請求的不一樣屬性匹配。多個Route Predicate工廠能夠進行組合
SpringCloud Gateway 建立Route 對象時,使用RoutePredicateFactory 建立 Predicate,Predicate 對象能夠賦值給Route。Springcloud Gateway 包含許多內置的 Route Predicate Factories.
全部這些動詞 都匹配HTTP請求的不一樣屬性,多種謂詞工廠能夠組合,經過邏輯and
在這裏插入圖片描述
public class T2 {
public static void main(String[] args) { //獲取當前時間串 ZonedDateTime now = ZonedDateTime.now(); System.out.println(now); //2020-06-17T11:53:40.325+08:00[Asia/Shanghai] }
}
#指定時間前才能訪問(Before) - Before=2020-06-17T11:53:40.325+08:00[Asia/Shanghai] #指定時間內才能訪問(Between) - Between=2020-06-17T11:53:40.325+08:00[Asia/Shanghai],2020-06-17T12:53:40.325+08:00[Asia/Shanghai]
在這裏插入圖片描述
yml 設置 cookie
- Cookie=username,angenin #帶Cookie,而且username的值爲angenin
不帶cookie 直接訪問失敗
在這裏插入圖片描述
# - After=2020-06-17T12:53:40.325+08:00[Asia/Shanghai]# - Cookie=username,angenin #帶Cookie,username的值爲angenin - Header=X-Request-Id, \d+ #請求頭要有 X-Request-Id屬性而且值爲整數的正則表達式
在這裏插入圖片描述
- Method=GET #只容許get請求訪問
在這裏插入圖片描述
在這裏插入圖片描述
路由過濾器可用於修改進入的HTTP請求和返回的HTTP響應,路由過濾器只能指定路由進行使用。
SpringCloud Gateway 內置了多種路由過濾器,他們都由GatewayFilter的工廠類來產生
GatewayFilter(31種) Global Filter(10種)
arameter爲表明。
package com.yxl.cloud.config;
import lombok.extern.slf4j.Slf4j;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;
import java.util.Date;
@Component@Slf4jpublic class MyLogGateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("**************come in MyLogGateWayFilter:" + new Date()); String uname = exchange.getRequest().getQueryParams().getFirst("uname"); if(uname ==null){ log.info("*******用戶名爲null,非法用戶!!"); //設置響應,不被接受 exchange.getResponse().setStatusCode(HttpStatus.NO_CONTENT); return exchange.getResponse().setComplete();
} //返回chain.filter(exchange),放行 return chain.filter(exchange); }
@Override public int getOrder() { return 0; }}
http://localhost:9527/payment/lb?xxx=111