国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - Java教程 - SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

2021-05-03 10:35蝸居在小黑屋操控世界 Java教程

服務(wù)網(wǎng)關(guān)是分布式架構(gòu)中不可缺少的組成部分,是外部網(wǎng)絡(luò)和內(nèi)部服務(wù)之間的屏障。這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)。一起跟隨小編過來看看吧

為什么需要網(wǎng)關(guān)呢?

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

第二,我們這么多服務(wù),我們是不是要挨個(gè)調(diào)用它呀,我們這里假設(shè)做了個(gè)權(quán)限認(rèn)證,我們每一個(gè)客戶訪問的都是跑在不同機(jī)器上的不同的jvm上的服務(wù)程序,我們每一個(gè)服務(wù)都需要一個(gè)服務(wù)認(rèn)證,這樣做煩不煩呀,明顯是很煩的。

那么我們這時(shí)候面臨著這兩個(gè)及其總要的問題,這時(shí)我們就需要一個(gè)辦法解決它們。首先,我們看ip地址的暴露和ip地址寫死后帶來的單點(diǎn)問題,我是不是對這么服務(wù)本身我也要動態(tài)的維護(hù)它服務(wù)的列表呀,我需要調(diào)用這服務(wù)本身,是不是也要一個(gè)負(fù)載均衡一樣的玩意,

還有關(guān)于ip地址暴露的玩意,我是不是需要做一個(gè)代理呀,像nginx的反向代理一樣的東西,還有這玩意上部署公共的模塊,比如所有入口的權(quán)限校驗(yàn)的東西。因此我們現(xiàn)在需要zuul api網(wǎng)關(guān)。它就解決了上面的問題,你想調(diào)用某個(gè)服務(wù),它會給你映射,把你服務(wù)的ip地址映射成

某個(gè)路徑,你輸入該路徑,它匹配到了,它就去替你訪問這個(gè)服務(wù),它會有個(gè)請求轉(zhuǎn)發(fā)的過程,像nginx一樣,服務(wù)機(jī)器的實(shí)例具體實(shí)力,它不會直接去訪問ip,它會去eureka注冊中心拿到服務(wù)的實(shí)例id,即服務(wù)的名字。我再次使用客戶端的負(fù)載均衡ribbon訪問其中服務(wù)實(shí)例中的一臺。

api網(wǎng)關(guān)主要為了服務(wù)本身對外的調(diào)用該怎么調(diào)用來解決的,還有解決權(quán)限校驗(yàn)的問題,你可以在這里整合調(diào)用一系列過濾器的,例如整合shiro,springsecurity之類的東西。

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

zuul可以通過加載動態(tài)過濾機(jī)制,從而實(shí)現(xiàn)以下各項(xiàng)功能:

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

2.審查與監(jiān)控: 在邊緣位置追蹤有意義數(shù)據(jù)及統(tǒng)計(jì)結(jié)果,從而為我們帶來準(zhǔn)確的生產(chǎn)狀態(tài)結(jié)論。

3.動態(tài)路由: 以動態(tài)方式根據(jù)需要將請求路由至不同后端集群處。

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

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

6.靜態(tài)響應(yīng)處理: 在邊緣位置直接建立部分響應(yīng),從而避免其流入內(nèi)部集群。

7.多區(qū)域彈性: 跨越aws區(qū)域進(jìn)行請求路由,旨在實(shí)現(xiàn)elb使用多樣化并保證邊緣位置與使用者盡可能接近。

接著下來進(jìn)行實(shí)戰(zhàn)小demo

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

?
1
2
3
4
5
6
7
8
9
10
11
<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注解,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server:
 port: 5000
spring:
 application:
  name: api-geteway
zuul:
 routes:
#標(biāo)識你服務(wù)的名字,這里可以自己定義,一般方便和規(guī)范來講還是跟自己服務(wù)的名字一樣
  hello-service:
