- ノンブロッキング(
InputStream
/OutputStream
→ 非ブロックモードのChannel
) - バックプレッシャー
- 非同期
参考:
- 昔から存在するSpringのWebフレームワーク
- サーブレットがベース
@RestController
public class HelloController {
@GetMapping("/hello")
public String getHello() {
return "Hello World";
}
@PostMapping("/hello")
public Hello postHello(@RequestBody final YourName yourName) {
return new Hello("Hello " + yourName.getName());
}
}
public final class YourName {
private final String name;
public YourName(@JsonProperty("name") final String name) {
this.name = Objects.requireNonNull(name);
}
public String getName() {
return name;
}
}
public final class Hello {
private final String message;
public Hello(@JsonProperty("message") final String message) {
this.message = Objects.requireNonNull(message);
}
public String getMessage() {
return message;
}
}
- Spring Frameworkでリアクティブシステムを構築するためのWebフレームワーク
- Reactor(
Flux
/Mono
) - Annotated ControllersとFunctional Endpoints
https://backpaper0.github.io/ghosts/reactive/
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> getHello() {
return Mono.just("Hello World");
}
@PostMapping("/hello")
public Mono<Hello> postHello(@RequestBody final YourName yourName) {
return Mono.just(yourName.getName())
.map(name -> "Hello " + name)
.map(Hello::new);
}
}
public class HelloHandler {
public Mono<ServerResponse> getHello(final ServerRequest request) {
return ServerResponse.ok().contentType(TEXT_PLAIN)
.syncBody("Hello Functional World");
}
public Mono<ServerResponse> postHello(final ServerRequest request) {
final var yourName = request.bodyToMono(YourName.class);
final var hello = yourName
.map(YourName::getName)
.map(name -> "HELLO " + name)
.map(Hello::new);
return ServerResponse.ok().contentType(APPLICATION_JSON)
.body(hello, Hello.class);
}
}
@Configuration
public class HelloRouter {
@Bean
public RouterFunction<ServerResponse> routerFunction() {
final var handler = handler();
return route()
.GET("/fn/hello", handler::getHello)
.POST("/fn/hello", handler::postHello)
.build();
}
@Bean
public HelloHandler handler() {
return new HelloHandler();
}
}
ThreadLocal
でDBコネクションやHttpServletRequest
を引回す、といった手法は捨て去る- 1リクエストを1トランザクションで囲む手法(トランザクションスクリプト)は捨て去る
for
やif
を使ったコードから、高階関数を使ったコードへ- 処理をキューに追加して、空いているスレッドで順次処理していくため(処理が関数だとキューに追加しやすい)
関数型プログラミングの世界へ入門するには:
- Scalaスケーラブルプログラミング
- 型無しラムダ計算を学ぶ(GroovyでFizzBuzzやってみた)
- リストを書く(
filter
map
flatMap
を定義してみる、flatMap
をベースにfilter
map
を定義してみる、foldLeft
を定義してみる、foldLeft
をベースにflatMap
を定義してみる)