Spring Cloud Gateway示例 | DevGlan

banq發表於2019-06-25

 這是討論了Spring cloud閘道器並使用它建立了一個演示應用程式。原始碼可以從github下載。

在這個實現中,我們將有2個不同的基於Spring Boot的微服務作為第一服務和第二服務。這些服務將自己註冊到發現伺服器。Spring雲閘道器將使用Netflix客戶端API發現服務並將請求路由到負載均衡的下游服務。

首先生成一個Spring Boot專案,選定的依賴項是Gateway,Hystrix和Actuator。我們還將在我們的pom中新增spring-cloud-starter-netflix-eureka-client依賴。

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


Spring雲路由配置
Route是閘道器的基本構建塊。它由ID,目標URI,謂詞集合和過濾器集合定義。如果聚合謂詞為真,則匹配路由。

Spring Cloud Gateway提供了許多內建路由謂詞工廠,如路徑,主機,日期/時間,方法,標題等。我們可以使用這些內建路由與and()或or()結合來定義我們的路由。一旦請求到達閘道器,閘道器所做的第一件事就是根據定義的謂詞將請求與每個可用路由進行匹配,並將請求路由到匹配的路由。

以下是我們的路由配置。我們為2個微服務定義了2條不同的路由 - 第一服務和第二服務。


@Configuration
public class BeanConfig {

    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/api/v1/first/**")
                        .filters(f -> f.rewritePath("/api/v1/first/(?.*)", "/${remains}")
                                .addRequestHeader("X-first-Header", "first-service-header")
                                .hystrix(c -> c.setName("hystrix")
                                        .setFallbackUri("forward:/fallback/first")))
                        .uri("lb://FIRST-SERVICE/")
                        .id("first-service"))

                .route(r -> r.path("/api/v1/second/**")
                        .filters(f -> f.rewritePath("/api/v1/second/(?.*)", "/${remains}")
                                .hystrix(c -> c.setName("hystrix")
                                        .setFallbackUri("forward:/fallback/second")))
                        .uri("lb://SECOND-SERVICE/")
                        .id("second-service"))
                .build();
    }

}

在上面的配置中,第一個路由與一個路徑匹配,該路徑的謂詞定義為匹配URL /api/v1/queue/**所有請求,然後這些多個過濾器(如rewritePath addRequestHeader)將應用啟用,這些都是由開箱即用的閘道器提供的內建過濾器。

rewritePath過濾器採用路徑regexp引數和替換引數;AddRequestHeader GatewayFilter Factory接受名稱和值引數,並在請求中新增已配置的標頭引數;Hystrix GatewayFilter Factory需要單個名稱引數,該引數是HystrixCommand的名稱。請求將被轉發到與fallbackUri引數匹配的控制器。

下面是一個等效的application.yaml配置:

spring
    cloud:
        gateway:
          routes:
          - id: first-service
            uri: lb://FIRST-SERVICE
            predicates:
            - Path=/api/v1/first/**
            filters:
            - RewritePath=/api/v1/first/(?.*), /$\{remains}
            - AddRequestHeader=X-first-Header, first-service-header
            - name: Hystrix
                args:
                  name: hystrix
                  fallbackUri: forward:/fallback/first




Spring Cloud Gateway應用程式配置
下面是我們的application.yaml檔案。

hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds:2000 
spring:
  application:
    name:api-gateway 

server:
  port:8088 

eureka:
  client:
    serviceUrl:
      defaultZone:http :// localhost :8761 / eureka 
    register-with- eureka:false 
  instance:
    preferIpAddress:true 

management:
  endpoints:
    web:
      exposure:
        include:hystrix.stream




Hystrix fallback 命令
下面是我們的控制器實現,其端點將在我們的微服務失敗時被呼叫。


@RestController 
@RequestMapping(“/ fallback”)
public class HystrixController { 

    @GetMapping(“/ first”)
    public String firstServiceFallback(){ 
        return“這是第一個服務的後備。”; 
    } 

    @GetMapping(“/ second”)
    public String secondServiceFallback(){ 
        return“Second Server overloaded!請在一段時間後再試。”; 
    } 
}

 

相關文章