- 博客(35)
- 收藏
- 关注
原创 JavaMailSender发送邮件报错:Couldn‘t connect to host, port: localhost, 25; timeout -1;
因为自己粗心声明了一个空的bean导致覆盖了yml文件声明的配置,JavaMailSenderImpl()对象中的host、username等邮箱信息都为空。发现在执行时没有获取到yml配置......;然后将host=localhost,port=25赋了默认值。socketConnect()这个方法执行时抛出的异常。从异常情况看显示连接超时,但为什么连接超时呢?好好好这么玩是吧,那么根本原因就找到了,没有读到yml配置。:手动声明bean添加邮箱基本信息或者只使用yml声明。
2024-02-01 17:13:05
886
原创 RocketMQ常见面试题及答案梳理
半消息是只生产者向broker发送消息时,还没经过两次确认的消息,此时的状态标记为“不可消费”状态,所以暂时对消费者不可见9.消息的可用性,RocketMQ如何能保证消息的可用性/可靠性?当一条消息无法正常消费的时会被投递到死信队列,比如一条消息初次消费失败或超时,消息队列会自动进行消费重试累计默认16次;达到最大重试次数后,消息队列不会立刻将消息丢弃而是暂时存放到死信队列中。死信队列的特征死信消息会保存三天后(CommitLog的过期时间)被删除。
2024-01-19 17:09:13
1873
原创 RocketMQ13-事务消息的理解
假如张三给李四转账,张三首先发送一条需要转账的消息到MQ, 发送成功后,张三开始从建设银行卡扣款,可能由于网络的问题,张三在扣款的时候发生了故障,出现了扣款未知(UNKNOW, 就不是成功也不是失败)的状态,紧接着张三将这条。RocketMQ采用了2PC(二阶段提交)的思想来实现了提交事务消息,同时增加一个补偿逻辑来处理二阶段超时或者失败的消息,如下图所示。状态,则需要发起回查,给张三个机会,看看网络是不是好了,好了就扣款,如果是余额不足,那就结束转账。处于该种状态下的消息即半事务消息。
2024-01-16 17:04:00
478
原创 RokcetMQ源码解析12-延迟消息
发送消息时,通过来设置延迟等级,RocketMQ默认支持18种延迟等级,每个延迟等级对应不同的延迟时间所有延迟消息共用一个相同延迟等级的消息会放到同一个队列中(相同等级的消息会被同一个线程去处理。
2024-01-11 16:21:53
869
原创 RocketMQ源码解析11-主从同步原理(HA)
dispatchPosition记录了已经处理的数据在读缓冲区中的位置,从读缓冲区byteBufferRead获取剩余可读取的字节数,如果可读数据的字节数大于一个消息头的字节数(HAConnection中封装了Master节点与从节点的网络通信处理,分别在。这边值注意的一点是,消息消费时用的是。中与主节点建立连接后,会向主节点发送同步消息拉取偏移量,调用。中,在它的构造函数中实例化了几个对象同时在。()方法中处理了可读事件,也就是处理。节点汇报从节点的消息同步偏移量,那么。(负责读Socket的服务)。
2024-01-02 16:34:56
1144
原创 RokcetMQ10-消费者的(重平衡)概念
重平衡分析的前提是:集群消费模式Rebalance(重平衡)机制指的是:将一个Topic下的多个队列,在同一个消费者组()下的多个消费者实例()之间进行重新分配。Rebalance机制的本意是为了提升消息的并行消费能力。例如,⼀个Topic下5个队列,在只有1个消费者的情况下,这个消费者将负责消费这5个队列的消息。如果此时我们增加⼀个消费者,那么就可以给其中⼀个消费者分配2个队列,给另⼀个分配3个队列,从而提升消息的并行消费能力。这就是为什么重平衡为什么前提条件是要在集群消费模式。
2023-12-29 13:28:34
448
原创 RocketMQ源码解析9-consumer消费流程
消费者启动拉取消息的服务,先阻塞在这里然后启动重平衡服务,重平衡就是给当前消费者指定要去消费哪个queue,然后上面的就可以拉取消息了发送netty请求到broker,从commitlog读取消息读取到消息后开始处理消息。
2023-12-28 19:03:53
1050
原创 RocketMQ源码解析8-comsumer启动
消费者启动过程相比生产者启动过程要复杂一些,会启动很多对象(实际上生产者也启动了,因为他们都是基于客户端实例去创建的对象,只不过生产者并不会使用某些服务类)创建客户端实例(其内部要创建netty客户端对象),包括构建消费监听器启动客户端实例,其内部要启动netty客户端,消息拉取服务,以及负载平衡服务,还有各种定时任务。
2023-12-27 13:25:27
946
原创 RocketMQ源码解析3-Borker
对于每个IndexFile来说IndexHeader是固定大小的,Slot是索引的目录,用于定位Index在IndexFile中存储的物理位置。RocketMQ存储文件主要包括:CommitLog文件、ConsumerQueue文件、Index文件。之前的官方流程架构图看着比较复杂,我在网上找了一张比较简单的消息处理流程图,便于理解。按照上述命名的好处是给出任意一个消息的物理偏移量,可以。消息主体以及元数据的存储主体,存储。写入的消息主体内容,单个文件大小默认。,快速定位这个文件的位置。
2023-12-26 14:44:33
214
原创 RocketMQ源码解析7-Borker(刷盘机制)
RocketMQ的存储与读写是基于NIO的内存映射机制()的,消息存储时首先将消息追加到内存中,再根据配置的刷盘策略在不同时间刷盘。
2023-12-21 15:00:04
480
原创 RocketMQ源码解析6- borker(处理消费者拉取消息)
还记得之前启动BrokerController.start()时,同时启动了很多组件,当中就有针对PullRequest的组件pullRequestHoldService。可以看到这里只是将PullRequest对象放进了本地缓存ConcurrentMap中,并没有执行线程挂起操作。消费者组、topic、offset、queueId。这块代码很容易理解,就是启动一个新线程构建。,其实还是原来消费者发送过来的那个。拉取消息的请求就会挂起,方法为。拉取消息时,发送的请求。被重载了,多出来的参数。
2023-12-19 19:37:17
305
原创 RocketMQ源码解析5-broker消息接收流程(写入commitLog)
表示某个任务执行完成后执行的动作,会将该任务的执行结果即方法返回值作为入参传递到回调方法中,无返回值,区别就是thenAcceptAsync可以自行传入线程池。之前的官方流程架构图看着比较复杂,我在网上找了一张比较简单的消息处理流程图,便于理解。文件,所以很多代码省略掉了,默认情况下回执行普通消息处理最后实际会进入到。,对应的一些算法和写入流程。就会走默认的流程,构建请求头和mq主体信息,然后处理消息。,但只是简单概括了怎么使用处理器,现在开始分析在。做了简单的介绍,这里调用的时。对象,可以看到这里通过。
2023-12-18 20:51:48
292
原创 RocketMQ源码解析4-broker启动流程
首先创建BrokerController处理器:实例化加载各种配置后进行初始化初始化:读取本地josn文件添加到缓存,向netty的远程接口类注册各种组件,以便在客户端和服务端交互时调用添加关闭的钩子函数执行borker启动:启动各种组件以及定义一个心跳的定时任务想NameServer注册broker信息,如果broekr发生变更在定时任务后续执行过程中也会向NameServer进行更新。
2023-12-14 15:38:21
1287
原创 RocketMQ源码解析1-NameServer
创建controller:主要是解析nameServer的配置并完成赋值操作初始化controller:主要创建了NettyRemotingServer对象、netty服务线程池、定时任务等启动controller:就是启动netty 服务。
2023-12-02 17:13:02
234
1
原创 k8s简单入门操作(三)
特别注意:在v1.18版之后,kubectl run nginx --image=nginx --replicas=3 --port=80,会反馈Flag --replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例。示例: 暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx。
2023-12-01 13:02:25
121
1
原创 k8s-资源详解(四)
上面两种探针目前均支持三种探测方式:1.exec命令:在容器内执行一次命令,如果命令执行的退出码为0,则认为程序正常,否则不正常。spec:containers: # 容器配置exec:command:- cat2.tcpSocket:将会尝试访问一个用户容器的端口,如果能够建立这条连接,则认为程序正常,否则不正常。spec:containers: # 容器配置tcpSocket:port: 8080。
2023-12-01 13:02:00
281
3
原创 k8s问题记录
在/etc/kubernetes/manifests/kube-apiserver.yaml 文件command字段下增加。首先看metrics-server-deployment.yaml中是否添加了hostNetwork: true。1.重启后发现coredns-7ff77c879f-d6xz5 状态为error。发现找不到subnet.env文件,可以从集群节点将该文件拷贝到问题节点解决。2.在使用kubectl top node查看资源负载时出现一下错误。使用描述命令查看详细信息。
2023-11-22 14:15:38
105
原创 k8s资源管理(二)
在Kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理KubernetesKubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务。所谓的部署服务,其实就是在Kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。Kubernetes的最小管理单元是Pod而不是容器,所以只能将容器放在Pod中,而Kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。
2023-11-16 14:05:00
60
1
原创 Nacos配置中心-原理
共享配置 -> 扩展配置 -> 当前应用自身配置共享配置 < 扩展配置 < 应用自身配置本地配置 > 远程配置 > 快照配置。
2023-11-09 14:31:39
354
1
原创 Nacos注册中心源码解析-服务端
与instance有关的请求都是这个来处理。该类为一个服务实例处理器API,用于处理的心跳、注册、下线等请求。
2023-11-09 11:16:43
280
1
原创 Nacos注册中心基本概念
nacos架构中包含众多内容,例如服务 (Service)、服务注册中心 (Service Registry)、服务元数据 (Service Metadata)、服务提供方和消费方等,这里跳几个重点概念说明。具体详情可见。
2023-11-02 16:50:30
69
1
原创 JDK21内容及使用(虚拟线程)
与前面的JEP相比,主要变化是删除了带括号的模式并允许合格的enum常量,如带switch表达式和语句的常量。使用命令行选项 -XX:+UseZGC 命令目前默认情况下,使用的非分代式的GC,官方说明在未来的版本中,分代GC将成为默认设置。以前Java中的线程是基于操作系统线程的平台线程,按照1:1的模式调度,这导致线程的创建和执行都非常耗资源,并且受系统限制。,它们有效地共享所属的平台线程即操作系统线程的资源,从而提高系统利用率,并且没有数量限制。用个简单的demo看下使用平台线程和虚拟线程的资源消耗。
2023-10-08 16:37:43
873
1
原创 Spring Cloud GateWay网关源码解析
方法,进行路由匹配,判断是否允许请求通过!ok到这里流程图中的执行源码解析过程基本就描述完了,有兴趣的可以通过调试思路将其他的三个。GateWay提供了三种负载均衡策略:轮询策略(默认)、加权轮询策略、IP哈希策略。接口,方法内拿到内存空间后,通过组装请求上下文对象。现在从流程图一步一步进行解析,首先请求发送到。,内容大致就是查找并验证路由和断言。为代理,通过上下文构建所需要的。内容不多,一个构造器和实现了。中配置的所有的路由断言工厂(类中还提供了一个构造器,通过。(路由断言),父类为。
2023-09-24 13:47:35
995
2
原创 java线程池ThreadPoolExecutor和ThreadPoolTaskExecutor
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
2023-09-22 19:33:14
1957
原创 Spring Cloud GateWay网关基本使用
在springcloud有多个微服务,首先要考虑的是不是如果不配置网关各个服务的端口都暴露在外?还有过滤器和鉴权功能是不是在每个服务都配置一遍?所以网关主要作用是作为项目的统一入口。
2023-09-21 16:36:53
539
原创 Spring Cloud Openfeign源码解析,深入浅出
openfeign简单概括做了几件事1、启动通过扫描和2、拿到扫描要注册的Bean信息后,注入到一个名为的spring容器中3、spring容器初始化通过JDK动态代理,获取产生的代理对象Proxy4、在进行远程调用时,请求会进过统一处理,封装http上下文,拿到了properties配置,配置负载均衡策略,重试策略,发起http请求。
2023-09-20 11:01:12
688
1
原创 Bean的生命周期
因为三级中存的是lambda表达式且是一次性的,执行一次后就销毁了。二级中存的是三级中的表达式执行的结果。如果三级缓存中如果存在一个lambda表达式,那么就表示在二级缓存中beanName对应的就没有值。相反如果在二级缓存里面beanName有值,那么在三级缓存中就没有对应的表达式。8.放入单例池beanDifintion(如果有aop就放入代理对象,如果没有就放入普通对象。singleton(单例):跟随spring 容器的声明周期,session(会话),一次会话结束销毁。request(请求)
2023-09-15 16:01:23
137
1
原创 SpringBoot源码解析
通俗一点讲就是在springboot运行过程中,会自动配置各种类和bean到IOC容器中,无需手动进行配置。在约定大于配置的概念下,只需引入依赖就可以直接使用一些组件,具体是扫描依赖中的 META-INF/spring.factories 文件,将文件中配置的类型信息加载到 Spring 容器。大大简化应用程序的部署和开发流程。
2023-09-15 12:33:49
262
1
原创 SpringBoot整合grpc
之所以会说grpc是高性能框架,默认情况下,gRPC基于Netty进行服务端和客户端互通,使用Protocol Buffers进行传输,这是Google用于序列化结构化数据的成熟开源机制,基于proto3情况下它还是一个跨语言的RPC框架(目前支持Java、c++、Dart、Python、Objective-C、c#、lite-runtime (Android Java)、Ruby和JavaScript(来自协议缓冲区GitHub repo),以及来自golang/protobuf官方包的Go语言生成器)
2023-09-11 16:42:11
5100
5
原创 SpringBoot分布式Netty集群,通过Redis发布/订阅广播
之前做用springboot+websocket做双向通讯时,websocket的存在session无法序列化导致集群不能通过共享session来实现,后来采取了记录需要推送客户端ip,然后用http去请求web接口这个不友好的方式。当然需求只需要做扫码登录,这种方式影响也不会有什么影响。但集群问题一直没解决就在心里埋下了个种子。
2023-09-01 13:30:40
3452
1
原创 OAuth2.0踩坑之路一(获取此资源的范围不足)
根据搜索资料找到由于 UserInfoTokenServices 类未能从请求中提取范围,因此没有将它们添加到新的 OAuth2Request 中造成的。
2023-08-07 17:30:42
624
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人