自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 Netty应用(七) ----MQTT编解码器

这里梳理下netty中对mqtt协议的编码和解码的处理。一方面对mqtt协议的结构再巩固些,另一方面就是学习下netty中对字节的处理。对于MQTT协议,可以参考前一篇文章MQTT协议详解。

2023-12-19 15:16:50 1514

原创 MQTT协议详解

MQTT协议3.1.1中文版,对于中文文档,最新的版本,可以通过gitbook阅读。大家也可以下载以往版本的文档查看。这里写这篇文章主要是为了后面的Netty应用(七) ---- mqtt服务开发做基础,所以想着这里做下铺垫,这里只是对基本组成和概念进行了解。MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅范式的“轻量级”消息协议,由 IBM 发布。

2023-12-16 21:36:52 1760

原创 Netty应用(六) ---- netty源码(待完善)

在执行完doRegister()方法方法后,在invokeHandlerAddedIfNeeded中会回调initAndRegister()方法中添加的处理器中的initChannel方法,给pipeline上又添加了一个ServerBootstrapAcceptor处理器。里面有两个重要的方法,如下图。bind方法的层级比较深,建议通过debug模式往下看,不要自己点。在initAndRegister()方法中,我们先看初始化的逻辑,即。我们看下bind方法的内部调用链,找到doBind方法。

2023-12-14 17:01:48 959

原创 Netty应用(五) ---- netty优化

我们定义的messagePb.proto文件本身就是消息的定义,所以我们如果补全文件的话,相当与我们之前定义的那些消息请求,都集成到MessagePb这一个类中,并且还有对应的set/get方法。这称为Nagle算法。注意我们编译后生成的类名,就是取的文件名,所以我们这边不叫message.proto,否则和我们之前的messge类重名,导包会麻烦。当处理Accept的速率小于连接建立的速率时,全连接队列中堆积的连接数大于SO_BACKLOG设置的值是,便会抛出异常。我们打开代码后,会发现是缺少依赖的。

2023-12-12 19:52:05 886

原创 Netty应用(四) ----聊天室

Data@Slf4j@Override// 1. 4个字节的魔数// 2. 1字节的版本// 3. 1字节的序列化方式,0-jdk 1-json// 4. 1字节表示消息类型,比如登录、退出..// 5. 4字节表示消息请求序号// 由于4+1+1+1+4+4=15,我们再加一字节用于补齐,无意义// 6. 4字节表示消息的长度// 7.消息正文@Override。

2023-12-08 17:42:18 802

原创 Netty应用(三) ----协议设计与解析

魔数,用来在第一时间判定是否是无效数据包,一般协议的头几个就是魔数,比如Java字节码魔数是cafe版本号,可以支持协议的升级序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian等指令类型,跟业务相关,即消息类型请求序号,为了双工通信,提供异步能力正文长度:通过正文长度才知道接下来的正文长度是多长消息正文: 用户名,密码等等,我们通常用 json 或者 xml 格式,java也支持对象流(序列化)

2023-12-07 15:29:46 986

原创 Netty应用(二) ---- 粘包半包的处理

滑动窗口其实就是一个缓冲区,在滑动窗口内发送的数据,无需接收响应,可以继续发送。当第一个数据ack确认之后,滑动窗口就会向下移动一个单位。当接收方的滑动窗口设置足够大,并且接收方处理不及时的情况下,发送方发过来的数据就会在接收方的滑动窗口中缓冲多个报文,最终导致粘包。当接收方的滑动窗口设置小于实际发送量,就只能先处理一部分数据,等ack确认后再处理后续的,就导致了半包的情况。我们可以调节server端接收缓冲区的大小,设置小一点,当client端一次发送的包size超过设置最大值的时候,就会发生半包现象。

2023-12-07 11:38:26 770

原创 netty应用(一)--netty入门及组件

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。注意:这里的异步不要和异步IO混淆,这里的异步指Netty使用多线程来完成结果传送,让发送请求的线程不阻塞。优点Nio开发工作量大,bug多需要自己构建协议netty解决 TCP 传输问题,如粘包、半包nio中在liunx系统中epoll 空轮询导致 CPU 100%

2023-12-07 11:37:27 919

原创 Mongodb高级查询

对基础语法还不了解的,可以去此网站进行学习,语法比较全面。

2023-10-09 16:28:46 89

原创 RabbitMq安装(含延迟队列插件安装)--Liunx系统

