自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Spring-配置元信息

【代码】Spring-配置元信息。

2024-05-20 22:14:36 2

原创 SpringBean-生命周期

EnvironmentAware 以及后面的接口都是属于ApplicationContext的生命周期,普通的BeanFactory 并不会回调这些Aware接口,在操作ApplicationContext的时候才会回调这些接口,因为在ApplicationContext初始化阶段,会添加一个AwarePostProcessor但是这个类是内置类,所以只有与ApplicationContext打交道才会有更多的Aware接口方法回调。在前面的讨论,已经完成了以下工作,这些工作也是属于前阶段。

2024-05-19 22:02:48 613

原创 Nginx-基础-基础配置-Location

访问:/Test1/Test2/ ~* /Test1/(\w+)$是严格以字母或数字结尾 所以正则匹配不上,走最长前缀匹配 ‘longest prefix string match!访问: /Test1/ 这个时候精准匹配不上了所以按照优先级应该是去找正则匹配,由于我们配置了带参匹配^~ 这个匹配成功也会立即返回。访问:/test1/Test2 这个时候不区分大小写的正则表达式都匹配不上,因为要以字母或数字结尾,所以走普通匹配 返回 ‘longest prefix string match!

2024-05-13 16:58:13 530 2

原创 Spring-Bean 作用域

1 首先自定义Scope@Override@Override@Override@Override@Override2 查找方式/*** 默认scope 就是singleton* @return*/@Bean/*** 创建bean* @return*/// 注册工厂 也就是 ThreadLocalScope.SCOPE_NAME 这个注入会走这里});// 这里开启三个现场去查找i < 3;i ++) {});

2024-05-11 22:01:26 555 1

原创 Spring-依赖来源

这个时候注册会报错,如果启动了,我们可不可以把这个注册写到refresh之后呢?不可以因为这个时候上面的@Autowired 注入的时候找不到这个bean也会报错,所以通过回调函数的方式来处理,当Factory创建好以后进行注册。这个方法后面会有这样一段代码,前者是存储了beanName和beanDefinition 后者是为了保证顺序,因为后者是一个ArrayList。我们看到这里还有一把锁,是因为这个方法可能会被单独使用,但是其实这里锁的是同一个对象,如果是同一个线程内没有额外加锁。

2024-05-09 21:21:48 1043 1

原创 Spirng-IOC零碎知识点

FactoryBean 是 Spring 框架提供的一种特殊的工厂 Bean 接口,用于创建复杂的 Bean 对象。与普通的 Bean 不同,FactoryBean 实现类不直接返回实例化的 Bean 对象,而是通过工厂方法来创建 Bean 实例。总结:对比上面我们可以发现,如果不使用延迟加载在上下文刷新的时候Bean的初始化已经完成了。延迟加载的话,在真正使用的时候才会进行初始化。这里和上面有所区别,这里我们只需要定义工厂就行了,不需要先定义工厂,然后还要定义具体的bean来指定实现工厂。

2024-05-09 13:11:49 459

原创 Spring-依赖查找

Spring 4.1覆盖默认参数:getBean(Class, Object)根据名称 + 类型查找 : getBean(Class, Name)Spring 3.0 获取指定名称+标注类型 Bean 实例。Spring 3.0 获取标注类型 Bean 名称列表。Spring 3.0 获取标注类型 Bean 实例列表。单一类型依赖查找(主要是基于BeanFactory)Spring 5.1 Bean 延迟查找。根据 Bean 类型查找实例列表。根据 Bean 类型查找。根据 Bean 名称查找。

2024-05-09 13:07:39 646

原创 Spring-依赖注入的处理过程

DependencyDescriptor 描述了我们要注入的目标的一些信息,申明类,字段名称,是否必须对应的就是Autowired的知否必须,eager是否是肌饿模式(实时注入),一般不用懒加载都是肌饿的。为什么上面可以直接返回呢,因为在resolveMultipleBeans方法中,判断了注入的类型如果是集合类型,也是走的一样的逻辑findAutowireCandidates找到候选的Bean进行返回。在懒注入的时候我们在这个方法已经有值了,所以逻辑在这一步就结束了,返回的是一个代理对象。

2024-05-08 20:14:02 821

原创 Java-小知识点记录

【代码】Java-小知识点记录。

2024-05-07 15:34:24 233

转载 好文阅读-分布式ID生成

原文链接

2024-05-07 08:35:33 8

转载 好文阅读-10年前微信的架构

3 sequence 机制这个设计很精妙,很多地方也有这种思想的影子例如Mysql的主从同步实现增量更新。2 一般来说复杂的业务都是有分层结构的比如文中的接入层,逻辑层,存储层。1 不同的业务功能交给不同的服务来做。

2024-05-05 14:00:10 13

