Zuul 簡介html
https://www.liangzl.com/get-article-detail-20957.html
Zuul是Netflix開源的微服務網關,他能夠和Eureka,Ribbon,Hystrix等組件配合使用。Zuul組件的核心是一系列的過濾器,這些過濾器能夠完成如下功能:前端
身份認證和安全: 識別每個資源的驗證要求,並拒絕那些不符的請求
審查與監控:
動態路由:動態將請求路由到不一樣後端集羣
壓力測試:逐漸增長指向集羣的流量,以瞭解性能
負載分配:爲每一種負載類型分配對應容量,並棄用超出限定值的請求
靜態響應處理:邊緣位置進行響應,避免轉發到內部集羣
多區域彈性:跨域AWS Region進行請求路由,旨在實現ELB(ElasticLoad Balancing)使用多樣化
---------------------
做者:菜雞旭旭
來源:CSDN
原文:https://blog.csdn.net/fengyuhan123/article/details/82835482
版權聲明:本文爲博主原創文章,轉載請附上博文連接!java
介紹完分佈式配置中心,結合前面的文章。咱們已經有了一個微服務的框架了,能夠對外提供api接口服務了。但如今試想一下,在微服務框架中,每一個對外服務都是獨立部署的,對外的api或者服務地址都不是不盡相同的。對於內部而言,很簡單,經過註冊中心自動感知便可。但咱們大部分狀況下,服務都是提供給外部系統進行調用的,不可能同享一個註冊中心。同時通常上內部的微服務都是在內網的,和外界是不連通的。並且,就算咱們每一個微服務對外開放,對於調用者而言,調用不一樣的服務的地址或者參數也是不盡相同的,這樣就會形成消費者客戶端的複雜性,同時想一想,可能微服務多是不一樣的技術棧實現的,有的是
http
、rpc
或者websocket
等等,也會進一步加大客戶端的調用難度。因此,通常上都有會有個api網關,根據請求的url不一樣,路由到不一樣的服務上去,同時入口統一了,還能進行統一的身份鑑權、日誌記錄、分流等操做。接下來,咱們就來了解今天要講解的路由服務:zuul
。nginx
簡單來講,微服務網關是微服務架構中一個不可或缺的部分。經過服務網關統一貫外系統提供REST API的過程當中,除了具有服務路由、均衡負載功能以外,它還具有了權限控制等功能。web
在未加入網關時,通常上會在服務外網架設一個負載均衡,如nginx等。此時,微服務的組成爲:ajax
此時,對於Open Service
而言可能須要提供權限控制等和業務無關的能力,這樣自己就破壞了微服務服務單一的原則。因此,通常上在Open Service
之上,還有一層服務提供諸如通用的權限校驗、參數校驗等功能,此服務就是網關了。以後,對於內部微服務而言,只須要關係各自微服務提供的業務功能便可,無需去關心其餘非業務相關的功能。spring
API網關能夠提供一個單獨且統一的API入口用於訪問內部一個或多個API。簡單來講嘛就是一個統一入口,好比如今的支付寶或者微信的相關api服務同樣,都有一個統一的api地址,統一的請求參數,統一的鑑權。後端
優勢:api
缺點:跨域
如今市場上有不少的網關可供選擇:
Netflix
開源的微服務網關,能夠和Eureka
,Ribbon
,Hystrix
等組件配合使用。spring
官方基於Spring5.0
,Spring Boot2.0
,Project Reactor
等技術開發的網關,提供了一個構建在Spring Ecosystem
之上的API網關,旨在提供一種簡單而有效的途徑來發送API,並向他們提供交叉關注點,例如:安全性,監控/指標和彈性。目的是爲了替換Spring Cloud Netfilx Zuul
的。在Spring cloud
體系中,通常上選擇zuul
或者Gateway
。固然,也能夠綜合本身的業務複雜性,自研一套或者改在一套符合自身業務發展的api網關的,最簡單作法是作個聚合api服務
,經過SpringBoot
構建對外的api接口,實現統一鑑權、參數校驗、權限控制等功能,說白了就是一個rest
服務。
Zuul
是Netflix
開源的微服務網關,能夠和Eureka
、Ribbon
、Hystrix
等組件配合使用,Spring Cloud
對Zuul
進行了整合與加強,Zuul
的主要功能是路由轉發和過濾器。
Zuul
基於JVM的路由器和服務器端負載均衡器。同時,Zuul
的規則引擎容許規則和過濾器基本上用任何JVM語言編寫,內置支持Java
和Groovy
。這個功能,就能夠實現動態路由的功能了。當須要添加某個新的對外服務時,通常上不停機更新是經過數據緩存配置或者使用Groovy
進行動態路由的添加的。
Zuul
的核心一系列的過濾器:
加入Zuul
網關後:
建立工程:spring-cloud-zuul
。 這裏直接加入了註冊中心進行服務化模式。
0.加入pom依賴。
<!-- zuul 依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- eureka client 依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
注意:這裏的Eureka
不是必須的。在沒有註冊中心的狀況下,也是能夠進行zuul使用的。
1.配置文件,配置註冊中心相關信息、路由規則等。
spring.application.name=zuul-server server.port=8888 # 註冊中心地址 -此爲單機模式 eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka # 啓用ip配置 這樣在註冊中心列表中看見的是以ip+端口呈現的 eureka.instance.prefer-ip-address=true # 實例名稱 最後呈現地址:ip:15678 eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} ## 路由規則 ## 傳統路由配置:不依賴服務發現。 ## 全部以myapi開頭的url路由至http://127.0.0.1:2000/下 ## 如http://127.0.0.1:8888/myapi/hello --> http://127.0.0.1:2000/hello zuul.routes.myApi.path=/myapi/** zuul.routes.myApi.url=http://127.0.0.1:2000 #forward模式 直接轉發至zuul提供的rest服務 zuul.routes.myDemo.path=/myDemo/** zuul.routes.myDemo.url=forward:/demo ## 服務發現模式 # 路由地址 zuul.routes.myEureka.path=/eureka/** #爲具體服務的名稱 zuul.routes.myEureka.service-id=eureka-client
友情提示: 默認狀況下:Zuul代理全部註冊到EurekaServer的微服務,路由規則: http://ZUUL_HOST:ZUUL_PORT/微服務實例名(serverId)/**
轉發至serviceId對應的微服務。
如:http://127.0.0.1:8888/eureka-client/hello?name=oKong 最後就是轉發至:http://127.0.0.1:2000//hello?name=oKong
2.啓動類加入@EnableZuulProxy
註解,聲明一個Zuul代理。
/** * zuul 示例 * * @author oKong * */ @SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient @Slf4j public class SpringCloudZuulApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringCloudZuulApplication.class, args); log.info("spring-cloud-zuul啓動!"); } }
3.編寫一個控制類,測試forward
功能。
/** * zuul 內部提供對外服務示例 * @author oKong * */ @RestController @RequestMapping("/demo") public class DemoController { @GetMapping("/hello") public String hello(String name) { return "hi," + name + ",this is zuul api! "; } }
4.啓動spring-cloud-eureka-server
和spring-cloud-eureka-client
服務,以後再啓動spring-cloud-zuul
服務。
此時,咱們來訪問zuul內部服務:http://127.0.0.1:8888/demo/hello?name=oKong
而後訪問:http://127.0.0.1:8888/myDemo/hello?name=oKong 效果和上面直接方式是同樣的,最後都是訪問/demo/**
api地址的。
訪問:http://127.0.0.1:8888/myapi/hello?name=oKong 和 http://127.0.0.1:8888/eureka/hello?name=oKong 最後效果都是同樣的,都是訪問http://127.0.0.1:2000/hello?name=oKong 。
直接以默認形式訪問:http://127.0.0.1:8888/eureka-client/hello?name=oKong 最後效果也是同樣的。
其實,從控制檯輸出日誌也是能夠一窺究竟的:
簡單說明下關於路由規則的一些說明:
zuul.routes.<route>.path
和zuul.routes.<route>.url
參數對的方式來配置# 傳統路由配置 zuul.routes.server-provide.path=/server-provide/** zuul.routes.server-provide.url=http://127.0.0.1:1001/
zuul.routes.<route>.path
與zuul.routes.<route>.serviceId
參數對的方式配置# 多實例 zuul.routes.server-provide.path=/user-service/** zuul.routes.server-provide.serviceId=user-service ribbon.eureka.enabled=false server-provide.ribbon.listOfServers=http://127.0.0.1:1001/,http://127.0.0.1:1001/
默認規則:http://ZUUL_HOST:ZUUL_PORT/微服務實例名(serverId)/** ,轉發至serviceId對應的微服務。
自定義路由規則:經過一組zuul.routes.<route>.path
與zuul.routes.<route>.serviceId
參數對的方式配置
# 自定義路由 zuul.routes.server-provide.path=/server-api/** zuul.routes.server-provide.serviceId=server-provide
好比:
並且,要注意,這些過濾器是path
進行最佳路徑匹配的,因此,通常上在一些歷史系統上,咱們會在最後後面加上一個路徑/**的匹配規則,以保證歷史api可使用,作到最大兼容性,避免相似404的異常。
zuul.routes.legacy.path=/**
本章節主要簡單介紹了關於
Zuul
的一些簡單使用以及一些路由規則的簡單說明。開頭也說過了,Zuul
的核心是一系列的過濾器。介於篇幅問題,關於過濾器的介紹、自定義過濾器、異常處理、熔斷降級等放在下一章節來說解。而相關的其餘配置,你們能夠去官網進行查看,或者自行搜索下,也能夠查看下:org.springframework.cloud.netflix.zuul.filters.ZuulProperties
類,相關配置信息都在裏面了。
目前互聯網上大佬都有分享
SpringCloud
系列教程,內容可能會相似,望多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有錯誤之處,還望提出,謝謝。