暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Web Flux

产教Code 2019-09-21
471

Web Flux

WebFlux简单介绍

Flux是一个非阻塞异步的框架,其核心是Reactor相关API实现的,相对于其较早的  struts2 , springmvc
 等来说它可在 Nettt , Undertow , Servlet3.1+
 的容器运行。

Flux的特点体现在非阻塞和函数式编程端点。非阻塞利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态下,其在servlet3.1中提供了非阻塞的API,WebFlux体现的更加完美;

WebFlux和SpringMVC


WebFlux和SpringMVC非常的相似,从上面官方图片中可以看出都可以运行在tomcat,jetty,undertow等servlet容器当中,只不过SpringMVC采用命令式编程方式而WebFlux采用响应式编程,如果在SpringMVC正常运行的应用程序,不需要更改。

在性能方面,反应和非阻塞通常不会使应用成勋运行的更快。


一个简单WebFlux实现的实例:

使用的jar包:

spring-webflux-5.1.2.RELEASE.jar

WebFluxConfig:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import org.thymeleaf.spring5.SpringWebFluxTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.reactive.ThymeleafReactiveViewResolver;
import org.thymeleaf.templatemode.TemplateMode;

@ComponentScan
@EnableWebFlux
public class WebFluxConfig implements WebMvcConfigurer {

   @Autowired
   private ApplicationContext applicationContext;

   @Override
   public void configureViewResolvers(ViewResolverRegistry registry) {
       ThymeleafReactiveViewResolver  thymeleafReactiveViewResolver =
               new ThymeleafReactiveViewResolver();
       SpringResourceTemplateResolver springResourceTemplateResolver =
               new SpringResourceTemplateResolver();
       springResourceTemplateResolver.setApplicationContext(applicationContext);
       springResourceTemplateResolver.setPrefix("classpath:/templates/");
       springResourceTemplateResolver.setSuffix(".html");
       springResourceTemplateResolver.setCharacterEncoding("utf-8");
       springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML);
       SpringWebFluxTemplateEngine springWebFluxTemplateEngine = new SpringWebFluxTemplateEngine();
       springWebFluxTemplateEngine.setTemplateResolver(springResourceTemplateResolver);
       thymeleafReactiveViewResolver.setApplicationContext(applicationContext);
       thymeleafReactiveViewResolver.setTemplateEngine(springWebFluxTemplateEngine);
       registry.viewResolver((ViewResolver) thymeleafReactiveViewResolver);
  }
}
复制

Controller:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class InlcentController {


   @RequestMapping("/Login")
   public String Login(){
       return "index";
  }

}
复制


Main:

import cj.zhang.flux.WebFluxConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
import reactor.netty.http.server.HttpServer;

import java.io.IOException;

public class Mian {
   public static void main(String[] args) throws IOException {
       AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(WebFluxConfig.class);
       //通过ApplicationContext创建HttpHandler
       HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build();
       ReactorHttpHandlerAdapter httpHandlerAdapter = new ReactorHttpHandlerAdapter(httpHandler);
       HttpServer.create().port(8080).handle(httpHandlerAdapter).bind().block();
       System.in.read();
  }
}
复制



文章转载自产教Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论