Reactor

【翻译】Spring 5 WebFlux入门

杀马特。学长 韩版系。学妹 提交于 2020-04-17 10:16:29
【推荐阅读】微服务还能火多久?>>> 原文链接: Guide to Spring 5 WebFlux | Baeldung 1. 概览 Spring WebFlux 框架是 Spring 5的一部分,他为 web 应用提供了响应式编程的支持。 在本文中,我们将使用响应式注解*RestController*和*WebClient*创建一个小的 REST 应用, 我们还将研究如何使用Spring Security保护我们的响应式端点。 2. Spring WebFlux 框架 ** Spring WebFlux内部使用Project Reactor及其发布者实现 - Flux和Mono。** 这个新框架支持下面两种编程模型: - 基于注释的响应式组件 - 函数级别的路由和处理 在这里,我们将重点关注基于注释的响应式组件,正如我们已经研究过的[functional style – routing and handling]( Introduction to the Functional Web Framework in Spring 5 | Baeldung ). 3. 依赖 让我们从spring-boot-starter-webflux依赖开始,它包含了所有其他必需的依赖: 用于基本Spring Boot应用程序设置的spring-boot和spring-boot-starter

Redis高级客户端Lettuce详解

六眼飞鱼酱① 提交于 2020-04-16 08:35:22
【推荐阅读】微服务还能火多久?>>> 前提 Lettuce 是一个 Redis 的 Java 驱动包,初识她的时候是使用 RedisTemplate 的时候遇到点问题 Debug 到底层的一些源码,发现 spring-data-redis 的驱动包在某个版本之后替换为 Lettuce 。 Lettuce 翻译为 生菜 ,没错,就是吃的那种生菜,所以它的 Logo 长这样: 既然能被 Spring 生态所认可, Lettuce 想必有过人之处,于是笔者花时间阅读她的官方文档,整理测试示例,写下这篇文章。编写本文时所使用的版本为 Lettuce 5.1.8.RELEASE , SpringBoot 2.1.8.RELEASE , JDK [8,11] 。超长警告:这篇文章断断续续花了两周完成,超过4万字..... Lettuce简介 Lettuce 是一个高性能基于 Java 编写的 Redis 驱动框架,底层集成了 Project Reactor 提供天然的反应式编程,通信框架集成了 Netty 使用了非阻塞 IO , 5.x 版本之后融合了 JDK1.8 的异步编程特性,在保证高性能的同时提供了十分丰富易用的 API , 5.1 版本的新特性如下: 支持 Redis 的新增命令 ZPOPMIN, ZPOPMAX, BZPOPMIN, BZPOPMAX 。 支持通过 Brave

IO操作与IO模型

纵然是瞬间 提交于 2020-04-15 10:59:46
【推荐阅读】微服务还能火多久?>>> 目录 一 、IO操作本质 二、 IO模型 BIO – 阻塞模式I/O NIO – 非阻塞模式I/O IO Multiplexing - I/O多路复用模型 AIO – 异步I/O模型 三、同步I/O与异步I/O 四、 IO设计模式 Reactor模式 Proactor模式 对比分析 一 、IO操作本质 数据复制的过程中不会消耗CPU # 1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作、网络请求加载到内存的数据一开始是放在内核缓冲区的 二、 IO模型 BIO – 阻塞模式I/O 用户进程从发起请求,到最终拿到数据前,一直挂起等待; 数据会由用户进程完成拷贝 ''' 举个例子:一个人去 商店买一把菜刀, 他到商店问老板有没有菜刀(发起系统调用) 如果有(表示在内核缓冲区有需要的数据) 老板直接把菜刀给买家(从内核缓冲区拷贝到用户缓冲区) 这个过程买家一直在等待 如果没有,商店老板会向工厂下订单(IO操作,等待数据准备好) 工厂把菜刀运给老板(进入到内核缓冲区) 老板把菜刀给买家(从内核缓冲区拷贝到用户缓冲区) 这个过程买家一直在等待 是同步io ''' NIO – 非阻塞模式I/O 用户进程发起请求,如果数据没有准备好,那么立刻告知用户进程未准备好

能说一说你对IO的理解吗?IO模块总结

