Gateway網(wǎng)關源碼解析
工作原理

客戶端向 Spring Cloud Gateway 發(fā)出請求。 如果網(wǎng)關處理程序映射確定請求與路由匹配,則將其發(fā)送到網(wǎng)關 Web 處理程序。 此處理程序通過特定于請求的過濾器鏈運行請求。 過濾器用虛線劃分的原因是過濾器可以在發(fā)送代理請求之前和之后運行邏輯。 執(zhí)行所有“預”過濾器邏輯。 然后發(fā)出代理請求。 發(fā)出代理請求后,將運行“發(fā)布”過濾器邏輯。
配置類分析
jar包中加載的配置類,會注入到IOC容器中。

1、GatewayClassPathWarningAutoConfiguration 檢查是否有正確的配置webflux
檢查是否有 org.springframework.web.servlet.DispatcherServlet類,也就是是否引入了springweb的依賴。

2、GatewayAutoConfiguration 核心配置類
配置了很多bean,加載了gateway 需要注入的類。

配置了很多謂詞想的的bean

3、GatewayLoadBalancerClientAutoConfiguration 網(wǎng)關需要使用的負載均衡

該過濾器實現(xiàn)了負載均衡的功能,通過責任鏈的設計模式。

4、GatewayRedisAutoConfiguration 網(wǎng)關整合Redis整合Lua實現(xiàn)限流

5、GatewayDiscoveryClientAutoConfiguration 把網(wǎng)關服務注冊到注冊中心中去,服務注冊與發(fā)現(xiàn)功能
路由模式源碼分析
網(wǎng)關的請求入口在 DispatcherHandler類里面的 handler 方法。

查找handler方法中,子類會查找路由策略,循環(huán)查找路由策略,第一個匹配的策略會返回了。

執(zhí)行的handler

webHandler去執(zhí)行

執(zhí)行的是 filter 的 handler,gateway 默認有7個filter,分別實現(xiàn)了不同的功能:負載均衡、請求轉發(fā)等功能。各個filter通過責任鏈模式循環(huán)執(zhí)行。

解決前后端的跨域問題
微服務中跨域的問題,不屬于前端解決 jsonp ,只能支持get請求。
核心點就是在我們后端。
解決跨域的問題
- HttpClient轉發(fā)
- 使用過濾器允許接口可以跨域 響應頭設置
- Jsonp 不支持我們的post 屬于前端解決
- Nginx解決跨域的問題保持我們域名和端口一致性
- Nginx也是通過配置文件解決跨域的問題
- 基于微服務網(wǎng)關解決跨域問題,需要保持域名和端口一致性
- 使用網(wǎng)關代碼允許所有的服務可以跨域的問題
- 使用SpringBoot注解形式@CrossOrigin
gateway解決跨域問題:增加過濾器,給請求頭增加參數(shù)。
@Component
public class CrossOriginFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
HttpHeaders headers = response.getHeaders();
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
return chain.filter(exchange);
}
}以上就是Gateway網(wǎng)關源碼解析的詳細內容,更多關于Gateway網(wǎng)關的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot集成MyBatis的分頁插件PageHelper實例代碼
這篇文章主要介紹了SpringBoot集成MyBatis的分頁插件PageHelper的相關操作,需要的朋友可以參考下2017-08-08

