天天看點

SpringCloud進階-整合Spring Cloud Gateway網關入門實操

作者:架構師面試寶典
SpringCloud進階-整合Spring Cloud Gateway網關入門實操

Spring Cloud Gateway 是Spring 基于Spring5.0、SpringBoot2.0和Project Reactor等技術開發的微服務網關服務。是為Spring Cloud 微服務提供簡單高效的API路由管理方式。作為Spring Cloud微服務生态系統中的網關服務,目标就是為了能替代Netflix的Zuul網關的存在,在提供了路由網關的基礎上,通弄過Filter的方式提供了一些其他的功能例如:接口安全、服務監控、服務埋點、服務限流等功能。

下面我們就來通過一個簡單的例子來看一下Spring Cloud Gateway的工作原理。

建立項目

第一步、我們來建立一個Spring Cloud Gateway的Maven項目,并且引入Spring Cloud Gateway相關的依賴。如下所示。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>           

第二步、隻需要設定一個主啟動類即可

@SpringBootApplication
public class GatewayApplication {
	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}
}
           

到這裡,也許會有人問是不是這個項目這樣搭建得有點太簡單了,我們如何來實作路由的轉發呢?下面我們就來看看如何實作路由轉發操作

路由轉發示例

我們可以在配置檔案中添加如下的配置來實作路由轉發功能。

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://www.baidu.com
        predicates:
        - Path=/test           

添加完這個配置之後,我們如果我們通路了http://localhost:8080/test這個時候,我們的路由就會被轉發到百度的首頁上去了,如果要通路多級的Path路徑,隻需要在對應的配置路徑下加上 * 就可以了。例如

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://www.baidu.com
        predicates:
        - Path=/test/**	           

這樣一來,上面的配置就可以支援多級Path的通路例如我們可以通過http://localhost:8080/test/iamge,http://localhost:8080/test/fanyi等等路徑進行通路。

這裡我們看到,在我們配置調用的過程中所有的通路都是在http://www.baidu.com上進行通路的,但是在實際的微服務場景中,我們的後端需要通路的服務有很多的微服務組成,而這些微服務都被我們統一管理在Eureka注冊中心,那麼我們如何才能調用注冊中心中的服務呢?

整合Eureka路由

需要整合Eureka首先需要将這個網關作為一個服務注冊到Eureka注冊中心。是以需要在POM檔案中添加Eureka用戶端相關的依賴,如下。

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>           

添加完對應的依賴之後我們就可以對配置檔案進行修改了。

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/user-service/**           

我們可以通過在Eureka中配置的服務名稱來進行調用,這種調用方式在之前的例子中我們也有使用到。在uri中是以lb://開頭,表示這裡可能還會用到負載均衡相關的内容,這個在後續的文章中我們也會提到。

在Zuul 中會對所有的服務都進行轉發,在調用的時候隻需要指定需要通路的服務就可以完成調用。通過這個方式就不需要再為每個服務都配置轉發的規則了,當需要添加新的服務上去的時候也不需要配置路由規則以及重新開機網關等操作。

既然Spring Cloud Gateway是旨在替代Zuul,那麼就一定也會有同樣的支援。那麼我們如何來實作整合Eureka的預設路由操作呢?

整合Eureka的預設路由

要開啟Spring Cloud Gateway的預設路由操作需要進行如下的配置設定,這裡我們進行了兩個配置的修改,第一是支援預設路由的配置、第二則是開啟大小寫服務。

server:
  port: 8080
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/user-service/**           

大小寫服務對服務的調用影響還是蠻大的,如果從Zuul改造到使用了Spring Cloud Gateway之後服務位址也會有很多的變化而大小寫服務則是提供了開發者一個預設的服務配置支援操作。完成配置之後,我們就可以通過小寫配置來進行通路。

這裡需要注意的是開啟了大小寫服務之後 ,就隻能用小寫服務名進行調用,而不能再使用大寫服務名進行調用。

總結

通過上面的例子,我們簡單的了解了Spring Cloud Gateway的使用,并且也了解Spring Cloud Gateway如何整合Eureka進行服務的調用配置,在後續的文章中還會對Gateway進行深入的介紹,期待大家的關注與支援。