亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

SpringCloud實戰之Zuul網關服務

2024-07-14 08:40:54
字體:
來源:轉載
供稿:網友

為什么需要網關呢?

我們知道我們要進入一個服務本身,很明顯我們沒有特別好的辦法,直接輸入IP地址+端口號,我們知道這樣的做法很糟糕的,這樣的做法大有問題,首先暴露了我們實體機器的IP地址,別人一看你的IP地址就知道服務部署在哪里,讓別人很方便的進行攻擊操作。

第二,我們這么多服務,我們是不是要挨個調用它呀,我們這里假設做了個權限認證,我們每一個客戶訪問的都是跑在不同機器上的不同的JVM上的服務程序,我們每一個服務都需要一個服務認證,這樣做煩不煩呀,明顯是很煩的。

那么我們這時候面臨著這兩個及其總要的問題,這時我們就需要一個辦法解決它們。首先,我們看IP地址的暴露和IP地址寫死后帶來的單點問題,我是不是對這么服務本身我也要動態的維護它服務的列表呀,我需要調用這服務本身,是不是也要一個負載均衡一樣的玩意,

還有關于IP地址暴露的玩意,我是不是需要做一個代理呀,像Nginx的反向代理一樣的東西,還有這玩意上部署公共的模塊,比如所有入口的權限校驗的東西。因此我們現在需要Zuul API網關。它就解決了上面的問題,你想調用某個服務,它會給你映射,把你服務的IP地址映射成

某個路徑,你輸入該路徑,它匹配到了,它就去替你訪問這個服務,它會有個請求轉發的過程,像Nginx一樣,服務機器的實例具體實力,它不會直接去訪問IP,它會去Eureka注冊中心拿到服務的實例ID,即服務的名字。我再次使用客戶端的負載均衡ribbon訪問其中服務實例中的一臺。

API網關主要為了服務本身對外的調用該怎么調用來解決的,還有解決權限校驗的問題,你可以在這里整合調用一系列過濾器的,例如整合shiro,springsecurity之類的東西。

網關服務,Zuul,SpringCloud

Zuul可以通過加載動態過濾機制,從而實現以下各項功能:

1.驗證與安全保障: 識別面向各類資源的驗證要求并拒絕那些與要求不符的請求。

2.審查與監控: 在邊緣位置追蹤有意義數據及統計結果,從而為我們帶來準確的生產狀態結論。

3.動態路由: 以動態方式根據需要將請求路由至不同后端集群處。

4.壓力測試: 逐漸增加指向集群的負載流量,從而計算性能水平。

5.負載分配: 為每一種負載類型分配對應容量,并棄用超出限定值的請求。

6.靜態響應處理: 在邊緣位置直接建立部分響應,從而避免其流入內部集群。

7.多區域彈性: 跨越AWS區域進行請求路由,旨在實現ELB使用多樣化并保證邊緣位置與使用者盡可能接近。

接著下來進行實戰小Demo

第一步,在原來的工程下,新建一個Zuul模塊,引入依賴,代碼如下:

<dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-eureka</artifactId>      <version>1.3.5.RELEASE</version>    </dependency>    <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-zuul</artifactId>      <version>1.3.5.RELEASE</version>    </dependency>

接著在啟動類上打上@EnableZuulProxy注解,代碼如下:

server: port: 5000spring: application:  name: api-getewayzuul: routes:#標識你服務的名字,這里可以自己定義,一般方便和規范來講還是跟自己服務的名字一樣  hello-service:#服務映射的路徑,通過這路徑就可以從外部訪問你的服務了,目的是為了不爆露你機器的IP,面向服務的路由了,給你選一個可用的出來,#這里zuul是自動依賴hystrix,ribbon的,不是面向單機   path: /hello-service/**#這里一定要是你Eureka注冊中心的服務的名稱,是所以這里配置serviceId因為跟eureka結合了,如果單獨使用zuul,那么就必須寫自己機器的IP了,#如url:http://localhost:8080/ 這樣的不好就是寫死IP了,萬一這IP掛了,這高可用性,服務注冊那套東西就用不起來了   serviceId: hello-serviceeureka:#客戶端 client:#注冊中心地址  service-url:   defaultZone: http://localhost:8888/eureka/,http://localhost:8889/eureka/

接著啟動先前文章中的注冊中心和兩個hello-service服務提供者,接著我們運行,看一下它的請求轉發功能,看他有沒有輪詢進入兩個服務,

輸入localhost:5000/hello-service/hello,如下:

網關服務,Zuul,SpringCloud

接著再刷新一遍:

網關服務,Zuul,SpringCloud

可以看到zuul進行了請求分發了。它是根據你的服務名字hello-servie來映射到具體的機器上,這不就是一個反向代理的功能嗎?

