Gateway網(wǎng)關(guān)
網(wǎng)關(guān),在微服務(wù)架構(gòu)中,主要用來路由,增強(qiáng)和控制對服務(wù)的訪問,同時(shí)也具備負(fù)載均衡、流量控制、訪問控制等能力,SpringCloud Gateway是Spring官方基于Spring5.0、SpringBoot2.0等技術(shù)開發(fā)的網(wǎng)關(guān),SpringCloud Gateway旨在為微服務(wù)架構(gòu)提供一種簡單而有效的統(tǒng)一的API路由管理方式。
第二代網(wǎng)關(guān)技術(shù)和SpringCloud配合更緊密,之前的網(wǎng)關(guān)技術(shù)是zuul
底層Netty(網(wǎng)絡(luò)框架,封裝了NIO)性能更好,多路復(fù)用
路由過濾器合理的API設(shè)計(jì),功能更加強(qiáng)大
目前項(xiàng)目的問題:
微服務(wù)外部調(diào)用微服務(wù)集群里面的內(nèi)容時(shí),遇到問題,服務(wù)太多,需要記住所有的服務(wù)的地址
一個(gè)服務(wù)有很多臺(tái)機(jī)器,需要做負(fù)載均衡,瀏覽器顯然不能做這件事情
無法對請求進(jìn)行統(tǒng)一的統(tǒng)計(jì)和過濾
網(wǎng)關(guān)就可以解決這些問題
微服務(wù)網(wǎng)關(guān)封裝了應(yīng)用程序的內(nèi)部結(jié)構(gòu),客戶端只需要跟網(wǎng)關(guān)交互,而無需直接調(diào)用特定微服務(wù)
方便監(jiān)控,所有的請求都可以先請求網(wǎng)關(guān),方便了對請求的管理和監(jiān)控
統(tǒng)一過濾處理,方便管理
可以做負(fù)載均衡
三、Gateway使用
創(chuàng)建一個(gè)服務(wù)(coding-gateway),并注冊到注冊中心
引入gateway網(wǎng)關(guān)依賴
XML<!--引入gateway網(wǎng)關(guān)依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
注意:不能導(dǎo)入SpringBoot Web的依賴spring-boot-start-web
網(wǎng)關(guān)配置
Properties#路由的id 可以認(rèn)為是當(dāng)前路由規(guī)則的名字 要求唯一性spring.cloud.gateway.routes[0].id=product_route#匹配后的路由地址 【目標(biāo)服務(wù)地址】spring.cloud.gateway.routes[0].uri=http://localhost:8080#斷言 也就是匹配規(guī)則spring.cloud.gateway.routes[0].predicates[0]=Path=/coding-product/**#路由的id 可以認(rèn)為是當(dāng)前路由規(guī)則的名字 要求唯一性spring.cloud.gateway.routes[1].id=order_route#匹配后的路由地址 【目標(biāo)服務(wù)地址】spring.cloud.gateway.routes[1].uri=http://localhost:8090#斷言 也就是匹配規(guī)則spring.cloud.gateway.routes[1].predicates[0]=Path=/coding-order/**server.port=8001
啟動(dòng)項(xiàng)目測試
http://localhost:網(wǎng)關(guān)服務(wù)端口/coding-product/products
四、路徑重寫
后臺(tái)接口:http://localhost:8001/coding-order/order,如果前端調(diào)用時(shí),地址為http://localhost:8001/api/coding-order/order,那么我們需要對路徑進(jìn)行重寫
方式一
Properties#路由的id 可以認(rèn)為是當(dāng)前路由規(guī)則的名字 要求唯一性spring.cloud.gateway.routes[1].id=order_route#匹配后的路由地址 【目標(biāo)服務(wù)地址】spring.cloud.gateway.routes[1].uri=http://localhost:8090#斷言 也就是匹配規(guī)則# 1、添加上apispring.cloud.gateway.routes[1].predicates[0]=Path=/api/coding-order/**# 2、對路徑進(jìn)行重寫,把/api/coding-order重寫成/coding-orderspring.cloud.gateway.routes[1].filters[0]=RewritePath=/api/coding-order(?<segment>/?.*),/coding-order/$\{segment}server.port=8001
YAMLspring:cloud:gateway:routes:- id: order_routeuri: http://localhost:8090predicates:- Path=/api/coding-order/**filters:- RewritePath=/api/coding-order(?<segment>/?.*),/coding-order/$\{segment}
方式二
YAMLspring:cloud:gateway:routes:- id: order_routeuri: http://localhost:8090predicates:- Path=/api/coding-order/**filters:# - RewritePath=/api/coding-order(?<segment>/?.*),/coding-order/$\{segment}# 去除Path中前兩個(gè)路徑- StripPrefix=2# Path中路徑換成/coding-order- PrefixPath=/coding-orderserver:port: 8001
五、動(dòng)態(tài)路徑(負(fù)載均衡)
Gateway能夠以注冊中心上微服務(wù)名為路徑創(chuàng)建動(dòng)態(tài)路由進(jìn)行轉(zhuǎn)發(fā),從而實(shí)現(xiàn)動(dòng)態(tài)路由的功能
配置【以訂單服務(wù)為例】
YAMLspring:cloud:gateway:routes:- id: order_route# uri: http://localhost:8090uri: lb://coding-orderpredicates:- Path=/api/coding-order/**filters:# - RewritePath=/api/coding-order(?<segment>/?.*),/coding-order/$\{segment}- StripPrefix=2- PrefixPath=/coding-order- id: product_routeuri: lb://coding-productpredicates:- Path=/coding-product/**server:port: 8001
測試
同時(shí)開啟兩個(gè)訂單服務(wù),重復(fù)請求,查詢是否訪問的不是同一個(gè)
訂單服務(wù)控制器
Java@RestController()public class OrderController {@Value("${server.port}")private Integer port;@GetMapping("/order")public String getOrder(){return "訂單服務(wù)測試..."+port;}}
六、處理跨域問題
YAMLspring:cloud:gateway:globalcors:corsConfigurations:'[/**]':allowedHeaders: "*"allowedOrigins: "*"allowCredentials: trueallowedMethods:- GET- POST- DELETE- PUT- PATCH- OPTIONserver:port: 8001
七、自定義過濾器(GlobalFilter)
案例:判斷請求中是否攜帶token
Java@Componentpublic class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//某個(gè)參數(shù) 對不對String username = exchange.getRequest().getQueryParams().getFirst("username");if (username==null) {//攔截// 設(shè)置響應(yīng)狀態(tài)碼exchange.getResponse().setStatusCode(HttpStatus.MULTI_STATUS );return exchange.getResponse().setComplete();}//放行return chain.filter(exchange);}@Overridepublic int getOrder() {return 0; // 多個(gè)Filter中,數(shù)值越小越先執(zhí)行}}
一文講清楚什么是網(wǎng)關(guān)、DNS、子網(wǎng)掩碼、MAC地址
上次我們發(fā)布了局域網(wǎng)ip地址不夠用怎么解決?很多朋友多次問到什么是網(wǎng)關(guān)、dns、子網(wǎng)掩碼,它有什么作用,確實(shí),我們平時(shí)在網(wǎng)絡(luò)中總是在不斷的提到網(wǎng)關(guān),卻很少真正的去了解它。
例:
一、什么是網(wǎng)關(guān)
一、什么是網(wǎng)關(guān)
網(wǎng)關(guān)(Gateway)又稱網(wǎng)間連接器、協(xié)議轉(zhuǎn)換器。網(wǎng)關(guān)在傳輸層上以實(shí)現(xiàn)網(wǎng)絡(luò)互連,是最復(fù)雜的網(wǎng)絡(luò)互連設(shè)備,僅用于兩個(gè)高層協(xié)議不同的網(wǎng)絡(luò)互連。
二、如何來理解網(wǎng)關(guān)
大家都知道,從一個(gè)房間走到另一個(gè)房間,必然要經(jīng)過一扇門 。同樣,從一個(gè)網(wǎng)絡(luò)向另一個(gè)網(wǎng)絡(luò)發(fā)送信息,也必須經(jīng)過一道“關(guān)口”,這道關(guān)口就是網(wǎng)關(guān)。顧名思義,網(wǎng)關(guān)(Gateway)就是一個(gè)網(wǎng)絡(luò)連接到另一個(gè)網(wǎng)絡(luò)的“關(guān)口 ”。
按照不同的分類標(biāo)準(zhǔn),網(wǎng)關(guān)也有很多種。TCP/IP協(xié)議里的網(wǎng)關(guān)是最常用的,在這里我們所講的“網(wǎng)關(guān)”均指TCP/IP協(xié)議下的網(wǎng)關(guān)。
三、網(wǎng)關(guān)的ip地址
那么網(wǎng)關(guān)到底是什么呢?
網(wǎng)關(guān)實(shí)質(zhì)上是一個(gè)網(wǎng)絡(luò)通向其他網(wǎng)絡(luò)的IP地址,網(wǎng)關(guān)在網(wǎng)段內(nèi)的可用ip中選一個(gè) ,不過,一般用的是第1個(gè)和最后一個(gè) 。
例如
比如有網(wǎng)絡(luò)A和網(wǎng)絡(luò)B,
網(wǎng)絡(luò)A: 的IP地址范圍為“192.168.1.1~192. 168.1.254”,子網(wǎng)掩255.255.255.0;
如果需要與其它網(wǎng)段通信,那么它的網(wǎng)關(guān)可以設(shè)置為192.168.1.1,當(dāng)然也可以設(shè)置為網(wǎng)段內(nèi) 其它的一個(gè)ip地址。
網(wǎng)絡(luò)B: 的IP地址范為“192.168.2.1~192.168.2.254”,子網(wǎng)掩碼255.255.255.0。
如果需要與其它網(wǎng)段通信,那么它的網(wǎng)關(guān)可以設(shè)置為192.168.2.1,當(dāng)然也可以設(shè)置為網(wǎng)段內(nèi) 其它的一個(gè)ip地址。
四、網(wǎng)關(guān)是如何實(shí)現(xiàn)通信?
在沒有路由器 的情況下,不同的兩個(gè)網(wǎng)絡(luò)之間是不能 進(jìn)行TCP/IP通信的,即使是兩個(gè)網(wǎng)絡(luò)連接在同一臺(tái)交換機(jī)(或集線器)上,TCP/IP協(xié)議也會(huì)根據(jù)子網(wǎng)掩碼(255.255.255.0)判定兩個(gè)網(wǎng)絡(luò)中的主機(jī)處在不同的網(wǎng)絡(luò)里。而要實(shí)現(xiàn)這兩個(gè)網(wǎng)絡(luò)之間的通信,則必須通過網(wǎng)關(guān) 。
如果網(wǎng)絡(luò)A 中的主機(jī)發(fā)現(xiàn)數(shù)據(jù)包 的目的主機(jī)不在 本地網(wǎng)絡(luò)中,就把數(shù)據(jù)包轉(zhuǎn)發(fā)給它自己的網(wǎng)關(guān) ,再由網(wǎng)關(guān)轉(zhuǎn)發(fā)給網(wǎng)絡(luò)B的網(wǎng)關(guān),網(wǎng)絡(luò)B的網(wǎng)關(guān)再轉(zhuǎn)發(fā)給網(wǎng)絡(luò)B的某個(gè)主機(jī)(如附圖所示)。網(wǎng)絡(luò)B向網(wǎng)絡(luò)A轉(zhuǎn)發(fā)數(shù)據(jù)包的過程。
所以說,只有設(shè)置好網(wǎng)關(guān)的IP地址 ,TCP/IP協(xié)議才能實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的相互通信。
五、什么是默認(rèn)網(wǎng)關(guān)?
如果搞清了什么是網(wǎng)關(guān),默認(rèn)網(wǎng)關(guān)也就好理解了。就好像一個(gè)房間可以有多扇門一樣,一臺(tái)主機(jī)可以有多個(gè)網(wǎng)關(guān)。默認(rèn)網(wǎng)關(guān) 的意思是一臺(tái)主機(jī)如果找不到可用的網(wǎng)關(guān),就把數(shù)據(jù)包發(fā)給默認(rèn)指定的網(wǎng)關(guān) ,由這個(gè)網(wǎng)關(guān)來處理數(shù)據(jù)包?,F(xiàn)在主機(jī) 使用的網(wǎng)關(guān),一般指的是默認(rèn)網(wǎng)關(guān)。
二、什么是DNS
DNS是域名解析服務(wù)器(Domain Name System),是把網(wǎng)址變成IP地址的服務(wù)器。
DNS說白了是把域名翻譯成IP地址用的,這里面舉個(gè)例子 ,大家就很容易清楚了。
例如我們在瀏覽器里面輸入www.baidu.com的時(shí)候,機(jī)器要跟百度這個(gè)網(wǎng)站進(jìn)行通信 ,機(jī)器要往外面發(fā)送 數(shù)據(jù)包,數(shù)據(jù)包里面要寫百度這臺(tái)服務(wù)器的IP地址 ,我們不知道IP地址是多少,那么就需要主機(jī)問DNS服務(wù)器 ,DNS服務(wù)器就自動(dòng)幫我們把www.baidu.com這個(gè)域名翻譯成 了IP地址61.135.169.105。然后寫到了數(shù)據(jù)包的目的IP地址里面就可以進(jìn)行通信。
就跟我們寫信一樣,你得寫個(gè)收信人的地址 郵局才能給你發(fā)送吧,你給國外寫信,你寫中文地址郵局不認(rèn)識,需要這個(gè)一個(gè)人幫你翻譯成英語。這就是DNS的作用,所以你的在本地連接里面寫DNS才可以正常瀏覽網(wǎng)頁,如果不設(shè)置DNS,是無法正常訪問網(wǎng)頁的。
三、MAC地址
講到MAC地址,就不得不提ip地址,這里順便把ip地址也說下。
IP與MAC
雖然現(xiàn)在已經(jīng)ipv6了,但我們基本用的大多數(shù)還是ipv4協(xié)議,所謂ip就是你電腦整個(gè)網(wǎng)絡(luò)的編號 。其他電腦想訪問電腦就得需要這個(gè)編號。但是這個(gè)編號很多情況下是一直在變化 的。唯一不變的是你的MAC地址:物理地址 。
MAC是網(wǎng)絡(luò)中用來標(biāo)識網(wǎng)卡設(shè)備的唯一網(wǎng)絡(luò)地址。由相關(guān)硬件制造商統(tǒng)一分配,每臺(tái)電腦的MAC地址都是唯一 的。
做個(gè)比喻,你經(jīng)常搬家,你沒搬一次家都有一個(gè)地址,XX小區(qū)XX單元XX號,這個(gè)就是IP。但是你的名字不變,這個(gè)就是MAC,不同的是我們的MAC不允許重名。
我們的IP分為兩個(gè)部分: 如上圖分為網(wǎng)絡(luò)部分 和主機(jī)部分 。 網(wǎng)絡(luò)部分好比就是你在XX省XX市XX鎮(zhèn),這個(gè)是國家固定下來了的。但是XX小區(qū)XX單元XX號是開發(fā)商自己定的。兩個(gè)編號加起來 就是你的ip了。 不同的是在現(xiàn)實(shí)中兩個(gè)編號的長度是固定的,在網(wǎng)絡(luò)上A、B、C、D的ip地址卻是變化的,這個(gè)在前天有詳細(xì)講到。
四、子網(wǎng)掩碼
子網(wǎng)掩碼是為了區(qū)分網(wǎng)絡(luò)位和主機(jī)位,上面我們說到過,一個(gè)ip地址是由網(wǎng)絡(luò)部分 和主機(jī)部分。 正如一個(gè)人的名字由姓與名組成。
那么我們可以把IP地址比作一個(gè)人的名字,那么子網(wǎng)掩碼就像是一份名單,可以快速的知道那些人同姓,那些人不同姓,把同姓的人分在一組,讓他們之前可以互相交流。
舉個(gè)例子
有一個(gè)網(wǎng)段 是192.168.1.0-192.1.254,這個(gè)網(wǎng)段就像一個(gè)村子一樣,就稱它為安防村 ,此這網(wǎng)段有個(gè)ip地址是192.168.1.1,我們就叫他安防一,另外一個(gè)人叫安防二,它的ip地址為192.168.1.2,我們一看他們,就知道他們是同村的。
另外有一個(gè)網(wǎng)段, 是192.168.0.0——192.168.255.254,我們叫它安村 ,村里有個(gè)同樣有兩個(gè)ip地址192.168.1.1與192.168.1.2,也叫安防一,安防二,那么問題來了?這個(gè)時(shí)候,如何區(qū)分他們是屬于那個(gè)村的?
這個(gè)時(shí)候就需要子網(wǎng)掩碼 了來判斷他們是屬于那個(gè)網(wǎng)段的,需要把安防一、安防二帶到村里去認(rèn)下,就知道他們是屬于那個(gè)村了,安防村 的網(wǎng)段是255.255.255.0,安村 的網(wǎng)段是255.255.0.0。
網(wǎng)絡(luò)中也會(huì)出現(xiàn)類似于“同名”“同姓”的ip地址,如何區(qū)分他們到底是屬于那個(gè)網(wǎng)段,就需要依靠子網(wǎng)掩碼了。
相關(guān)問答
什么叫 網(wǎng)關(guān) 和子網(wǎng)掩碼?1、網(wǎng)關(guān)(Gateway),將兩個(gè)使用不同協(xié)議的網(wǎng)絡(luò)段連接在一起的設(shè)備。(1)它的作用就是對兩個(gè)網(wǎng)絡(luò)段中的使用不同傳輸協(xié)議的數(shù)據(jù)進(jìn)行互相的翻譯轉(zhuǎn)換。(2)舉個(gè)例...
路由器與 網(wǎng)關(guān) 的區(qū)別?一、概念上的區(qū)別:交換機(jī)為電(光)信號轉(zhuǎn)發(fā)的網(wǎng)絡(luò)設(shè)備,路由器(Router)則是一種計(jì)算機(jī)網(wǎng)絡(luò)設(shè)備(路由器不能處理光信號源),而網(wǎng)關(guān)則為連接兩個(gè)網(wǎng)絡(luò)的設(shè)備,...一...
何為 網(wǎng)關(guān) WIFI?網(wǎng)關(guān)WiFi是光貓和WiFi的結(jié)合體,不僅可以單獨(dú)使用,也可搭配路由器使用,具有更強(qiáng)的功能性。網(wǎng)關(guān)WiFi雖然可充當(dāng)無線路由器使用,但是其對同時(shí)上網(wǎng)的終端設(shè)備...
網(wǎng)關(guān) 是多少?網(wǎng)關(guān)是一種連接不同網(wǎng)絡(luò)的設(shè)備或軟件,它可以將來自一個(gè)網(wǎng)絡(luò)的數(shù)據(jù)轉(zhuǎn)發(fā)到另一個(gè)網(wǎng)絡(luò),同時(shí)可以對數(shù)據(jù)進(jìn)行轉(zhuǎn)換、過濾、加密等操作。網(wǎng)關(guān)在計(jì)算機(jī)網(wǎng)絡(luò)中起著重要...
ip子網(wǎng)掩碼和 網(wǎng)關(guān) 的區(qū)別?1、子網(wǎng)掩碼(subnetmask)又叫網(wǎng)絡(luò)掩碼、地址掩碼、子網(wǎng)絡(luò)遮罩,它是一種用來指明一個(gè)IP地址的哪些位標(biāo)識的是主機(jī)所在的子網(wǎng),以及哪些位標(biāo)識的是主機(jī)的位掩碼...
wifi 網(wǎng)關(guān) 入口?WiFi網(wǎng)關(guān)入口是指使用無線網(wǎng)絡(luò)連接設(shè)備連接互聯(lián)網(wǎng)的門戶。通常,WiFi網(wǎng)關(guān)入口是一個(gè)路由器或者調(diào)制解調(diào)器,它們充當(dāng)設(shè)備和Internet之間的橋梁,將無線信號轉(zhuǎn)化為...
WIFI 網(wǎng)關(guān) 什么意思?WIFI網(wǎng)關(guān)又稱網(wǎng)間連接器、協(xié)議轉(zhuǎn)換器。網(wǎng)關(guān)在網(wǎng)絡(luò)層以上實(shí)現(xiàn)網(wǎng)絡(luò)互連,是最復(fù)雜的網(wǎng)絡(luò)互連設(shè)備,僅用于兩個(gè)高層協(xié)議不同的網(wǎng)絡(luò)互連。網(wǎng)關(guān)既可以用于廣域網(wǎng)互連...
網(wǎng)關(guān) 有什么用?網(wǎng)關(guān)(Gateway)是計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)中的一個(gè)重要組件,位于兩個(gè)或多個(gè)網(wǎng)絡(luò)之間,用來連接和傳遞數(shù)據(jù)。網(wǎng)關(guān)具有以下幾個(gè)主要的功能和用途:1.數(shù)據(jù)轉(zhuǎn)發(fā)與路由...
網(wǎng)關(guān) 怎么填?第一項(xiàng):IP地址IP地址通常是自己自由指定的,但是也有嚴(yán)格的限制IP地址需要和網(wǎng)關(guān)在同一個(gè)IP段,例如:默認(rèn)網(wǎng)關(guān)為192.168.1.1那么IP地址就需要填寫192.168.1...
網(wǎng)關(guān) 與防火墻的區(qū)別?防病毒網(wǎng)關(guān)是網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)防范層面,防火墻系統(tǒng)是應(yīng)用軟件的防護(hù)層面。2.一般認(rèn)為防病毒網(wǎng)關(guān)包括以病毒掃描為首要的代理服務(wù)器;以及需要與防火墻配合使用...