首先創建網關之前你要有幾個微服務的應用。這個我之前已經創建好了,沒有的先創建一個簡單的消費者,提供者,註冊中心的微服務。
1:通過IDEA 創建 項目,選擇Spring Initializr 點擊 next
2:選擇微服務名稱,路徑,點擊next,
3:這裏選擇下面2個選擇,選擇Eureka Discovery是因爲我們需要讓路由path不是映射具體的url,而是讓它映射到某給具體的服務當中,而具體的url則交給Eureka的服務發現機制去自動維護。
4:點擊生成後pxm文件如下圖所示:
當我們點開zuul依賴時我們會發現zuul核心依賴不僅包含
spring-cloud-netflix-zuul
還包含下面這些重要的依賴
spring-cloud-starter-netflix-hystrix:該依賴用來在網關服務實現對微服務轉發時的保護機制,通過線程隔離和斷路器,防止微服務的故障引發API網關的資源無法釋放,從而影響其他應用的對外服務
spring-cloud-starter-netflix-ribbon:該依賴用來實現在網關服務進行路由轉發時的客戶端負載均衡以及請求重試
5:在啓動類中加入註解
@EnableZuulProxy //開啓Zuul的API網關服務。
@EnableDiscoveryClient //將API註冊到註冊中心中去,同時也讓Zuul獲取的註冊中心的註冊清單,以實現通過path映射服務,在從服務中調用實例來請求轉發完整的路由機制。
這是我的yml文件配置:
server:
port: 8989
eureka:
client:
service-url:
defaultZone: http://server1:11000/eureka/,http://server2:12000/eureka/
spring:
application:
name: gateway
zuul:
routes:
server-consumer:
path: /consumer/**
ignored-services:
server-provider:
path: /provider/**
當我調用http://localhost:8989/consumer/MallBackground/productList這個路徑的時候,該url的consumer符合consumer的路由規則所用該路徑會被映射到serviceId爲server-consumer的服務的某給實例中去。
Zuul網關路徑匹配:
通配符 | 說明 |
---|---|
? | 匹配任意單個字符 |
* | 匹配任意數量的字符 |
** | 匹配任務數量的字符,支持多級目錄 |
示例:
URL路徑說明 | 說明 |
---|---|
/consumer/? |
它可以匹配/consumer/a,/consumer/b,/consumer/c |
/consumer/* | 它可以匹配/consumer/abc,/consumer/bac,/consumer/cba,但是無法匹配/consumer/abc/a |
/consumer/** | 它可以匹配/consumer/abc的目錄以外還可以匹配/consumer/abc/a,多級目錄 |
由於默認情況下所有Eureka上的服務都會Zuul自動創建映射關係來進行路由,這使我們有一些不希望被路由的服務也可能被外部訪問到,這個時候可以使用 下面的表達式來定義不創建路由的規則。
zuul:
ignored-services::
server-provider:
path: /provider/**
Zuul還提供了一個忽略表達式的參數
zuul:
ignored-patterns: /**/MallBackground/**
當我們訪問consumer/MallBackground/的路徑的時候由於符合ignored-patterns的規則所以不被正確路由,另外在使用時還需要注意他不是針對某個路由,而是對所有路由,所有設置的時候需要全面考慮URL的規則,防止不該被忽略的URL也忽略了
路由前綴:
放了方便路由規則增減前綴,Zuul提供了 Zuul.prefix參數來增減前綴
zuul:
prefix: /mall
本地跳轉:
Zuul實現了API網關功能中,還支持forward形式的服務端配置,實現方式 gateway 網關服務名,當發起
http://localhost:8989/mall/loca/hello/hello請求時,loca/hello的請求規則轉發到API網關以gateway/cookie/hello爲前綴的請求上
在API網關執行本地跳轉的時候,我們也要爲本地實現對應的接口,否則forward轉發也會因爲找不到請求返回404錯誤
zuul:
routes:
gateway:
path: /loca/hello/**
url: forward:/gateway/cookie
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/gateway")
public class gatewayController {
@GetMapping("cookie/hello")
public String hello(){
return "0";
}
}