Spring Cloud微服務架構從入門到會用(四)—服務網關Spring Cloud Gateway

前兩篇文章我們已經初步的完成了一個小型的微服務框架,有服務註冊中心,有訂單服務,也有庫存服務;訂單服務也能通過feign進行服務間調用庫存服務。那本文我們將引入服務網關Spring Cloud Gateway。

Spring Cloud Gateway旨在提供一種簡單而有效的方法來路由到API。Spring Cloud Gateway是基於Spring Framework5,Spring Boot 2.0構建的。Spring Cloud Gateway是Spring開發並用來替代Zuul的。Spring Cloud Gate是基於Spring Framework5的WebFlux實現的。

Zuul和Spring Cloud Gateway的對比大家請參考這篇文章:https://www.cnblogs.com/yizhishi/archive/2019/09/26/11588860.html

接下來我們開始引入Spring Cloud Gateway。

1. 創建網關服務module

按照第二篇文章創建一個module,起名爲server-gateway。

2. 修改pom文件,引入gateway

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

這裏我們同樣將gateway註冊到eureka。

3. 修改啓動類

@SpringBootApplication
@EnableEurekaClient
public class ServerGatewayApplication {

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

}

這裏只需要加上eureka客戶端的註解即可

4. 修改配置文件

server.port=10010
spring.application.name=server-gateway

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
eureka.instance.instance-id=${spring.application.name}:${server.port}

# 路由到app-storage服務
spring.cloud.gateway.routes[0].id=app-storage
spring.cloud.gateway.routes[0].uri=lb://APP-STORAGE
spring.cloud.gateway.routes[0].predicates[0]=Path=/storage/v1/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=2
# 路由到app-order服務
spring.cloud.gateway.routes[1].id=app-order
spring.cloud.gateway.routes[1].uri=lb://APP-ORDER
spring.cloud.gateway.routes[1].predicates[0]=Path=/order/v1/**
spring.cloud.gateway.routes[1].filters[0]=StripPrefix=2

這裏我們着重介紹下,怎麼配置路由,以app-storage爲例。

  • spring.cloud.gateway.routes[0].id 是配置這個路由唯一id
  • spring.cloud.gateway.routes[0].uri是配置uri也就是app-storage所在的服務,這裏使用lb://是代表採用負載均衡
  • spring.cloud.gateway.routes[0].predicates[0]是配置請求app-storage下所有接口的請求前綴
  • spring.cloud.gateway.routes[0].filters[0]是用來配置轉發到app-storage上的服務路徑時,要去掉兩個/的路徑。比如直接訪問app-storage的服務的路徑是http://ip:port/storage/deduct,我們這裏配置的是/storage/v1,那麼我們通過網關訪問的時候就是http://ip:port/storage/v1/storage/deduct,當網關轉發的時候,會去找app-storage服務下的storage/v1/storage/deduct接口,這個接口顯然是沒有的,只有storage/deduct接口,這個時候就需要去掉storage/v1,一共是兩個前綴,所以這兒要寫2.

好了,這裏我們就可以通過網關訪問app-storage和app-order服務了

5. 通過gateway訪問服務

依次啓動server-eureka,server-gateway,app-storage,app-order

訪問 http://127.0.0.1:10010/order/v1/order/placeOrder/commit ,我們上一篇文章寫好的下單接口。因爲我們加了請求前綴order/v1,所以再這裏要加上。

如果返回true,代表網關配置成功。

網關如果只是用來路由就沒有必要上Spring Cloud Gateway了,nginx就可以搞定了,路由僅僅是網關的基本本能,基於網關我們可以做接口鑑權,限流等。下一篇文章我們講講怎麼通過網關鑑權

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章