Netty

spring cloud gateway cpu使用异常问题排查

☆樱花仙子☆ 提交于 2020-04-21 21:35:57
问题 生产环境发现spring cloud gateway服务cpu使用过高,接近100% 使用top命令查询占用CPU较高的线程,发现4个线程CPU异常 spring cloud gateway 基于Netty 实现,默认情况创建一个线程监听端口,accept连接,多个线程(数量等于CPU核心数)处理socket数据,因此怀疑是做路由 转发的四个线程出现问题 使用 jstack 查看java线程栈信息,发现了对应线程确实是做路由转发的线程(jstack中线程是16进制展示的) 排查log4j日志,发现大量日志输出,日志级别为debug,怀疑是请求处理线程输出大量日志导致CPU占用过高 处理方式 调整日志级别到info,重新部署服务,CPU 恢复正常 结论 1、大量日志会影响服务性能,高并发场景,谨慎处理日志级别 2、网关是后台所有请求的入口,基于单一职责原则,只做代理,不要添加认证等业务相关的服务,以防系统出现瓶颈 来源: oschina 链接: https://my.oschina.net/canghaidekongjian/blog/3288464

spark 源码分析之十二--Spark RPC剖析之Spark RPC总结

谁说我不能喝 提交于 2020-04-21 07:18:28
在 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv 中,剖析了NettyRpcEnv的创建过程。 Dispatcher、NettyStreamManager、TransportContext、TransportClientFactory、TransportServer、Outbox、Inbox等等基础的知识都已经在前面剖析过了。 可以参照如下文章做进一步了解。 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv spark 源码分析之六 -- Spark内置RPC机制剖析之二Dispatcher和Inbox、Outbox剖析 spark 源码分析之七 -- Spark内置RPC机制剖析之三RpcEndPoint和RpcEndPointRef剖析 spark 源码分析之八 -- Spark内置RPC机制剖析之四TransportContext和TransportClientFactory剖析 spark 源码分析之九 -- Spark内置RPC机制剖析之五StreamManager和RpcHandler spark 源码分析之十 -- Spark内置RPC机制剖析之六TransportResponseHandler

秒懂:tomcat的maxConnections、maxThreads、acceptCount 图解

