Reactor

【Spring Cloud】网关-gateway(2.x)

让人想犯罪 __ 提交于 2020-08-06 20:29:36
cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,springcloud最后自己研发了一个网关代替Zuul,那就是SpringCloud Gateway。 概述 gateway是在spring生态系统之上构建的API网关服务,基于Spring 5, Spring Boot 2和Project Reactor等技术。gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。 SpringCLoud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。 作用 • 反向代理 • 鉴权 • 流量控制 • 熔断 • 日志监控 微服务架构中网关的位置 特性 • 基于spring Framework 5, Project Reactor 和 spring boot 2.0 进行构建; • 动态路由:能够匹配任何请求属性; • 可以对路由指定 Predicate(断言) 和 Filter(过滤器); • 集成Hystrix的断路器功能; • 集成SPringCloud服务发现功能; • 易于编写的 Predicate(断言) 和 Filter(过滤器); • 请求限流功能; • 支持路径重写。

Linux(服务器编程):44---TCP长连接、短连接(心跳检测)

折月煮酒 提交于 2020-08-04 14:19:14
一、TCP连接的相关说明 ①使用TCP协议时,会在客户端和服务器之间建立一条虚拟的信道,这条虚拟信道就是指连接,而建议这条连接需要3次握手,拆毁这条连接需要4次挥手, 可见,我们建立这条连接是有成本的,这个成本就是效率成本,简单点说就是时间成 本 ,你要想发送一段数据,必须先3次握手(来往3个包),然后才能发送数据,发送完了,你需要4次挥手(来往4个包) 来断开这个连接 ②CPU资源成本, 三次握手和4次挥手和发送数据都是从网卡里发送出去和接收的,还有其余的设备,比如防火墙, 路由器等等,站在操作系统内核的角度来讲,如果我们是一个高并发系统的话,如果大量的数据包都经历过这么一个过 程,那是很耗CPU的。 ③每个socket是需要耗费系统缓存的, 比如系统提供了一些接口设置socket缓存的,比如: /proc/sys/net/ipv4/tcp_rmem /proc/sys/net/ipv4/tcp_wmem /proc/sys/net/ipv4/tcp_mem 因为TCP的可靠传输,所以我们有大量的应用程序使用TCP协议作为通信,但是每个应用因为产品功能的原因,对TCP的使用是不一样的,比如即时聊天系统(微信,钉钉,探探) 二、TCP长连接、TCP短连接 TCP短连接 概念: 如下图所示,客户端与服务器建立连接开始通信,一次/指定次数通信结束之后就断开本次TCP连接

聊聊nacos-sdk-go的BeatReactor

