• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Spring WebFlux

武飞扬头像
xharvard
帮助1

传统的基于Servlet的Web框架,如Spring MVC,在本质上都是阻塞和多线程的,每个连接都会使用一个线程。在请求处理的时候,会在线程池中拉取一个工作者( worker )线程来对请求进行处理。同时,请求线程是阻塞的,直到工作者线程提示它已经完成为止。

首先webflux不是spring mvc的替代方案!webflux强调的是异步非阻塞,spring mvc强调的是同步阻塞,如果方案大部分偏向于非同步,则spring webflux才是首选。另外,如果依赖了大量阻塞式持久化 API 和网络 API,建议使⽤ Spring MVC。

WebMVC:springMvc构建在servlet api之上,因此需要Servlet容器(比如Tomcat)才能执行。使用的是同步阻塞式IO模型,每一个请求对应一个线程去处理。

WebFlux:spring webflux是一个异步非阻塞式的web框架,它能够充分利用多核cpu的硬件资源去处理大量的并发请求。

相同之处

都可以使用springmvc注解,如@Controller,方便我们在两个web框架中自由转换;

都可以使用tomcat,jetty,undertow, servlet容器(servlet 3.1 )

注意点:

spring mvc因为是使用的同步阻塞式,更方便开发人员编写功能,debug测试等,一般来说,如果spring mvc能够满足的场景,就尽量不要用webflux;

使用WebFlux有一个很有 意思的副作用, 即WebFlux 的默认嵌人式服务器是Netty而不是Tomcat。Netty 是一个异步 、事件驱动的服务器,非常适合Spring WebFlux这样的反应式Web框架。

Spring WebFlux的控制器方法要接受和返回反应式类型,如Mono和Flux,而不是领域类型和集合。
 

SpringWebflux 实现方式有两种:注解编程模型函数式编程模型

基于注解编程模型

该模型与Spring MVC很相似。甚至注解都一样。

搭建一个简易的Spring WebFlux工程:

1,到https://start.spring.io/ 创建spring boot工程,选择 Spring Reactive Web 依赖。

2,导入到IDEA,创建controller, service, entity 等包

3,创建entity

  1.  
    public class User {
  2.  
    private int id;
  3.  
    private String name;
  4.  
     
  5.  
    public User() {
  6.  
    }
  7.  
     
  8.  
    public User(int id, String name) {
  9.  
    this.id = id;
  10.  
    this.name = name;
  11.  
    }
  12.  
     
  13.  
    public int getId() {
  14.  
    return id;
  15.  
    }
  16.  
     
  17.  
    public void setId(int id) {
  18.  
    this.id = id;
  19.  
    }
  20.  
     
  21.  
    public String getName() {
  22.  
    return name;
  23.  
    }
  24.  
     
  25.  
    public void setName(String name) {
  26.  
    this.name = name;
  27.  
    }
  28.  
    }
学新通

4,创建service 这里使用map模拟数据库操作

  1.  
    public interface UserService {
  2.  
     
  3.  
    Mono<User> selectById(int id);
  4.  
     
  5.  
    Flux<User> selectAllUsers();
  6.  
     
  7.  
    Mono<Void> insertUser(Mono<User> user);
  8.  
    }
  9.  
     
  10.  
    @Repository
  11.  
    public class UserServiceImpl implements UserService {
  12.  
     
  13.  
    private static Map<Integer, User> users = new HashMap<>();
  14.  
     
  15.  
    public UserServiceImpl() {
  16.  
    users.put(1, new User(1, "刘备"));
  17.  
    users.put(2, new User(2, "曹操"));
  18.  
    users.put(3, new User(3, "孙权"));
  19.  
    }
  20.  
     
  21.  
    @Override
  22.  
    public Mono<User> selectById(int id) {
  23.  
    return Mono.just(users.get(id));
  24.  
    }
  25.  
     
  26.  
    @Override
  27.  
    public Flux<User> selectAllUsers() {
  28.  
    return Flux.fromIterable(users.values());
  29.  
    }
  30.  
     
  31.  
    @Override
  32.  
    public Mono<Void> insertUser(Mono<User> userMono) {
  33.  
    return userMono.doOnNext(user -> {
  34.  
    int id = users.size() 1;
  35.  
    users.put(id, user);
  36.  
    }).thenEmpty(Mono.empty());
  37.  
    }
  38.  
    }
