Spring Cloud的無伺服器函式Bean簡介

banq發表於2018-10-29

Spring Cloud雲函式可以實現無伺服器功能,快速瀏覽Spring Cloud 2.0提供的一些改進,包括更快的啟動和“全函式”的能力。而且,由於它是在Spring Boot之上構建的,因此不再需要servlet容器。Spring Cloud Function 2.0是基於Spring Boot 2.1和Spring Framework 5.1以上版本實現,不同於傳統的Bean的定義,顯著改善了在無伺服器架構中的冷啟動效能。

下面是1.0版本的Spring的雲函式功能應用,透過@Configuration和@Bean等宣告式註解一起實現:

@SpringBootApplication
public class DemoApplication {

  @Bean
  public Function<String, String> uppercase() {
    return value -> value.toUpperCase();
  }

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

}

可以在AWS Lambda中執行,還支援 Azure FunctionsApache OpenWhisk,以及其他無伺服器支援(例如Oracle FnRiff)。

將spring-cloud-function-starter-web放在類路徑中,就能訪問端點:
$ curl localhost:8080 -d foo
返回的是大寫FOO,說明上面程式碼中@Bean註解的函式轉換功能起作用了。

1.0中Web介面卡是使用Spring MVC實現的,這樣你就需要啟動一個Servlet容器才能執行Spring MVC。在Spring Cloud Function 2.0中,如果想使用Servlet容器,預設伺服器是netty;還可以使用Webflux - 只需包含 spring-cloud-starter-function-webflux依賴項。

在2.0中,雲函式功能實現程式碼有所區別:

@SpringBootConfiguration
public class DemoApplication
    implements ApplicationContextInitializer<GenericApplicationContext> {

  public static void main(String args) {
    FunctionalSpringApplication.run(DemoApplication.class, args);
  }

  public Function<String, String> uppercase() {
    return value -> value.toUpperCase();
  }

  @Override
  public void initialize(GenericApplicationContext context) {
    context.registerBean("demo", FunctionRegistration.class,
        () -> new FunctionRegistration<>(uppercase())
            .type(FunctionType.from(String.class).to(String.class)));
  }

}


主要區別是:
  • 主要實現類是ApplicationContextInitializer。
  • @Bean方法已被轉換為呼叫context.registerBean()
  • @SpringBootApplication已被替換@SpringBootConfiguration,表示不會讓Spring啟動後實現自動配置,但是仍然標記這個類作為一個啟動“入口點”。
  • SpringApplication已經被替換為FunctionalSpringApplication,這是雲功能新類(SpringApplication的一個子類)。


在Spring Cloud Function應用程式中註冊的業務邏輯bean屬於型別FunctionRegistration。這是一個包裝器,包含有關輸入和輸出型別的函式和資訊。在@Bean應用程式的形式中,資訊可以反射性地匯出,但在函式bean註冊中,除非我們使用FunctionRegistration,否則其中一些資訊會丟失。

還有一種方法是使應用自己直接實現Function (或Consumer 或Supplier):

@SpringBootConfiguration
public class DemoApplication implements Function<String, String> {

  public static void main(String args) {
    FunctionalSpringApplication.run(DemoApplication.class, args);
  }

  @Override
  public String apply(String value) {
    return value.toUpperCase();
  }

}



Spring Boot在函式功能bean註冊方面執行良好 - Spring Cloud Function在Spring Boot基礎上構建和執行 - 但Spring Boot中的一些最有用的功能,即自動配置,都是以非函式性方式編碼的。與整個Spring Boot相比,大多數Spring Cloud Function應用程式的範圍相對較小,因此我們可以輕鬆地將其適應這些功能bean定義。



 

相關文章