完成一個複雜的業務,可能需要多個微服務合作來完成,比如下單,需要使用者服務,支付服務,地圖服務,訂單服務
一般是我們對外服務的視窗,進行服務内外隔離
一般微服務都在内網,不做安全驗證
用戶端請求多個微服務,增加了用戶端複雜性,每個微服務都要做使用者認證,限流等,避免和多個微服務打交道的複雜性
有跨域問題,不在同一個域
認證複雜,每個服務都要獨立認證,服務要求的權限不一緻
難以重構。因為微服務被用戶端調用着,重構難以實施
網關是介于用戶端(外部調用方比如app,h5)和微服務的中間層
是所有微服務入口,進行分發
身份認證與安全,識别合法的請求,攔截不合法的請求
監控,在入口處監控,更全面
動态路由,動态将請求分發到不同的後端叢集
壓力測試,可以逐漸增加對後端服務的流量,進行測試
負載均衡,也是用ribbon
限流,比如每秒隻要1000次,10001次就不讓通路
zuul預設內建了:ribbon和hystrix
官方位址:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul
引入依賴
該注解聲明這是一個zuul代理,該代理使用ribbon來定位注冊到eureka server上的微服務,同時,整合了hystrix,實作了容錯。
普通配置,端口,應用名,eureka位址
網關會将服務名轉換成具體服務的ip和端口,實際進行通路。
看高德開放平台:https://lbs.amap.com/api/webservice/guide/api/geofence_service#t6
zuul yml中
結果中是,eureka中有的執行個體的網關,和自己配置的映射
如果eureka中沒有執行個體,則隻有自己配置的映射。
error: [],
post: [],
pre: [],
route: []
通過服務名配置(虛拟主機名)
配置前先通路,然後做對比
這樣通路
http://localhost:9100/zuul-api-driver/test/hello
自定義命名配置
通路前 看結果,做對比。
通路:http://localhost:9100/zuul-custom-name/test/hello
這樣 ribbon和hystrix就都失效了
原來通路:
http://localhost:9100/api-driver/test/hello
增加如下配置
再通路:
http://localhost:9100/api-driver/test/hello , 不好使
http://localhost:9100/zuul-api-driver/test/hello, 好使
可以測試一下
http://localhost:9100/zuul-api-driver/test/hello,不好使
http://localhost:9100/api-driver/test/hello ,不好使
接口一般命名:/api/v1/xxxx
通路時帶上字首,實際請求會将字首去掉
比如通路:http://localhost:9100/api/zuul-api-driver/test/hello
實際:http://localhost:9002/test/hello
注意全局的移除,和自定義名字下面的移除。
即zuul下的移除,和custom-zuul-name2: 下面的移除
關鍵點找 200,最後幾行。看到路由成功,找到了目的地。
敏感的header不會傳播到下遊去,也就是說此處的token不會傳播的其它的微服務中去。
通路網關token為null。
zuul的大部分功能都是有過濾器實作的
pre: 在請求被路由之前調用,可利用這種過濾器實作身份驗證,選擇微服務,記錄日志
routing:在将請求路由到微服務調用,用于建構發送給微服務的請求,并用http clinet(或者ribbon)請求微服務
post:在調用微服務執行後,可用于添加header,記錄日志,将響應發給用戶端
error:在其他階段發生錯誤時,走此過濾器
prefilter看代碼,注意下面4點。
filtertype: pre,routing, post, error
filterorder: 執行順序,在誰前,在誰後,可以+1,-1
shouldfilter: 此過濾器是否執行,true false,可以寫過濾器是否執行的判斷條件。
run: 具體執行邏輯
通路: yapi中 網關token
說一下authfilter。利用filter實作了鑒權, 看代碼
選用基礎yml,啟動eureka,api-driver, online-taxi-zuul
正常啟動,正常通路yapi 網關token,正常;停止api-driver,則走了容錯方法
将fallback的改成
在通路上面 yapi 中 zuul,中網關token,則報500
再改成
重寫通路,熔斷生效
保護自己,用ratelimit
假設進入高速公路的車輛需要在入口處領取到通行卡才能進入高速公路,為了節約人力成本,入口處放置自動出卡機
按照國家高速公路交通安全法的規定,在高速公路上行駛的車輛,車速超過100km/h時,應與同車道前車保持100米以上距離
為了保持最小安全行車距離100米,按車速100km/h計算,需要間隔至少3.6秒才能放行一輛車,是以出卡機每隔3.6秒出一張通行卡
在自動出卡機下放置一個盒子,自動出卡機按照3.6秒的間隔向盒子中投放通行卡
每輛進入高速公路的車輛,從盒子中領取通行卡之後才可以進入高速公路
系統按設定的速度向桶中放置令牌
當桶中令牌滿時,多出的令牌溢出,桶中令牌不再增加
在使用令牌桶對流量規格進行評估時,是以令牌桶中的令牌數量是否足夠滿足封包的轉發為依據的
每個需要被轉發的封包,都要從令牌桶中領取一定數量的令牌(具體數量視封包大小而定),才可以被正常轉發
如果桶中存在足夠的令牌可以用來轉發封包,稱流量遵守或符合約定值,否則稱為不符合或超标。
高可用,一般做法,前面架上nginx
zuul作為普通的服務,對外通路,前面加一層(nginx+keepalived)
<b>論讀書</b>
睜開眼,書在面前
閉上眼,書在心裡