Decorative image frame

记一次Nacos的issue问题解决之并发导致的NPE异常

ISSUE

Spring boot 应用启动被终止 #21

错误分析

DeferredApplicationEventPublisher的继承关系

1
2
3
4
5
6
7
8
9
10
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.event.ContextRefreshedEvent;

public class DeferredApplicationEventPublisher implements ApplicationEventPublisher, ApplicationListener<ContextRefreshedEvent> {
...
}
Read More...

牛客网——剑指offer之二叉树的下一个结点

题目

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

题解

这道题其实理解中序遍历的话就很简单,针对各种情况做不同的选择

  • 如果给定的点是根节点的话
    • 判断根节点的右孩子是否存在,若存在则已有孩子为起点,查找最左节点
    • 如果右孩子不存在,则直接返回null
  • 如果给定的节点是父节点的左孩子
    • 判断节点是否存在右孩子节点,如果存在,则返回右孩子
    • 如果不存在,则返回父节点
  • 如果给定的节点是父节点的右孩子
    • 节点的右孩子是否存在,如果存在直接返回右孩子
    • 如果右孩子不存在,判断是否是最右节点,是的话直接返回null
    • 否则,返回父节点的父节点
Read More...

Nacos是如何实现TCP端口测探方式检测实例是否存活

如何发起健康检查

在注册实例时,会需要带上集群信息;而集群信息在nacos-server端,会有相应的额外信息增加以及额外的初始化动作。其中,健康检查的设定操作如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Cluster
public void init() {
if (inited) {
return;
}
checkTask = new HealthCheckTask(this);
HealthCheckReactor.scheduleCheck(checkTask);
inited = true;
}

// HealthCheckTask
public HealthCheckTask(Cluster cluster) {
this.cluster = cluster;
distroMapper = SpringContext.getAppContext().getBean(DistroMapper.class);
switchDomain = SpringContext.getAppContext().getBean(SwitchDomain.class);
healthCheckProcessor = SpringContext.getAppContext().getBean(HealthCheckProcessorDelegate.class);
initCheckRT();
}
Read More...

牛客网——剑指offer之孩子们的游戏(圆圈中最后剩下的数)

题目

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

解题思路

题目假设:n=7,m=3

这道题可以用数组+记录下一位小朋友的位置的方法来做

Read More...

记一次解决Nacos-SpringBoot不支持@ConditionalOnProperty

错误介绍

@ConditionalOnProperty配置生效问题

错误原因分析

在使用Nacos-Config-SpringBoot时,有使用者反馈说无法支持@ConditionalOnProperty注解,经过研究Nacos-Config-SpringBootNacos-Spring-Context源码以及调试跟踪SpringBoot的初始化流程,最终发现问题所在——@ConditionalOnProperty的解析时间与Nacos-Spring-Context相关Bean的注册以及工作时间存在先后问题(其本质原因就是Bean的加载顺序)

@ConditionalOnProperty解析时间
Read More...

Spring-Cloud中AbstractAutoServiceRegistration的“bug“

前话:zipkin-server与nacos结合时的坑

参考github解决方案

在解决Nacos的issue——对接zipkin时,遇到了一个奇怪的问题,当采用github的解决方案,即采用eureka-client时,zipkin-server能够自动注册到Eureka Server中,但是当采用nacos-discovery时,却怎么也无法实现zipkin-server服务自动注册到nacos-server中,通过断点调试以及参考Spring Cloud相关源码以及文档,终于发现了问题所在

Spring-Cloud认为服务自动注册的时机

SpringCloud本身认为服务的注册时机,应该是WebServerInitializedEvent事件发生后,进行服务的自动注册,因为在接收到此事件时,会下发bind(Event)操作,由start()函数内部调用register()实现服务的自动注册

Read More...

解析Nacos Client端实现配置的动态变更

注解NacosValue如何生效的

官方示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfiguration {}

@Controller
@RequestMapping("config")
public class ConfigController {

@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;

@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
Read More...

牛客网——剑指offer之数字在排序数组中出现的次数

题目

统计一个数字在排序数组中出现的次数

解题思路

既然数组已经是有序的了,那么有两种方法

双指针

设立两个指针,一个指向数组的开头元素,另一个指向数组的末尾元素,然后两个指针同时向中间扫描,当遇到目前数字时停止扫描并记录指针所指向的位置;当左右指针完成后进行计算得出目标数字的出现次数

Read More...