自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(212)
  • 资源 (3)
  • 收藏
  • 关注

原创 【netty】TCP 粘包和拆包及解决方案

TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的由于TCP无消息保护边界, 需要在接收端处理消息边界问题,也就是我们所说的粘包、拆包问题, 如下图。

2023-07-10 23:41:50 532

原创 【netty】Netty模型

当向一个 Selector 中注册 Channel 后,Selector 内部的机制就可以自动不断地查询(Select) 这些注册的 Channel 是否有已就绪的 I/O 事件(例如可读,可写,网络连接完成等),这样程序就可以很简单地使用一个线程高效地管理多个 Channel。入站事件和出站事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干扰。

2023-07-10 23:36:56 268

原创 【netty】Reactor线程模型

目前存在的线程模型有:传统阻塞 I/O 服务模型 Reactor 模式根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现单 Reactor 单线程;单 Reactor 多线程;主从 Reactor 多线程Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor)

2023-07-04 23:50:09 209

原创 【netty】I/O模型

Java BIO 就是传统的java io 编程,其相关的类和接口在 java.ioBIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,程序简单易理解。

2023-07-04 00:08:58 117

原创 【netty】什么是netty

netty

2022-10-31 22:22:09 180 1

原创 线程相关概念

一.线程运行的原理每个线程启动后,虚拟机就会为其分配一块栈内存。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。线程上下文切换(Thread Context Switch)因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码线程的 cpu 时间片用完垃圾回收有更高优先级的线程需要运行线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方

2022-05-28 21:13:51 104

原创 【设计模式】【行为型】备忘录模式

一.概述1.1 概述又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态1.2 结构发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能

2022-05-23 23:41:03 112

原创 【设计模式】【行为型】访问者模式

一.概述1.1 概述1.2 结构二.场景三.类图及实现

2022-05-23 23:15:35 83

原创 【设计模式】【行为型】迭代器模式

一.概述1.1 概述提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。1.2 结构抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成

2022-05-23 20:51:36 117

原创 【设计模式】【行为型】中介者模式

一.概述1.1 概述又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。1.2 结构抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽

2022-05-23 20:17:20 73

原创 【设计模式】【行为型】观察者模式

一.概述1.1 概述又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。1.2 结构Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,

2022-05-23 19:29:21 77

原创 【设计模式】【行为型】命令模式

一.概述1.1 概述将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。1.2 结构命令模式包含以下主要角色:抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。实现者/接收者(Receiver)角色: 接收者,真正执行命令的对象。任何类都可能成

2022-05-22 22:42:59 166

原创 【设计模式】【结构型】享元模式

一.概述1.1 概述运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。1.2 结构享元(Flyweight )模式中存在以下两种状态:内部状态,即不会随着环境的改变而改变的可共享部分。外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现享元模式的主要有以下角色:抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提

2022-05-22 21:16:12 65

原创 【设计模式】【结构型】组合模式

一.概述1.1 概述又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。1.2 结构组合模式主要包含三种角色:抽象根节点( ):定义系统各层次对象的共有方法和属性,可以预先定义一些默认行为和属性。树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构。叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最

2022-05-22 20:47:40 77

原创 【设计模式】【结构型】外观模式

一.概念1.1概念又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。1.2结构外观(Facade)模式包含以下主要角色:外观(Facade)角色:为多个子系统对外提供一个共同的接口。子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。二.场景物联网时代,可以将打开灯、打开电视、打开空调;睡觉

2022-05-22 18:15:36 64

原创 【设计模式】【结构型】桥接模式

一.概念1.1概念将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和现这两个可变维度的耦合度。1.2 结构桥接(Bridge)模式包含以下主要角色:抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。

2022-05-22 18:03:09 81

原创 【设计模式】【结构型】装饰者模式