原创 问题记录-全局配置了跨域但是后端下载仍然跨域-(Java, SpirngBoot)

这个代码也是直接从网上粘贴的,结果就遇到坑了,这个故事告诉我们粘贴代码的时候还是要检查一下核心代码干了什么事情。前端请求后端下载文件,其它接口都不会跨域,唯独这个下载跨域了。好了今天的问题记录就到这里,我继续写Bug去了。把这个该死的reset()注释掉。

2024-04-28 16:00:26 308 1

原创 好文阅读-数据库-CREATE TABLE AS

这种方式创建表不会复制表的索引,主键,外键约束,包括自增ID。因此应该使用 CREATE TABLE LIKE。3 数据的处理可以通过建立临时表的方式,之后还原到正常表。1 DROP DELETE TRUNCATE对比。

2024-04-08 09:48:33 223

原创 好文阅读-Java-限流解决方案

Java限流常见实现

2024-04-07 13:28:31 156

转载 Java-异常处理

检查异常:也称为“编译时异常”,编译器在编译期间检查的那些异常。由于编译器“检查”这些异常以确保它们得到处理,因此称为“检查异常”。如果抛出检查异常,那么编译器会报错,需要开发人员手动处理该异常,要么捕获,要么重新抛出。除了RuntimeException之外,所有直接继承 Exception 的异常都是检查异常。非检查异常:也称为“运行时异常”,编译器不会检查运行时异常,在抛出运行时异常时编译器不会报错,当运行程序的时候才可能抛出该异常。检查异常也就是说在编译时就要进行。

2024-04-06 14:18:35 26

原创 Java-问题记录-NoClassDefFoundError

由于数据库连接识别了导致,在使用这个工具类的时候直接发生了NoClassDefFoundError异常。此次问题说明使用静态代码块的时候要保证静态代码块里面的东西能够正常加载,有异常就要处理异常,否则会导致类加载失败,在使用的时候找不到类。

2024-04-03 16:54:30 199

原创 强化基础-Java-集合

我们看到这个约束其实是不一样的,集合可能是只读的,所以有UnsupportedOperationException异常。Object[] toArray() 与 T[] toArray(T[] a) 的区别。这里只对值得记录的知识点做一个记录,其它平时比较熟悉的基础知识这里不再记录。List有两种实现(ArrayList 是数组实现,LinkedList)因为Long和double 是非线程安全的,有两个四字节,高位和地位。1 set是map key 的实现,Set底层调用Map实现。

2024-04-01 17:25:08 295

原创 强化基础-Java-基础回顾

所谓字符,就是单个的字符表示,例如字母a,或者中文张,外面用单引号包围,比如 char a = ‘B’;Java的成员内部类是一个嵌套在另一个类中的类,它可以访问外部类的成员和方法。8)布尔类型: 使用boolean表示,布尔类型只有两种可能,分别为true或false。所谓浮点型,指的是小数,也叫实数,例如:1.2。2)字节型: 使用byte表示(从-128到127之间的256个整数)。1)整型: 使用int表示(32位)。3)短整型: 使用short表示(16位)。对于异常,性能的优化。

2024-03-30 15:29:45 791

原创 基础强化-Java-面向对象设计

原则四:如果需要集合是可以修改的确保返回的是快照,尽可能返回ArrayList(如果确定的话,如果不确定可以返回LinkedList 但是效率会慢一点)final保证了类的完整性,保证类的行为不被破坏。抽象类介于类和接口之间,其实在1.8之后接口也能有默认的实现所以和抽象类差别不是很大了,但是抽象类可以有自己的成员。关于字符串的拓展,对象都是new出来的,只是String提供了可以直接写成常量的写法,相当于变量常量化。public 和default 可以修饰类(这个类是最外层的内,内置类可以使用)

2024-03-30 15:21:34 860

原创 强化基础-Java-泛型设计

在编译的时候指定了泛型类型,比如向集合里面添加元素的时候会进行类型检查。多参数限制类型 extends 第一个类型可以是类,也可以是接口。比如集合里面元素E,使用泛型实现了通用方法。可以参考Function下面包的设计。super 与 extend。第二或更多的参数必须时接口。2 多界限泛型参数类型。1 编译是强类型检查。

2024-03-30 14:20:44 385

原创 强化基础-Java-函数式设计

Java作为一面向对象的静态语言,其封装性能够屏蔽数据结构的细节,从而更加关注模块的功能性。随着模块功能的提升,伴随而来的是复杂度的增加,代码的语义清晰依赖于开发人员抽象和命名类或方法的能力。如果在接口里面方法是默认实现了,则匿名内置类可以不实现这个方法。函数式接口没有固定的类型(就是说不需要确定它是什么类型),只有固定的模式(SCFP+ action)3 接口方法升级的时候不太好弄,比如我们有三个方法,那如果要升级为4个方法,改动比较大。3 内置类其实在底层也是有类文件的,只不过是JVM帮我们生成的。