淺唱寂寞╮ 提交于 2020-04-07 07:42:49
大家好,这是一个为了梦想而保持学习的博客。这是第六篇文章,分享一下我对【IO】的理解。 文章的风格会一直保持问答的方式讲述,这是我个人喜欢的一种风格,也是相当于模拟面试。 能说说IO的整个过程吗? 网络数据从接收到处理,可以分为三个阶段: 网卡接收数据包 :在网络编程中,我们的数据来源都是从网络中来的,那么数据包首先到达的就是我们的 网卡 ,因此这就是我们整个过程的第一阶段。 操作系统(OS)读取数据包 :在网卡拿到数据以后,会由我们的OS来负责读取对应的数据到我们的OS内核缓冲区中。数据都是自下而上传递的,此时我们应用层的运行的程序还无法获取到对应的数据。 将数据复制到用户空间 :我们的应用想要获取对应的数据,就需要将对应的数据从OS内核缓冲区中复制到自己的用户空间内,才可以进行下一步操作。 你知道有哪些获取数据的IO模型吗? 说起IO模型,大家肯定都不陌生,或多或少都了解过一些,但是是否有思考过这些IO模型是用来干什么的呢?我自己的理解,这些IO模型都是为了获取数据,针对上面所说的IO过程,准确的来说这些IO模型都是为了从OS内核缓冲区中获取数据。(当然换一种说法,可以理解为处理连接) 下面就来看看有哪些数据模型,分别都是怎么从OS内核缓冲区中获取数据的。 阻塞IO(BIO) 阻塞IO是最经典的一种网络IO模型,在这种IO模型下,从等待网络数据到达网卡

【NIO引入】BIO、AIO与NIO的区别

不羁的心 提交于 2020-04-06 16:57:03
同步异步与阻塞非阻塞的区别 1.同步 例:买饭:自己亲自去饭馆买饭,这就是同步(自己处理IO读写) 2.异步 例:买饭:叫外卖送到家,这就是异步(IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(饭名和地址),OS需要支持异步IO操作API) 3.阻塞 例:办理业务:一直排队等待(调用会一直阻塞到读写完成才返回) 4.非阻塞 例:办理业务:抽号后就可以做其他事,如果你等不急,可以去问工作人员到你了没,如果没到你就不能办理业务。(如果不能读写,调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成) BIO模型 同步阻塞 服务器实现模式:一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。 BIO图解: 伪异步IO 通过线程池机制优化了BIO模型 伪异步IO图解: NIO模型 同步非阻塞 服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 NIO图解: AIO模型 异步非阻塞 服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理, 注:AIO又称为NIO2.0,在JDK7才开始支持。 AIO流程图 BIO、伪异步

解Bug之路-记一次中间件导致的慢SQL排查过程

南楼画角 提交于 2020-03-23 10:36:14
3 月,跳不动了?>>> 解Bug之路-记一次中间件导致的慢SQL排查过程 前言 最近发现线上出现一个奇葩的问题,这问题让笔者定位了好长时间,期间排查问题的过程还是挺有意思的,正好博客也好久不更新了,就以此为素材写出了本篇文章。 Bug现场 我们的分库分表中间件在经过一年的沉淀之后,已经到了比较稳定的阶段。而且经过线上压测的检验,单台每秒能够执行1.7W条sql。但线上情况还是有出乎我们意料的情况。有一个业务线反映,每天有几条sql有长达十几秒的超时。而且sql是主键更新或主键查询,更奇怪的是出现超时的是不同的sql,似乎毫无规律可寻,如下图所示: 一个值得注意的点,就是此业务只有一部分流量走我们的中间件,另一部分还是直接走数据库的,而超时的sql只会在连中间件的时候出现,如下图所示: 很明显,是引入了中间件之后导致的问题。 排查是否sql确实慢 由于数据库中间件只关心sql,并没有记录对应应用的traceId,所以很难将对应的请求和sql对应起来。在这里,我们先粗略的统计了在应用端超时的sql的类型是否会有超时的情况。 分析了日志,发现那段时间所有的sql在往后端数据执行的时候都只有0.5ms,非常的快。如下图所示: 看来是中间件和数据库之间的交互是正常的,那么继续排查线索。 寻找超时规律 由于比较难绑定对应请求和中间件执行sql之间的关系,于是笔者就想着列出所有的异常情况