zuul還能進行請求過濾,那么我們進行一下token校驗來演示一下,首先我們需要先新建一個TokenFilter類來繼承ZuulFilter這個類,實現它的四個接口,代碼如下:

package hjc.zuul;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import javax.servlet.http.HttpServletRequest;/** * Created by cong on 2018/5/18. */public class TokenFilter extends ZuulFilter {  //四種類型:pre,routing,error,post  //pre:主要用在路由映射的階段是尋找路由映射表的  //routing:具體的路由轉發過濾器是在routing路由器,具體的請求轉發的時候會調用  //error:一旦前面的過濾器出錯了,會調用error過濾器。  //post:當routing,error運行完后才會調用該過濾器,是在最后階段的  @Override  public String filterType() {    return "pre";  }  //自定義過濾器執行的順序,數值越大越靠后執行,越小就越先執行  @Override  public int filterOrder() {    return 0;  }  //控制過濾器生效不生效,可以在里面寫一串邏輯來控制  @Override  public boolean shouldFilter() {    return true;  }  //執行過濾邏輯  @Override  public Object run() {    RequestContext context = RequestContext.getCurrentContext();    HttpServletRequest request = context.getRequest();    String token = request.getParameter("token");    if (token == null){      context.setSendZuulResponse(false);      context.setResponseStatusCode(401);      context.setResponseBody("unAuthrized");      return null;    }    return null;  }}

filterType:返回一個字符串代表過濾器的類型,在zuul中定義了四種不同生命周期的過濾器類型,具體如下:

1. pre :可以在請求被路由之前調用,用在路由映射的階段是尋找路由映射表的

2.route :在路由請求時候被調用,具體的路由轉發過濾器是在routing路由器具體的請求轉發的時候會調用

3. error :處理請求時發生錯誤時被調用

4. post :當routing,error運行完后才會調用該過濾器,是在最后階段的

這里聲明一下zuul過濾器執行網絡請求發生的異常,過濾器里面是不能直接將try-catch捕捉的異常拋出給頁面的。應用程序拋出的異常是可以返回出的需解決辦法就是在catch里面用context.set()方法返回給頁面。如下:

try{  業務邏輯......}catch(Exception e){    RequestContext context = RequestContext.getCurrentContext();     context.set("error.status_code",401);      context.set("error.exception",e);      context.set("error.message","sfdfsdf");}

接著,你還需要把這個過濾器加入spring中,讓spring管理,代碼如下:

package hjc;import hjc.zuul.TokenFilter;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.zuul.EnableZuulProxy;import org.springframework.context.annotation.Bean;@SpringBootApplication@EnableZuulProxypublic class ZuulApplication {  public static void main(String[] args) {    SpringApplication.run(ZuulApplication.class, args);  }  //將過濾器交給Spring管理  @Bean  public TokenFilter tokenFilter(){    return new TokenFilter();  }}

接著,讓我們啟動啟動類,先進行不帶token的訪問,如下:

網關服務,Zuul,SpringCloud

可以看到,返回一個沒權限的信息,這里要說一下,Token一般都是放在請求頭中的,這里我們只是為了演示才沒那么干,

接著將token帶上再去訪問,如下:

網關服務,Zuul,SpringCloud

可以看到這是已經將我們的請求放過去了。

這里我還要講一下什么是默認路由,將zuul的配置刪除路由配置,如下:

server: port: 5000spring: application:  name: api-getewayeureka:#客戶端 client:#注冊中心地址  service-url:   defaultZone: http://localhost:8888/eureka/,http://localhost:8889/eureka/

接著,重啟繼續訪問,如下:

網關服務,Zuul,SpringCloud 、

可以看到,還是能繼續訪問,我們什么都沒配,居然還能訪問,那是因為,這里默認用你的服務名字hello-service自動聲明了。

那么,如果說我不想讓它幫我自動聲明,我要我自己定義,那么可以在yml配置文件中使用zuu.ignored-services就可以把自己像過濾的過濾,如下:”

zuul:#如果ignored-services:* 表示所有的默認路由都失效了,要自己一個個配,沒人會那么操蛋,除非遇到奇葩業務 ignored-services: 

接著我們再說一下映射規則,比方說

zuul: routes:#標識你服務的名字,這里可以自己定義,一般方便和規范來講還是跟自己服務的名字一樣  hello-service:#服務映射的路徑,通過這路徑就可以從外部訪問你的服務了,目的是為了不爆露你機器的IP,面向服務的路由了,給你選一個可用的出來,#這里zuul是自動依賴hystrix,ribbon的,不是面向單機   path: /hello-service/**#這里一定要是你Eureka注冊中心的服務的名稱,是所以這里配置serviceId因為跟eureka結合了,如果單獨使用zuul,那么就必須寫自己機器的IP了,#如url:http://localhost:8080/ 這樣的不好就是寫死IP了,萬一這IP掛了,這高可用性,服務注冊那套東西就用不起來了   serviceId: hello-servicezuul: routes:  hello-service:   path: /hello-service/ext/**   serviceId: hello-service

這里的兩個zuul配置映射路徑都有/hello-service/,可以看到/hello-service/**是包括/hello-service/ext/**的,這兩個路徑進行匹配的時候是不是有沖突呀,怎么處理呢?誰先匹配呢?

這里是yml中定義的順序來匹配的。如果是application.properties格式的配置文件,它這個順序是不能保證的,yml格式的配置文件是有順序的,可以保證,這里要注意下一下。

如果我們想定義一下匹配規則怎么辦呢?那么我們就需要在啟動類中定義一個bean,這個類就是決定你的路由的,如下:

網關服務,Zuul,SpringCloud

這里就不演示了,需要用到的時候自己再去慢慢查找資料吧。

還有就是ignored-patterns:,如下:

zuul: routes:#標識你服務的名字,這里可以自己定義,一般方便和規范來講還是跟自己服務的名字一樣  hello-service:#服務映射的路徑,通過這路徑就可以從外部訪問你的服務了,目的是為了不爆露你機器的IP,面向服務的路由了,給你選一個可用的出來,#這里zuul是自動依賴hystrix,ribbon的,不是面向單機   path: /hello-service/**#這里一定要是你Eureka注冊中心的服務的名稱,是所以這里配置serviceId因為跟eureka結合了,如果單獨使用zuul,那么就必須寫自己機器的IP了,#如url:http://localhost:8080/ 這樣的不好就是寫死IP了,萬一這IP掛了,這高可用性,服務注冊那套東西就用不起來了   serviceId: hello-service ignored-patterns: /hello/**

ignored-patterns:表示屏蔽掉/hello/**的路徑,就算你/hello-service/hello/**也不行,照樣屏蔽。這個配置我們可以進一步細化,比如說我不想給/hello接口路由,那我們可以按照上面方式配置

如果我們還想配置一個服務的前綴該怎么辦?代碼如下:

zuul: routes:#標識你服務的名字,這里可以自己定義,一般方便和規范來講還是跟自己服務的名字一樣  hello-service:#服務映射的路徑,通過這路徑就可以從外部訪問你的服務了,目的是為了不爆露你機器的IP,面向服務的路由了,給你選一個可用的出來,#這里zuul是自動依賴hystrix,ribbon的,不是面向單機   path: /hello-service/**#這里一定要是你Eureka注冊中心的服務的名稱,是所以這里配置serviceId因為跟eureka結合了,如果單獨使用zuul,那么就必須寫自己機器的IP了,#如url:http://localhost:8080/ 這樣的不好就是寫死IP了,萬一這IP掛了,這高可用性,服務注冊那套東西就用不起來了   serviceId: hello-service prefix: /api/**

可以看到那么你訪問的服務都必須要加/api/前綴,例如/api/hello-service/**

如果我們還想進行一個路徑訪問就跳轉到我的本地,那該怎么辦呢?

我希望用戶在訪問/local時能夠自動跳轉到這個方法上來處理,那么此時我們需要用到Zuul的本地跳轉,配置方式如下:

zuul: prefix: /api ignored-patterns: /**/hello/** routes:  local:   path: /hello-service/**   url: forward:/local

我們常用的一些,對接springsecurity,或者是一些第三方組件,它們會獲取你的一些cookie信息,那么Zuul網關為了安全起見,把你的cookie信息都給干掉了,這個是沒辦法去搞cookie的。它是默認干掉的。

這里Zuul提供了zuul.sensitive-headers來給你搞這些cookie,header,這些信息不要進行過濾??刂颇愕拿舾行畔ⅰ?/p>

默認情況下,敏感的頭信息無法經過API網關進行傳遞,我們可以通過如下配置使之可以傳遞:

zuul: routes:  hello-service:   path: /hello-service/**   serviceId: hello-service sensitive-headers:  cookie,header之類額東西

還可以配合Hystrix的一些詳細配置一起使用,前面也講過了。這里就不說了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品视频在线观看免费| 亚洲精品女av网站| 亚洲精品aⅴ中文字幕乱码| 91欧美精品成人综合在线观看| 91精品国产高清久久久久久91| 亚洲理论片在线观看| 日韩成人黄色av| 日韩福利伦理影院免费| 国产精品日日摸夜夜添夜夜av| 动漫精品一区二区| 久久精品国产清自在天天线| 91九色单男在线观看| 亚洲欧美精品中文字幕在线| 午夜精品久久久久久99热软件| 最近中文字幕2019免费| 国产精品91久久久| 久久国产精品影片| 国产精品久久激情| 欧美一区二区三区图| 国产精品第一第二| 国产欧美最新羞羞视频在线观看| 欧美性猛交xxxx免费看久久久| 亚洲成人网在线观看| 一本一本久久a久久精品综合小说| 国产精品久久久久久久久久小说| 91精品国产91久久| 97av视频在线| 亚洲午夜精品久久久久久性色| 激情亚洲一区二区三区四区| 91久久国产综合久久91精品网站| 成人一区二区电影| 欧美伦理91i| 黄色精品在线看| 久久久久久香蕉网| 九九综合九九综合| 欧美电影免费观看电视剧大全| 成人性生交大片免费观看嘿嘿视频| 欧美精品videosex牲欧美| 日韩欧美黄色动漫| 国产精品电影一区| 国产日韩av高清| 国产精品一区=区| 国产精品99蜜臀久久不卡二区| 国产欧美日韩91| 91久久精品久久国产性色也91| 精品一区精品二区| 日韩综合视频在线观看| 精品毛片三在线观看| 中文字幕在线成人| 久久久精品2019中文字幕神马| 日韩电影大全免费观看2023年上| 91免费视频国产| 精品美女永久免费视频| 欧美性在线视频| 亚州成人av在线| 国产91精品黑色丝袜高跟鞋| 国产精品一区二区三区免费视频| 亚洲精品日韩久久久| 欧美裸体xxxx| 欧美激情精品久久久久久免费印度| 热re91久久精品国99热蜜臀| 精品日韩美女的视频高清| 国产日韩一区在线| 国产成人精品免费久久久久| 日韩高清av在线| 国产亚洲视频在线| 午夜精品久久久久久久男人的天堂| 国产精品大片wwwwww| 欧美午夜片欧美片在线观看| 欧美一性一乱一交一视频| 668精品在线视频| 疯狂蹂躏欧美一区二区精品| 欧美精品在线观看91| 亚洲精品久久久久久久久久久久| 亚洲国产精品网站| 成人激情视频在线观看| 91黄色8090| 国产丝袜视频一区| 国产suv精品一区二区三区88区| 久久精品国产综合| 亚洲网站在线播放| 中文字幕欧美专区| 国产视频精品xxxx| 久久成人国产精品| 亚洲iv一区二区三区| 另类天堂视频在线观看| 中文字幕亚洲无线码在线一区| 欧美日韩午夜激情| 免费97视频在线精品国自产拍| 国产精品96久久久久久又黄又硬| 国产亚洲精品久久久久动| 久久色在线播放| 91国内在线视频| 久久国产精品电影| 日韩国产欧美精品一区二区三区| 久久久在线免费观看| 亚洲桃花岛网站| 最新亚洲国产精品| 国产97在线播放| 色老头一区二区三区在线观看| 亚洲精品一区中文| 久久久久久久爱| 神马国产精品影院av| 精品国产一区二区三区久久| 国产91精品久久久久久久| 亚洲国产成人精品久久久国产成人一区| xxxx性欧美| 国产a级全部精品| 97精品国产97久久久久久| 日本乱人伦a精品| 国产一区二区三区在线| 成人av电影天堂| 欧美日韩中文在线| 欧美中文字幕视频在线观看| 国产精品久久久久久久av电影| 国产91精品久久久久久| 日本aⅴ大伊香蕉精品视频| 国产成人欧美在线观看| 中文字幕一区电影| 色琪琪综合男人的天堂aⅴ视频| 色yeye香蕉凹凸一区二区av| 国产精品欧美亚洲777777| 91在线中文字幕| 亚洲人成网站免费播放| 欧美丰满少妇xxxx| 欧美国产第一页| 欧美日韩亚洲91| 国产精品久久久久久久久久| 中文国产亚洲喷潮| 国产日韩欧美成人| 国产精品久久久久久av| 国产主播精品在线| 成人黄色免费片| 国产成人福利网站| 91亚洲精品久久久久久久久久久久| 欧美最近摘花xxxx摘花| 美日韩精品免费观看视频| 曰本色欧美视频在线| 国产成人综合亚洲| 97色在线视频| 96精品视频在线| 韩国美女主播一区| 日韩av免费一区| 久久久久久国产精品| 国产精品视频中文字幕91| 国产精品视频一| 欧美福利小视频| 成人午夜在线观看| 精品中文视频在线| 亚洲欧美中文在线视频| 亚洲一区二区三区在线免费观看| 国产欧美精品久久久| 色视频www在线播放国产成人| 国产亚洲欧洲黄色| 91在线观看免费高清完整版在线观看| 在线视频免费一区二区| 色先锋资源久久综合5566| 亚洲a级在线播放观看| 久久国产精品99国产精| 欧美大成色www永久网站婷| 亚洲毛茸茸少妇高潮呻吟| 亚洲精品日产aⅴ| 精品日韩美女的视频高清| 91性高湖久久久久久久久_久久99|