Netty

spring-cloud网关报400 Bad Request问题排查

依然范特西╮ 提交于 2020-11-17 22:23:38
问题现象 api访问时,如果访问过快,第二次访问大概率报Bad Request。 我们对网关做的操作 记录请求报文,打印日志。 对请求进行验签。 验签不通过,打回。验签通过,提取真正的请求参数。 根据请求报文和数据库配置,路由到后端的微服务,并附带真正的请求参数。 问题排查 排查网关日志,未发现异常现象。网关只打印了HTTP的报文体,未打印请求头。 排查微服务日志,发现tomcat接收的请求日志,HTTP请求头丢失了一部,所以Bad Request是微服务报出来的。 由此定位到网关出问题了。查看Netty的HttpServerCodec。发现请求头是一定会写的,为什么会丢失,怀凝是ByteBuf出问题了,导致一部分内容未写进去。 检查 ByteBuf并添加日志,确认ByteBuf没有问题。 由此判定是 tomcat解析出问题了,一部分请求头未解析到。 继续查看tomcat日志,无意中发现content-length与实际内容不一致。由此猜想,可能是对网关进行转发的时候,改变了网关的请求内容,而content-length是已经解析好的。所以需要重设content-length。 String content = toData.getString("content"); byte[] content4Byte = content.getBytes(StandardCharsets

Netty怎么切换三种I/O模式和源码解释

耗尽温柔 提交于 2020-11-17 05:55:06
参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code! 三种I/O模式   BIO:Block I/O,即同步并阻塞的IO;BIO就是传统的java.io包下的代码实现   NIO:New IO(non-blocking IO):同步非阻塞的IO,jdk1.4及以上版本提供   AIO:Async IO: 异步非阻塞IO,jdk1.7 阻塞和非阻塞     阻塞: 没有数据传输过来时,读会阻塞直到有数据;缓冲区满时,写操作也会阻塞。   非阻塞: 非阻塞遇到这些情况都是直接返回。 同步和异步   同步:数据就绪后需要自己去读是同步。   异步:数据就绪后直接读好再回调给程序是异步。 Netty对三种IO的支持    首先Netty是都支持三种IO模式的,准确的来说是曾经都支持过,因为BIO的被Netty给过期了,AIO被Netty给删除了,具体原因这就不多赘述;知道BIO在Netty被称为OIO,NIO在多平台下都有对应的支持,有人会问为啥有common的支持了还有Linux等其他的意义吗,这好比全栈和后端前端之分一样,一个通用一个专用的区别。 Netty切换IO模式    如上图所示,对应的实现类都差不多,甚至可以看出都是头不一样,如果NIO的通用是NioEventLoopGroup

《精通并发与Netty》学习笔记(01

扶醉桌前 提交于 2020-11-15 04:46:57
一、Netty介绍 Netty是由 JBOSS 提供的一个 java开源 框架。Netty提供异步的、 事件驱动 的网络应用程序框架和工具,用以快速开发高性能、高可靠性的 网络服务器 和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、 服务端 应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。 “快速”和“简单”并不用产生维护性或性能上的问题。 Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 (摘自百度百科) 二、Netty的体系结构 三、Netty的核心结构 Netty是典型的Reactor模型结构,在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的可用核数)。 在处理新来的请求时,NioWorker读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。

你知道Redis可以实现延迟队列吗?

穿精又带淫゛_ 提交于 2020-11-14 17:03:41
点击上方蓝色字体,选择“设为星标” 回复”资源“获取整理的海量电子书 作者:_BKing 来源:www.cnblogs.com/xiaowei123/p/13222710.html 最近,又重新学习了下Redis,深深被Redis的魅力所折服,Redis不仅能快还能慢(我想也这么优秀o(╥﹏╥)o),简直利器呀 咳咳咳,大家不要误会,本文很正经的啦!伙伴们跟我一起冲呀,我们一起去爬爬这座延时队列的山峰,探一探它究竟到底有高。 那接下来开始我们的旅行啦~,我们都知道Redis是一种基于内存的单进程单线程数据库(Redis6.0开始之后支持多线程啦!),处理速度都非常快。那么为何Redis又能慢呢?原来,这里说的慢是指Redis可以设置一些参数达到慢处理的结果。(这就是为什么Redis既能快又能慢啦!) 那接下来开始讲讲我们的Redis在队列中如何实现延时的情况: 在我们日常生活中,我们可以发现: 在淘宝、京东等购物平台上下单,超过一定时间未付款,订单会自动取消。 打车的时候,在规定时间没有车主接单,平台会取消你的单并提醒你暂时没有车主接单。 点外卖的时候,如果商家在10分钟还没接单,就会自动取消订单。 收快递的时候,如果我们没有点确认收货,在一段时间后程序会自动完成订单。 在平台完成订单后,如果我们没有在规定时间评论商品,会自动默认买家不评论。 ....... 这时

JAVA基于Swing和netty仿QQ界面聊天小项目

主宰稳场 提交于 2020-11-14 16:26:54
1.前言 2.功能实现 3.模块划分 4.使用到知识 5.部分代码实现 6.运行例图 1.前言    先说一下这个小项目也算是我在大学做的第一个应该算的上是的项目的项目,前前后后用了20天左右吧。先是用swing写好了仿QQ界面(界面很丑)最后逻辑实现都是后面断断续续加进去的。写这个项目之前没有很好的规划在逻辑实现方面与数据库逻辑交互过于频繁。走了很多的弯路 2.功能实现 1.修改功能(密码、昵称、个性签名) 2.添加好友、删除好友 3.单聊功能 4.判断好友是否在线 3.模块划分 4.使用的知识 netty swing 集合等同步阻塞队列synchronousQueue 数据库MySQL中的CRUD C3p0连接池 JSON字符串 5.部分代码实现 1.nettyController.java 接收到来自客户端的消息,与dao层进行交互 dao层与之数据库进行交互 修改密码 添加好友 从添加好友逻辑实现上我走了很多的弯路频繁的访问数据库,这是一件很不好的事情 package chat . Project . controller ; import chat . Project . bean . information ; import chat . Project . constant . EnMsgType ; import chat . Project . dao . * ;

Netty 客户端断线重连

坚强是说给别人听的谎言 提交于 2020-11-14 10:19:59
client 关闭后会执行 finally 代码块,可以在这里可以进行重连操作 public class NettyClient implements Runnable { private final String host; private final int port; private final int reconnectSleepSeconds; public NettyClient(String host, int port, int reconnectSleepSeconds){ this.host = host; this.port = port; this.reconnectSleepSeconds = reconnectSleepSeconds; } @Override public void run() { connect(); } private void connect(){ EventLoopGroup workerGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(workerGroup); b.channel(NioSocketChannel.class); b.option(ChannelOption.SO_KEEPALIVE, true); b

刚毕业不久,接私活赚了2万块!

风格不统一 提交于 2020-11-14 07:01:03
持续坚持原创输出,点击蓝字关注我吧 作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 😜 目录 一、前言 二、2万元私活收入 1. 企业门户网站(5000元) 2. 卖家具宣传网站(2000元) 3. Netty通信框架(2000元) 4. 毕设、讲课、数据采集(11000元) 三、心得体会 四、系列推荐 一、前言 5:30下班让我有更多的时间! 🤔13年~15年,我还从来没想过一天上班,还能干到6点以后!因为我上班的第一家公司是偏传统的外包公司,与互联网公司不同。不知道现在如何了,但当时: 9点到公司,6点下班,但基本大家5:30也就走了。 每天下班都能看见日落☀️ 一个C#写的项目代码能运行十年。 一个Java程序员写了两年C# 一年会出那么几次差,全国各个地方都几乎会去。 一年去了四次上海! 也正是因为这样,5:30 下班回家的我,吃完饭也就7点。剩下了大把的时间让我不停的 折腾 。也就是那段时间接了一些私活,共计赚了2万块。那段期间租住在距离卢沟桥很近的大瓦窑,村落里的平房小院子住起来还是蛮舒服的,开开心心的住了两年。 小傅哥,租住小平房的那些年! 哈哈 ,是不是很大一部分程序员都害怕接私活被发现了不好。而我最开始工作的前两年除了有时间以外,还有一个非常赞的领导。既带着我出去嗨、也领我去他家烤肉

GitHub爆火Java核心知识笔记,入门进阶涨薪如探囊取物

会有一股神秘感。 提交于 2020-11-13 13:12:17
前言 Github 是目前全球最大的男性同性交友平台~最近在GitHub上爆火的一份Java核心知识笔记让大家趋之若鹜,我费尽心思拿到整理后只感觉:Java技术可谓博大精深,知识体系非常丰富并且也极其复杂,因此想要学习好Java其实并不是一件非常轻松的事。当然,刚跨入编程行业的小白也无需担心,这份 Java核心知识笔记 你学完一半基本就可以找个非常不错的开发工作了,如果想要高薪,那就默默地全部学完吧! 目录 内容 本书中的章节大部分是相互独立的。你可以研究自己最感兴趣的主题,并可以按照任意顺序阅读这些章节。 JVM JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 Java集合 集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。 Java多线程并发 Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。 Java基础 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。 Spring 原理 它是一个全面的

857页Alibaba“Java学习进阶笔记”开源!分布式/微服务/Spring框架/JVM/数据结构与算法啥都有

做~自己de王妃 提交于 2020-11-13 11:36:26
笔记作者: 来自于阿里P8级架构师: Mark 笔记特点: 条理清晰,含图像化表示更加易懂。 内容概要: 包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈! 由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。 即可免费获取 JAVA集合 接口继承关系和实现 List ArrayList(数组) Vector(数组实现、线程同步) LinkList(链表) Set HashSet(Hash表) TreeSet(二叉树) JVM JVM就是java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM有自己完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。 线程 JVM内存区域 JVM运行时内存 垃圾回收与算法 JAVA 四种引用类型 GC分代收集算法 VS 分区收集算法 GC垃圾收集器 JAVA IO/NIO JVM 类加载机制 JAVA多线程并发 JAVA并发知识库 JAVA线程实现/创建方式 4种线程池 线程生命周期(状态) 终止线程4种方式

阿里雷卷:RSocket从入门到落地,RSocket让AJP换发青春

安稳与你 提交于 2020-11-13 11:21:02
简介: 借助 RSocket 的架构提供,我们可以将之前比较复杂的方案简化,当然最最重要的是性能的提升,即便之前的一些性能提升技术点,可能由于一些约束等,现在和 RSocket 对接,那些问题都不存在啦!这篇文章只是一个架构启发,不会浪费你时间让你学习 20 年前的技术和知识。 考虑很久,决定还是写一下这篇文章,主要是 AJP 技术太老,我只能说 Long long ago ,估计我在用这个技术的时候,很多同学小学还没有毕业。但是没有问题,这篇文章只是一个架构启发,不会浪费你时间让你学习 20 年前的技术和知识。 Apache JServ Protocol Apache JServ 协议,简称 AJP ,是一种二进制协议,可以将来自 Web 服务器的入站请求代理到位于 Web 服务器后面的应用程序服务器,部署结构如下: 通常我们不希望直接将应用服务暴露到互联网上,有安全问题,当然还涉及到 DNS,IP等问题,我们会做一个互联网请求入口的 Gateway,也就是一个Web服务负责入站请求,然后再转发给内部的Web应用服务器,这样架构就灵活很多。 为何要使用 AJP 这个二进制协议?我们知道 HTTP 1.1 是文本协议,所以解析协议的工作量还是有的,如果 Gateway 的 Web 服务器已经将 HTTP 协议解析啦,为何不复用解析后的结果,形成一个更高效的二进制结构