2024-03-27 23:26:37 165

原创 强化基础-Java-泛型基础

泛型其实就参数化类型,也就是说这个类型类似一个变量是可变的。

2024-03-27 20:52:18 1012

原创 Jmeter-实战案例(随机上传文件,接口依赖调用)

总结:整个流程第一是通过csv获得编号,第二是需要对第一个接口的返回值进行处理并存入环境变量,便于直接使用。1 首先对于第一个接口生成一个csv文件每次从文件中拿一个bh作为第一个参数(sdbh)的值。layerName和fieldContent里面的name都依赖于第一个接口的返回结果。1-2 appendData 需要依赖于第一个接口的返回结果。4 下一步就是拿到readData的返回结果进行后置处理。1-1 readData需要上传文件。2 新建一个前置处理脚本随机一个文件。

2024-03-15 12:12:38 696

原创 Spring-AOP基础(全在这里)

可以看到我们三种After的执行顺序是先after类似于finally,然后是afterReturing,如果是有异常的话就是after和afterThrowing.通过配置的方式参考前面的配置。我们找到了切入点,我们需要执行的动作,在一个特定的Joint Poiont 进行操作。1 关于顺序问题我们可以看到在同一切面遵循环绕通知 -> 前置通知 -> 后置通知的顺序 当然后置通知里面又有分类,后文会进行介绍。2 前置通知,后置通知都是框架主动执行,只有环绕通知需要我们手动去调用。

2024-03-10 15:03:57 1335

转载 消息队列-kafka-高性能设计及对比

消息查询:RocketMq “topic+key”、“topic+messageId” 支持,kafka 不支持。3 在发送消息的时候,先是通过send发送到了队列里面,然后sender线程批次发送,这样节省了网络开销。Master宕机有无自动切换:RocketMq普通不支持但是 Dledger 支持,kafka 自动支持。建立了一个通道,不将数据拷贝到用户态,而是直接由用户写这个通道,这样少一次拷贝。消息过滤:RocketMq支持,kafka 不支持。消息轨迹:RocketMq支持,kafka 不支持。

2024-03-09 23:40:22 47

原创 消息队列-Kafka-消费方如何分区与分区重平衡

拉取消息:org.apache.kafka.clients.consumer.KafkaConsumer#pollForFetches。协调者会选一个leader一般是先发起JoinGroup的消费者,这个时候协调器会告诉这个消费者去进行分区方案的生成。作用是让组内所有的消费者知道自己应该消费那个分区或者它可以不用消费分区,或者消费多个分区,都是由重平衡机制来保证的。入组成功,自己被选为分配分区的 leader:AbstractCoordinator#onJoinComplete。

2024-03-07 23:17:59 1077

原创 消息队列-Kafka-如何进行顺序消费

然后指定partitioner.class为我们的class,这样就可以自定义我们的分区逻辑,这个时候把需要放到同一个分区的数据使用同样的运算逻辑放到同一个分区即可。如果我们还是想同时消费多个分区并且保证有序,这个时候我们需要将需要保证顺序的消息路由到同一个分区。上面的代码定义了消息会被送到哪一个分区,我们发现起作用的是Partitioner。我们在ProducerConfig里面可以找到只有一段,使用了默认的分区。只有 1 个分区,那这个时候就是能够保证消息的顺序消费。

2024-03-07 22:22:13 500

原创 数据库-Mysql-读写分离(Atalas,Mysql-Router,Mysql-Proxy)

至此使用mycat 搭建读写分离就完成了,这里要注意是基于已经搭建好的一主两从,如果之前没有搭建虽然实现了读写分离,但是主库的数据不会同步。MySQL Router最早是作为MySQL-Proxy的替代方案出现的。不推荐使用,使用MySQL Router代替。这个是很老的了,了解即可。

2024-03-06 08:06:38 976

原创 消息队列-kafka-服务端处理架构(架构,Topic文件结构,服务端数据的一致性)

2 活过来的时候,发现已经有顶替的 leader 角色(主分片)了,那么就跟随,也就是向 leader 获取 HW 高水位线,与自己的 LEO 比对,大于 LEO 则删除,小于 LEO 则从 leader 这边复制数据过去。1 首先它会从ISR中剔除,当恢复正常的时候,会向主分片获取 HW 高水位线,与自己的 LEO 比对,如果自己的 LEO 超过 HW 则干掉超过的部分,小于的话就从主分片复制数据过来。HW:高水位,消费者消费最高的位置,其实也就是木桶原理,所以只能到下面图中的第四条消息。

2024-03-05 22:17:41 1008

原创 消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

