技术博客Java

SpringBoot嵌入式Netty的Server(WebFlu

2018-06-08  本文已影响14人  老生住长亭

1。终于等到springboot集成netty的server服务器,叫webflux,版本在springboot 2.0.2的版本体现。

自己写个demo,里面有些mono和Flux关键字,大家可以查查,不在阐述。

 Mono 和 Flux 适用于两个场景,即: 
 Mono:实现发布者,并返回 0 或 1 个元素,即单对象。 
 Flux:实现发布者,并返回 N 个元素,即 List 列表对象。 
 有人会问,这为啥不直接返回对象,比如返回 City/Long/List。 
 原因是,直接使用 Flux 和 Mono 是非阻塞写法,相当于回调方式。 
 利用函数式可以减少了回调,因此会看不到相关接口。这恰恰是 WebFlux 的好处:集合了非阻塞 + 异步 
  1. web层:Controller.java代码
/**
* @author botter
*/
@RestController
public class TestController {

   @Autowired
   private TestService testService;

   @RequestMapping(value = "test", method = RequestMethod.GET)
   public Mono<String> testMono() {
       return testService.test();
   }

   /**
    * do userlist data
    * @param users
    * @return lastest add success  data
    */
   @RequestMapping(value = "addUser", method = RequestMethod.POST)
   public Flux<UserBean> add(@RequestBody Flux<UserBean> users) {
       return testService.createOrUpdate(users);
   }

   /**
    * get one data
    * @param id
    * @return
    */
   @RequestMapping(value = "getUser/{id}", method = RequestMethod.GET, produces = {"application/json"})
   public Mono<UserBean> getUser(@PathVariable int id) {
       return testService.getUserBeanById(id);
   }

   @RequestMapping(value = "deleteUser/{id}", method = RequestMethod.POST)
   public Mono<UserBean> delete(@PathVariable int id) {
       return testService.deleteById(id);
   }
}

2.service层:Testservice.java

package cn.nest.webflux.service;

import cn.nest.webflux.base.UserBean;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author botter
 */
@Service
public class TestService {

    private Map<Integer, UserBean> UserBeanMap = new ConcurrentHashMap<>();

    @PostConstruct
    private void init() {
        UserBean UserBean1 = new UserBean(1, "tom1");
        UserBean UserBean2 = new UserBean(2, "tom2");
        UserBean UserBean3 = new UserBean(3, "tom3");
        UserBean UserBean4 = new UserBean(4, "tom4");
        UserBeanMap.put(1, UserBean1);
        UserBeanMap.put(2, UserBean2);
        UserBeanMap.put(3, UserBean3);
        UserBeanMap.put(4, UserBean4);
    }

    public Mono<String> test() {
        System.out.println("[TestService].....");
        return Mono.just("hello word");
    }

    public Flux<UserBean> getUserBeanList(Flux<Integer> ids) {
        return ids.flatMap(id -> Mono.justOrEmpty(this.UserBeanMap.get(id)));
    }

    public Mono<UserBean> getUserBeanById(int id) {
        return Mono.justOrEmpty(this.UserBeanMap.get(id));
    }

    public Flux<UserBean> createOrUpdate(Flux<UserBean> UserBeans) {
        return UserBeans.doOnNext(UserBean -> this.UserBeanMap.put(UserBean.getId(), UserBean));
    }

    public Mono<UserBean> createOrUpdate(UserBean UserBean) {
        this.UserBeanMap.put(UserBean.getId(), UserBean);
        return Mono.just(UserBean);
    }

    public Mono<UserBean> deleteById(int id) {
        return Mono.justOrEmpty(this.UserBeanMap.remove(id));
    }

}

  1. 实体UserBean.java
package cn.nest.webflux.base;

/**
 * @author botter
 */
public class UserBean {
    private int id;
    private String name;

    public UserBean(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public UserBean() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

4.pom.xml配置:

<?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>com.example</groupId>
   <artifactId>base-webflux</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>base-webflux</name>
   <description>base-websocket project for Spring Boot</description>

   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.0.2.RELEASE</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
       <java.version>1.8</java.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>

       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>

       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-webflux</artifactId>
           <version>2.0.2.RELEASE</version>
       </dependency>

   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>
</project>

6.启动log

image.png
上一篇 下一篇

猜你喜欢

热点阅读