路由Gateway
是什麼
Gateway旨在提供一種簡單而有效的方式來對API進行路由,以及提供一些強大的過濾器功能,例如:熔斷、限流、重試等。
SpringCloud Gateway的目标提供統一的路由方式且基于Filter鍊的方式提供了網關基本的功能,例如:安全、監控/名額、和限流。
幹什麼
反向代理
鑒權
流量控制
熔斷
日志監控
功能:
路由轉發+執行過濾器鍊
怎麼幹
可以參考子父工程可以參考 上期Nacos結合使用
https://blog.csdn.net/qq_56602812/article/details/126214010?spm=1001.2014.3001.5501
上期Nacos配置中心
1.與配置中心Nacos結合
1.pom檔案
<!--新增gateway,不需要引入web和actuator子產品-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.yml配置檔案(nacos配置中心的檔案)
server:
port: 8300
spring:
cloud:
gateway:
routes:
- id: employee_routh #路由的ID,沒有固定規則但要求唯一,建議配合服務名
uri: http://localhost:8100 #比對後提供服務的路由位址
predicates:
- Path=/employees/employee/** #斷言,路徑相比對的進行路由
yml檔案第二中寫法(可以實作負載均衡)
server:
port: 8300
spring:
cloud:
gateway:
discovery:
locator:
enabled: true #開啟從注冊中心動态建立路由的功能,利用微服務名進行路由
routes:
- id: employee_routh #路由的ID,沒有固定規則但要求唯一,建議配合服務名
uri: http://localhost:8100 #比對後提供服務的路由位址
predicates:
- Path=/employees/employee/** #斷言,路徑相比對的進行路由
注意:
需要注意的是uri的協定為lb,表示啟用Gateway的負載均衡功能。
lb://serviceName是spring cloud gateway在微服務中自動為我們建立的負載均衡uri
代理路徑localhost:8100的服務
3.加上啟動注解(nacos配置中心)
@EnableDiscoveryClient //nacos
4.啟動項目
1.啟動8100端口項目
2.啟動路由代理8100的項目
2.Predicate的使用
是什麼
Predicate就是為了實作一組比對規則,讓請求過來找到對應的Route進行處理。就是給路由通路提供一些通路規則。
配合yml中使用
predicates:
- Path=/employees/lb/** #斷言,路徑相比對的進行路由
#- After=2022-03-08T10:59:34.102+08:00[Asia/Shanghai]
#- Cookie=username,zhangshuai #并且Cookie是username=zhangshuai才能通路
#- Header=X-Request-Id, \d+ #請求頭中要有X-Request-Id屬性并且值為整數的正規表達式
#- Host=**.hand.com
#- Method=GET
#- Query=username, \d+ #要有參數名稱并且是正整數才能路由
3.Filter的使用
是什麼 :
路由過濾器可用于修改進入的HTTP請求和傳回的HTTP響應,路由過濾器隻能指定路由進行使用。
3.1自定義過濾器
幹什麼
全局日志記錄
統一網關鑒權
自定義全局GlobalFilter
兩個主要接口介紹 主要實作下面接口
impiemerts GlobalFilter ,Ordered
實作過濾方法
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
/**
* 自定義實作過濾規則的方法
*
* @param exchange
* @param chain
* @author PC 2022-08-07 23:20
* @return reactor.core.publisher.Mono<java.lang.Void>
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("------welcom MyLogGateWayFilter"+new Date());
String token = exchange.getRequest().getQueryParams().getFirst("token");
if(StringUtils.isEmpty(token)){
log.info("使用者名為Null非法使用者(---)");
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
3.1實作效果
路徑沒有拼接token規則
控制台
路徑拼接token 符合要求放行