- 博客(35)
- 收藏
- 关注
原创 自定义动态数据源+事务控制
以上是自定义动态数据源+事务控制 关注老哥带你上高速。在业务类型上添加如下的代码实现切换。定义DataSource注解。
2024-07-02 16:32:25
182
原创 mybatis-plus之数据源切换事务失效问题
由于业务数据来源不同 需要配置多个数据源来进行数据的查询 编辑等操作 这一切换业务对数据的一致性要求很高那就要保证ACID啦 也就是数据的有效性 要么是成功的 要么是失败的。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。一定要明白事务的传播特性,开发中其实常用的就只有REQUIRED和REQUIRES_NEW,大家只要把这两个搞明白,就能应对绝大数的问题。多数据源失效,然后去掉事务发现切换正常 在于这样的切换失去了事务控制的行为。事务的传播行为可以由传播属性指定。
2024-05-13 10:30:54
533
原创 第五步->手撕spring源码之资源加载器解析到注册
这样在接口 BeanDefinitionReader 的具体实现类中,就可以把解析后的 XML 文件中的 Bean 信息,注册到 Spring 容器去了。这里需要注意 getRegistry()、getResourceLoader(),都是用于提供给后面三个方法的工具,加载和注册,这两个方法的实现会包装到抽象类中,以免污染具体的接口实现方法。按照资源加载的不同方式,资源加载器可以把这些方式集中到统一的类服务下进行处理,外部用户只需要传递资源地址即可,简化使用。上述的Resource的接口 同样在。
2024-05-12 22:56:17
498
原创 第四步->手撕spring源码之bena注入实现和依赖
其实还缺少一个关于类中是否有属性的问题,如果有类中包含属性那么在实例化的时候就需要把属性信息填充上,这样才是一个完整的对象创建。3:另外是填充属性信息还包括了 Bean 的对象类型,也就是需要再定义一个 BeanReference,里面其实就是一个简单的 Bean 名称,在具体的实例化操作时进行递归创建和填充,与 Spring 源码实现一样。2:由于我们需要在创建Bean时候填充属性操作,那么就需要在 bean 定义 BeanDefinition 类中,添加 PropertyValues 信息。
2024-05-12 18:28:14
326
原创 第三步->手撕spring源码之基于Cglib实现实例化策略
把入参信息传递给 newInstance 进行实例化。从不断的完善增加需求可以看到的,当你的代码结构设计的较为合理的时候,就可以非常容易且方便的进行扩展不同属性的类职责,而不会因为需求的增加导致类结构混乱。所以在我们自己业务需求实现的过程中,也要尽可能的去考虑一个良好的扩展性以及拆分好类的职责。3:接下来就需要循环比对出构造函数集合与入参信息 args 的匹配情况,这里我们对比的方式比较简单,只是一个数量对比,而实际 Spring 源码中还需要比对入参类型,否则相同数量不同入参类型的情况,就会抛异常了。
2024-05-12 17:43:30
784
原创 第二步->手撕spring源码之bean操作
3:除此之外这个类还实现了接口 BeanDefinitionRegistry 中的 registerBeanDefinition(String beanName, BeanDefinition beanDefinition) 方法,当然你还会看到一个 getBeanDefinition 的实现,这个方法我们文中提到过它是抽象类 AbstractBeanFactory 中定义的抽象方法。所以有时候你会看到一些类的强转,调用某些方法,也是因为你强转的类实现接口或继承了某些类。后续继续完成手写spring源码。
2024-05-12 11:38:09
988
原创 第一步->手撕spring源码之Bean容器创建
它的数据结构会尽可能最大限度的让整个数据读取的复杂度在 O(1) ~ O(Logn) ~O(n)之间,当然在极端情况下也会有 O(n) 链表查找数据较多的情况。不过我们经过10万数据的扰动函数再寻址验证测试,数据会均匀的散列在各个哈希桶索引上,所以 HashMap 非常适合用在 Spring Bean 的容器实现上。以上的测试 能简单你的看出 始化 Bean 工厂、注册 Bean、获取 Bean,三个步骤,使用效果上贴近与 Spring,但显得会更简化。1:简单的bean定义 如下。
2024-05-11 18:49:05
698
1
原创 Feign 第一次调用为什么会很慢?
Feign进行远程调用的,这里面包括,注册中心、负载均衡、FeignClient之间的关系,微服务通过不论是eureka、nacos也好注册到服务端,Feign是靠Ribbon做负载的,而Ribbon需要拿到注册中心的服务列表,将服务进行负载缓存到本地,然后FeignClient客户端在进行调用。B:WeightedResponseTimeRule(权重比策略,优先选择权重比高的服务,也就是服务响应时间比C:较短的,响应时间越长权重比越低)需要咨询更多的问题 欢迎识别下方二维码开启我们的故事吧。
2024-05-11 14:51:30
955
原创 SpringBoot之远程调用的三大方式
SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(像发起流程接口submit等等)下面也是提供了三种方式(不使用dubbo的方式)供我们选择。定义serviceImpl。定义controller。定义controller。
2024-05-09 17:42:15
1358
1
原创 Excel操作之工具类
C:为了方便后续解析任意的excel文件 故创建一个文件解析工具 ExcelParserUtil.java。以上的是Excel操作之工具类 若需完整代码 可识别二维码后 给您发代码。上述的属性A B的index对应excel的标题头的第几列的字段值。A:创建excel表格对应的字段注解 ExcelColumn。D:使用上述工具类进行文件的解析和下载功能演练。1:将路径下的excel文件进行解析 下载。B:建立一个excel映射的实体对象。4:文件相关操作工具类。3:文件基础相关操作。
2024-05-09 17:08:00
415
原创 分布式锁之RedissonLock
俗话说他就是看门狗,看门狗机制是一种用于保持Redis连接活跃性的方法,通常用于分布式锁的场景。看门狗的工作原理是:当客户端获取到锁之后,会对Redis中的一个特定的键设置一个有限的过期时间,然后每隔一段时间(默认是15秒),客户端会对这个键“续约”,即重新设置它的过期时间,以此来保持锁的持有状态,防止锁因为某些原因(如客户端崩溃或网络问题)而被释放。以上的是分布式锁之RedissonLock 若需完整代码 可识别二维码后 给您发代码。实现DistributedLock的实现类逻辑。
2024-05-06 21:51:37
629
1
原创 Spring Boot 整合 socket 实现简单聊天
/监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端。//判断当前浏览器是否支持WebSocket。//关闭WebSocket连接。//连接发生错误的回调方法。//连接成功建立的回调方法。//接收到消息的回调方法。// 显示别人发送的消息。// 显示自己发送的消息。index.css文件。//连接关闭的回调方法。
2024-05-05 13:25:41
1158
原创 分布式锁之-mysql
以上的是分布式锁之-mysql 若需完整代码 可识别二维码后 给您发代码。1:基于 MySQL 实现的乐观锁。2:基于 MySQL 实现的悲观锁。
2024-05-04 21:27:10
326
原创 分布式锁之-redis
即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。以上的是分布式锁之-redis 若需完整代码 可识别二维码后 给您发代码。A:Redisson 实现的分布式锁使用演示。B:自己实现的 Redis 分布式锁使用演示。2:高可用的获取锁与释放锁。3:高性能的获取锁与释放锁。
2024-05-04 21:15:11
451
原创 树形数据结构-二分搜索树Binary Search Tree
B:如果当前树是有树根的,则对插入元素与当前树进行一个节点遍历操作,找到元素可以插入的索引位置 parent(挂到这个父节点下)。值查找的过程,就是对二叉搜索树的遍历,不断的循环节点,按照节点值的左右匹配,找出最终相当的值节点。最后是进行节点72与待删节点64的交换过程,更换三角关系,父节点、左子节点、右子节点。2:若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;待删除节点14,判断此节点的父节点的孩子节点,哪个等于14,找出左右。把待删节点的右孩子节点,挂到删除节点的右节点。
2024-05-04 14:20:25
558
原创 线性数据结构-手写队列-哈希(散列)Hash
通过我们使用数组存放元素,都是按照顺序存放的,当需要获取某个元素的时候,则需要对数组进行遍历,获取到指定的值。这就引入了哈希散列表的设计。除了对哈希桶上碰撞的索引元素进行拉链存放,还有不引入新的额外的数据结构,只是在哈希桶上存放碰撞元素的方式。这也就是使用哈希散列必须解决的一个问题,无论是在已知元素数量的情况下,通过扩容数组长度解决,还是把碰撞的元素通过链表存放,都是可以的。开放寻址的设计会对碰撞的元素,寻找哈希桶上新的位置,这个位置从当前碰撞位置开始向后寻找,直到找到空的位置存放。
2024-05-04 13:33:12
991
原创 线性数据结构-手写队列-Queue
将元素添加到队列后的操作称为入队,从队列中移除元素的操作称为出队。但剩余接下里的步骤才是复杂的,因为需要在根元素迁移走后,寻找另外的最小元素迁移到对头。延迟队列的实现,主要为在优先队列的基础上,添加可重入锁 ReentrantLock 对阻塞队列的实现。首先将元素2挂到队列尾部,之后通过 (k - 1) >>> 1 计算父节点位置,与对应元素进行比对和判断交换。在存放元素时,以遵循它的特点,会在存存放过程中,通过队尾元素向上比对迁移。1:单端队列和双端队列,分别对应的实现类是哪个?
2024-05-03 00:44:47
915
原创 线性数据结构-手写链表-LinkList
在列表的最后一个节点中,链接字段通常包含一个空引用,一个特殊的值用于指示缺少进一步的节点。在“双向链表”中,除了下一个节点链接之外,每个节点还包含指向序列中“前一个”节点的第二个链接字段。之后创建一个新的节点,新的节点构造函数的头节点入参为null,通过这样的方式构建出一个新的头节点。尾差节点与头插节点正好相反,通过记录当前的结尾节点,创建新的节点,并把当前的结尾节点,通过 l.next 关联到新创建的节点上。链表的数据结构核心根基就在于节点对象的使用,并在节点对象中关联当前节点的上一个和下一个节点。
2024-05-02 23:43:40
682
原创 RabbitMQ之生产批量发送
timeout :超过收集的时间的最大等待时长,单位:毫秒。不过要注意,这里的超时开始计时的时间,是以最后一次发送时间为起点。但是 RabbitMQ 并没有提供了批量发送消息的 API 接口,使用 spring-amqp 的 BatchingRabbitTemplate 实现批量能力。不过值得注意的是,我们一次发送十条消息到 RabbitMQ Broker 中去,在 RabbitMQ Broker 显示的也是 1 个消息。bufferLimit :超过收集的消息占用的最大内存。
2024-05-01 14:41:49
906
1
原创 RabbitMQ之消费者批量消费
在一些业务场景下,我们希望使用 Consumer 批量消费消息,提高消费速度。可以通过对 SimpleRabbitListenerContainerFactory 进行配置实现批量消费能力。若需完整代码 可识别二维码后 给您发代码。
2024-05-01 14:29:35
1605
5
原创 RabbitMQ之事务机制
事务要么成功 要么失败 传统事务有4个主要特性:原子性、一致性、隔离性、持久性。◆ Eventually consistent (最终一致性)◆ 分区容忍性 (Partition tolerance)◆ 随着后端架构的微服务化,事务无法在本地完成。◆ 在传统单体应用中,事务在本地即可完成。◆ 可用性(Availability)◆ 一致性(Consistency)◆ 一致性(Consistency)◆ 持久性(Durability)◆ 原子性(Atomicity)◆ 隔离性(Isolation)
2024-05-01 12:12:22
988
2
原创 RabbitMQ之顺序消费
消息发送端的顺序,大部分业务不做要求,谁先发消息无所谓,如果遇到业务一定要发送消息也确保顺序,那意味着,只能全局加锁一个个的操作,一个个的发消息,不能并发发送消息。虽然消息队列的消息是顺序的,但是多个消费者并发消费消息,获取的消息的速度、执行业务逻辑的速度快慢、执行异常等等原因都会导致消息顺序不一致。我们说如何保证消息顺序性,通常说的就是消费者消费消息的顺序,在多个消费者消费同一个消息队列的场景,通常是无法保证消息顺序的,一般我们讨论如何保证消息的顺序性,会从下面三个方面考虑。2:队列中消息的顺序。
2024-05-01 11:04:23
2881
2
原创 RabbitMQ之生产者confirm机制
接下来需要再介绍生产者的confirm机制;核心作用在与能确保生产者将消息发送到mq的channel中,这一过程需要确保消息不丢失就需要生产者给予mq一个确认发送消息的机制。confirm 模式最大的好处在于是异步的,一旦发布一条消息,生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息,当消息最终得到确认之后,生产者应用便可以通过回调方法来处理该确认消息,如果RabbitMQ 因为自身内部错误导致消息丢失,就会发送一条 nack 消息, 生产者应用程序同样可以在回调方法中处理该 nack 消息。
2024-05-01 10:44:48
343
原创 RabbitMQ之消费者并发消费
当生产者的推送速度是远远超过消费者的能力的,可以提高消费者的消费速度。比如在java中我们可以启动多个 JVM 进程,实现多进程的并发消费,从而加速消费的速度,在mq中也可以通过设置配置。Consumer 线程,负责从 RabbitMQ Broker 获取 Queue 中的消息,存储到内存中的 BlockingQueue 阻塞队列中。@RabbitListener 注解中,有 concurrency 属性,它可以指定并发消费的线程数。若需完整代码 可识别二维码后 给您发代码。
2024-05-01 10:42:58
1083
2
原创 RabbitMQ之延迟队列
RabbitMQ 提供了过期时间 TTL 机制,可以设置消息在队列中的存活时长。在消息到达过期时间时,会从当前队列中删除,并被 RabbitMQ 自动转发到对应的死信队列中。延迟消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费。2:利用 RabbitMQ 中的插件 x-delay-message。然后再来消费该死信队列,这样就可以实现一个延迟队列的效果。失败重试:业务操作失败后,间隔一定的时间进行失败重试。此种方式需要安装mq的延迟第一列插件。
2024-05-01 10:42:04
1014
1
原创 docker安装RabbitMQ
找到 rabbitmq_delayed_message_exchange 去进行下载,注意要和你的 RabbitMQ 版本一致 比如我的 RabbitMQ 是 3.10.1 的, 就可以使用 3.10.x 的 插件。我们可以看到 是有 /plugins 路径的,复制插件到容器内部,复制的话我们可以借助 docker cp 指令来完成。到管理后台的页面上,去创建交换机的页面看一下,如果多了一种 x-delayed-message,就说明安装成功。使用docker安装mq的延迟插件。1:上传到 docker。
2024-05-01 10:35:39
499
原创 docker的安装以及docker-compose
docker-ce docker-ce-cli: 这是要安装的软件包的名称。docker-ce 是 Docker CE 软件的主要组件,docker-ce-cli 是用于与 Docker 进行交互的命令行工具。3:通过sudo yum install -y docker-ce docker-ce-cli 安装 Docker CE (Community Edition) 软件。-add-repo: 该选项告诉 yum-config-manager 命令要添加一个新的仓库。
2024-05-01 10:22:36
1011
1
原创 RabbitMQ之消费者ACK 功能
若 RabbitMQ 服务器端一直没有收到消费者的确认信号,并且消费此消息的消费者已经断开连接, 则服务器端会安排该消息重新进入队列,等待投递给下一个消费者(也可能还是原来的那个消费者)。可以看到当前队列中的 “Ready” 状态和 “Unacked” 状态的消息数,分别对应等待投递给消费者的消息数和已经投递给消费者但是未收到确认信号的消息数。对于手动确认的方式,RabbitMQ Broker 将消息发送给 Consumer 之后,由 Consumer 手动确认之后,才任务消息投递成功。
2024-04-30 17:23:44
1643
原创 RabbitMQ之基础入门
在 AMQP 中,Producer 将消息发送到 Exchange ,再由 Exchange 将消息路由到一个或多个 Queue 中(或者丢弃)。Exchange 根据 Routing Key 和 Binding Key 将消息路由到 Queue ,目前提供了四种类型。A. QueueQueue: Queue(队列)是RabbitMQ的内部对象,用于存储消息,RabbitMQ 中的消息都只能存储在 Queue 中,生产消息并最终投递到Queue中, 消费者可以从Queue中获取消息并消费。
2024-04-30 16:28:23
1750
2
原创 ElasticSearch
ELK是包含但不限于Elasticsearch(简称es)、Logstash、Kibana 三个开源软件的组成的一个整体。这三个软件合成ELK。是用于数据抽取(Logstash)、搜索分析(Elasticsearch)、数据展现(Kibana)的一整套解决方案,所以也称作ELK stack。本课程从分别对三个组件经行详细介绍,尤其是Elasticsearch,因为它是elk的核心。本课程从es底层对文档、索引、搜索、聚合、集群经行介绍,从搜索和聚合分析实例来展现es的魅力。Logstash从内部如何采集数据
2023-09-24 12:37:37
412
原创 微服务方案之-Sentinel
为什么需要Sentinel? 想象下在大型互联网项目同一时刻面对成千上万的QPS+HPS的冲击下,如双十一京东是怎么处理相应订单的问题?如出现访问超时 下单不成功 响应延迟这些应该都有体会过吧 但是随着技术的更新对于用户操作来说是没有任何感知延迟和系统蹦跶的情况,这一些列操作在技术架构后台是经过了很多服务共同来完成这个用户请求的 为了应对这些问题需要对访问进行做限流 降级 熔断的处理 而Alibab提供了基于SpringCloud实现的一套微服务的解决方案 中Sentinel就是处理这些问...
2021-12-31 01:29:39
742
原创 部署运维之Docker+Jenkins+K8S
如今快速发展的时代,互联网项目的开发成本和项目维护的成本也在逐渐的减少,如果是以往那种单体的部署项目,那么在如今的时代就显得很臃肿的开发成本很高,效率低下,维护困难,处理速度极其的慢。一旦在分布式和集群的模式下,这些工作就会显得很重要,运维和部署的维护以及监控就显得很重要。什么样的技术能够解决在分布式环境下,能够将多服务集聚在一起解决同一样的问题,他们之间对外是独立,而对内是...
2019-12-06 18:43:34
1497
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人