一个人想着一个人 提交于 2020-07-29 07:47:25
序 本文主要研究一下nacos-sdk-go的BeatReactor BeatReactor nacos-sdk-go-v0.3.2/clients/naming_client/beat_reactor.go type BeatReactor struct { beatMap cache.ConcurrentMap serviceProxy NamingProxy clientBeatInterval int64 beatThreadCount int beatThreadSemaphore *nsema.Semaphore beatRecordMap cache.ConcurrentMap } BeatReactor定义了beatMap、serviceProxy、clientBeatInterval、beatThreadCount、beatThreadSemaphore、beatRecordMap属性 NewBeatReactor nacos-sdk-go-v0.3.2/clients/naming_client/beat_reactor.go func NewBeatReactor(serviceProxy NamingProxy, clientBeatInterval int64) BeatReactor { br := BeatReactor{} if

如何从JDK8 Stream转换为反应式框架流?

被刻印的时光 ゝ 提交于 2020-07-29 06:41:36
一、前言 最近在做一个项目,获取JDK8 Stream对象后,想要批量消费,不想自己写个集合来做批量处理。而反应式编程实现比如rxjava或者reactor是有丰富的流操作符,所以调研了下如何把JDK8 Stream转换为反应式流。 二、批量消费 有时候场景需要我们批量消费以便提高执行效率,比如对应同一个表的插入操作,批量插入的效率比单条逐个插入效率要好很多。那么对应给定的一个数据源,如何聚合数据为批量那?当数据源是一个内存list时候,最简单方法如下: public static void main(String[] ar) { //1.创建list List<Integer> personList = new ArrayList<Integer>(); for (int i = 0; i < 100; ++i) { personList.add(i); } //2.切分处理 List<List<Integer>> list = Lists.partition(personList, 20); list.stream().forEach(tempList->System.out.println(JSON.toJSONString(tempList))); } 如上代码1创建了一个list列表,代码2,使用Google guava包里面的Lists

Redis 6.0 多线程重磅发布!!!

时间秒杀一切 提交于 2020-07-29 06:01:47
Redis 6.0在5.2号这个美好的日子里悄无声息的发布了,这次发布在IT圈犹如一颗惊雷一般,因为这是redis最大的一次改版,首次加入了 多线程 。 作者Antirez在RC1版本发布时在他的博客写下: the most “enterprise” Redis version to date // 最”企业级”的 the largest release of Redis ever as far as I can tell // 最大的 the one where the biggest amount of people participated // 参与人数最多的 这次改变,性能有个飞速的提升~ 先po出新版和旧版性能图 从上面可以看到 GET/SET 命令在 4 线程 IO 时性能相比单线程是几乎是翻倍了。另外,这些数据只是为了简单验证多线程 IO 是否真正带来性能优化,并没有针对严谨的延时控制和不同并发的场景进行压测。数据仅供验证参考而不能作为线上指标,且只是目前的 unstble分支的性能,不排除后续发布的正式版本的性能会更好。 Redis 6.0 之前的版本真的是单线程吗? Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。

Rust异步浅谈

怎甘沉沦 提交于 2020-07-28 11:26:33
https://rustcc.cn/article?id=e6d50145-4bc2-4f1e-84da-c39c8217640b 前提   这篇文章主要描述了Rust中异步的原理与相关的实现,Rust异步也是在最近的版本(1.39)中才稳定下来。希望可以通过这边文章在提高自己认知的情况下,也可以给读者带来一些解惑。( 来自于本人被Rust异步毒打的一些经验之谈 ).   阅读这篇文章需要对操作系统,IO多路复用,以及一些数据结构有一定的概念。   老生常谈,几乎所有的语言中异步相关的解释都是统一的: 线程切换开销大,且资源浪费(主要集中在内存上) ,这篇文章假定读者已对这些情况已知晓。 Future    Future 字面的意思就是未来发生的事情,在程序中则代表了一系列暂时没有结果的运算子, Future 需要程序主动去 poll (轮询)才能获取到最终的结果,每一次轮询的结果可能是 Ready 或者 Pending 。   当 Ready 的时候,证明当前 Future 已完成,代码逻辑可以向下执行;当 Pending 的时候,代表当前 Future 并未执行完成,代码不能向下执行,看到这里就要问了,那什么时候才能向下执行呢,这里的关键在于 Runtime 中的 Executor 需要不停的去执行 Future 的 poll 操作,直至 Future 返回 Ready

Netty、Redis、ZooKeeper高并发实战(笔记三)

做~自己de王妃 提交于 2020-07-27 13:02:42
Netty、Redis、ZooKeeper高并发实战(笔记三) 将Doug Lea著名的文章《Scalable IO in Java》:http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf,开阔下眼界。 Reactor反应器模式 反应器模式由Reactor反应器线程、Handlers处理器两大角色组成: (1)Reactor反应器线程的职责:负责响应IO事件,并且分发到Handlers处理器。 (2)Handlers处理器的职责:非阻塞的执行业务处理逻辑。 在Java的OIO编程中,最初和最原始的网络服务器程序,是用一个while循环,不断地监听端口是否有新的连接。如果有,那么就调用一个处理函数来处理,示例代码如下: while(true){ socket = accept(); //阻塞,接收连接 handle(socket) ; //读取数据、业务处理、写入结果 } 这种方法的最大问题是:如果前一个网络连接的handle(socket)没有处理完,那么后面的连接请求没法被接收,于是后面的请求通通会被阻塞住,服务器的吞吐量就太低了。对于服务器来说,这是一个严重的问题。 为了解决这个严重的连接阻塞问题,出现了一个极为经典模式:Connection Per Thread(一个线程处理一个连接)模式。 class

JFR定位由于可能的JDK11的bug导致Log4j2 CPU占用100%的问题

隐身守侯 提交于 2020-07-27 11:44:10
本文基于OpenJDK 11 最近使用 Spring Cloud Gateway 的时候,遇到了一个奇怪的问题: 线上有3个 API 网关实例,压力均衡,平稳运行3天后,突然有一个实例,CPU飚高,并且响应时间增加很多,从几十毫秒涨到了几分钟。 线上是 k8s 管理容器,立刻停掉了这个 pod,重建,恢复正常。 线上我们开启了 JFR 记录(可以参考我的另外系列文章: Java 监控 JFR ),通过 JMC 查看下出问题的 JFR 记录。 首先我们来看 GC,我们的 GC 算法是 G1,主要通过 G1 Garbage Collection这个事件查看: 发现 GC 全部为 Young GC,且耗时比较正常,频率上也没有什么明显异常。 接下来来看,CPU 占用相关。直接看 Thread CPU Load 这个事件,看每个线程的 CPU 占用情况。发现 reactor-http-epoll 线程池的线程,CPU 占用很高,加在一起,接近了 100%。 这些线程是 reactor-netty 处理业务的线程,观察其他实例,发现正常情况下,并不会有这么高的 CPU 负载。那么为啥会有这么高的负载呢?通过 Thread Dump 来看一下线程堆栈有何发现. 通过查看多个线程堆栈 dump,发现这些线程基本都处于 Runnable,并且执行的方法是原生方法,和 StackWalker 相关

Maven常用参数及其说明

假如想象 提交于 2020-07-27 08:21:53
-h,--help Display help information -am,--also-make 构建指定模块,同时构建指定模块依赖的其他模块; -amd,--also-make-dependents 构建指定模块,同时构建依赖于指定模块的其他模块; -B,--batch-mode 以批处理(batch)模式运行; -C,--strict-checksums 检查不通过,则构建失败;(严格检查) -c,--lax-checksums 检查不通过,则警告;(宽松检查) -D,--define <arg> Define a system property -e,--errors 显示详细错误信息 -emp,--encrypt-master-password <arg> Encrypt master security password -ep,--encrypt-password <arg> Encrypt server password -f,--file <arg> 使用指定的POM文件替换当前POM文件 -fae,--fail-at-end 最后失败模式:Maven会在构建最后失败(停止)。如果Maven refactor中一个失败了,Maven会继续构建其它项目,并在构建最后报告失败。 -ff,--fail-fast 最快失败模式: 多模块构建时,遇到第一个失败的构建时停止。

Netty源码学习系列之4-ServerBootstrap的bind方法

微笑、不失礼 提交于 2020-07-25 04:08:12
前言 今天研究ServerBootstrap的bind方法,该方法可以说是netty的重中之重、核心中的核心。前两节的NioEventLoopGroup和ServerBootstrap的初始化就是为bind做准备。照例粘贴一下这个三朝元老的demo,开始本文内容。 1 public class NettyDemo1 { 2 // netty服务端的一般性写法 3 public static void main(String[] args) { 4 EventLoopGroup boss = new NioEventLoopGroup(1 ); 5 EventLoopGroup worker = new NioEventLoopGroup(); 6 try { 7 ServerBootstrap bootstrap = new ServerBootstrap(); 8 bootstrap.group(boss, worker).channel(NioServerSocketChannel. class ) 9 .option(ChannelOption.SO_BACKLOG, 100 ) 10 .handler( new NettyServerHandler()) 11 .childHandler( new ChannelInitializer<SocketChannel> () {