Netty面试题(2020最新版)

不羁的心 提交于 2020-03-06 20:53:32
1.Netty 是什么? Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方法灵活。 2.Netty 的特点是什么? 高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。 传输快:Netty 的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。 封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。 3.Netty 的优势有哪些? 使用简单:封装了 NIO 的很多细节,使用更简单。 功能强大:预置了多种编解码功能,支持多种主流协议。 定制能力强:可以通过 ChannelHandler 对通信框架进行灵活地扩展。 性能高:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。 稳定:Netty 修复了已经发现的所有 NIO 的 bug,让开发人员可以专注于业务本身。 社区活跃:Netty 是活跃的开源项目,版本迭代周期短,bug 修复速度快。 4.Netty 的应用场景有哪些? 典型的应用有:阿里分布式服务框架 Dubbo,默认使用 Netty 作为基础通信组件,还有 RocketMQ

java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类

杀马特。学长 韩版系。学妹 提交于 2020-03-01 13:12:51
RamUsageEstimator,maven坐标: <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.0.0</version> </dependency> RamUsageEstimator就是根据java对象在堆内存中的存储格式, 通过计算Java对象头、实例数据、引用等的大小,相加而得,如果有引用,还能递归计算引用对象的大小。 RamUsageEstimator的源码并不多,几百行,清晰可读。这里不进行一一解读了。 它在初始化的时候会根据当前JVM运行环境、CPU架构、运行参数、是否开启指针压缩、JDK版本等综合计算对象头的大小,而实例数据部分则按照java基础数据类型的标准大小进行计算。 思路简单,同时也在一定程度上反映出了Java对象格式的奥秘! import java.util.List; import java.util.concurrent.atomic.AtomicLong; import lombok.extern.slf4j.Slf4j; import org.apache.lucene.util.RamUsageEstimator; import reactor.fn.tuple.Tuple2; import

WebFlux系列(九)WebClient Uri列表、数组传参

丶灬走出姿态 提交于 2020-02-28 04:52:10
#Java#Spring#WebFlux#Reactor#WebClient#Uri#传参#数组#列表# WebClient Uri列表、数组传参 视频讲解: https://www.bilibili.com/video/av83351261/ 服务端: @RestController class EmployeeController { @GetMapping("employee") public Mono<String> requestList(@RequestParam List<String> names, ServerHttpRequest request){ names.stream().forEach(System.out::println); return Mono.just(request.getURI().toString()); } } 客户端: @RestController class EmployeeController { @GetMapping("employee/{names}") public Mono<String> request(@PathVariable List<String> names) { return WebClient.create(baseUrl) .get() .uri(uriBuilder -> uriBuilder

0116 spring的webFlux

爷,独闯天下 提交于 2020-02-27 15:00:16
背景 场景 要求 编程方法 电商和金融行业 数据一致性要求非常高 高并发的时候需要锁或者其它机制来保证一些重要数据的一致性;<br />但是性能也下降的很快; 游戏,新闻,视频,广告 不需要很高的数据一致性 对并发数和响应速度要求比较高 这种场景下,出现了响应式编程。依赖的基础技术点如下: 技术点 说明 servlet3.1 支持响应式编程 java8 语法丰富支持响应式编程,非堵塞式编程 spring5 新一代的web框架webflux,依托于servlet3.1+和java8 srpingboot2.x 使用了spring5 Rxjava 一种流行的响应式编程框架 Reactor spring5中响应式编程的默认实现方式 基本概念 响应式编程关键词: 数据流:流式处理 异步: 异步处理 消息:基于消息名 Reactor模型 客户端先向服务器端注册感兴趣的event,完成了事件订阅; 客户端发生已经注册的事件,会触发服务器的响应,服务器存在一个selector线程,【轮询客户端发送过来的事件】但是并不实际处理事件,而是找到对应的Request Handler,启用另外一条线程运行处理。 最终结果会转换成data stream,发送到客户端; WebFlux 基于servlet3.1对非阻塞机制,和java8的函数式语法,webflux出现了。 响应式编程分为3层: 层 说明