• 140、spring webflux 高并发的spring组件


    最近公司可谓是风云变幻,年前说要拆开卖,后来说要整体卖,表示像我这种渣渣,始终逃脱不掉被卖的命运

    下面进入正题

    spring webflux 是spring 支持的高并发web框架,将每个http请求都以java nio的非阻塞方式来进行处理

    这样当cpu在处理一个请求的空隙时,还有时间来处理其他请求。提高CPU资源的运行效率

    下面来看如何进行实现

    1、首先eclipse中新建一个maven的项目。然后完整版的pom文件如下所示。(本人翻遍了网上的教程,都没有提供完整版的pom文件,哪里有?哪里有?感觉这里是独一份,除了github以外)

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        
      <groupId>Pactera</groupId>
      <artifactId>webflux-test</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>webflux-test</name>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
      </properties>
      
       <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.6.BUILD-SNAPSHOT</version>
            <relativePath/>
       </parent>
       
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        
        
    
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
      </dependencies>
      
           <build>
                  <defaultGoal>compile</defaultGoal>
            <plugins>  
                <plugin>  
                    <artifactId>maven-jar-plugin</artifactId>  
                    <executions>  
                        <execution>  
                            <!-- <goals>  
                                <goal>jar</goal>  
                            </goals>   -->
                            <phase>package</phase>  
                        </execution>  
                    </executions>  
                </plugin> 
                <!-- <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin> -->
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <pluginRepositories>
            <pluginRepository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
            <pluginRepository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
        
      
      
    </project>

    2、下面是一个handler处理类,这个类是用来处理http请求的核心类

    package org.spring.springboot.handler;
    
    import org.springframework.http.MediaType;
    import org.springframework.stereotype.Component;
    import org.springframework.web.reactive.function.BodyInserters;
    import org.springframework.web.reactive.function.server.ServerRequest;
    import org.springframework.web.reactive.function.server.ServerResponse;
    import reactor.core.publisher.Mono;
    
    @Component
    public class CityHandler {
        
        public Mono<ServerResponse> helloCity(ServerRequest request) {
            return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                    .body(BodyInserters.fromObject("Hello, City!"));
        }
        
    }

    3、下面一个类是当监测到CPU有空闲时间的时候,将HTTP请求分发给handler类的router类

    package org.spring.springboot.router;
    
    import org.spring.springboot.handler.CityHandler;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.MediaType;
    import org.springframework.web.reactive.function.server.RequestPredicates;
    import org.springframework.web.reactive.function.server.RouterFunction;
    import org.springframework.web.reactive.function.server.RouterFunctions;
    import org.springframework.web.reactive.function.server.ServerResponse;
    
    @Configuration
    public class CityRouter {
    
        @Bean
        public RouterFunction<ServerResponse> routeCity(CityHandler cityHandler) {
            return RouterFunctions.route(
                    RequestPredicates.GET("/hello").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                    cityHandler::helloCity);
        }
    
    }

    4、然后在最外层的主入口,Application.java

    package org;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableAutoConfiguration
    @SpringBootApplication
    @ComponentScan("org.spring")
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

    5、整个包的结构如下所示

     6、然后程序跑起来啦

      .   ____          _            __ _ _
     /\ / ___'_ __ _ _(_)_ __  __ _    
    ( ( )\___ | '_ | '_| | '_ / _` |    
     \/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::  (v2.0.6.BUILD-SNAPSHOT)
    
    2019-03-05 07:37:15.713  INFO 8284 --- [           main] org.Application                          : Starting Application on DESKTOP-QGKILFJ with PID 8284 (D:eclipse-workspacewebflux-test	argetclasses started by weizhen in D:eclipse-workspacewebflux-test)
    2019-03-05 07:37:15.725  INFO 8284 --- [           main] org.Application                          : No active profile set, falling back to default profiles: default
    2019-03-05 07:37:15.818  INFO 8284 --- [           main] onfigReactiveWebServerApplicationContext : Refreshing org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@62e136d3: startup date [Tue Mar 05 07:37:15 CST 2019]; root of context hierarchy
    2019-03-05 07:37:17.662  WARN 8284 --- [           main] reactor.ipc.netty.tcp.TcpResources       : [http] resources will use the default LoopResources: DefaultLoopResources {prefix=reactor-http, daemon=true, selectCount=4, workerCount=4}
    2019-03-05 07:37:17.662  WARN 8284 --- [           main] reactor.ipc.netty.tcp.TcpResources       : [http] resources will use the default PoolResources: DefaultPoolResources {name=http, provider=reactor.ipc.netty.resources.PoolResources$$Lambda$188/243575009@2e554a3b}
    2019-03-05 07:37:18.293  INFO 8284 --- [           main] o.s.w.r.f.s.s.RouterFunctionMapping      : Mapped ((GET && /hello) && Accept: [text/plain]) -> org.spring.springboot.router.CityRouter$$Lambda$197/416201381@64bc21ac
    2019-03-05 07:37:18.310  INFO 8284 --- [           main] o.s.w.r.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.reactive.resource.ResourceWebHandler]
    2019-03-05 07:37:18.310  INFO 8284 --- [           main] o.s.w.r.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.reactive.resource.ResourceWebHandler]
    2019-03-05 07:37:18.437  INFO 8284 --- [           main] o.s.w.r.r.m.a.ControllerMethodResolver   : Looking for @ControllerAdvice: org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@62e136d3: startup date [Tue Mar 05 07:37:15 CST 2019]; root of context hierarchy
    2019-03-05 07:37:18.750  INFO 8284 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
    2019-03-05 07:37:20.073  INFO 8284 --- [ctor-http-nio-1] r.ipc.netty.tcp.BlockingNettyContext     : Started HttpServer on /0:0:0:0:0:0:0:0:8080
    2019-03-05 07:37:20.074  INFO 8284 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080
    2019-03-05 07:37:20.080  INFO 8284 --- [           main] org.Application                          : Started Application in 4.836 seconds (JVM running for 5.499)

    7、进行访问

    这样下来一个简单的高并发框架就完成啦

    可能有小伙伴看博主之前写的博客都是关于机器学习的,还有salesforce的

    其实吧,博主一直是做java的,两年半以来做过GE的NPI CRM项目,惠普的Solr搜素项目,还有GE的语言助手项目,还有赛诺菲的供应链语音助手项目

    为什么不写java类的博客,主要是博客觉得java这个应该都算是基础知识,应该是程序猿最基本的知识。

    感觉写出来也不显得吸引人眼球。所以没写。不过今天这个高并发确实很厉害。所以写了一下

    Thanks

    WeiZhen

  • 相关阅读:
    Java接口(interface),扫盲贴
    Java抽象类,扫盲贴
    Java类的继承、super关键字、复写
    Java内部类,扫盲贴
    数据结构学习笔记1--简单排序
    7.1 通用的职责分配软件原则 GRASP原则一: 创建者 Creator
    6.6 面向对象设计
    6.5 开始进入设计 … Transition to Design
    6.4 操作契约 Operation Contracts
    6.3 契约式设计
  • 原文地址:https://www.cnblogs.com/weizhen/p/10474467.html
Copyright © 2020-2023  润新知