javascript
Zuul(SpringCloud学习笔记一)
路由是微服務(wù)架構(gòu)中必須(integral?)的一部分,比如,“/” 可能映射到你的WEB程序上,”/api/users?“可能映射到你的用戶服務(wù)上,“/api/shop”可能映射到你的商品服務(wù)商。(注解:我理解這里的這幾個(gè)映射就是說通過Zuul這個(gè)網(wǎng)關(guān)把服務(wù)映射到不同的服務(wù)商去處理,從而變成了微服務(wù)!)
Zuul是Netflix出品的一個(gè)基于JVM路由和服務(wù)端的負(fù)載均衡器.
Zuul功能:
- 認(rèn)證
- 壓力測(cè)試
- 金絲雀測(cè)試
- 動(dòng)態(tài)路由
- 負(fù)載削減
- 安全
- 靜態(tài)響應(yīng)處理
- 主動(dòng)/主動(dòng)交換管理
Zuul的規(guī)則引擎允許通過任何JVM語言來編寫規(guī)則和過濾器, 支持基于Java和Groovy的構(gòu)建。
配置屬性?zuul.max.host.connections?已經(jīng)被兩個(gè)新的配置屬性替代,?zuul.host.maxTotalConnections?(總連接數(shù))和?zuul.host.maxPerRouteConnections,(每個(gè)路由連接數(shù)) 默認(rèn)值分別是200和20.
一 . Zuul做反向代理
當(dāng)一個(gè)UI應(yīng)用調(diào)用一個(gè)或更多的后端服務(wù)的時(shí)候,我們可以用Spring Cloud創(chuàng)建一個(gè)Zuul代理減少開發(fā)是非常常見的例子。使用代理服務(wù)來避免必須的跨域資源共享(Cross-Origin Resource Sharing)和所有的后端需要分別認(rèn)證的問題。
在Spring Boot主函數(shù)上通過注解?@EnableZuulProxy?來開啟, 這樣可以讓本地的請(qǐng)求轉(zhuǎn)發(fā)到適當(dāng)?shù)姆?wù). 按照約定, 一個(gè)ID為"users"的服務(wù)會(huì)收到?/users?請(qǐng)求路徑的代理請(qǐng)求(前綴會(huì)被剝離). Zuul使用Ribbon定位服務(wù)注冊(cè)中的實(shí)例, 并且所有的請(qǐng)求都在hystrix的command中執(zhí)行, 所以失敗信息將會(huì)展現(xiàn)在Hystrix metrics中, 并且一旦斷路器打開, 代理請(qǐng)求將不會(huì)嘗試去鏈接服務(wù).
Zuul starter沒有包含服務(wù)發(fā)現(xiàn)的客戶端, 所以對(duì)于路由你需要在classpath中提供一個(gè)根據(jù)service IDs做服務(wù)發(fā)現(xiàn)的服務(wù).(例如, eureka是一個(gè)不錯(cuò)的選擇)
在服務(wù)ID表達(dá)式列表中設(shè)置?zuul.ignored-services, 可以忽略已經(jīng)添加的服務(wù). 如果一個(gè)服務(wù)匹配表達(dá)式, 則將會(huì)被忽略, 但是對(duì)于明確配置在路由匹配中的, 將不會(huì)被忽略, 例如:
?application.yml
?zuul:
ignoredServices: '*'
routes:users: /myusers/** 在這個(gè)例子中, 除了"users", 其他所有服務(wù)都被忽略了.這個(gè)意味著http請(qǐng)求"/myusers"將被轉(zhuǎn)發(fā)到"users"服務(wù)(比如 "/myusers/101" 將跳轉(zhuǎn)到 "/101") 為了更細(xì)致的控制一個(gè)路由, 你可以直接配置路徑和服務(wù)ID: zuul:routes: users:path: /myusers/**serviceId: users_service 這個(gè)意味著 HTTP 調(diào)用"/myusers"被轉(zhuǎn)發(fā)到"users_service"服務(wù). 路由必須配置一個(gè)可以被指定為ant風(fēng)格表達(dá)式的"path", 所以“/myusers/*”只能匹配一個(gè)層級(jí), 但"/myusers/**"可以匹配多級(jí).后端的配置既可以是"serviceId"(對(duì)于服務(wù)發(fā)現(xiàn)中的服務(wù)而言), 也可以是"url"(對(duì)于物理地址), 例如: 但"/myusers/**"可以匹配多級(jí).后端的配置既可以是"serviceId"(對(duì)于服務(wù)發(fā)現(xiàn)中的服務(wù)而言), 也可以是"url"(對(duì)于物理地址), 例如: zuul:routes:users:path: /myusers/**url: http://example.com/users_service 這個(gè)簡(jiǎn)單的"url-routes"不會(huì)按照?HystrixCommand?執(zhí)行, 也無法通過Ribbon負(fù)載均衡多個(gè)URLs. 為了實(shí)現(xiàn)這一指定服務(wù)路由和配置Ribbon客戶端(這個(gè)必須在 Ribbon中禁用Eureka: 具體參考更多信息), 例如: zuul:routes:users:path: /myusers/**serviceId: usersribbon:eureka:enabled: falseusers:ribbon:listOfServers: example.com,google.com //所使用的Ribbon列表 你可以使用regexmapper提供serviceId和routes之間的綁定. 它使用正則表達(dá)式組來從serviceId提取變量, 然后注入到路由表達(dá)式中. ApplicationConfiguration.java @Bean public PatternServiceRouteMapper serviceRouteMapper() {return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)","${version}/${name}"); } 這個(gè)意思是說"myusers-v1"將會(huì)匹配路由"/v1/myusers/**". 任何正則表達(dá)式都可以, 但是所有組必須存在于servicePattern和routePattern之中. 如果servicePattern不匹配服務(wù)ID,則使用默認(rèn)行為. 在上面例子中,一個(gè)服務(wù)ID為“myusers”將被映射到路徑“/ myusers/**”(沒有版本被檢測(cè)到) ,這個(gè)功能默認(rèn)是關(guān)閉的,并且僅適用于服務(wù)注冊(cè)的服務(wù)。設(shè)置?zuul.prefix?可以為所有的匹配增加前綴, 例如?/api,代理前綴默認(rèn)會(huì)從請(qǐng)求路徑中移除(通過?zuul.stripPrefix=false?可以關(guān)閉這個(gè)功能).你也可以在指定服務(wù)中關(guān)閉這個(gè)功能:
zuul:routes:users:path: /myusers/**stripPrefix: false 在這個(gè)例子中, 請(qǐng)求"/myusers/101"將被跳轉(zhuǎn)到"users"服務(wù)的"/myusers/101"上. zuul.routes的鍵值隊(duì)實(shí)際上綁定到類型為?ZuulProperties?的對(duì)象上. 如果你查看這個(gè)對(duì)象你會(huì)發(fā)現(xiàn)一個(gè)叫"retryable"的字段, 設(shè)置為"true"會(huì) 使Ribbon 客戶端自動(dòng)在失敗時(shí)重試(如果你需要修改重試參數(shù), 直接使用Ribbon客戶端的配置) X-Forwarded-Host?請(qǐng)求頭默認(rèn)在跳轉(zhuǎn)時(shí)添加. 通過設(shè)置?zuul.addProxyHeaders = false?關(guān)閉它. 前綴路徑默認(rèn)剝離, 并且對(duì)于后端的請(qǐng)求通過請(qǐng) 求頭"X-Forwarded-Prefix"獲取(上面的例子中是"/myusers")通過?@EnableZuulProxy?應(yīng)用程序可以作為一個(gè)獨(dú)立的服務(wù), 如果你想設(shè)置一個(gè)默認(rèn)路由("/"), 比如?zuul.route.home: /將路由所有的請(qǐng)求(例如: "/**") 到"home"服務(wù).總結(jié)
以上是生活随笔為你收集整理的Zuul(SpringCloud学习笔记一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一段Spring代码引起的调用绑定总结
- 下一篇: 深入SpringBoot:自定义Endp