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 的好处:集合了非阻塞 + 异步
- 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));
}
}
- 实体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
![](https://img.haomeiwen.com/i4034029/c88bbc45b3fe8ca2.png)