51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息

这篇具有很好参考价值的文章主要介绍了51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

★ Spring WebFlux的两种开发方式

1. 采用类似于Spring MVC的注解的方式来开发。
   此时开发时感觉Spring MVC差异不大,但底层依然是反应式API。

2. 使用函数式编程来开发

★ 基于注解开发Spring WebFlux

开发上变化并不大,主要是处理方法的返回值可使用Mono或Flux,但并不强制使用Mono或Flux

WebFlux的变化主要是两点:
- 彻底抛弃Servlet API;
- 基于订阅-发布的异步机制。

这两点的区别主要体现在底层服务器能以较小的线程池处理更高的并发,从而提高应用的可伸缩性 

WebFlux支持基于背压(back press)的反应式流。

什么是背压:
这个是Reactive(反应) 的概念,当订阅者的消费能力,远低于发布者时,订阅者(也就是消费者)有通知取消或终止发布者生产数据的机制,这种机制可以称作为“背压”。

说白了就是:当消费者消费积压的时候,反向告诉推送生产者,我不需要你生产了,你慢点,这个叫背压。

比如这个.onBackpressureDrop() 方法,用来给方法开启背压处理功能,机制就是当发布者发送过多的消息给订阅者,订阅者处理不过来的时候,就会把一些数据丢掉,以保证程序不会崩溃。

代码演示:

用 spring webFlux 演示 springmvc 做不到的一个背压功能,就是消息的发布者可以不断的向消息的订阅者推送消息。就是一直向客户端发送消息。

需求:每隔5秒推送消息到客户端。

创建项目的时候,之前是勾选 Spring Web ,是基于Spring MVC 的,现在要勾选这个 Spring Reactive Web ,是基于反应式的。
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot
如图:
可以看出 Spring WebFlux 是集成了 Reactor框架 / 基于Reactor框架
Spring WebFlux 和 Reactor 底层默认使用 Netty 作为Web服务器
Spring MVC 是使用 Tomcat 作为 Web 服务器
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

简单写一个通过id查询书本的流程,数据库用 Map 集合代替:
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

写一个添加书籍的方法,postMapping提交类型,用 postman测试
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot
在这里写一个 书籍对象数据,用json格式提交,
后端用 @RequestBody 注解修饰的对象来接收数据。
public Book addBook(@RequestBody Book book){}
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

重点是这个方法,体现背压,就是一直向客户端发送数据

代码弄简洁点:
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

一些注释:
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot
后面的查看所有书本的代码。
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

功能实现:

需求:每隔5秒推送消息到客户端。

在项目运行的时候 ,插入一条书本数据,可以看出的确是每5秒执行一次查询,然后向客户端推送数据。

这就是 spring mvc 无法实现的 背压功能。
51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

如果把项目改成 spring mvc ,那么Flux 这个就不能用了。

    通过依赖把 <artifactId>spring-boot-starter-webflux</artifactId>
     改成  <artifactId>spring-boot-starter-web</artifactId>
     就是把 spring webflux 改成 spring mvc 框架

51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

完整代码

pom依赖:
        <!-- 表明使用 WebFlux , 此时是反应式 Web 应用,默认使用 Reactor netty 作为服务器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

domain
package cn.ljh.my_annotation_flux.domain;
import lombok.Data;
@Data
public class Book
{
    private Integer id;
    private String name;
    private double price;
    private String author;
    
    public Book(Integer id, String name, double price, String author)
    {
        this.id = id;
        this.name = name;
        this.price = price;
        this.author = author;
    }
}
BookController
package cn.ljh.my_annotation_flux.controller;


import cn.ljh.my_annotation_flux.domain.Book;
import cn.ljh.my_annotation_flux.service.BookService;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

import java.time.Duration;
import java.util.Collection;

@RestController
@RequestMapping("/books")
public class BookController
{
    private BookService bookService;
    //有参构造器完成依赖注入
    public BookController(BookService bookService)
    {
        this.bookService = bookService;
    }

    @GetMapping("/{id}")
    public Book viewBooks(@PathVariable Integer id)
    {
        Book book = bookService.getBook(id);
        return book;
    }