我们发现里面是用一个MAP存储的一个分区和ProducerBatch 是讲这个消息写到内存里面MemoryRecordsBuilder 通过这个进行写入。6 接着我们就要看返回逻辑了,可以看到在sendRequest里面sendProduceRequest方法是通过传入了一个回调函数处理返回的。主线程:主线程只负责组织消息,如果是同步发送会阻塞,如果是异步发送需要传入一个回调函数。5 接着我们看,我们append了以后,会有一个判断去唤醒sender线程,见下面的注释。Map集合:存储了主线程的消息。

2024-03-04 23:44:59 957 1

原创 消息队列-Kafka-基础架构

上面这张图类比RocketMQ 相当于对一个主题进行了分区(类似于RockeMQ 消息队列),每个分区存储到不同的Broker。在发送消息的时候都是发送到主分区。如果一台Broker由于其它节点备份了挂掉节点的数据,所以可以继续进行消费,从而保证了整个集群的高可用性。

2024-03-04 21:57:37 680

转载 数据库-主从同步(延迟,全库与部分同步)

在我们搭建的这个主从集群中,有一个比较隐藏的问题,就是这样的主从复制之间会有延迟。当然,这在我们目前的这个集群中是很难出现的,但是在大型集群中会很容易出现。之前提到,我们目前配置的主从同步是针对全库配置的,而实际环境中,一般并不需要针对全库做备份,而只需要对一些特别重要的库或者表来进行同步。首先在Master端:在my.cnf中,可以通过以下这些属性指定需要针对哪些库或者哪些表记录binlog。然后在Slave端:在my.cnf中,需要配置备份库与主服务的库的对应关系。

2024-03-03 16:50:44 40

原创 Mysql-主从架构篇(一主多从,半同步案例搭建)

从 MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。GTID即全局事务ID (Global TransactionIdentifier),其保证每个主节点上提交的事务,在从节点可以一致性的复制。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

2024-03-03 16:11:38 1420

转载 Mysql-Binlog

因为binlog日志文件:mysql-bin.000005是二进制文件,没法用vi等打开,这时就需要mysql的自带的mysqlbinlog工具进行解码,执行: mysqlbinlog mysql-bin.000005 可以将二进制文件转为可阅读的sql语句。sync_binlog=0或sync_binlog大于1,事务被提交,而尚未同步到磁盘。1:每提交一次事务,存储引擎调用文件系统的sync操作进行一次缓存的刷新,这种方式最安全,但性能较低。方式一:使用mysqlbinlog查看binlog日志文件。

2024-03-01 13:39:08 25

原创 网络编程-Disruptor框架 + Netty整合

Disruptor是一个通用解决方案,用于解决并发编程中的难题(低延迟与高吞吐量)。其本质还是一个队列(环形),与其他队列类似,也是基于生产者消费者模式设计,只不过这个队列很特别是一个环形队列。这个队列能够在无锁的条件下进行并行消费,也可以根据消费者之间的依赖关系进行先后次序消费。

2024-02-29 16:58:36 928

原创 设计模式-构造者模式

为了满足2这个时候我们可以也可以把必填的参数通过set的方式来注入,但是这样违背了1,同样之前非必填通过set注入也违背了1.并且如果通过set注入的话,我们的校验逻辑也没有地方放置。假如我们有下面这个config,其中必填的参数有很多,非必填的参数也有几个,maxThread和cpuCore 存在依赖关系。我们可以通过构造参数 + set 来进行赋值操作, 可以实现我们的功能。是不是感觉这种写法更好呢?这样设置了属性以后就不可以被修改了。1 要求这个config一旦填好了以后不可以修改。

2024-02-28 10:48:21 645

原创 设计模式-代理模式(静态代理,动态代理)

代理模式Proxy是⼀种结构型设计模式,能够增强一些功能,不会影响到之前核心功能的流程。

2024-02-27 15:55:12 1008

原创 网络编程-编码与解码(Protobuf)

Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,但其内部使用的仍是 Java 序列化技术,所以在某些场景下不适用。使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述,然后通过 protoc.exe 编译器根据.proto 自动成.java 文件在使用 Netty 开发时,经常会结合 Protobuf 作为 codec (编解码器)去使用,具体用法如下所示。

2024-02-26 09:55:35 991

原创 网络编程-NIO案例 与 AIO 案例

案例说明:一个简单的群聊实现,支持重复上下线。

2024-02-24 20:26:06 602

转载 网络编程-(BIO,NIO,AIO)

这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销.类似于 BIO 中的 stream用来建立到目标(文件,网络套接字,硬件设备等)的一个连接,但是需要注意:BIO 中的 stream 是单向的,(InputStream,OutputStream ),而 NIO 中的通道(Channel)是双向的, 既可以用来进行读操作,也可以用来进行写操作。

2024-02-22 16:37:16 23

空空如也

空空如也

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

TA关注的人

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