现在最新的版本已经到v26.0.2,最新的版本不支持el7的,我们可以找个之前的版本,我这里用的erlang-23.3.4.8-1.el7.rpm,该版本支持el7,我们下载对应的rpm包就好了。RabbitMQ默认提供了WEB插件,方便通过页面进行RabbitMQ管理,需要执行如下命令启用WEB插件。,比如这里的3.9.0是支持3.9.x版本的,我们下载ez插件包就好了。对应的rabbitMQ版本:从3.8.4 到 3.9.21都是支持的。找到对应版本后,在版本的最下面的Assets中有详细的下载版本。

2023-06-30 15:14:32 1060

原创 如何将SpringBoot项目构建成zip包

springboot项目中,我们可以通过maven-antrun-plugin插件指定一个自定义的文件,在构建项目时就会根据此文件构建。

2023-03-31 17:39:36 616

原创 Redisson使用--bitMap

Redis 的位图(bitmap)是由多个二进制位组成的数组,只有两种状态,0和1, 数组中的每个二进制位都有与之对应的偏移量(从 0 开始),通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作。

2023-03-16 14:52:44 1365

原创 SpringCloudGateway CORS跨域问题解决

一.前端页面通过不同域名或IP直接访问后台微服务@Configurationpublic class CorsFilterConfiguration { /** * 跨域配置 * * @return */ @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); /

2022-01-14 22:55:12 214

原创 Spring5源码分析(5)----循环依赖源码分析

0.前置内容相关文章链接: Spring5源码分析(4)----循环依赖原理分析1.循环依赖流程图假设instA依赖instB,instB又依赖instA,那么在代码中的调用流程如下图:2.doGetBean方法 protected <T> T doGetBean( String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) thro

2021-09-21 16:48:37 137

原创 Spring5源码分析(4)----循环依赖原理分析

1.什么是循环依赖?所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。或者是 A 依赖 B,B 依赖 C,C 又依 赖 A。它们之间的依赖关系如下:2.一级缓存和二级缓存原理分析2.1 一级缓存的作用我们可以简单手写实现下创建bean的过程,如下:重点关注getBean方法,过程已在注释中标明。@Componentpublic class InstanceA { @Autowired private InstanceB instanceB;}@

2021-09-21 16:48:08 108

原创 Spring5源码分析(3)----后置处理器ConfigurationClassPostProcessor

ConfigurationClassPostProcessor

2021-09-21 16:46:40 73

原创 Spring5源码分析(2)----spring IoC容器的加载过程

1.实例化容器:AnnotationConfigApplicationContext这里主要分析注解形式的源码,我们启动容器的时候,虽然只是new了一个AnnotationConfigApplicationContext对象,但是在这个过程中spring处理了很多的事情。AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);AnnotationCo

2021-09-12 22:38:29 118

原创 Spring5源码分析(1)----spring源码编译

1.下载Spring源码GitHub Spring源码下载链接: https://github.com/spring-projects/spring-framework.注意:下载的时候选择branch和对应的tag,下载RELEASE版本的,这种是正式版,稳定性更好,M1,M2,…中的M是milestone的意思,意思是里程碑,代表着有重大改进的版本。用git克隆或者直接下载zip包,我一般都是用spring-framework-5.1.20.RELEASE。由于5.1.20版本的源码,我之前很早就编

2021-09-11 23:22:10 917

原创 Spring高级特性(3)----后置处理器及SpringBean的生命周期

Spring提供了两种后处理bean的扩展接口,分别为 BeanPostProcessor 和BeanFactoryPostProcessor,两者在使用上是有所区别的。工厂在前,bean对象在后。在BeanFactory初始化之后可以使用BeanFactoryPostProcessor进行后置处理做⼀些事情,在Bean对象实例化(并不是Bean的整个生命周期完成)之后可以使用BeanPostProcessor进行后置处理做⼀些事情。注意:对象不一定是springbean,但springbean⼀定是个对

2021-09-01 23:28:22 172

原创 Spring高级特性(2)----BeanFactory和FactoryBean

BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础行为,负责⽣产和管理Bean的⼀个⼯⼚,具体使⽤它下面的子接口类型,比如ApplicationContext。此处我们重点分析FactoryBean。Spring中Bean有两种,⼀种是普通Bean,⼀种是工厂Bean(FactoryBean),FactoryBean可以生成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它自定义Bean的创建过程。FactoryBean是一个接口,源码入下:// 可以让我们⾃定义Bean的

2021-08-29 16:12:51 140

原创 Spring高级特性(1)----bean的延迟加载

ApplicationContext 容器的默认行为是在启动服务器时将所有 singleton bean提前进⾏实例化。提前实例化意味着作为初始化过程的⼀部分,ApplicationContext 实例会创建并配置所有的singleton bean。控制bean是否要延迟加载由lazy-init属性来控制,默认为false。<!-- lazy-init属性默认为false--> <bean id="lazyBean" class="com.nanmao.LazyBean"

