netty编码器、解码器、HTTP通信
Netty编码器、解码器在网络传输的过程中,数据都是以字节流的方式进行传递。客户端在向服务端发送数据的时候,将业务中其他类型数据转化为字节,叫编码。服务端接收到数据为字节流,将字节流转化为原来的格式,叫解码。统称codec。
编解码器分为两部分-编码器和解码器,编码器负责出站,解码器负责入站。
在前面的学习中,我们的数据发送和接收都是需要以ByteBuf形式传输,但是这样是不是有点太不方便了,咱们能不能参考一下JavaWeb那种搞个Filter,在我们开始处理数据之前,过过滤一次,并在过滤的途中将数据转换成我们想要的类型,也可以将发出的数据进行转换,这就要用到编码解码器了。
我们先来看看最简的,字符串,如果我们要直接在客户端或是服务端处理字符串,可以直接添加一个字符串解码器到我们的流水线中:
使用了编码器解码器的客户端
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849package org.wsy.encoder;import io.netty.boots ...
netty工作模型、Channel剖析
Netty工作模型Netty为我们提供的更高级的缓冲区类,我们接着来看看Netty是如何工作的,上一章我们介绍了Reactor模式,而Netty正是以主从Reactor多线程模型为基础,构建出了一套高效的工作模型。
Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup专门负责接受客户端的连接, WorkerGroup专门负读写,就像我们前面说的主从Reactor一样。
无论是BossGroup还是WorkerGroup,都是使用EventLoop(事件循环,很多系统都采用了事件循环机制,比如前端框架Node.js,事件循环顾名思义,就是一个循环,不断地进行事件通知)来进行事件监听的,整个Netty也是使用事件驱动来运作的,比如当客户端已经准备好读写、连接建立时,都会进行事件通知,说白了就像我们之前写NIO多路复用那样,只不过这里换成EventLoop了而已,它已经帮助我们封装好了一些常用操作,而且我们可以自己添加一些额外的任务,如果有多个EventLoop,会存放在EventLoopGroup中,EventLoopGroup就是BossGro ...
netty基础入门篇
再次剖析NIOnetty为什么快呢?这是因为netty底层使用了JAVA的NIO技术,并在其基础上进行了性能的优化,虽然netty不是单纯的JAVA nio,但是netty的底层还是基于的是nio技术。
nio是JDK1.4中引入的,用于区别于传统的IO,所以nio也可以称之为new io。
nio的三大核心是Selector,channel和Buffer,本文我们将会深入探究NIO和netty之间的关系。
Java NIO则是非阻塞的,每一次数据读写调用都会立即返回,并将目前可读(或可写)的内容写入缓冲区或者从缓冲区中输出,即使当前没有可用数据,调用仍然会立即返回并且不对缓冲区做任何操作
NIO框架存在的问题但是之前我们在使用NIO框架的时候,还是发现了一些问题,我们先来盘点一下。
客户端关闭导致服务端空轮询当我们的客户端主动与服务端断开连接时,会导致READ事件一直被触发,也就是说selector.select()会直接通过,并且是可读的状态,但是我们发现实际上读到是数据是一个空的(上面的图中在空轮询两次后抛出异常了,也有可能是无限的循环下去)所以这里我们得稍微处理一下:
12 ...
项目部署-jvm调优
部署上线前准备
索引
开发完成后,到了上线环节,需要检查mysql的索引是否设置合理,如果后续数据量多了在设置索引,那么用时会比较长,需要进行停机维护,造成不好的用户体验
合理设置索引,可以有效的提高查询性能
索引的设计原则:
每个表都必须有自增主键
有顺序,磁盘顺序读写 速度快
插入数据的时候,会插入到最后(B+Tree结构),减少了数据移动
减少页分裂(B+Tree结构)
常做为查询条件的字段,排序,分组的字段建立索引
提高查询效率
索引字段的选择尽量不使用 字段长度较长的
数据量小的表 不建立索引
限制索引的数量 不是越多越好 (通常建议在6个以内)
写比多,并且写频繁的表不建议加索引
不要在区分度低的字段建立索引
比如性别,只有 男 女 未知 三个值,索引完全起不到优化作用
联合索引的创建要符合最左原则
遇到范围查询 索引失效
比如:a = 1 and b = 2 and c > 3 and d = 4,如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任 ...
go语法剖析
什么是go程序执行的入口?runtime包里面的函数(rt0_windows)
是程序员的运行编译环境 JVM就是java的runtime
初始化g0协程栈 是go代码的第一个协程
go启动新的协程调用的是底层的new proc 创建一个新的协程去执行runtime.main 放入调度器等待调度
初始化一个M,用来调度主协程
go的启动像是一个框架 go允许oo编程 但是缺乏继承结构 go的继承只是组合
12345678910111213141516171819202122232425262728package mainimport ( "fmt")type User struct { Id int64 `form:"id" binding:"required"` Name string `form:"name"` Address []string `form:"address"` ...
自研高性能网关-技术选型-架构设计
自研API网关API网关主要的作用有:接口转发、协议转换(http->dubbo)熔断降级、流量监控。
API网关的存在使系统增加了一个必须开发、部署和维护的高可用组件。如果这个组件没有处理好,那么 API 网关就会变成了应用的性能瓶颈。
技术栈调研细节对比
技术栈
优点
缺点
Nginx+OpenResty
性能很好
依赖lua语言进行扩展,加大学习成本
Kong/APISIX
基于OpenResty,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可视化平台等,支持gRPC、Dubbo、http协议转换
Netflix Zuul1.0
案例丰富
基于阻塞IO、性能差
SpringCloud GateWay
异步非阻塞、集成SpringCloud性能好
Netfix Zuul1.0
性能接近SpringCloud GateWay
Netfix闭源,前景不明
开源网关的不足之处组件的附加功能太多-难以维护
技术栈不符合团队
性能参差不齐 Zuul1.0阻塞 APISIXluna语言编写
自研优势因需制宜
研发需求是可以控制的 ...
算法刷题日记记第一阶段
记录我刷题的笔记,从2022年11月29日开始,到2023年5月12日,第一阶段。
日期
hpy
我
差值
2022年11月29日
591
348
243
2022年12月11日
618
388
230
2022年12月26日
639
430
209
2023年1月6日
652
453
199
2023年1月10日
666
475
191
2023年1月16日
677
510
167
2023年1月17日
678
518
160
2023年1月22日
693
535
158
2023年1月25日
700
550
150
2023年1月29日
707
563
144
2023年1月30日
708
568
140
2023年1月31日
709
571
138
2023年2月2日
715
580
135
2023年2月16日
750
622
128
2023年3月5日
774
646
128
2023年3月12日
779
656
123
2023年4月6日
812
680
132
2023年4月15日
817
6 ...
代理模式再剖析
代理模式再剖析代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
静态代理: 在编译时就已经实现,编译完成后代理类是一个实际的class文件
动态代理: 在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
JDK动态代理1.通过实现InvocationHandler接口来自定义自己的InvocationHandler;
2.通过Proxy.getProxyClass获得动态代理类;
3.通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class);
4.通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入;
5.通过代理对象调用目标方法;
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 ...
工厂模式再剖析
工厂模式工厂模式常见的有三种简单工厂模式、工厂方法模式、抽象工厂模式
(一)简单工厂模式简单工厂模式又称静态工厂方法模式。它存在的目的很简单:定义一个用于创建对象的接口。 组成结构: **1) 工厂类角色(Creator)**:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 **2) 抽象产品角色(Product)**:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 **3) 具体产品角色(ConcreteProduct)**:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
1public interface Figure(){public double calculateArea();//计算面积}
具体产品角色 – 正方形、圆形:
12345678910111213141516171819202122232425public class Square implements Figure{//正方形 public Square(){} publ ...