天天看點

詳細講解springcloud第四章:-------在springcloud中配置并使用zuul和gateway的兩種路由方法及其差別

6.zuul(springcloud1.x所使用的路由元件)(Gateway(Filter)是springcloud2.x所使用的路由元件,和路由實作的方式一樣,除了jar包,注解,配置不一樣)

路由網關

兩大核心:
			路由:
				整個項目的入口,所有的請求都必須要先經過路由,再由路由轉發到目标項目中
			過濾:
				保護項目的真實通路路徑,無法使用項目真實的通路路徑進行通路,過濾掉所有的惡意請求
           

6.1.建立zuul-5081項目

6.2.添加jar包(!進階java工程師的面試題!)

路由項目是否需要添加eureka的jar包?為什麼?
			需要
				目前為止,隻要是consumer通路provider,已經不需要使用provider的真實路徑(localhost:8081/userAll)了,現在所有的通路使用的位址都是eureka的Application的值,也就是provider的USER-PROVIDER,如果路由并不知道eureka是誰,zuul就不能擷取到Application的值,一旦zuul無法擷取Application的值,是否還可以做路徑的映射?可以的!
					讓zuul項目直接映射provider的真實路徑(localhost:8081/userAll),!映射成功!,是否有問題?為什麼?
					是
					如果需要實作負載均衡,也就是說localhost:5081必須要映射-->localhost:8081,8082,8083...,路由是做不到的
           

添加zuul的jar包

<dependencies>
		        <dependency>
		            <groupId>org.springframework.cloud</groupId>
		            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
		        </dependency>
		        <dependency>
		            <groupId>org.springframework.cloud</groupId>
		            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		        </dependency>
		        <dependency>
		            <groupId>org.springframework.boot</groupId>
		            <artifactId>spring-boot-starter-web</artifactId>
		        </dependency>
		        <!--
		            顯示eureka的服務的具體資訊
		            info.company.name=AAA...
		        -->
		        <dependency>
		            <groupId>org.springframework.boot</groupId>
		            <artifactId>spring-boot-starter-actuator</artifactId>
		        </dependency>
		    </dependencies>
           

6.3.測試理由(隻是為了做測試)

先啟動三台eureka
		然後啟動8081項目
		最後啟動路由
		
		先啟動三台eureka
		然後啟動8081,8082,8083,8084
		再然後啟動consumer
		最後啟動路由
           

6.4.項目通路

先使用localhost:8081/userAll進行通路
		再使用路由進行通路localhost:5081/user-provider/userAll
           

6.5.當使用路由進行通路的時候(localhost:5081/user-provider/userAll),provider中的真實路徑仍然暴露在浏覽器的位址欄中(user-provider),在真實項目的開發環境中,絕對不允許把provider的真實路徑暴露給用戶端(浏覽器上)(localhost:8081/userAll,user-provider)

6.6.雖然已經實作虛拟路徑的映射,但是當使用真實路徑的時候仍然可以通路

最終需要禁用掉真實路徑通路(user-provider)

在zuul-5081項目中添加application.properties配置檔案

配置mysql主從複制的(忽略mysql資料庫)

zuul.ignored-services=user-provider
           

6.7.因為目前為止隻有一個provider,這個provider的application.name的值是user-provider,如果現在有20個provider,每5個provider的application.name的值都不一樣

order-provider
		cart-provider
		....
	可以使用通配符"*",表示所有的服務真實名稱
	zuul.ignored-services=*
           

6.8.如果整個項目非常大,order(consumer,provider),cart(consumer,provider),portal,login

如果隻有一個zuul-5081項目,需要比對所有的微服務,違背springcloud的細粒度化的原則,違背了路由的職責單一化,而且路由中的代碼會非常臃腫

9.Gateway:(路由)

springcloud2.x之後使用的都是gateway,zuul也是可以使用的,但是zuul目前為止已經不維護了(功能目前也夠用),沒有過濾器的路由是沒有靈魂的路由!

gateway提供了很多強大的過濾器(自定義過濾器,自定義過濾工廠)

(如果需要使用Gateway,使用的并不是tomcat(使用并不是原始的servlet容器),必須要非常熟悉lamda表達式和斷言,當使用java代碼進行配置的時候必須要用lamda,如果使用的properties/yml進行配置則不需要了解(隻能是gateway所自帶的,如果需要自定義擴充就必須要熟悉lamda表達式))

9.1.zuul和gateway差別是什麼?

zuul和gateway都是路由,但是最終實作路由的機制和方式不同
			gateway所使用的netty的異步IO實作的路由
			zuul使用的是servlet3,每一個請求都會配置設定一個線程,同步servlet,多線程的時候會阻塞
			zuul和gateway如何選擇?
				如果都是低并發的狀态,gateway和zuul的選擇無所謂,因為根本就沒有任何差別,但是一旦出現高并發,gateway至少要比zuul快10倍,差距非常明顯
				異步IO
				線程阻塞
				(自行百度一下)
           

9.2.建立springcloud-gateway-5082項目

9.3.添加jar包

!!有坑!!

不要添加web-starter的jar包,因為gateway使用的并不是原生的servlet實作的tomcat,使用的是基于webflux實作的netty容器!隻需要添加gateway的包即可

9.4.gateway比較常用的過濾器

AddRequestHeader:添加request的請求頭
			AddRequestParameter:修改request的請求參數
			localhost:5082/userOne?id=1-->5
			localhost:5082/userOne?id=1&name=zhangsan
			AddResponseHeader:添加response的響應頭
			RewritePath:
				zuul-->通路localhost:5081/user-provider/userAll
					-->user-provider-->provider-->localhost:5081/provider/userAll
				gateway:
					user-provider/userAll--->userAll
					localhost:5082/userAll-->映射的是localhost:5082/user-provider/userAll
			PrefixPath:
				zuul-->添加字首
				gateway:
					真實通路路徑為localhost:5082/user-provider/userAll-->添加字首-->localhost:5082/seven/user-provider/userAll
			StripPrefix:
				zuul不支援該功能
				gateway:
					通路路徑規則:
						localhost:5082/aaa/seven/test/user-provider/userAll(localhost:5082/user-provider/userAll)
						StripPrefix = 3
						localhost:5082/user-provider/userAll
				自定義路由過濾器
				自定義路由過濾器工廠
           

繼續閱讀