目錄
代碼地址:代碼地址
一:Zuul的簡介
Zuul是Netflix開源的微服務網關,它可以和Eureka,Ribbon,Hystrix等組合使用。Zuul的核心是一系列的過濾器,這些過濾器完成以下功能。
1:身份認證與安全;識別每個資源的驗證要求,並拒絕那些與要求不符合的請求。
2:審查與監控;在邊緣位置追蹤有意義的數據並統計結果,從而帶來精確的生產視圖。
3:動態路由;動態將請求路由到不通的後邊的集羣。
4:壓力測試;逐漸增加指向集羣的流量,以瞭解性能。
5:負載均衡;爲每一種負載類型分配對應的容量,並棄用超出限定值的請求。
6;靜態響應處理;在邊緣位置直接建立部分響應,從而避免其轉發到內部集羣。
7;多區域彈性;闊約AWS Region進行請求路由,旨在實現ELB(Elastic Load Balancing),使用的多樣化,以及讓系統的邊緣更貼近系統的使用者。
SpringCloud對Zuul進行了整合與增強。目前Zuul使用默認Http客戶端是Apache Http Client.也可以使用RestClient。如果想使用RestClient,可以設置ribbon.restclient.enabled=true.
網關提供的主要功能就是:過濾和路由和限流。
其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎.
Zuul和Eureka進行整合,將Zuul自身註冊爲Eureka服務治理下的應用,同時從Eureka中獲得其他微服務的消息,也即以後的訪問微服務都是通過Zuul跳轉後獲得.
引入Zuul之後,請求流程就變成如下圖所示:
請求先到Zuul網關,然後會進行身份驗證,如果通過再進行路由請求後面的服務。
二:使用Zuul。
Zuul也是獨立的服務。我們在之前Eureka,Ribbon,hystrix,Feign上的基礎上繼續添加。這些內容可以查看前幾天的博客。
1:新建一個zuul的模塊,我命名爲gateway。引入依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2:啓動類上添加註解:@EnableZuulProxy 。還有一個註解@EnableZuulServer,不使用它因爲它開啓的過濾器比前一個少。
@SpringBootApplication
@EnableZuulProxy
public class GateWayApplication {
public static void main(String[] arsg){
SpringApplication.run(GateWayApplication.class);
}
}
3:配置路由規則
我們以後訪問微服務,就不把各個微服務的模塊的地址暴露出來了,而是隻暴露Zuul的地址,由它來路由需要訪問的服務ip
因此我們需要配置各個微服務模塊的路由規則,我們之前直接訪問的消費者模塊按如下路由規則配置。
我們需要在application.yml中配置:zuul:routes屬性,從上圖中可以看出,這個屬性的值是個map,map的key我們可以自己定義,value是個對象ZuulRoute,我們可以配置的屬性見上圖類的聲明。
路由規則可以分如下幾種配置方式:
寫死的url配置:
server:
port: 10010
zuul:
routes:
consumer-server: #自定義的key
path: /consumer_service/** #對象ZuulRoute中path屬性,自定義。用於瀏覽器訪問
url: http://127.0.0.1:8012 #對象ZuulRoute中url屬性,路由到的地址,注意前面帶http/https
這樣我們可以使用如下地址訪問消費者服務了: http://localhost:10010/consumer_service/getFeign/1
消費者服務controller中方法如下:
@GetMapping("/getFeign/{id}")
public String getAllproduct(@PathVariable Long id){
return productFeginInterface.getAllProducts(id);
}
上面這種配置顯然不夠好,因爲url地址寫死了,如果有多個地址比如集羣,寫起來很麻煩。
面向服務的配置:
我們可以配置路由地址,直接路由到對應的服務,底層是zuul從Eureka中心拉取服務列表,然後進行路由。這就需要我們gateway模塊也註冊到註冊中心(EurekaServer)。
1:因此在gateway模塊引入Eureka的客戶端。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-autoconfigure</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
2:當前模塊註冊到註冊中心。
eureka:
client:
service-url:
defaultZone: http://localhost:8010/eureka/,http://localhost:8009/eureka/
instance:
prefer-ip-address: true
instance-id: 127.0.0.1:10010
spring:
application:
name: GATEWAY
3:面向對象路由,屬性就不再是url了,而是serviceId。故名思意,配置的是註冊中心中的服務id.
#2:面向服務的配置。我們把當前模塊註冊到Eureka註冊中心之後就可以直接路由服務了
zuul:
routes:
consumer-server: #自定義的key
path: /consumer_service/**
serviceId: EUREKA-SERVICE.CONSUMER
再看一下我們註冊中心已經註冊的服務列表。
訪問地址:http://localhost:10010/consumer_service/getFeign/1 一樣可以成功。
面向服務路由的簡化配置:
上面這個配置,雖然可以動態的路由到服務,但是配置方法還有一點不好,就是那個自定義的key,看起來很沒有必要,因爲不會用到它。至少我們不會。因此在寫法上有一種簡單的寫法,就是省略key。而是直接配置path和serviceId.只是配置成:serviceId: path
這裏說明一下,我前面所用的服務id都是帶 "."的,但是這樣我在gateway模塊路由的時候一直不成功,我把服務id改成如下內容,則可以註冊成功.
簡化配置如下:
#3.面向服務的簡化配置
zuul:
routes:
EUREKA-SERVICE-CONSUMER: /consumer_service/**
EUREKA-SERVICE-PRODUCER: /service_producer/**
這樣可以通過: http://localhost:10010/consumer_service/getFeign/1訪問資源。
三:路由前綴配置
上面我們的訪問地址中:http://localhost:10010/consumer_service 是一個路由地址是爲了路由真實的ip然後拼接後面getFeign得到真實的url。那我們可不可以把路由的路徑和真實的路徑一樣,不僅可以路由服務id還可以作爲真實的地址使用。這就需要配置路由前綴的東西。
1:配置stripPrefix屬性:去除前綴,默認爲true。會把path的屬性值只當成路由地址。改爲false後,會保留path中的屬性值作爲真實的路徑。
zuul:
routes:
service_consumer:
path: /getFeign/**
url: EUREKA-SERVICE-CONSUMER
stripPrefix: false
因此我們的訪問地址可以直接這樣:http://localhost:10010/getFeign/1
2:上面的屬性是對單個路由的配置,還有一個屬性可以配置全局的路由前綴。
#2:全局路由前綴
zuul:
routes:
EUREKA-SERVICE-CONSUMER: /consumer_service/**
prefix: /api #和下面這個屬性一起使用來定義全局前綴不去除,一般不太常用,視情況而定
strip-Prefix: false #