梦想与她 提交于 2020-04-21 03:18:45
后面附图 | 秒懂 疯狂创客圈 Java 高并发【 亿级流量聊天室实战】实战系列 【 博客园总入口 】 前言 疯狂创客圈 (笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版本的 高并发秒杀: 一、 版本1 :springcloud + zookeeper 秒杀 二、版本2 :springcloud + redis 分布式锁秒杀 三、版本3 :springcloud + Nginx + Lua 高性能版本秒杀 以及有关Springcloud 几篇 核心、重要的文章 : 一、 Springcloud 配置, 史上最全 一文全懂 二、 Springcloud 中 SpringBoot 配置全集 , 收藏版 三、 Feign Ribbon Hystrix 三者关系 , 史上最全 深度解析 四、 SpringCloud gateway 详解 , 史上最全 五、 图解:tomcat的maxConnections、maxThreads、acceptCount | 秒懂 本文,是《tomcat的maxConnections、maxThreads、acceptCount》篇 ,为大家解读tomcat的maxConnections、maxThreads、acceptCount, 大家可以藏好,一定有用的到时候 。 怎么配置tomcat

spring cloud gateway的NettyConfiguration

时光毁灭记忆、已成空白 提交于 2020-04-21 02:28:16
本文主要研究下spring cloud gateway的NettyConfiguration NettyConfiguration @Configuration @ConditionalOnProperty ( name = "spring.cloud.gateway.enabled" , matchIfMissing = true ) @EnableConfigurationProperties @AutoConfigureBefore ( HttpHandlerAutoConfiguration . class ) @AutoConfigureAfter ( { GatewayLoadBalancerClientAutoConfiguration . class , GatewayClassPathWarningAutoConfiguration . class } ) @ConditionalOnClass ( DispatcherHandler . class ) public class GatewayAutoConfiguration { @Configuration @ConditionalOnClass ( HttpClient . class ) protected static class NettyConfiguration { @Bean

Netty入门系列(2) --使用Netty解决粘包和拆包问题

血红的双手。 提交于 2020-04-19 08:05:49
前言 上一篇我们介绍了如果使用Netty来开发一个简单的服务端和客户端,接下来我们来讨论如何使用解码器来解决TCP的粘包和拆包问题 TCP为什么会粘包/拆包 我们知道,TCP是以一种流的方式来进行网络转播的,当tcp三次握手简历通信后,客户端服务端之间就建立了一种通讯管道,我们可以想象成自来水管道,流出来的水是连城一片的,是没有分界线的。 TCP底层并不了解上层的业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分。 所以对于我们应用层而言。我们直观是发送一个个连续完整TCP数据包的,而在底层就可能会出现将一个完整的TCP拆分成多个包发送或者将多个包封装成一个大的数据包发送。 这就是所谓的TCP粘包和拆包。 当发生TCP粘包/拆包会发生什么情况 我们举一个简单例子说明: 客户端向服务端发送两个数据包:第一个内容为 123;第二个内容为456。服务端接受一个数据并做相应的业务处理(这里就是打印接受数据加一个逗号)。 那么服务端输出结果将会出现下面四种情况 服务端响应结果 结论 123,456, 正常接收,没有发生粘包和拆包 123456, 异常接收,发生tcp粘包 123,4,56, 异常接收,发生tcp拆包 12,3456, 异常接收,发生tcp拆包和粘包 如何解决 主流的协议解决方案可以归纳如下: 消息定长,例如每个报文的大小固定为20个字节,如果不够,空位补空格;

Golang websocket推送

跟風遠走 提交于 2020-04-19 06:52:13
Golang websocket推送 在工作用主要使用的是Java,也做过IM(后端用的netty websocket)。最近想通过Golang重写下,于是通过websocket撸了一个聊天室。 项目地址 Github 依赖 golang.org/x/net 下的websocket。 由于我使用的是golang版本是1.12,在国内访问 golang.org/x 需要借助代理,或者通过replace替换为github下的镜像。 module github.com/xuanbo/pusher require golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 replace ( golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/net => github.com/golang/net v0.0.0-20190404232315-eb5bcb51f2a3 golang.org/x/sys => github.com/golang/sys v0.0.0-20190215142949-d0b11bdaac8a golang.org/x/text => github.com/golang/text

2020BAT一线互联网常考Java面试题:Spring+并发编程+JVM+设计模式+Redis

喜你入骨 提交于 2020-04-18 15:30:54
大厂面试主要及经常问到技术点: (文末领取答案) 并发编程、多线程、JVM、优化、Spring、消息框架、分布式、缓存等以及你使用过的框架且第一轮的基础很重要,通过会后录取可能性就相对高了! 今天小编已经将这些大厂都常问的技术点的问题都整理出来了,希望能帮助到深夜还在为面试做准的朋友、后续准备面试的朋友。 面试题如下: 并发编程28题 Synchronized 用过吗,其原理是什么? 你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁? 什么是可重入性,为什么说 Synchronized 是可重入锁? JVM 对 Java 的原生锁做了哪些优化? 为什么说 Synchronized 是非公平锁? 什么是锁消除和锁粗化? 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性? 乐观锁一定就是好的吗? 跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同? 那么请谈谈 AQS 框架是怎么回事儿? 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。 ReentrantLock 是如何实现可重入性的? 除了 ReetrantLock,你还接触过 JUC 中的哪些并发工具? 请谈谈 ReadWriteLock 和 StampedLock。 如何让

手动搭建I/O网络通信框架4:AIO编程模型,聊天室终极改造

点点圈 提交于 2020-04-18 14:44:44
第一章: 手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊 第二章: 手动搭建I/O网络通信框架2:BIO编程模型实现群聊 第三章: 手动搭建I/O网络通信框架3:NIO编程模型,升级改造聊天室   上一章讲到的NIO编程模型比较主流,非常著名的Netty就是基于NIO编程模型的。这一章说的是AIO编程模型,是 异步非阻塞 的。虽然同样实现的是聊天室功能,但是实现逻辑上稍微要比NIO和BIO复杂一点。不过理好整体脉络,会好理解一些。首先还是讲讲概念:   BIO和NIO的区别是阻塞和非阻塞,而AIO代表的是异步IO。在此之前只提到了阻塞和非阻塞,没有提到异步还是同步。可以用我在知乎上看到的一句话表示:【在处理 IO 的时候,阻塞和非阻塞都是同步 IO,只有使用了特殊的 API 才是异步 IO】。这些“特殊的API”下面会讲到。在说AIO之前,先总结一下阻塞非阻塞、异步同步的概念。    阻塞和非阻塞,描述的是结果的请求 。 阻塞 :在得到结果之前就一直呆在那,啥也不干,此时线程挂起,就如其名,线程被阻塞了。 非阻塞 :如果没得到结果就返回,等一会再去请求,直到得到结果为止。 异步和同步,描述的是结果的发出 ,当调用方的请求进来。 同步 :在没获取到结果前就不返回给调用方,如果调用方是阻塞的,那么调用方就会一直等着。如果调用方是非阻塞的

Netty解决粘包和拆包问题的四种方案

廉价感情. 提交于 2020-04-18 11:42:01
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请求都是使用的同一个连接,这样就会产生粘包和拆包的问题。本文首先会对粘包和拆包问题进行描述,然后介绍其常用的解决方案,最后会对Netty提供的几种解决方案进行讲解。这里说明一下,由于oschina将“jie ma qi”认定为敏感文字,因而本文统一使用“解码一器”表示该含义 1. 粘包和拆包 产生粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区,例如1024个字节大小,如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题;如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包,也就是将一个大的包拆分为多个小包进行发送。如下图展示了粘包和拆包的一个示意图: image.png 上图中演示了粘包和拆包的三种情况: A和B两个包都刚好满足TCP缓冲区的大小,或者说其等待时间已经达到TCP等待时长,从而还是使用两个独立的包进行发送; A和B两次请求间隔时间内较短,并且数据包较小,因而合并为同一个包发送给服务端; B包比较大,因而将其拆分为两个包B_1和B_2进行发送

从百度三轮面试拿到offer后又到阿里六轮面试,最后留在了阿里!

巧了我就是萌 提交于 2020-04-17 19:08:19
本人开发五年,从一个中游的公司跳槽的阿里P6,刚刚开始是进行了百度三面,后来拿到百度offer,又到阿里进行六轮面试,其实这六轮的面试下来整体感觉还是不错的,在这之前我其实面试的其他公司的时候很烂。如果要去百度或者阿里面试的话,都需要提前做好充足的准备吧,不然你会败的很惨。 下面整理下我从百度三轮面试回来的题目,供你参考! 一,百度一面 1、给一个函数,返回 0 和 1,概率为 p 和 1-p,请你实现一个函数,使得返回 01 概率一样。 2、10 亿个 url,每个 url 大小小于 56B,要求去重,内存 4G。 3、把一个 bst 转化成一个双向链表。 4、http 和 https 区别,https 在请求时额外的过程,https 是如何保证数据安全的; 5、IP 地址子网划分; 6、POST 和 GET 区别; 7、DNS 解析过程; 8、硬链接和软连接区别; 9、kill 用法,某个进程杀不掉的原因(进入内核态,忽略 kill 信号); 10、linux 用过的命令; 11、系统管理命令(如查看内存使用、网络情况) 12、管道的使用; 13、grep 的使用,一定要掌握,每次都会问在文件中查找; 14、shell 脚本; 15、find 命令; 16、awk 使用 二,百度二面 对照着简历问了些东西。 1、Linux 下的一些指令,$(进程 id),$?