1衣洁、網(wǎng)關(guān)介紹
1、為什么產(chǎn)生了網(wǎng)關(guān)
微服務(wù)架構(gòu)下寒波,隨著服務(wù)的數(shù)量不斷累加屯远,當(dāng)客戶端訪問這些微服務(wù)的時(shí)候,往往需要記住即使甚至上百個(gè)地址扛伍,這對于客戶端而言,是非常復(fù)雜且難以維護(hù)的。
如果直接讓客戶端和各個(gè)微服務(wù)通信礼患,存在如下問題,
- 客戶端會請求多個(gè)不同的服務(wù)掠归,需要維護(hù)不同的請求地址缅叠,增加了開發(fā)難度
- 跨域請求的問題
- 加大身份認(rèn)證的難度,每個(gè)微服務(wù)需要獨(dú)立認(rèn)證
因此需要一種對外的統(tǒng)一集散地虏冻,類似于在所有服務(wù)的外層包裝一個(gè)管卡肤粱,所有的請求不再是直接到服務(wù),而實(shí)先經(jīng)過網(wǎng)關(guān)厨相。如此一來客戶端只需要記住一個(gè)網(wǎng)關(guān)领曼,比如http://oneNet.com/getorder/12
。
1蛮穿、網(wǎng)關(guān)應(yīng)用場景
除了上述優(yōu)點(diǎn)庶骄,網(wǎng)關(guān)還有如下優(yōu)點(diǎn),
- 統(tǒng)一入口:未全部為服務(wù)提供一個(gè)唯一的入口践磅,網(wǎng)關(guān)起到外部和內(nèi)部隔離的作用单刁,保障了后臺服務(wù)的安全性。
- 鑒權(quán)校驗(yàn):識別每個(gè)請求的權(quán)限府适,拒絕不符合要求的請求羔飞。
- 動態(tài)路由:動態(tài)的將請求路由到不同的后端集群中。
- 減少客戶端與服務(wù)端的耦合:服務(wù)可以獨(dú)立發(fā)展檐春,通過網(wǎng)關(guān)層來做映射逻淌。
甚至:監(jiān)控、負(fù)載均衡喇聊、緩存恍风、請求分片和管理、靜態(tài)響應(yīng)處理誓篱。
1朋贬、流行組件
常見的API網(wǎng)管實(shí)現(xiàn)有,
基于Nginx+Lua開發(fā)窜骄, 性能高锦募,穩(wěn)定,有多個(gè)可用的插件(限流邻遏、鑒權(quán)等等)可用開箱即用糠亩。
Zuul虐骑, Netflix開源,功能豐富赎线,使用Java開發(fā)廷没,易于二次開發(fā),需要運(yùn)行在Web容器中垂寥,如Tomcat
Traefik颠黎,Go語言開發(fā),輕量易用滞项,提供大多數(shù)功能如服務(wù)路由狭归,負(fù)載均衡等等,提供Web UI界面文判。
Spring Cloud Gateway过椎,SpringCloud提供的網(wǎng)關(guān)服務(wù)。
基于Nginx的網(wǎng)關(guān)實(shí)現(xiàn)戏仓,Nginx是一個(gè)自由的疚宇、開源的、高性能的HTTP服務(wù)器和反向代理服務(wù)器柜去,同時(shí)也是一個(gè)IMAP灰嫉、POP3、SMTP代理服務(wù)器嗓奢。
2、Spring Cloud Zuul對比Gateway
基于目前Spring cloud 支持的兩種網(wǎng)關(guān)浑厚,Zuul和Gateway股耽,做如下對比
1、來源
- zuul則是netflix公司的項(xiàng)目钳幅,只是spring將zuul集成在spring-cloud中使用而已物蝙。
- spring-cloud-Gateway是spring-cloud的一個(gè)子項(xiàng)目。因?yàn)閦uul2.0連續(xù)跳票和zuul1的性能表現(xiàn)不是很理想敢艰,所以催生了spring團(tuán)隊(duì)開發(fā)了Gateway項(xiàng)目诬乞。
2、相同點(diǎn)
- 底層都是servlet
- 兩者均是web網(wǎng)關(guān)钠导,處理的是http請求
3震嫉、不同點(diǎn)
內(nèi)部實(shí)現(xiàn)
- gateway對比zuul多依賴了spring-webflux,在spring的支持下牡属,功能更強(qiáng)大票堵,內(nèi)部實(shí)現(xiàn)了限流、負(fù)載均衡等逮栅,擴(kuò)展性也更強(qiáng)悴势,但同時(shí)也限制了僅適合于Spring Cloud套件窗宇。
- zuul則可以擴(kuò)展至其他微服務(wù)框架中,其內(nèi)部沒有實(shí)現(xiàn)限流特纤、負(fù)載均衡等军俊。
是否支持異步
- zuul僅支持同步
- gateway支持異步。理論上gateway則更適合于提高系統(tǒng)吞吐量(但不一定能有更好的性能)捧存,最終性能還需要通過嚴(yán)密的壓測來決定
框架設(shè)計(jì)的角度
- gateway具有更好的擴(kuò)展性粪躬,并且其已經(jīng)發(fā)布了2.0.0的RELESE版本,穩(wěn)定性也是非常好的
性能
- WebFlux 模塊的名稱是 spring-webflux矗蕊,名稱中的 Flux 來源于 Reactor 中的類 Flux短蜕。Spring webflux 有一個(gè)全新的非堵塞的函數(shù)式 Reactive Web 框架,可以用來構(gòu)建異步的傻咖、非堵塞的朋魔、事件驅(qū)動的服務(wù),在伸縮性方面表現(xiàn)非常好卿操。使用非阻塞API警检。 Websockets得到支持,并且由于它與Spring緊密集成害淤,所以將會是一個(gè)更好的 開發(fā) 體驗(yàn)扇雕。Zuul 1.x,是一個(gè)基于阻塞io的API Gateway窥摄。Zuul已經(jīng)發(fā)布了Zuul 2.x镶奉,基于Netty,也是非阻塞的崭放,支持長連接哨苛,但Spring Cloud暫時(shí)還沒有整合計(jì)劃。
總結(jié):
1币砂、總的來說建峭,在微服務(wù)架構(gòu),如果使用了Spring Cloud生態(tài)的基礎(chǔ)組件决摧,則Spring Cloud Gateway相比而言更加具備優(yōu)勢亿蒸,單從流式編程+支持異步上就足以讓開發(fā)者選擇它了。
2掌桩、對于小型微服務(wù)架構(gòu)或是復(fù)雜架構(gòu)(不僅包括微服務(wù)應(yīng)用還有其他非Spring Cloud服務(wù)節(jié)點(diǎn))边锁,zuul也是一個(gè)不錯(cuò)的選擇。
3拘鞋、Spring cloud Gateway
什么是Spring cloud Gateway
Spring Cloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目砚蓬,該項(xiàng)目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術(shù)開發(fā)的網(wǎng)關(guān)盆色,它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的 API 路由管理方式灰蛙。
Spring Cloud Gateway 作為 Spring Cloud 生態(tài)系統(tǒng)中的網(wǎng)關(guān)祟剔,目標(biāo)是替代 Netflix Zuul,其不僅提供統(tǒng)一的路由方式摩梧,并且基于 Filter 鏈的方式提供了網(wǎng)關(guān)基本的功能物延,例如:安全,監(jiān)控/指標(biāo)仅父,和限流叛薯。
術(shù)語
Route(路由):這是網(wǎng)關(guān)的基本構(gòu)建塊。它由一個(gè) ID笙纤,一個(gè)目標(biāo) URI耗溜,一組斷言和一組過濾器定義。如果斷言為真省容,則路由匹配抖拴。
Predicate(斷言):這是一個(gè) Java 8 的 Predicate。輸入類型是一個(gè) ServerWebExchange腥椒。我們可以使用它來匹配來自 HTTP 請求的任何內(nèi)容阿宅,例如 headers 或參數(shù)。
Filter(過濾器):這是org.springframework.cloud.gateway.filter.GatewayFilter的實(shí)例笼蛛,我們可以使用它修改請求和響應(yīng)洒放。
原理
客戶端向 Spring Cloud Gateway 發(fā)出請求。然后在 Gateway Handler Mapping 中找到與請求相匹配的路由滨砍,將其發(fā)送到 Gateway Web Handler往湿。Handler 再通過指定的過濾器鏈來將請求發(fā)送到我們實(shí)際的服務(wù)執(zhí)行業(yè)務(wù)邏輯,然后返回惋戏。過濾器之間用虛線分開是因?yàn)檫^濾器可能會在發(fā)送代理請求之前(“pre”)或之后(“post”)執(zhí)行業(yè)務(wù)邏輯煌茴。
簡單上手
Spring Cloud Gateway 網(wǎng)關(guān)路由有兩種配置方式,這兩種方式是等價(jià)的日川,建議使用 yml 方式進(jìn)配置。
- 在配置文件 yml 中配置
- 通過@Bean自定義 RouteLocator矩乐,在啟動主類 Application 中配置
1龄句、加入依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、配置文件
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: gateway-service
uri: https://blog.csdn.net
predicates:
- Path=/meteor_93
//上面這段配置的意思是散罕,配置了一個(gè) id 為 gateway-service 的路由規(guī)則分歇,當(dāng)訪問地址 http://localhost:8080/meteor_93時(shí)會自動轉(zhuǎn)發(fā)到地址:http://localhost:8080/meteor_93
3、路由配置(跟配置為文件一樣)
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/meteor_93")
.uri("https://blog.csdn.net"))
.build();
}
}
4欧漱、Predicate詳解
Predicate 來源于 Java 8职抡,是 Java 8 中引入的一個(gè)函數(shù),Predicate 接受一個(gè)輸入?yún)?shù)误甚,返回一個(gè)布爾值結(jié)果缚甩。該接口包含多種默認(rèn)方法來將 Predicate 組合成其他復(fù)雜的邏輯(比如:與谱净,或,非)擅威『咎剑可以用于接口請求參數(shù)校驗(yàn)、判斷新老數(shù)據(jù)是否有變化需要進(jìn)行更新操作郊丛。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性實(shí)現(xiàn)了各種路由匹配規(guī)則李请,有通過 Header、請求參數(shù)等不同的條件來進(jìn)行作為條件匹配到對應(yīng)的路由厉熟。網(wǎng)上有一張圖總結(jié)了 Spring Cloud 內(nèi)置的幾種 Predicate 的實(shí)現(xiàn)导盅。