1.Zuul概述
1.1.什么是Zuul

由于有如此眾多的客戶端和服務器,在您的云體系結構中包括一個API網關通常會很有幫助,網關可以負責保護和路由訊息,隱藏服務,限制負載以及許多其他有用的事情,Spring Cloud Gateway 使您可以精確控制API層,集成Spring Cloud服務發現和客戶端負載平衡解決方案以簡化配置和維護,
Zuul包含了對請求的路由和過濾兩個最主要的功能:
其中路由功能負責將外部請求轉發到具體的微服務實體上,是實作外部訪問統一入口的基礎,而過濾器功能則負責對請求的處理程序進行干預,是實作請求校驗,服務聚合等功能的基礎,Zuul和Eureka進行整合,將Zuul自身注冊為Eureka服務治理下的應用,同時從Eureka中獲得其它微服務的訊息,也即以后的訪問微服務都是通過Zuul跳轉后獲得,
注意:Zuul服務最侄訓是會注冊進Eureka,
1.2.Zuul的作用
Zuul有三大功能:
- 代理
- 路由
- 過濾
其中路由和過濾是Zuul的主要功能,
2.Zuul的基本配置
專案工程基于原專案: springcloud_hello ,可以查看我之前的博客,這里基于zuul新創建一個springcloud-zuul-gateway-9527的Module模塊,

2.1.匯入pom.xml依賴
匯入相關pom依賴包:
<!--zuul組件、zuul需要注冊至eureka中--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> <version>1.4.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.6.RELEASE</version> </dependency> <!--actuator:完善監控資訊--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--引入hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.6.RELEASE</version> </dependency> <!--需要拿到物體類,引入api module--> <dependency> <groupId>com.fengye</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--jetty服務器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <!--熱部署工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
2.2.配置application.yml
server:
port: 9527 #埠資訊
#spring的配置
spring:
application:
name: springcloud-zuul-gateway #注冊進eureka中的實體名稱(顯示大寫)
#eureka的配置,確定客戶端服務注冊到eureka服務串列內
eureka:
client:
service-url:
#集群配置
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: gateway-9527.com #修改eureka上默認的服務描述資訊
prefer-ip-address: true #訪問路徑可以顯示ip地址
#info配置
info:
app.name: fengye-springcloud
company.name: blog.fengye.com
build.artifactId: $project.artifactId$
build.version: $project.version$
這里在本機單機電腦上測驗,增加了hosts檔案配置:

2.3.撰寫啟動項
新建啟動項配置,增加@EnableZuulProxy注解,表示網關代理:
@SpringBootApplication @EnableZuulProxy //增加zuul網關代理支持 public class Zuul_9527_StartSpringCloudApp { public static void main(String[] args) { SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args); } }
2.4.啟動測驗
需要啟動三個Eureka注冊中心集群、一個服務提供者dept-8001、一個zuul 9527路由網關:

啟動后訪問:http://eureka7001.com:7001/,可以看到zuul網關服務已經注冊進了Eureka注冊中心,

路由訪問測驗,訪問服務提供者的介面地址:
①使用原來的Restful風格進行訪問:http://localhost:8001/dept/queryById/1

②使用API網關路由地址進行訪問:http://myzuul.com:9527/springcloud-provider-dept/dept/queryById/1

其中myzuul.com:9527為域名映射后的訪問地址+port埠號,springcloud-provider-dept為服務名稱(使用小寫),/dept/queryById/1是Restful風格的地址,
這樣就是用zuul對服務的請求訪問進行了最基本的配置,達到了可以使用Zuul進行訪問地址的配置,
3.Zuul訪問映射規則配置
基于上面的操作我們實作了zuul的基本配置,但是在實際開發中我們不想對外暴露出我們微服務的具體名稱,可能會自定義做一些安全訪問的策略,
那么就可以進行一些訪問規則的配置,zuul可以基于application.xml中一些自定義的簡單配置實作路由映射url地址自定義訪問,
3.1.zuul替換服務名配置
application.yml配置:
#避免真實服務名暴露,可以自定義修改,key-value形式,key:原真實服務名,value:自定義映射地址
zuul:
routes:
mydept.serviceId: springcloud-provider-dept #不暴露原來的服務名,將springcloud-provider-dept作為key替換
mydept.path: /mydept/** #現在的服務路徑修改為/mydept/**
before:http://myzuul.com:9527/springcloud-provider-dept/dept/queryById/1
after:http://myzuul.com:9527/mydept/dept/queryById/1
但是這樣after路徑與before路徑都能訪問:


3.2.Zuul忽略原服務名配置
如果我們要去除原來的地址,只保留我們想要映射的地址(單一入口)訪問,那么需要添加如下配置:
#避免真實服務名暴露,可以自定義修改,key-value形式,key:原真實服務名,value:自定義映射地址
zuul:
ignored-services: springcloud-provider-dept #原來的springcloud-provider-dept無效,使用新的
routes:
mydept.serviceId: springcloud-provider-dept #不暴露原來的服務名,將springcloud-provider-dept作為key替換
mydept.path: /mydept/** #現在的服務路徑修改為/mydept/**
可以看到真實的路徑已經被忽略:


實際開發中如果涉及多個微服務需要忽略配置:
ignored-services: "*" #多個微服務統一忽略原微服務名,使用現在給的value值
3.3.Zuul統一域名前綴配置
表示所有的請求訪問都要加上前綴/fengye才能訪問:
#避免真實服務名暴露,可以自定義修改,key-value形式,key:原真實服務名,value:自定義映射地址
zuul:
prefix: /fengye #統一路徑名前綴
ignored-services: springcloud-provider-dept #原來的springcloud-provider-dept無效,使用新的
routes:
mydept.serviceId: springcloud-provider-dept #不暴露原來的服務名,將springcloud-provider-dept作為key替換
mydept.path: /mydept/** #現在的服務路徑修改為/mydept/**

3.4.Zuul配置總結:
#避免真實服務名暴露,可以自定義修改,key-value形式,key:原真實服務名,value:自定義映射地址
zuul:
prefix: /fengye #統一路徑名前綴
ignored-services: springcloud-provider-dept #原來的springcloud-provider-dept無效,使用新的;使用"*"表示多個微服務統一忽略原微服務名,使用現在給的value值
routes:
mydept.serviceId: springcloud-provider-dept #不暴露原來的服務名,將springcloud-provider-dept作為key替換
mydept.path: /mydept/** #現在的服務路徑修改為/mydept/**
Zuul是SpringCloud Netflix Greenwich版本中Gateway的一種實作方式,目前隨著SpringCloud Alibaba的出現,Zuul網關實作已經隨SpringCloud切換到了Hoxton版本,
更多Zuul特性如攔截器請參閱以下博文及官方檔案:
Zuul官方檔案
本博客涉及示例代碼均已上傳至Github地址:
https://github.com/devyf/SpringCloud_Study
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272749.html
標籤:Java