2021-08-29 00:19:08 1541

原创 Spring框架基础(4)----Ioc注解开发

xml与注解相结合模式1)实际企业开发中,纯xml模式使⽤已经很少了,一般是xml和注解相结合或者是纯注解方式。2)引入注解功能,不需要引入额外的jar。3)xml+注解结合模式,xml⽂件依然存在,所以,spring IOC容器的启动仍然从加载xml开始。4)第三方jar中的bean定义在xml,比如德鲁伊数据库连接池,自己开发的bean定义使用注解。<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.

2021-08-28 23:21:47 107

原创 Spring框架基础(3)----DI依赖注入

第四个

2021-08-22 23:21:48 113

原创 Spring框架基础(2)----Bean的创建及标签属性

一、实例化Bean的三种方式⽅式⼀:使⽤⽆参构造函数在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象。如果类中没有⽆参构造函数,将创建失败。<bean id="userService" class="com.nanmao.service.impl.UserServiceImpl"/>⽅式⼆:使⽤静态⽅法创建(静态工厂创建对象)在实际开发中,我们使⽤的对象有些时候并不是直接通过构造函数就可以创建出来的,它可能在创建的过程中会做很多额外的操作。此时会提供⼀个创建对象的⽅法,恰好这

2021-08-22 17:26:41 276

原创 Spring框架基础(1)----Ioc容器xml使用

启动 IoC 容器的⽅式Java环境下启动IoC容器:ClassPathXmlApplicationContext:从类的根路径下加载配置⽂件(推荐使⽤)FileSystemXmlApplicationContext:从磁盘路径上加载配置⽂件AnnotationConfigApplicationContext:纯注解模式下启动Spring容器 <!--引入spring Ioc容器依赖--> <dependency> &

2021-08-21 23:54:24 70

原创 手写IOC和AOP(四)----动态代理改造事务控制

代理模式分为静态代理和动态代理,我们先以一个例子来回顾这两种代理模式的使用。静态代理:静态代理,有点类似于装饰设计模式。静态代理是一种编译期增强,还没运行就已经知道增强的目标对象。装饰设计模式是运行时增强,只有运行时才知道具体增强的目标。以租房举例,我们可以自己去找房源去租房子,也可以通过中介去租,这里的我们也就是租房的客户就是委托者,中介就是一个代理者。作为客户,我们需要将自己的需求告知中介,作为中介,需要提供一个客户访问或接入的方式,得需要客户能找到你。站着两者的角度,他们最终目的都需要干一件事-

2021-08-18 23:21:19 100

原创 手写IOC和AOP(三)----添加事务控制

问题:转账案例中,service层只是简单的实现了转账过程中变更数据库数据的操作,并没有进行相关的事务控制。如果在两个更新账户信息方法中间添加一个异常,第一个更新方法正常执行,而第二个方法则不会执行,造成了数据的不一致性。所以我们需要对业务处理过程添加事务控制,保证其满足事务的ACID原则。 accountDao.updateAcctByCardId(fromAcctInfo); int i = 1 / 0; accountDao.updateAcctByCardId(toAcctInfo);问

2021-08-11 23:05:21 149

原创 手写IOC和AOP(二)----new关键字强耦合改造

在转账案例中,TransferServlet和TransferServiceImpl代码中,直接用的new关键字去创建对象,属于一个强耦合代码关系。当需要切换Dao层实现类的时候必须修改service层代码,不符合面向接口与开发的最优原则。假如在项目迭代中,dao层不再采用JDBC技术实现,而是采用mybatis实现,我们在写完MybatisAccountDaoImpl后,需要在之前所有new accountDaoImpl的地方都得进行更改。private TransferService transfer

2021-08-08 14:47:50 128

原创 手写IOC和AOP(一)----转账案例原型

这里以一个转账的例子原型开启手写IOC和AOP过程。原型代码是按三层架构模型来写的,controller层采用的是servlet,dao层采用jdbc来实现的,此代码中只是简单的模拟了转账的过程,中间存在的问题点,在后面会去分析以及改进。代码结构如下:前台页面:在页面中对账户信息给定了默认值,对应数据库中的账户信息,我们可以自定义转账的金额。采用ajax指定发送url地址和发送的数据,返回结果采用json格式进行接收并根据返回的结果码信息以弹出框的形式给出转账结果的提示。<script

2021-08-08 01:42:41 207

Netty应用(四) -聊天室

Netty应用(四) -聊天室

2023-12-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除