学新通

5,创建controller

  1.  
    @RestController
  2.  
    public class UserController {
  3.  
     
  4.  
    @Autowired
  5.  
    private UserService userService;
  6.  
     
  7.  
    @GetMapping("/users/{id}")
  8.  
    public Mono<User> getUser(@PathVariable int id) {
  9.  
    return userService.selectById(id);
  10.  
    }
  11.  
     
  12.  
    @GetMapping("/users")
  13.  
    public Flux<User> getAllUsers() {
  14.  
    return userService.selectAllUsers();
  15.  
    }
  16.  
     
  17.  
    }
学新通

6,启动 SringBoot,这里修改了端口号为9999

  1.  
    "D:\Program Files\java\tsjdk64\bin\java.exe" -Dvisualvm.id=31217450973500 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1.2\lib\idea_rt.jar=64346:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\java\tsjdk64\jre\lib\charsets.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\access-bridge-64.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\cldrdata.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\dnsns.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\jaccess.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\localedata.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\nashorn.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunec.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunjce_provider.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunmscapi.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunpkcs11.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\zipfs.jar;D:\Program Files\java\tsjdk64\jre\lib\jce.jar;D:\Program Files\java\tsjdk64\jre\lib\jfr.jar;D:\Program Files\java\tsjdk64\jre\lib\jsse.jar;D:\Program Files\java\tsjdk64\jre\lib\management-agent.jar;D:\Program Files\java\tsjdk64\jre\lib\resources.jar;D:\Program Files\java\tsjdk64\jre\lib\rt.jar;D:\05_spring_dev\java-study\spring-webflux\target\classes;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-webflux\2.7.1\spring-boot-starter-webflux-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter\2.7.1\spring-boot-starter-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot\2.7.1\spring-boot-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-context\5.3.21\spring-context-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-aop\5.3.21\spring-aop-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-expression\5.3.21\spring-expression-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-autoconfigure\2.7.1\spring-boot-autoconfigure-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-logging\2.7.1\spring-boot-starter-logging-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\Program Files\apache-maven-3.6.3\repo\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\Program Files\apache-maven-3.6.3\repo\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\Program Files\apache-maven-3.6.3\repo\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\Program Files\apache-maven-3.6.3\repo\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\Program Files\apache-maven-3.6.3\repo\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Program Files\apache-maven-3.6.3\repo\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-json\2.7.1\spring-boot-starter-json-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\core\jackson-databind\2.13.3\jackson-databind-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\core\jackson-annotations\2.13.3\jackson-annotations-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\core\jackson-core\2.13.3\jackson-core-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.3\jackson-datatype-jdk8-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.3\jackson-datatype-jsr310-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.3\jackson-module-parameter-names-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-reactor-netty\2.7.1\spring-boot-starter-reactor-netty-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\io\projectreactor\netty\reactor-netty-http\1.0.20\reactor-netty-http-1.0.20.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-http\4.1.78.Final\netty-codec-http-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-common\4.1.78.Final\netty-common-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-buffer\4.1.78.Final\netty-buffer-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport\4.1.78.Final\netty-transport-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec\4.1.78.Final\netty-codec-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-handler\4.1.78.Final\netty-handler-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-http2\4.1.78.Final\netty-codec-http2-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver-dns\4.1.78.Final\netty-resolver-dns-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver\4.1.78.Final\netty-resolver-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-dns\4.1.78.Final\netty-codec-dns-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver-dns-native-macos\4.1.78.Final\netty-resolver-dns-native-macos-4.1.78.Final-osx-x86_64.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver-dns-classes-macos\4.1.78.Final\netty-resolver-dns-classes-macos-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport-native-epoll\4.1.78.Final\netty-transport-native-epoll-4.1.78.Final-linux-x86_64.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport-native-unix-common\4.1.78.Final\netty-transport-native-unix-common-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport-classes-epoll\4.1.78.Final\netty-transport-classes-epoll-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\projectreactor\netty\reactor-netty-core\1.0.20\reactor-netty-core-1.0.20.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-handler-proxy\4.1.78.Final\netty-handler-proxy-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-socks\4.1.78.Final\netty-codec-socks-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-web\5.3.21\spring-web-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-beans\5.3.21\spring-beans-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-webflux\5.3.21\spring-webflux-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-core\5.3.21\spring-core-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-jcl\5.3.21\spring-jcl-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\io\projectreactor\reactor-core\3.4.19\reactor-core-3.4.19.jar;D:\Program Files\apache-maven-3.6.3\repo\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar" org.xharavard.webflux.WebfluxApplication
  2.  
     
  3.  
    . ____ _ __ _ _
  4.  
    /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  5.  
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  6.  
    \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  7.  
    ' |____| .__|_| |_|_| |_\__, | / / / /
  8.  
    =========|_|==============|___/=/_/_/_/
  9.  
    :: Spring Boot :: (v2.7.1)
  10.  
     
  11.  
    2022-07-14 17:05:21.976 INFO 10060 --- [ main] o.xharavard.webflux.WebfluxApplication : Starting WebfluxApplication using Java 1.8.0-taishan on LAPTOP-N89I5VOK with PID 10060 (D:\05_spring_dev\java-study\spring-webflux\target\classes started by xhh in D:\05_spring_dev\java-study)
  12.  
    2022-07-14 17:05:21.978 INFO 10060 --- [ main] o.xharavard.webflux.WebfluxApplication : No active profile set, falling back to 1 default profile: "default"
  13.  
    2022-07-14 17:05:23.635 INFO 10060 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port 9999
  14.  
    2022-07-14 17:05:23.640 INFO 10060 --- [ main] o.xharavard.webflux.WebfluxApplication : Started WebfluxApplication in 2.045 seconds (JVM running for 2.394)