    //restful的方式提交请求 ,
    // @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
    @PostMapping("/addBook")
    public Book addBook(@RequestBody Book book)
    {
        bookService.addBook(book);
        return book;
    }

    //    开发基于 背压的 WebFlux 反应式流,来看 spring mvc 做不到的事
    //    WebFlux支持基于背压(back press)的反应式流。
    //    背压:很多种处理方式,消息的发布者可以不断的向消息的订阅者推送消息。消息过多后的一些处理方式。


        //这个获取图书的方法,使用到了背压的技术,相当于是一个数据流、消息发布者,会不断的向客户端生成数据,
        // 因此需要指定响应的数据类型: 数据是stream数据流,数据流里面的数据格式是json
    @GetMapping(value = "/viewBooks",produces = "application/stream+json")
    //需要直接用 Reactor 特性的时候,可以让处理方法返回 Mono 或 Flux
    public Flux<Book> viewBooks()
    {
        Flux<Collection<Book>> map =

                //周期性的向客户端推送数据,每隔5秒推送一次,  interval:间隔 , Duration:持续 ,  Seconds:秒
                //Flux.interval(Duration.ofSeconds(5)) 属于上游发送消息的发送者
                Flux.interval(Duration.ofSeconds(5))
                        //onBackpressureDrop作用:实现处理背压的功能
                        .onBackpressureDrop()
                        .map((i) -> bookService.getAllBooks());

        //将 Collection 转换 Flux (相当于把同步数据集 转换成 反应式的数据发布者)。
        //flatMapIterable 方法中的Lambda 表达式负责将 Coollection 中的元素转成 Flux 中的元素。
        Flux<Book> bookFlux = map.flatMapIterable(book -> book);

        return bookFlux;
    }


}
BookService
package cn.ljh.my_annotation_flux.service;


import cn.ljh.my_annotation_flux.domain.Book;
import java.util.Collection;

public interface BookService
{
    Book getBook(Integer id);

    Integer addBook(Book book);

    Collection<Book> getAllBooks();
}
BookServiceImpl
package cn.ljh.my_annotation_flux.service.impl;


import cn.ljh.my_annotation_flux.domain.Book;
import cn.ljh.my_annotation_flux.service.BookService;
import org.springframework.stereotype.Service;

import java.util.*;

//添加这个@Service注解,springboot就可以自动扫描这个Service组件的实现类,然后把这个类部署成容器中的bean。
@Service
public class BookServiceImpl implements BookService
{
    //添加一个 Map 集合,假设为数据库
    public static final Map<Integer, Book> bookDB = new LinkedHashMap<>();

    //创建一个自增id
    static int nextId = 4;

    //初始化这个数据库
    static
    {
        bookDB.put(1, new Book(1, "火影忍者", 100.0, "岸本"));
        bookDB.put(2, new Book(2, "家庭教师", 110.0, "天野明"));
        bookDB.put(3, new Book(3, "七龙珠Z", 120.0, "鸟山明"));
    }


    //查看图书
    @Override
    public Book getBook(Integer id)
    {
        Book book = bookDB.get(id);
        if (book == null){
            throw new RuntimeException("没有此图书信息!");
        }
        return book;
    }

    //添加图书
    @Override
    public Integer addBook(Book book)
    {
        book.setId(nextId);
        bookDB.put(nextId,book);
        //返回id,先返回在自增。
        return nextId++;
    }

    //查看所有的图书
    @Override
    public Collection<Book> getAllBooks()
    {
        //获取集合中的所有元素
        Collection<Book> values = bookDB.values();
        return values;
    }
}
.onBackpressureDrop() 作用

查 .onBackpressureDrop() 这个方法的作用:

51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot

51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息,springboot,spring,java,后端,spring boot文章来源地址https://www.toymoban.com/news/detail-703493.html

