【SpringBoot】SpringBoot2.0響應式編程

========================1五、高級篇幅之SpringBoot2.0響應式編程 ================================html

 

一、SprinBoot2.x響應式編程簡介
簡介:講解什麼是reactive響應式編程和使用的好處java

一、基礎理解:
依賴於事件,事件驅動(Event-driven)
一系列事件稱爲「流」
異步
非阻塞react

觀察者模式web

網上的一個例子:
int b= 2;
int c=3
int a = b+c //命令式編程後續b和c變化,都不影響a
b=5;redis

int b= 2;
int c= 3
int a = b+c //響應式編程中,a的變化,會和b、c的變化而變化(事件驅動)
b=5;spring

二、官網:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux
SpingBoot2底層是用spring5,開始支持響應式編程,Spring又是基於Reactor試下響應式。編程

 

學習資料
一、reactive-streams學習資料:http://www.reactive-streams.org/
二、web-flux相關資料:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webfluxapi

 

 

 

 

二、SpringBoot2.x響應式編程webflux介紹
簡介:講解SpringBoot2.x響應式編程介紹 Mono、Flux對象和優缺點

一、Spring WebFlux是Spring Framework 5.0中引入的新的反應式Web框架
與Spring MVC不一樣,它不須要Servlet API,徹底異步和非阻塞,並 經過Reactor項目實現Reactive Streams規範。
RxJava數組

 

二、Flux和Mono User List<User>
1)簡單業務而言:和其餘普通對象差異不大,複雜請求業務,就能夠提高性能
2)通俗理解:
Mono 表示的是包含 0 或者 1 個元素的異步序列
mono->單一對象 User redis->用戶ID-》惟一的用戶Mono<User>

Flux 表示的是包含 0 到 N 個元素的異步序列
flux->數組列表對象 List<User> redis->男性用戶->Flux<User>
Flux 和 Mono 之間能夠進行轉換app


三、Spring WebFlux有兩種風格:基於功能和基於註解的。基於註解很是接近Spring MVC模型,如如下示例所示:
第一種:
@RestController
@RequestMapping(「/ users」)
public class MyRestController {

@GetMapping(「/ {user}」)
public Mono <User> getUser( @PathVariable Long user){
// ...
}

@GetMapping(「/ {user} / customers」)
public Flux <Customer> getUserCustomers( @PathVariable Long user){
// ...
}

@DeleteMapping(「/ {user}」)
public Mono <User> deleteUser( @PathVariable Long user){
// ...
}

}
第二種: 路由配置與請求的實際處理分開
@Configuration
public class RoutingConfiguration {

@Bean
public RouterFunction <ServerResponse> monoRouterFunction(UserHandler userHandler){
return route(GET( 「/ {user}」).and(accept(APPLICATION_JSON)),userHandler :: getUser)
.andRoute(GET(「/ {user} / customers」).and(accept(APPLICATION_JSON)),userHandler :: getUserCustomers)
.andRoute(DELETE(「/ {user}」).and(accept(APPLICATION_JSON)),userHandler :: deleteUser);
}

}

@Component
public class UserHandler {

公共 Mono <ServerResponse> getUser(ServerRequest請求){
// ...
}

public Mono <ServerResponse> getUserCustomers(ServerRequest request){
// ...
}

公共 Mono <ServerResponse> deleteUser(ServerRequest請求){
// ...
}
}

 

四、Spring WebFlux應用程序不嚴格依賴於Servlet API,所以它們不能做爲war文件部署,也不能使用src/main/webapp目錄

五、能夠整合多個模板引擎
除了REST Web服務外,您還可使用Spring WebFlux提供動態HTML內容。Spring WebFlux支持各類模板技術,包括Thymeleaf,FreeMarker

 


三、SpringBoot2.x webflux實戰
簡介:webflux響應式編程實戰

一、WebFlux中,請求和響應再也不是WebMVC中的(Http)ServletRequest和(Http)ServletResponse,而是ServerRequest和ServerResponse

二、加入依賴,若是同時存在spring-boot-starter-web,則會優先用spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

測試
localhost:8080/api/v1/user/test

 

三、啓動方式默認是Netty,8080端口

 

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/api/v1/user")
public class UserController {
    @GetMapping("/test")
    public Mono<String> test(){
        return Mono.just("hello xiaod");
    }
}
controller

 

四、參考:https://spring.io/blog/2016/04/19/understanding-reactive-types

 

package com.example.demo.service;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.example.demo.domain.User;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Service
public class UserService {
private static final Map<String, User> dataMap = new HashMap<>();
    
    static{
        dataMap.put("1", new User("1", "小X老師"));
        dataMap.put("2", new User("2", "小D老師"));
        dataMap.put("3", new User("3", "小C老師"));
        dataMap.put("4", new User("4", "小L老師"));
        dataMap.put("5", new User("5", "小A老師"));
        dataMap.put("6", new User("6", "小S老師"));
        dataMap.put("7", new User("7", "小S老師"));
    }
    public Flux<User> list(){
        Collection<User> list=UserService.dataMap.values();
        return Flux.fromIterable(list);
    }
    public Mono<User> getById(final String id){
        return Mono.justOrEmpty(UserService.dataMap.get(id));
    }
    public Mono<User> del(final String id){
        return Mono.justOrEmpty(UserService.dataMap.remove(id));
    }
    
}
service
package com.example.demo.controller;

import java.time.Duration;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.domain.User;
import com.example.demo.service.UserService;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/api/v1/user")
public class UserController {
     private UserService userService;


    public UserController(final UserService userService) {
        this.userService = userService;
    }
    
    
    @GetMapping("/test")
    public Mono<String> test(){
        return Mono.just("hello xiaod");
    }
    @GetMapping("find")
    public Mono<User> findByid(final String id){
        return userService.getById(id);
    }
    
    
    /**
     * 功能描述:刪除用戶
     * @param id
     * @return
     */
    @GetMapping("del")
    public Mono<User> del(final String id){
        return userService.del(id);
    }
    @GetMapping(value="list",produces=MediaType.APPLICATION_STREAM_JSON_VALUE)
    public Flux<User> list(){
        return userService.list().delayElements(Duration.ofSeconds(2));
    }
}
controller

能夠用於服務推送

 

 

 

 

 

 


四、WebFlux客戶端WebClient講解
簡介:講解SpringBoot2.x WebFlux客戶端WebClient的介紹和使用
一、反應式客戶端

官網地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webclient

相關文章
相關標籤/搜索