7,访问

浏览器输入:http://localhost:9999/users/1

返回  {"id":1,"name":"刘备"}


函数式编程模型

(1)在使用函数式编程模型操作时候,需要自己初始化服务器
(2)基于函数式编程模型时候,有两个核心接口:RouterFunction(实现路由功能,请求转发给对应的 handler)和 HandlerFunction(处理请求生成响应的函数)。核心任务定义两个函数式接口的实现并且启动需要的服务器。
(3)Spring WebFlux 请 求 和 响 应 不 再 是 ServletRequest 和 ServletResponse ,而是ServerRequest 和 ServerResponse
 

1,entity和service同之前一样

2,创建Handler

  1.  
    public class UserHandler {
  2.  
     
  3.  
    @Autowired
  4.  
    private final UserService userService;
  5.  
     
  6.  
    public UserHandler(UserService userService) {
  7.  
    this.userService = userService;
  8.  
    }
  9.  
     
  10.  
    public Mono<ServerResponse> getUserById(ServerRequest request) {
  11.  
    int userId = Integer.parseInt(request.pathVariable("id"));
  12.  
    //空值处理
  13.  
    Mono<ServerResponse> notFount = ServerResponse.notFound().build();
  14.  
    Mono<User> userMono = this.userService.selectById(userId);
  15.  
    return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(userMono, User.class)
  16.  
    .switchIfEmpty(notFount);
  17.  
    }
  18.  
     
  19.  
    public Mono<ServerResponse> getAllUsers(ServerRequest request) {
  20.  
    Flux<User> users = this.userService.selectAllUsers();
  21.  
    return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(users, User.class);
  22.  
    }
  23.  
    }
学新通

3,初始化服务器,编写 Router

  1.  
    public class Server {
  2.  
     
  3.  
    public static void main(String[] args) throws IOException {
  4.  
    Server server = new Server();
  5.  
    server.createReactorServer();
  6.  
    System.out.println("enter to exit");
  7.  
    System.in.read();
  8.  
    }
  9.  
     
  10.  
    // 创建路由
  11.  
    public RouterFunction<ServerResponse> routingFunction() {
  12.  
    UserService userService = new UserServiceImpl();
  13.  
    UserHandler userHandler = new UserHandler(userService);
  14.  
     
  15.  
    return RouterFunctions
  16.  
    .route(GET("/users/{id}").and(accept(MediaType.APPLICATION_JSON)), userHandler::getUserById)
  17.  
    .andRoute(GET("/users").and(accept(MediaType.APPLICATION_JSON)), userHandler::getAllUsers);
  18.  
    }
  19.  
     
  20.  
    // 创建服务器完成适配
  21.  
    public void createReactorServer() {
  22.  
    //路由和Handler适配
  23.  
    RouterFunction<ServerResponse> route = routingFunction();
  24.  
    HttpHandler httpHandler = toHttpHandler(route);
  25.  
    ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);
  26.  
     
  27.  
    //创建服务器
  28.  
    HttpServer httpServer = HttpServer.create();
  29.  
    httpServer.handle(adapter).bindNow();
  30.  
     
  31.  
    }
  32.  
    }