#服務(wù)映射的路徑,通過這路徑就可以從外部訪問你的服務(wù)了,目的是為了不爆露你機(jī)器的ip,面向服務(wù)的路由了,給你選一個(gè)可用的出來,
#這里zuul是自動依賴hystrix,ribbon的,不是面向單機(jī)
   path: /hello-service/**
#這里一定要是你eureka注冊中心的服務(wù)的名稱,是所以這里配置serviceid因?yàn)楦鷈ureka結(jié)合了,如果單獨(dú)使用zuul,那么就必須寫自己機(jī)器的ip了,
#如url:http://localhost:8080/ 這樣的不好就是寫死ip了,萬一這ip掛了,這高可用性,服務(wù)注冊那套東西就用不起來了
   serviceid: hello-service
 
eureka:
#客戶端
 client:
#注冊中心地址
  service-url:
   defaultzone: http://localhost:8888/eureka/,http://localhost:8889/eureka/

接著啟動先前文章中的注冊中心和兩個(gè)hello-service服務(wù)提供者,接著我們運(yùn)行,看一下它的請求轉(zhuǎn)發(fā)功能,看他有沒有輪詢進(jìn)入兩個(gè)服務(wù),

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

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

接著再刷新一遍:

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

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

zuul還能進(jìn)行請求過濾,那么我們進(jìn)行一下token校驗(yàn)來演示一下,首先我們需要先新建一個(gè)tokenfilter類來繼承zuulfilter這個(gè)類,實(shí)現(xiàn)它的四個(gè)接口,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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:具體的路由轉(zhuǎn)發(fā)過濾器是在routing路由器,具體的請求轉(zhuǎn)發(fā)的時(shí)候會調(diào)用
  //error:一旦前面的過濾器出錯(cuò)了,會調(diào)用error過濾器。
  //post:當(dāng)routing,error運(yùn)行完后才會調(diào)用該過濾器,是在最后階段的
  @override
  public string filtertype() {
    return "pre";
  }
 
  //自定義過濾器執(zhí)行的順序,數(shù)值越大越靠后執(zhí)行,越小就越先執(zhí)行
  @override
  public int filterorder() {
    return 0;
  }
 
  //控制過濾器生效不生效,可以在里面寫一串邏輯來控制
  @override
  public boolean shouldfilter() {
    return true;
  }
 
  //執(zhí)行過濾邏輯
  @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:返回一個(gè)字符串代表過濾器的類型,在zuul中定義了四種不同生命周期的過濾器類型,具體如下:

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

2.route :在路由請求時(shí)候被調(diào)用,具體的路由轉(zhuǎn)發(fā)過濾器是在routing路由器具體的請求轉(zhuǎn)發(fā)的時(shí)候會調(diào)用

3. error :處理請求時(shí)發(fā)生錯(cuò)誤時(shí)被調(diào)用

4. post :當(dāng)routing,error運(yùn)行完后才會調(diào)用該過濾器,是在最后階段的

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

?
1
2
3
4
5
6
7
8
try{
  業(yè)務(wù)邏輯......
}catch(exception e){
    requestcontext context = requestcontext.getcurrentcontext();
     context.set("error.status_code",401);
      context.set("error.exception",e);
      context.set("error.message","sfdfsdf");
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
@enablezuulproxy
public class zuulapplication {
 
  public static void main(string[] args) {
    springapplication.run(zuulapplication.class, args);
  }
 
  //將過濾器交給spring管理
  @bean
  public tokenfilter tokenfilter(){
    return new tokenfilter();
  }
}

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

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

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

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

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

可以看到這是已經(jīng)將我們的請求放過去了。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
server:
 port: 5000
spring:
 application:
  name: api-geteway
 
 
eureka:
#客戶端
 client:
#注冊中心地址
  service-url:
   defaultzone: http://localhost:8888/eureka/,http://localhost:8889/eureka/

接著,重啟繼續(xù)訪問,如下:

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

可以看到,還是能繼續(xù)訪問,我們什么都沒配,居然還能訪問,那是因?yàn)椋@里默認(rèn)用你的服務(wù)名字hello-service自動聲明了。

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

?
1
2
3
4
zuul:
#如果ignored-services:* 表示所有的默認(rèn)路由都失效了,要自己一個(gè)個(gè)配,沒人會那么操蛋,除非遇到奇葩業(yè)務(wù)
 
 ignored-services:

接著我們再說一下映射規(guī)則,比方說

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
zuul:
 routes:
#標(biāo)識你服務(wù)的名字,這里可以自己定義,一般方便和規(guī)范來講還是跟自己服務(wù)的名字一樣
  hello-service:
#服務(wù)映射的路徑,通過這路徑就可以從外部訪問你的服務(wù)了,目的是為了不爆露你機(jī)器的ip,面向服務(wù)的路由了,給你選一個(gè)可用的出來,
#這里zuul是自動依賴hystrix,ribbon的,不是面向單機(jī)
   path: /hello-service/**
#這里一定要是你eureka注冊中心的服務(wù)的名稱,是所以這里配置serviceid因?yàn)楦鷈ureka結(jié)合了,如果單獨(dú)使用zuul,那么就必須寫自己機(jī)器的ip了,
#如url:http://localhost:8080/ 這樣的不好就是寫死ip了,萬一這ip掛了,這高可用性,服務(wù)注冊那套東西就用不起來了
   serviceid: hello-service
 
zuul:
 routes:
  hello-service:
   path: /hello-service/ext/**
   serviceid: hello-service

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

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

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

SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

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

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

?
1
2
3
4
5
6
7
8
9
10
11
zuul:
 routes:
#標(biāo)識你服務(wù)的名字,這里可以自己定義,一般方便和規(guī)范來講還是跟自己服務(wù)的名字一樣
  hello-service:
#服務(wù)映射的路徑,通過這路徑就可以從外部訪問你的服務(wù)了,目的是為了不爆露你機(jī)器的ip,面向服務(wù)的路由了,給你選一個(gè)可用的出來,
#這里zuul是自動依賴hystrix,ribbon的,不是面向單機(jī)
   path: /hello-service/**
#這里一定要是你eureka注冊中心的服務(wù)的名稱,是所以這里配置serviceid因?yàn)楦鷈ureka結(jié)合了,如果單獨(dú)使用zuul,那么就必須寫自己機(jī)器的ip了,
#如url:http://localhost:8080/ 這樣的不好就是寫死ip了,萬一這ip掛了,這高可用性,服務(wù)注冊那套東西就用不起來了
   serviceid: hello-service
 ignored-patterns: /hello/**

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

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

?
1
2
3
4
5
6
7
8
9
10
11
zuul:
 routes:
#標(biāo)識你服務(wù)的名字,這里可以自己定義,一般方便和規(guī)范來講還是跟自己服務(wù)的名字一樣
  hello-service:
#服務(wù)映射的路徑,通過這路徑就可以從外部訪問你的服務(wù)了,目的是為了不爆露你機(jī)器的ip,面向服務(wù)的路由了,給你選一個(gè)可用的出來,
#這里zuul是自動依賴hystrix,ribbon的,不是面向單機(jī)
   path: /hello-service/**
#這里一定要是你eureka注冊中心的服務(wù)的名稱,是所以這里配置serviceid因?yàn)楦鷈ureka結(jié)合了,如果單獨(dú)使用zuul,那么就必須寫自己機(jī)器的ip了,
#如url:http://localhost:8080/ 這樣的不好就是寫死ip了,萬一這ip掛了,這高可用性,服務(wù)注冊那套東西就用不起來了
   serviceid: hello-service
 prefix: /api/**

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

如果我們還想進(jìn)行一個(gè)路徑訪問就跳轉(zhuǎn)到我的本地,那該怎么辦呢?

我希望用戶在訪問/local時(shí)能夠自動跳轉(zhuǎn)到這個(gè)方法上來處理,那么此時(shí)我們需要用到zuul的本地跳轉(zhuǎn),配置方式如下:

?
1
2
3
4
5
6
7
zuul:
 prefix: /api
 ignored-patterns: /**/hello/**
 routes:
  local:
   path: /hello-service/**
   url: forward:/local

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

這里zuul提供了zuul.sensitive-headers來給你搞這些cookie,header,這些信息不要進(jìn)行過濾。控制你的敏感信息。

默認(rèn)情況下,敏感的頭信息無法經(jīng)過api網(wǎng)關(guān)進(jìn)行傳遞,我們可以通過如下配置使之可以傳遞:

?
1
2
3
4
5
6
zuul:
 routes:
  hello-service:
   path: /hello-service/**
   serviceid: hello-service
 sensitive-headers:  cookie,header之類額東西

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 阿v视频在线观看 | 欧美在线不卡 | 能直接看的av网站 | 久久久国产精品免费 | 一区二区三区视频免费 | 午夜视频一区二区三区 | 在线观看五码 | 91麻豆精品国产91久久久资源速度 | 久久精品国产一区二区三区不卡 | 99伊人| 九九热视频在线观看 | 日韩一级免费观看 | 亚洲精品成a人ⅴ香蕉片 | 欧美a在线 | 国产日韩欧美精品 | 日韩成人中文字幕 | 偷拍做爰吃奶视频免费看 | 久久精品免费一区二区三区 | 一区二区 在线视频 | 国产精品久久精品 | 亚洲精品国产成人 | 在线观看日韩精品 | 欧美一区免费 | 一区二区中文字幕 | 国产人成精品一区二区三 | 亚洲第一福利视频 | 午夜精品在线 | 老司机福利在线视频 | 午夜精品一区二区三区免费视频 | 久久国产精品一区二区 | 九九九久久国产免费 | 午夜免费av | 欧美精品国产精品 | 精品久久av | 色av综合网 | 天堂成人av| 久久久久av | 婷婷激情综合 | 久久精品 | 欧美成人a∨高清免费观看 国产99久久 | 亚洲成人免费影院 |