為什么需要使用網關
1.實現統一認證
2.統一一個域名,解決調用困難。
3.協議轉換 將不友好的協議轉成友好的協議。
spring cloud gateway 是什么
是spring cloud 的第二代網關,會替代zuul 第一代網關。
基於 netty,reactor,webflux 構建。
優點:
1.性能強勁 是 zuul 的1.6倍
2.功能強大
內置 監控,限流,轉發等
3.設計優雅,容易擴展。
編寫spring cloud gateway
增加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
網關配置
server: port: 8040 spring: application: name: gateway cloud: nacos: discovery: server-addr: localhost:8848 gateway: discovery: locator: # 讓gateway通過服務發現組件找到其他的微服務 enabled: true management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
這樣網關就編寫好了
通過網關訪問為微服務
http://網關地址/user-center/user/1
這個將會將請求轉發到 http://用戶微服務/user/1 的地址。
- id: sytem uri: lb://jpaas-system predicates: - Path=/api-system/** filters: - StripPrefix=1
這個作用是,當路徑為
/api-system/ 開頭的路徑,轉發到 jpaas-system 的微服務,並將URL 去掉前綴。
spring gateway 的核心概念
1.路由
spring clound gateway 的基礎元素,可以理解成為一條轉發規則:
包含ID ,目標URL ,Predicate 集合和 Filter 集合。
2.Predicate (謂詞)
即 java.util.function.Predicate ,spring cloud gateway 使用謂詞實現路由匹配條件
3.Filter 過濾器
修改請求 以及響應
典型的路由配置:
spring: application: name: gateway cloud: gateway: discovery: locator: # 讓gateway通過服務發現組件找到其他的微服務 enabled: true routes: - id: user_route uri: lb://user-center predicates: - Path=/users/** - id: content_route uri: lb://content-center predicates: - Path=/shares/**,/admin/**
filters:
- AddRequestHeader=token,0001
包括:
id,uri,predicates,filtres 等
spring gateway 架構圖
1. gateway client 是瀏覽器
2. proxied service 表示 被代理的微服務
3. handler maping 判斷路徑是否和路由配置匹配。
4.webhandler 會讀取這個路由的過濾器,交給過濾器處理。
內置路由謂詞工廠
參考文檔
http://www.imooc.com/article/290804
自定義謂詞工廠
比如限制在 9-17 點才允許訪問某個路徑
import lombok.Data; import java.time.LocalTime; @Data public class TimeBeweenConfig { private LocalTime start; private LocalTime end; }
配置代碼
自定義謂詞工廠代碼
@Component public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<TimeBeweenConfig> { public TimeBetweenRoutePredicateFactory() { super(TimeBeweenConfig.class); } @Override public Predicate<ServerWebExchange> apply(TimeBeweenConfig config) { LocalTime start = config.getStart(); LocalTime end = config.getEnd(); return new Predicate<ServerWebExchange>() { @Override public boolean test(ServerWebExchange serverWebExchange) { LocalTime now = LocalTime.now(); return now.isAfter(start) && now.isBefore(end); } }; } @Override public List<String> shortcutFieldOrder() { return Arrays.asList("start", "end"); } }
類使用 RoutePredicateFactory 結束,這個是約定。
在配置文件中進行配置。
predicated:
-TimeBetween=上午8:00,下午17:00
網關過濾器配置
http://www.imooc.com/article/290816
內置過濾器介紹。
編寫自定義過濾器代碼。
@Component public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory { @Override public GatewayFilter apply(NameValueConfig config) { return new GatewayFilter() { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("請求進來了...{},{}", config.getName(), config.getValue()); ServerHttpRequest modifiedRequest = exchange.getRequest() .mutate() .build(); ServerWebExchange modifiedExchange = exchange.mutate() .request(modifiedRequest) .build(); return chain.filter(modifiedExchange); } }; } }
配置編寫為
filters:
-PreLog:a,b
filters:
- StripPrefix=1
StripPrefix 過濾器的作用
當我們訪問
/api-user/user/org/osUser/current
配置這個過濾器后,訪問路徑會被修改為
/user/org/osUser/current
會將前綴進行截取。
全局過濾器介紹
https://www.cnblogs.com/yinjihuan/p/10474768.html
GATEWAY 監控
使用 springboot actuator 進行監控
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
增加配置到pom.xml
修改 配置文件:
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
配置好后,訪問路徑都在 /actoator/gateway 下面
在這里我們可以通過 actuator 增加或更新路由。
調試方法
http://www.imooc.com/article/290824
限流
http://www.imooc.com/article/290828