学新通

启动上述程序

  1.  
    "D:\Program Files\java\tsjdk64\bin\java.exe" -Dvisualvm.id=32992872873300 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1.2\lib\idea_rt.jar=65106:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\java\tsjdk64\jre\lib\charsets.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\access-bridge-64.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\cldrdata.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\dnsns.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\jaccess.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\localedata.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\nashorn.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunec.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunjce_provider.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunmscapi.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\sunpkcs11.jar;D:\Program Files\java\tsjdk64\jre\lib\ext\zipfs.jar;D:\Program Files\java\tsjdk64\jre\lib\jce.jar;D:\Program Files\java\tsjdk64\jre\lib\jfr.jar;D:\Program Files\java\tsjdk64\jre\lib\jsse.jar;D:\Program Files\java\tsjdk64\jre\lib\management-agent.jar;D:\Program Files\java\tsjdk64\jre\lib\resources.jar;D:\Program Files\java\tsjdk64\jre\lib\rt.jar;D:\05_spring_dev\java-study\spring-webflux\target\classes;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-webflux\2.7.1\spring-boot-starter-webflux-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter\2.7.1\spring-boot-starter-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot\2.7.1\spring-boot-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-context\5.3.21\spring-context-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-aop\5.3.21\spring-aop-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-expression\5.3.21\spring-expression-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-autoconfigure\2.7.1\spring-boot-autoconfigure-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-logging\2.7.1\spring-boot-starter-logging-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\Program Files\apache-maven-3.6.3\repo\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\Program Files\apache-maven-3.6.3\repo\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\Program Files\apache-maven-3.6.3\repo\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\Program Files\apache-maven-3.6.3\repo\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\Program Files\apache-maven-3.6.3\repo\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Program Files\apache-maven-3.6.3\repo\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-json\2.7.1\spring-boot-starter-json-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\core\jackson-databind\2.13.3\jackson-databind-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\core\jackson-annotations\2.13.3\jackson-annotations-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\core\jackson-core\2.13.3\jackson-core-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.3\jackson-datatype-jdk8-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.3\jackson-datatype-jsr310-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.3\jackson-module-parameter-names-2.13.3.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\boot\spring-boot-starter-reactor-netty\2.7.1\spring-boot-starter-reactor-netty-2.7.1.jar;D:\Program Files\apache-maven-3.6.3\repo\io\projectreactor\netty\reactor-netty-http\1.0.20\reactor-netty-http-1.0.20.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-http\4.1.78.Final\netty-codec-http-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-common\4.1.78.Final\netty-common-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-buffer\4.1.78.Final\netty-buffer-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport\4.1.78.Final\netty-transport-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec\4.1.78.Final\netty-codec-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-handler\4.1.78.Final\netty-handler-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-http2\4.1.78.Final\netty-codec-http2-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver-dns\4.1.78.Final\netty-resolver-dns-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver\4.1.78.Final\netty-resolver-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-dns\4.1.78.Final\netty-codec-dns-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver-dns-native-macos\4.1.78.Final\netty-resolver-dns-native-macos-4.1.78.Final-osx-x86_64.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-resolver-dns-classes-macos\4.1.78.Final\netty-resolver-dns-classes-macos-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport-native-epoll\4.1.78.Final\netty-transport-native-epoll-4.1.78.Final-linux-x86_64.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport-native-unix-common\4.1.78.Final\netty-transport-native-unix-common-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-transport-classes-epoll\4.1.78.Final\netty-transport-classes-epoll-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\projectreactor\netty\reactor-netty-core\1.0.20\reactor-netty-core-1.0.20.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-handler-proxy\4.1.78.Final\netty-handler-proxy-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\io\netty\netty-codec-socks\4.1.78.Final\netty-codec-socks-4.1.78.Final.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-web\5.3.21\spring-web-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-beans\5.3.21\spring-beans-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-webflux\5.3.21\spring-webflux-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-core\5.3.21\spring-core-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\org\springframework\spring-jcl\5.3.21\spring-jcl-5.3.21.jar;D:\Program Files\apache-maven-3.6.3\repo\io\projectreactor\reactor-core\3.4.19\reactor-core-3.4.19.jar;D:\Program Files\apache-maven-3.6.3\repo\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar" org.xharavard.webflux.Server
  2.  
    17:34:57.051 [main] DEBUG reactor.util.Loggers - Using Slf4j logging framework
  3.  
    17:34:57.299 [main] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - enableLoggingRequestDetails='false': form data and headers will be masked to prevent unsafe logging of potentially sensitive data
  4.  
    17:34:57.331 [main] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
  5.  
    17:34:57.333 [main] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false
  6.  
    17:34:57.333 [main] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 8
  7.  
    17:34:57.334 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
  8.  
    17:34:57.334 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
  9.  
    17:34:57.334 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.storeFence: available
  10.  
    17:34:57.335 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
  11.  
    17:34:57.335 [main] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: available
  12.  
    17:34:57.341 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: available, true
  13.  
    17:34:57.341 [main] DEBUG io.netty.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable prior to Java9
  14.  
    17:34:57.341 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.<init>(long, int): available
  15.  
    17:34:57.341 [main] DEBUG io.netty.util.internal.PlatformDependent - sun.misc.Unsafe: available
  16.  
    17:34:57.342 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.tmpdir: C:\Users\xhh\AppData\Local\Temp (java.io.tmpdir)
  17.  
    17:34:57.342 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model)
  18.  
    17:34:57.342 [main] DEBUG io.netty.util.internal.PlatformDependent - Platform: Windows
  19.  
    17:34:57.343 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: 3787980800 bytes
  20.  
    17:34:57.343 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: -1
  21.  
    17:34:57.344 [main] DEBUG io.netty.util.internal.CleanerJava6 - java.nio.ByteBuffer.cleaner(): available
  22.  
    17:34:57.344 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false
  23.  
    17:34:57.352 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024
  24.  
    17:34:57.352 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096
  25.  
    17:34:57.375 [main] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.level: simple
  26.  
    17:34:57.375 [main] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4
  27.  
    17:34:57.400 [main] DEBUG reactor.netty.tcp.TcpResources - [http] resources will use the default LoopResources: DefaultLoopResources {prefix=reactor-http, daemon=true, selectCount=8, workerCount=8}
  28.  
    17:34:57.400 [main] DEBUG reactor.netty.tcp.TcpResources - [http] resources will use the default ConnectionProvider: reactor.netty.resources.DefaultPooledConnectionProvider@65f095f8
  29.  
    17:34:57.401 [main] DEBUG reactor.netty.resources.DefaultLoopIOUring - Default io_uring support : false
  30.  
    17:34:57.654 [main] DEBUG reactor.netty.resources.DefaultLoopEpoll - Default Epoll support : false
  31.  
    17:34:57.655 [main] DEBUG reactor.netty.resources.DefaultLoopKQueue - Default KQueue support : false
  32.  
    17:34:57.660 [main] DEBUG io.netty.channel.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 16
  33.  
    17:34:57.678 [main] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.noKeySetOptimization: false
  34.  
    17:34:57.678 [main] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.selectorAutoRebuildThreshold: 512
  35.  
    17:34:57.686 [main] DEBUG io.netty.util.internal.PlatformDependent - org.jctools-core.MpscChunkedArrayQueue: available
  36.  
    17:34:57.707 [main] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.processId: 8008 (auto-detected)
  37.  
    17:34:57.709 [main] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv4Stack: false
  38.  
    17:34:57.709 [main] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv6Addresses: false
  39.  
    17:34:57.851 [main] DEBUG io.netty.util.NetUtilInitializations - Loopback interface: lo (Software Loopback Interface 1, 127.0.0.1)
  40.  
    17:34:57.852 [main] DEBUG io.netty.util.NetUtil - Failed to get SOMAXCONN from sysctl and file \proc\sys\net\core\somaxconn. Default: 200
  41.  
    17:34:57.990 [main] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.machineId: 8c:c6:81:ff:fe:4c:01:12 (auto-detected)
  42.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numHeapArenas: 16
  43.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numDirectArenas: 16
  44.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.pageSize: 8192
  45.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxOrder: 9
  46.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.chunkSize: 4194304
  47.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.smallCacheSize: 256
  48.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.normalCacheSize: 64
  49.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedBufferCapacity: 32768
  50.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimInterval: 8192
  51.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimIntervalMillis: 0
  52.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.useCacheForAllThreads: false
  53.  
    17:34:58.005 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedByteBuffersPerChunk: 1023
  54.  
    17:34:58.010 [main] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.allocator.type: pooled
  55.  
    17:34:58.010 [main] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.threadLocalDirectBufferSize: 0
  56.  
    17:34:58.010 [main] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.maxThreadLocalCharBufferSize: 16384
  57.  
    17:34:58.077 [reactor-http-nio-1] DEBUG reactor.netty.transport.ServerTransport - [c9915a48, L:/0:0:0:0:0:0:0:0:65129] Bound new server
  58.  
    enter to exit
  59.  
    17:35:05.073 [reactor-http-nio-2] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkAccessible: true
  60.  
    17:35:05.074 [reactor-http-nio-2] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkBounds: true
  61.  
    17:35:05.074 [reactor-http-nio-2] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@301be937
  62.  
    17:35:05.102 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] New http connection, requesting read
  63.  
    17:35:05.102 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [1a0030eb, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65131] New http connection, requesting read
  64.  
    17:35:05.102 [reactor-http-nio-3] DEBUG reactor.netty.transport.TransportConfig - [1a0030eb, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65131] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
  65.  
    17:35:05.102 [reactor-http-nio-2] DEBUG reactor.netty.transport.TransportConfig - [09cda6a3, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
  66.  
    17:35:05.106 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 4096
  67.  
    17:35:05.106 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8
  68.  
    17:35:05.106 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.chunkSize: 32
  69.  
    17:35:05.106 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.blocking: false
  70.  
    17:35:05.119 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Increasing pending responses, now 1
  71.  
    17:35:05.124 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServer - [09cda6a3-1, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Handler is being applied: org.springframework.http.server.reactive.ReactorHttpHandlerAdapter@3bc10f7a
  72.  
    17:35:05.138 [reactor-http-nio-2] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [09cda6a3-1] HTTP GET "/users/1"
  73.  
    17:35:05.238 [reactor-http-nio-2] DEBUG org.springframework.http.codec.json.Jackson2JsonEncoder - [09cda6a3-1] Encoding [org.xharavard.webflux.entity.User@39412266]
  74.  
    17:35:05.252 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3-1, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Decreasing pending responses, now 0
  75.  
    17:35:05.252 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3-1, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Last HTTP packet was sent, terminating the channel
  76.  
    17:35:05.253 [reactor-http-nio-2] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [09cda6a3-1] Completed 200 OK
  77.  
    17:35:05.256 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3-1, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Last HTTP response frame
  78.  
    17:35:05.488 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Increasing pending responses, now 1
  79.  
    17:35:05.488 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServer - [09cda6a3-2, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Handler is being applied: org.springframework.http.server.reactive.ReactorHttpHandlerAdapter@3bc10f7a
  80.  
    17:35:05.488 [reactor-http-nio-2] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [09cda6a3-2] HTTP GET "/favicon.ico"
  81.  
    17:35:05.494 [reactor-http-nio-2] DEBUG org.springframework.web.server.handler.ResponseStatusExceptionHandler - [09cda6a3-2] Resolved [ResponseStatusException: "404 NOT_FOUND "No matching router function""] for HTTP GET /favicon.ico
  82.  
    17:35:05.494 [reactor-http-nio-2] DEBUG org.springframework.web.server.adapter.HttpWebHandlerAdapter - [09cda6a3-2] Completed 404 NOT_FOUND
  83.  
    17:35:05.494 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3-2, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Last HTTP response frame
  84.  
    17:35:05.494 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3-2, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] No sendHeaders() called before complete, sending zero-length header
  85.  
    17:35:05.494 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3-2, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Decreasing pending responses, now 0
  86.  
    17:35:05.494 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [09cda6a3-2, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] Last HTTP packet was sent, terminating the channel
  87.  
    17:35:05.495 [reactor-http-nio-2] DEBUG reactor.netty.channel.ChannelOperationsHandler - [09cda6a3, L:/0:0:0:0:0:0:0:1:65129 - R:/0:0:0:0:0:0:0:1:65130] No ChannelOperation attached. Dropping: EmptyLastHttpContent
学新通

浏览器输入:http://localhost:65129/users

返回 [{"id":1,"name":"刘备"},{"id":2,"name":"曹操"},{"id":3,"name":"孙权"}]

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbhekf
系列文章
更多 icon
同类精品
更多 icon
继续加载