1.gateway和zuul
Spring Cloud Finchley版本的gateway比zuul 1.x系列的效能和功能整體要好,且使用 Gateway 做跨域相比應用本身或是 Nginx 的好處是規則可以配置的更加靈活。Spring Cloud大型企業分散式微服務雲架構原始碼請加一七九一七四三三八零
這兩者相同的地方就是都是作為閘道器,處理前段的請求,可以進行路由到對應的服務或者url,也可以針對許可權做過濾處理,也可以對其他服務響應的結果做處理。
2.簡單使用gateway
有兩種方式配置,一種是配置檔案application的方式,一種是程式碼配置
a.application配置:
a. 路由到其他地址
spring:
cloud:
gateway:
#可以根據請求引數,cookie,host,請求時間,請求頭等進行校驗判斷路由, 下面根據先後順序轉發
routes:
- id: host_route
uri: http://httpbin.org:80/get
predicates:
- Path=/zzzgd/** # 請求地址攜帶zzzgd的,則轉發
複製程式碼
在spring.cloud.gateway.routes中,我們可以根據不同的謂語配置不同的路由,根據配置的先後順序來跳轉,越在前面優先順序越高.
其中id,區分不同的路由規則,不可重複,uri,指需要跳轉的地址,Predicates就是上面說的謂語了,可以配置多個,使用正則匹配. 這裡我們配置的是如果請求地址攜帶zzzgd則會跳轉到我們配置的uri。
配置好gateway,重新啟動,然後我們呼叫localhost:8088(閘道器的地址和埠)/zzzgd/abc,這個地址是沒有任何匹配的介面的,按理來說會返回404,但是配置了閘道器就返回了這些資訊,這個是我們配置的uri所返回的:
{
"args": {
"name": "zgd"
},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close",
"Cookie": "SL_G_WPT_TO=zh; SL_GWPT_Show_Hide_tmp=undefined; SL_wptGlobTipTmp=undefined",
"Forwarded": "proto=http;host=\"localhost:8088\";for=\"0:0:0:0:0:0:0:1:55782\"",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
"X-Forwarded-Host": "localhost:8088"
},
"origin": "0:0:0:0:0:0:0:1, 119.147.213.42",
"url": "http://localhost:8088/get?name=zgd"
}
複製程式碼
上面的是根據地址來路由,還有下面多種路由配置:
根據域名來轉發路由:
routes:
- id: host_route
uri: http://httpbin.org:80/get
predicates:
- Host=**.csdn.** # 請求域名攜帶csdn的,則轉發
- id: query_route
uri: http://httpbin.org:80/get
predicates:
- Query=username, zzz* # 請求引數含有username,且值滿足zzz開頭的,則轉發(對值的匹配可以省略)
- id: header_route
uri: http://httpbin.org:80/get
predicates:
- Header=request, \d+ # 如果請求頭含有request,且為數字,則轉發
- id: cookie_route
uri: http://httpbin.org:80/get
predicates:
- Cookie=name, zzzgd # 如果攜帶cookie,引數名為name,值為zzzgd,則轉發
- id: path_route
uri: http://httpbin.org:80/get
predicates:
- Path=/zzzgd/** # 請求地址攜帶zzzgd的,則轉發
# 路由到其他服務,url需要用[lb://]+[serviceId]
- id: service_client
uri: lb://service-client
predicates:
- Path=/to_client/** # 如果請求地址滿足/to_client/**,則轉發到 service-client 服務
filters:
- StripPrefix=1 # 去除請求地址中的to_client
- id: after_route
uri: http://httpbin.org:80/get
predicates:
- After=2019-01-01T17:42:47.789-07:00[America/Denver] # 如果請求時間大於該時間,則轉發
複製程式碼
b. 路由到其他服務
我們知道,zuul是可以根據服務在eureka的serviceId,來將請求路由到不同的服務上,這也是閘道器最大的作用之一,gateway也可以
gateway可以通過開啟以下配置來開啟根據服務的serviceId來匹配路由,預設是大寫:
# 配置gateway路由
spring:
cloud:
gateway:
discovery:
locator:
# 是否可以通過其他服務的serviceId來轉發到具體的服務例項。預設為false
# 為true,自動建立路由,路由訪問方式:http://Gateway_HOST:Gateway_PORT/大寫的serviceId/**,其中微服務應用名預設大寫訪問
enabled: true
複製程式碼
開啟配置,重啟gateway,訪問 localhost:8088/SERVICE-CLIENT/hi?name=zgd,
正常返回了service-client的結果.
如果需要小寫serviceId,則配置spring.cloud.gateway.locator.lowerCaseServiceId:true
注意事項
不管小寫大寫,不能使用下劃線,否則會報:
org.springframework.cloud.gateway.support.NotFoundException: Unable to find instance for localhost
所以服務的 spring. application .name 必須用中劃線而不是下劃線
如果開啟了lowerCaseServiceId,則只能用小寫,不能識別大寫,如果不開啟,只能識別大寫
除了上面這種自動設定路由服務,也可以手動設定,在routes中配置
# 路由到其他服務,url需要用[lb://]+[serviceId]
- id: service_client
uri: lb://service-client
predicates:
- Path=/to_client/** # 如果請求地址滿足/to_client/**,則轉發到 service-client 服務
filters:
- StripPrefix=1 # 去除請求地址中的to_client
複製程式碼
這裡的uri不是一個具體的地址了,而是lb://開頭,加上serviceId 然後比如上面這個配置,我們 再呼叫 localhost:8088/to_client/hi?name=zgd
可以看到也正常收到了service-client的返回.說明我們呼叫到了這個服務.
這裡需要注意的一點,如果不加上filters.- StripPrefix=1,那麼則無法請求到hi這個介面.因為對於service-client,相當於收到的請求路徑是localhost:8090/to_client/hi?name=zgd,這個to_client只是為了閘道器的路由加上去的,不需要業務服務也收到這段地址,所以需要去掉。