Spring Cloud的無伺服器函式Bean簡介
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 <b>public</b> <b>class</b> DemoApplication { @Bean <b>public</b> Function<String, String> uppercase() { <b>return</b> value -> value.toUpperCase(); } <b>public</b> <b>static</b> <b>void</b> main(String args) { SpringApplication.run(DemoApplication.<b>class</b>, args); } }
可以在AWS Lambda中執行,還支援ofollow,noindex" target="_blank">Azure Functions 和Apache OpenWhisk ,以及其他無伺服器支援(例如Oracle Fn 和Riff )。
將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 <b>public</b> <b>class</b> DemoApplication implements ApplicationContextInitializer<GenericApplicationContext> { <b>public</b> <b>static</b> <b>void</b> main(String args) { FunctionalSpringApplication.run(DemoApplication.<b>class</b>, args); } <b>public</b> Function<String, String> uppercase() { <b>return</b> value -> value.toUpperCase(); } @Override <b>public</b> <b>void</b> initialize(GenericApplicationContext context) { context.registerBean(<font>"demo"</font><font>, FunctionRegistration.<b>class</b>, () -> <b>new</b> FunctionRegistration<>(uppercase()) .type(FunctionType.from(String.<b>class</b>).to(String.<b>class</b>))); } } </font>
主要區別是:
- 主要實現類是ApplicationContextInitializer。
- @Bean方法已被轉換為呼叫context.registerBean()
- @SpringBootApplication已被替換@SpringBootConfiguration,表示不會讓Spring啟動後實現自動配置,但是仍然標記這個類作為一個啟動“入口點”。
- SpringApplication已經被替換為FunctionalSpringApplication,這是雲功能新類(SpringApplication的一個子類)。
在Spring Cloud Function應用程式中註冊的業務邏輯bean屬於型別FunctionRegistration。這是一個包裝器,包含有關輸入和輸出型別的函式和資訊。在@Bean應用程式的形式中,資訊可以反射性地匯出,但在函式bean註冊中,除非我們使用FunctionRegistration,否則其中一些資訊會丟失。
還有一種方法是使應用自己直接實現Function (或Consumer 或Supplier):
@SpringBootConfiguration <b>public</b> <b>class</b> DemoApplication implements Function<String, String> { <b>public</b> <b>static</b> <b>void</b> main(String args) { FunctionalSpringApplication.run(DemoApplication.<b>class</b>, args); } @Override <b>public</b> String apply(String value) { <b>return</b> value.toUpperCase(); } }
Spring Boot在函式功能bean註冊方面執行良好 - Spring Cloud Function在Spring Boot基礎上構建和執行 - 但Spring Boot中的一些最有用的功能,即自動配置,都是以非函式性方式編碼的。與整個Spring Boot相比,大多數Spring Cloud Function應用程式的範圍相對較小,因此我們可以輕鬆地將其適應這些功能bean定義。