到了这里,关于51、基于注解方式开发Spring WebFlux,实现生成背压数据,就是实现一直向客户端发送消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring注解驱动开发(BEAN注册方式与生命周期)

    目录 容器中注册BEAN的方式 BEAN生命周期 包扫描+组件标注注解 @ComponentScan(basePackages = {\\\"com.an.spring.condition\\\"}) @Service @Component @Controller @Repository @BEan方式【导入第三方包里面的组件】 @Import快速给容器中导入一个组件。 1)、@IMport(要导入到容器中的组件),容器就会注入这个组

    2024年02月07日
    浏览(54)
  • Spring基于注解管理bean及全注解开发

    Spring是一款主流的Java EE 轻量级开源框架,目的是用于简化Java企业级引用的开发难度和开发周期。从简单性、可测试性和松耦合度的角度而言,任何Java应用都可以从Spring中受益。Spring框架提供自己提供功能外,还提供整合其他技术和框架的能力。 Spring自诞生以来备受青睐,

    2024年02月14日
    浏览(40)
  • javaee spring 用注解的方式实现ioc

    spring核心依赖 spring配置文件

    2024年02月10日
    浏览(45)
  • 【Spring】使用自定义注解方式实现AOP鉴权

    AOP,是一种面向切面编程,可以通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 在软件开发中,鉴权(Authentication)是一项非常重要的安全措施,用于验证用户身份和权限。在应用程序中,我们通常会使用AOP(Aspect-Oriented Programming)来实现鉴权功能

    2024年02月11日
    浏览(47)
  • 【Spring MVC】Spring MVC基于注解的程序开发

    目录 一、什么是Spring MVC  二、Spring MVC项目的创建和使用 1、实现客户端和服务器端之间的连接 1.1、RequsestMapping注解 1.2、@RequestMapper的简单使用  1.3、使用@GetMapping和@POSTMapping注解来实现HTTP连接 三、获取参数 1、实现获取单个参数 2、实现获取对象 3、后端参数重命名(@Requ

    2024年02月13日
    浏览(49)
  • Spring5框架——AOP操作:通过Aspectj注解方式和配置文件方式来实现

    o((⊙﹏⊙))o. ** 之前的博客介绍了什么是AOP,以及AOP的底层原理,AOP主要是在原本的基础上添加一些之外的功能但是添加的功能是不会修改原定的代码,接下来为你介绍的是Aspectj注解,Spring 框架一般都是基于 AspectJ 实现 AOP 操作。AspectJ 不是 Spring 组成部分,独立 AOP 框架,一

    2024年02月16日
    浏览(50)
  • 注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】

    目录 一、注解配置AOP 1. 开启注解支持 2. 在类和方法加入注解 3. 测试 4.  为一个类下的所有方法统一配置切点 二、原生Spring实现AOP 1. 引入依赖 2. 编写SpringAOP通知类 3. 编写配置类bean2.xml 4  测试 三、SchemaBased实现AOP 1. 配置切面 2. 测试 往期专栏文章相关导读  1. Maven系列专栏

    2024年02月08日
    浏览(45)
  • 注解实现(基于Spring AOP)

    切入点表达式 Spring AOP 支持的切入点主要有以下几种: execution:用于匹配方法执行的连接点。这是最常用的切入点指示器。你可以指定具体的方法,或者类来匹配。 例如: execution(* com.example.service.*.*(..)) ,这个表达式表示匹配 com.example.service 包下的所有类的所有方法。 wit

    2024年02月16日
    浏览(42)
  • 55、基于 WebFlux 开发 WebSocKet

    两步: (1)实现WebSocketHandler开发WebSocket处理类。 实现该接口时只需要实现Mono handle(WebSocketSession webSocketSession)方法即可。 (2)使用HandlerMapping和WebSocketHandlerAdapter注册WebSocket处理类。 反应式API模型下,WebSocketSession的receive()方法返回的只是Flux(消息发布者), 它并不会同步

    2024年02月08日
    浏览(45)
  • 【Spring全家桶系列】Spring中的事务管理(基于注解完成实现)

    ⭐️ 前面的话 ⭐️ 本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍Spring中的事务管理,事务的概念与作用,以及Spring事务的属性和传播机制。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由 未见花闻 原创, CSDN 首发! 📆首

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包