一.概述1.1 概念指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。1.2 结构装饰(Decorator)模式中的角色:抽象构件(Component)角色 :定义一个抽象接口以规范准备接收附加责任的对象。具体构件(Concrete Component)角色 :实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰(Decorator)角色 : 继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。具体装饰(ConcreteDecora

2022-05-22 17:11:24 70

原创 【设计模式】【结构型】适配器模式

一.概念将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。适配器模式(Adapter)包含以下主要角色:目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。适配器(Adapter)类:它是一个转换器,通过继承或引用适

2022-05-22 16:28:10 77

原创 【设计模式】【创建型】建造者模式

一.概述将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型

2022-05-21 22:00:28 91

原创 【设计模式】【创建型】原型模式

一.概述1.1用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。1.2结构原型模式包含如下角色:抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。访问类:使用具体原型类中的 clone() 方法来复制新的对象。二.场景2.1 类图2.2 代码public class Realizetype implements Cloneable { public Real

2022-05-21 21:35:00 148

原创 【设计模式】概述

一.概述1.1 概念软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。1.2 分类创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF(四人组)书中提供了单例、原型、工厂方法、抽象工厂、建造者等 5

2022-05-21 17:07:01 68

原创 I/O模型

一.Java BIO1.1同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器 端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销1.2解决处理多个客户的请求:开启线程或线程池处理客户端连接请求;1.3缺点:每个Socket接收到,都会创建一个线程,线程的竞争、切换上下文影响性能;每个线程都会占用栈空间和CPU资源;并不是每个socket都进行lO操作,无意义的线程处理;客户端的并发访问增加时。服务端将呈现1:1的线程开销,访问量越

2022-05-11 10:48:21 78

原创 Sharding-jdbc执行流程分析

一.流程分析(1)解析sql,获取片键值,在本例中是order_id(2)Sharding-JDBC通过规则配置数据库和表路由规则 t_order_$->{order_id % 2 + 1},知道了当order_id为偶数时,应该往 t_order_1表插数据,为奇数时,往t_order_2插数据。(3)于是Sharding-JDBC根据order_id的值改写sql语句,改写后的SQL语句是真实所要执行的SQL语句。(4)执行改写后的真实sql语句(5)将所有真正执行sql绑定表 :指

2022-05-10 14:35:51 658

原创 Spring 事务失效的几种场景

1.抛出检查异常导致事务不能正确回滚spring 默认只会回滚非检查异常,需要配置rollbackFor属性指定回滚2.业务方法内自己try-cache异常导致事务不能正确回滚事务通知只有捕获到目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉解决:cache中原样抛出异常或者cache代码块中执行 TransactionInterceptor.currentTransactionStatus().setRollbackOnly();3.日志Aop切面 中捕获了s

2022-05-09 00:16:34 277

原创 Sharding-JDBC快速入门demo

一.需求描述使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用 方法;通过Sharding-Jdbc向订单表插入数据, 按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入t_order_2,通过Sharding-Jdbc 查询数据,根据 SQL语句的内容从t_order_1或t_order_2查询数据。二.环境搭建1.sqlCREATE DATABASE `order_db` CHARACTER SET 'u

2022-05-07 21:35:00 655

原创 Kafka调优

topic分区数和消费者数量topic的分区数大于等于消费者内节点数存储日志:每个日志文件的文件名为起始偏移量,因为每个分区的起始偏移量是0,所以,分区的日志文件都以0000000000000000000.log开始;默认的每个日志文件最大为「log.segment.bytes =102410241024」1G;为了简化根据offset查找消息,Kafka日志文件名设计为开始的偏移量。写入日志:新的消息总是写入到最后的一个日志文件中该文件如果到达指定的大小(默认为:1GB)时,将滚动到一个新

2022-05-04 21:38:47 1771 1

原创 seata实现2PC事务

一.业务说明本实例通过seata实现分布式事务,模拟两个账户跨行转账交易过程业务框架:数据库:MySQL-5.7.25,微服务框架:spring-boot-2.1.3、spring-cloud-Greenwich.RELEASEseata客户端(RM、TM):spring-cloud-alibaba-seata-2.1.0.RELEASE seata服务端(TC):seata-server-0.7.1 下载地址...

2022-04-28 22:20:27 1142

原创 分布式事务解决方案

一.什么是2PC2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。准备阶段(Prepare phase):事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事 务,并写本地的Undo/Redo日志,此时事务没有提交。 (Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,用于提交事务后写入数 据文件);提交阶段(commit

2022-04-28 16:24:41 248

原创 类初始化和实例初始化面试题

public class Father { private int a = testA(); private static int b = testB(); static { System.out.println("(1)"); } Father() { System.out.println("(2)"); } { System.out.println("(3)"); } pri

2022-04-22 21:30:38 426

原创 Dockerfile使用技巧

一.什么是DockerfileDockerfile 是 Docker 中用于定义镜像自动化构建流程的配置文件,在 Dockerfile 中,包含了构建镜像过程中需要执行的命令和其他操作。通过 Dockerfile 我们可以更加清晰、明确的给定 Docker 镜像的制作过程,而由于其仅是简单、小体积的文件,在网络等其他介质中传递的速度极快,能够更快的帮助我们实现容器迁移和集群部署。Dockerfile 优势:Dockerfile 的体积远小于镜像包,更容易进行快速迁移和部署;环境构建流程记录了 Doc

2022-04-20 17:11:47 694

原创 Docker 容器与镜像

一.查看镜像$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE在 docker images 命令的结果中,我们可以看到镜像的 ID ( IMAGE ID)、构建时间 ( CREATED )、占用空间 ( SIZE ) 等数据。注意: Docker 只显示了镜像 ID 的前 12 个字符二.镜像的命名分成三个部分:username、reposito

2022-04-20 15:56:24 2365

原创 Docker 安装

一. CentOS 安装Docker yum install yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install docker-ce#开机启动systemctl enable docker#启动dockersystemctl start docker二.ma

2022-04-20 00:01:35 831

原创 初识 Docker

一.虚拟化虚拟化技术:虚拟化技术是一种将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用的技术。程序跨平台:要实现程序跨平台兼容的方法其实很简单,只要操作系统或者物理硬件所提供的接口调用方式一致,程序便不需要兼容不同硬件平台的接口,而只需要针对这一套统一的接口开发即可。虚拟化技术正是通过其本身适配不同平台的硬件,而加以抽象成统一的接口,来实现程序跨平台运行这一目的的。虚拟化的分类:平台虚拟化:在操作系统和硬件平台间搭建虚拟化设施,使得整个操作系统都运行在虚拟后的环境中。应用程序虚拟化:

2022-04-19 23:32:42 73

原创 topic的相关操作

一.创建主题创建了一个分区数为4、副本因子为2(3个broker节点)的主题 topic-demokafka-topics.sh --zookeeper localhost:2181/kafka --create --topic topic-create --partitions 4 --replication-factor 2查看主题列表kafka-topics.sh --zookeeper localhost:2181/ kafka –list查看主题信息kafka-topics.sh

2022-04-17 16:40:28 184

原创 消费者消费消息分析

消费者者实例代码public class KafkaConsumerClient { public static final String brokerList = "localhost:9092"; public static final String topic = "topic-demo"; public static final String groupId = "group.demo"; public static final AtomicBoolean isRu

2022-04-17 15:35:22 692

原创 生产者发送消息分析

一.生产者发送消息生产者实例代码public class KafkaProducerClient { public static final String brokers = "localhost:9092"; public static final String topic = "topic-demo"; public static Properties initConfig(){ Properties props = new Properties();

2022-04-16 22:49:03 2394

原创 kafka入门及环境搭建

一.基本概念一个典型的 Kafka 体系架构包括若干 Producer、若干 Broker、若干 Consumer,以及一个 ZooKeeper 集群, 其中 ZooKeeper 是 Kafka 用来负责集群元数据的管理、控制器的选举等操作的。Producer 将消息发送到 Broker,Broker 负责将收到的消息存储到磁盘中,而 Consumer 负责从 Broker 订阅并消费消息。...

2022-04-16 20:16:53 224

原创 RocketMQ原理及解析

1 如何保证消息的可靠性传输生产者丢失数据:生产者设置同步提交消息,并且手动提交,将消息同步刷盘到从节点后在返回成功,broker :主从复制,同步刷盘消费端:消费重试,只有返回consume_success 才算消费完成,保证消息的可靠性,最终还是消费16次还是失败的会进死信队列2.如何保证消息不被重复消费消费端消费消息的幂等1 服务端代码根据messageId 设置分布式锁,获取锁再做业务操作2 更新数据库时校验业务的状态3 或者设置唯一索引3.如何保证消息的顺序性...

2022-04-07 16:46:55 3053

原创 zuul 和 gateway 原理分析

一. zuul 原理分析zuulServlet 源码public class ZuulServlet extends HttpServlet { private ZuulRunner zuulRunner; public void init(ServletConfig config) throws ServletException { ... } public void service(javax.servlet.ServletReques

2022-03-29 00:23:45 421 1

原创 Spring 解决循环依赖

一. Bean的生命周期二. 什么是什么是三级缓存 /** 1级缓存 Cache of singleton objects: bean name to bean instance. */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); /** 2级缓存 Cache of early singleton objects: bean name to bean i

2022-03-27 23:43:39 635

mq-starter.zip

RocketMQ消息中间件,微服务集成此jar即可快速发送消息,无需关心发送细节

2021-07-03

ratelimiter-starter.zip

限流框架源码 源码解析:https://blog.csdn.net/weixin_47626220/article/details/117364111

2021-05-28

读写分离源码及其测试代码

读写分离插件的源码,其中db-router-test项目是测试项目代码,先 mvn install datasource-router-starter项目后可运行测试;源码解析:https://blog.csdn.net/weixin_47626220/article/details/117090788

2021-05-24

空空如也

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

TA关注的人

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