<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/static/css/rss_xml_style.xsl"?>

<rss version="2.0">
  <channel>
    <title>Sprout Blog</title>
    <image>
      <title>Sprout Blog</title>
      <link>https://blog.yeskery.com/</link>
      <url>https://blog.yeskery.com/static/image/sprout.png</url>
    </image>
    <link>https://blog.yeskery.com/</link>
    <description>Here records affairs as of life.</description>
    <language>zh-cn</language>
    <pubDate>Thu, 27 Nov 2025 16:55:11 CST</pubDate>
    <lastBuildDate>Thu, 27 Nov 2025 16:55:11 CST</lastBuildDate>
    <docs>https://blog.yeskery.com/rss.xml</docs>
    <generator>Sprout Blog Generator 2.1.4</generator>
    <managingEditor>i@mail.yeskery.com</managingEditor>
    <webMaster>i@mail.yeskery.com</webMaster>
    <item>
      <title>Nacos服务注册中心原理总结</title>
      <link>https://blog.yeskery.com/articles/333291204</link>
      <description>客户端启动时会将当前服务的信息包含ip、端口号、服务名、分组名、集群名等信息封装为一个Instance对象，准备向Nacos服务器注册服务，在注册服务之前，会根据Instance中的信息创建一个BeatInfo对象，然后创建一个定时任务，每隔一段时间向Nacos服务器发送PUT请求并携带相关信息，作为定时心跳连接，服务器端在接收到心跳请求后，会去检查当前服务列表中有没有该实例，如果没有的话将当前服务实例重新注册，注册完成后立即开启一个异步任务，更新客户端实例的最后心跳时间，如果当前实例是非健康状态则将其改为健康状态；</description>
      <category>软件开发</category>
      <pubDate>Tue, 25 Oct 2022 10:46:00 CST</pubDate>
      <guid>333291204</guid>
    </item>
    <item>
      <title>注意BeanPostProcessor启动时对依赖Bean的“误伤”陷阱（is not eligible for getting processed by all...）</title>
      <link>https://blog.yeskery.com/articles/355094262</link>
      <description>本篇博文和Spring的上下文启动有较强的关联性，同时需要读者对Spring中的BeanPostProcessor有较为熟悉的了解。若之前没有接触过的同学，建议先点击一下相关阅读的文章列表，先对Spring容器有个大致的了解会效果更佳~这是曾发生在我原公司工作中的一个Spring项目的真实场景案例：简单的描述就是在使用Spring整合@Async、security的时候，出现一个诡异的现象：我把security整合进后原来的@Async就木有生效了，但是如果不把`security`集成进来的话，就能正常work当时还以为是spring-security的问题，甚至以为是它的bug，现在想起来确实是自己当初图样图森破，切忌不要轻易下结论啊~</description>
      <category>软件开发</category>
      <pubDate>Mon, 19 Dec 2022 23:04:59 CST</pubDate>
      <guid>355094262</guid>
    </item>
    <item>
      <title>Spring事务@Transactional的创建和执行过程</title>
      <link>https://blog.yeskery.com/articles/411794034</link>
      <description>首先生成事务类的动态代理对象，在执行动态代理事务类的事务方法时，会执行事务拦截器TransactionInterceptor；接着事务核心组件TransactionAspectSupport开始执行事务方法主流程；首先调用Connection.setAutoCommit(false)方法开启事务，本质是基于jdbc连接开启事务方法；接着调用目标方法invocation.proceedWithInvocation()，依旧采用ReflectiveMethodInvocation方法调用组件调用目标方法；在目标方法执行完成后，判断目标方法是否发生异常；如果发生异常，就调用Connection.rollback()方法回滚事务，本质是基于jdbc连接回滚事务；</description>
      <category>软件开发</category>
      <pubDate>Sat, 09 Apr 2022 11:23:00 CST</pubDate>
      <guid>411794034</guid>
    </item>
    <item>
      <title>Spring AOP 动态代理的执行过程</title>
      <link>https://blog.yeskery.com/articles/338295561</link>
      <description>调用代理类`$Proxy`的方法时，会调用`super.h.invoke`方法，该方法实际调用的是`JdkDynamicAopProxy#invoke`方法；判断当前方法是`equals`方法且实现类未对`equals`方法进行重新，如果是，就调用`JdkDynamicAopProxy#equals`方法，返回执行结果；判断当前方法是`hashCode`方法且实现类未对`hashCode`方法进行重新，如果是，就调用`JdkDynamicAopProxy#hashCode`方法，返回执行结果；</description>
      <category>软件开发</category>
      <pubDate>Thu, 07 Apr 2022 21:24:00 CST</pubDate>
      <guid>338295561</guid>
    </item>
    <item>
      <title>Spring AOP动态代理的创建过程</title>
      <link>https://blog.yeskery.com/articles/310198180</link>
      <description>从IOC容器中获取bean；调用bean后置处理器AbstractAutoProxyCreator的postProcessBeforeInstantiation()方法；判断是否指定targetSource，如果指定了targetSource会跳过bean的实例化和初始化流程，也就是会直接创建AOP代理；如果没有指定targetSource，执行正常创建bean的流程，执行bean的初始化，执行initMethod方法；调用bean后置处理器AbstractAutoProxyCreator的postProcessAfterInitialization()方法；执行wrapIfNecessary方法包装需要被代理的bean；获取所有的增强advisors；</description>
      <category>软件开发</category>
      <pubDate>Sat, 02 Apr 2022 18:28:00 CST</pubDate>
      <guid>310198180</guid>
    </item>
    <item>
      <title>Spring Bean生命周期</title>
      <link>https://blog.yeskery.com/articles/323191003</link>
      <description>调用 getBean(name) 方法来加载name对应的单例对象，这里只分析Spring的单例对象生命周期。转换并解析bean的名称，处理bean别名，获取到真正的bean名称；如果beanName是以&amp;开头的，就返回FactoryBean的工厂对象本身；如果获取的是以FactoryBean工厂自定义创建的实例对象，那么就通过FactoryBean的getObject方法来创建单例对象；从缓存中获取单例bean；</description>
      <category>软件开发</category>
      <pubDate>Wed, 16 Mar 2022 16:30:00 CST</pubDate>
      <guid>323191003</guid>
    </item>
    <item>
      <title>ApplicationContext的初始化过程</title>
      <link>https://blog.yeskery.com/articles/282792613</link>
      <description>ApplicationContext的初始化过程，本文介绍ClassPathXmlApplication和AnnotationConfigApplicationContext两种ApplicationContext，以及ConfigurationClassPostProcessor、BeanFactoryPostProcessor两个扩展点。</description>
      <category>软件开发</category>
      <pubDate>Wed, 16 Mar 2022 16:28:00 CST</pubDate>
      <guid>282792613</guid>
    </item>
    <item>
      <title>Spring使用TransactionalEventListener解决事务未提交读取不到数据问题</title>
      <link>https://blog.yeskery.com/articles/302091633</link>
      <description>在项目中，往往需要执行数据库操作后，发送消息或事件来异步调用其他组件执行相应的操作，例如：用户注册后发送激活码；配置修改后发送更新事件等。但是，数据库的操作如果还未完成，此时异步调用的方法查询数据库发现没有数据，这就会出现问题</description>
      <category>软件开发</category>
      <pubDate>Thu, 05 Aug 2021 16:52:26 CST</pubDate>
      <guid>302091633</guid>
    </item>
    <item>
      <title>「Elasticsearch」ES重建索引怎么才能做到数据无缝迁移呢？</title>
      <link>https://blog.yeskery.com/articles/302197726</link>
      <description>众所周知，Elasticsearch是⼀个实时的分布式搜索引擎，为⽤户提供搜索服务。当我们决定存储某种数据，在创建索引的时候就需要将数据结构，即Mapping确定下来，于此同时索引的设定和很多固定配置将不能改变。那如果后续业务发生变化，需要改变数据结构或者更换ES更换分词器怎么办呢？为此，Elastic团队提供了很多通过辅助⼯具来帮助开发⼈员进⾏重建索引的方案。 如果对 reindex API 不熟悉，那么在遇到重构的时候，必然事倍功半，效率低下。反之，就可以方便地进行索引重构，省时省力。</description>
      <category>软件开发</category>
      <pubDate>Fri, 23 Apr 2021 15:19:52 CST</pubDate>
      <guid>302197726</guid>
    </item>
    <item>
      <title>Java的动态绑定和静态绑定</title>
      <link>https://blog.yeskery.com/articles/314493653</link>
      <description>在Java方法调用的过程中，JVM是如何知道调用的是哪个类的方法源代码呢？这就涉及到程序绑定这个概念。程序绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对Java来说，绑定分为静态绑定和动态绑定；或者叫做前期绑定和后期绑定。</description>
      <category>软件开发</category>
      <pubDate>Wed, 24 Mar 2021 17:02:00 CST</pubDate>
      <guid>314493653</guid>
    </item>
    <item>
      <title>JVM知识点汇总</title>
      <link>https://blog.yeskery.com/articles/348591116</link>
      <description>加载：将编译后的.Class静态文件转换到内存中（方法区），然后暴露出来让程序员能访问到；验证：确保Class文件的字节流中包含的信息符合当前虚拟机的要求，并且不会危害虚拟机自身的安全；准备：准备阶段为类变量分配内存并设置初始值，使用的是方法区的内存；解析：将Class文件的常量池的符号引用替换为直接引用的过程（是静态链接），可能发生在初始化阶段之前，也可能发生在初始化阶段之后，后者是为了支持Java的动态绑定。初始化：为类的静态变量赋予程序中指定的初始值，还有执行静态代码块中的程序（执行方法）。</description>
      <category>软件开发</category>
      <pubDate>Tue, 23 Mar 2021 15:04:00 CST</pubDate>
      <guid>348591116</guid>
    </item>
    <item>
      <title>Java Object.hashCode()返回的是对象内存地址？</title>
      <link>https://blog.yeskery.com/articles/383691314</link>
      <description>一直以为Java Object.hashCode()的结果就是通过对象的内存地址做相关运算得到的，但是无意在网上看到有相应的意见争论，故抽时间从源码层面验证了剖析了hashCode的默认计算方法。先说结论：OpenJDK8 默认hashCode的计算方法是通过和当前线程有关的一个随机数+三个确定值，运用Marsaglia's xorshift scheme随机数算法得到的一个随机数。和对象内存地址无关。</description>
      <category>软件开发</category>
      <pubDate>Mon, 22 Mar 2021 20:30:00 CST</pubDate>
      <guid>383691314</guid>
    </item>
    <item>
      <title>ThreadLocal的内存泄露？什么原因？如何避免？</title>
      <link>https://blog.yeskery.com/articles/283592636</link>
      <description>ThreadLocalMap使用ThreadLocal的弱引用作为key，如果一个ThreadLocal不存在外部强引用时，Key(ThreadLocal)势必会被GC回收，这样就会导致ThreadLocalMap中key为null， 而value还存在着强引用，只有thead线程退出以后,value的强引用链条才会断掉。</description>
      <category>软件开发</category>
      <pubDate>Tue, 02 Mar 2021 16:44:00 CST</pubDate>
      <guid>283592636</guid>
    </item>
    <item>
      <title>关于高并发，我想告诉你这些！</title>
      <link>https://blog.yeskery.com/articles/417793487</link>
      <description>1、对数据化的指标没有概念：不清楚选择什么样的指标来衡量高并发系统？分不清并发量和QPS，甚至不知道自己系统的总用户量、活跃用户量，平峰和高峰时的QPS和TPS等关键数据。2、设计了一些方案，但是细节掌握不透彻：讲不出该方案要关注的技术点和可能带来的副作用。比如读性能有瓶颈会引入缓存，但是忽视了缓存命中率、热点key、数据一致性等问题。3、理解片面，把高并发设计等同于性能优化：大谈并发编程、多级缓存、异步化、水平扩容，却忽视高可用设计、服务治理和运维保障。4、掌握大方案，却忽视最基本的东西：能讲清楚垂直分层、水平分区、缓存等大思路，却没意识去分析数据结构是否合理，算法是否高效，没想过从最根本的IO和计算两个维度去做细节优化。</description>
      <category>软件开发</category>
      <pubDate>Sat, 18 Jul 2020 15:25:29 CST</pubDate>
      <guid>417793487</guid>
    </item>
    <item>
      <title>Virtual Box 安装 CentOS 的网络配置</title>
      <link>https://blog.yeskery.com/articles/355698636</link>
      <description>VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发，由Sun Microsystems公司出品的软件，使用Qt编写，在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。Innotek 以 GNU General Public License (GPL) 释出 VirtualBox，并提供二进制版本及 OSE 版本的代码。使用者可以在VirtualBox上安装并且执行Solaris、Windows、DOS、Linux、OS/2 Warp、BSD等系统作为客户端操作系统。现在则由甲骨文公司进行开发，是甲骨文公司xVM虚拟化平台技术的一部份。</description>
      <category>服务器</category>
      <pubDate>Fri, 18 May 2018 00:48:49 CST</pubDate>
      <guid>355698636</guid>
    </item>
    <item>
      <title>HashMap源码注解 之 静态工具方法hash()、tableSizeFor()</title>
      <link>https://blog.yeskery.com/articles/412791151</link>
      <description>设计者权衡了speed, utility, and quality，将高16位与低16位异或来减少这种影响。设计者考虑到现在的hashCode分布的已经很不错了，而且当发生较大碰撞时也用树形存储降低了冲突。仅仅异或一下，既减少了系统的开销，也不会造成的因为高位没有参与下标的计算(table长度比较小时)，从而引起的碰撞。</description>
      <category>软件开发</category>
      <pubDate>Sat, 13 Jun 2020 03:36:04 CST</pubDate>
      <guid>412791151</guid>
    </item>
    <item>
      <title>树莓派安装 OpenFans ，体验便捷的 Docker 容器云服务</title>
      <link>https://blog.yeskery.com/articles/351291858</link>
      <description>OpenFans 是一款基于 Debian 发行版的 Linux 发行版，也是全球发行的第一个同时支持树莓派全系64位硬件的64位系统（包括：2Bv1.2，3B，3B+，3A+，4B）。</description>
      <category>智能硬件</category>
      <pubDate>Sat, 13 Jun 2020 03:04:47 CST</pubDate>
      <guid>351291858</guid>
    </item>
    <item>
      <title>让线程按顺序执行8种方法</title>
      <link>https://blog.yeskery.com/articles/387491606</link>
      <description>本文使用了7中方法实现在多线程中让线程按顺序运行的方法，涉及到多线程中许多常用的方法，不止为了知道如何让线程按顺序运行，更是让读者对多线程的使用有更深刻的了解。 使用的方法如下:使用线程的join方法使用主线程的join方法使用线程的wait方法使用线程的线程池方法使用线程的Condition(条件变量)方法使用线程的CountDownLatch(倒计数)方法使用线程的CyclicBarrier(回环栅栏)方法使用线程的Semaphore(信号量)方法</description>
      <category>软件开发</category>
      <pubDate>Sat, 28 Sep 2019 02:45:17 CST</pubDate>
      <guid>387491606</guid>
    </item>
    <item>
      <title>基于 Redis 的分布式锁 Redlock</title>
      <link>https://blog.yeskery.com/articles/367698373</link>
      <description>Redis 官方站这篇文章提出了一种权威的基于 Redis 实现分布式锁的方式名叫 Redlock，此种方式比原先的单节点的方法更安全。它可以保证以下特性：安全特性：互斥访问，即永远只有一个 client 能拿到锁；避免死锁：最终 client 都可能拿到锁，不会出现死锁的情况，即使原本锁住某资源的 client crash 了或者出现了网络分区；容错性：只要大部分 Redis 节点存活就可以正常提供服务。</description>
      <category>软件开发</category>
      <pubDate>Thu, 29 Aug 2019 14:08:22 CST</pubDate>
      <guid>367698373</guid>
    </item>
    <item>
      <title>二叉树遍历的实现方式</title>
      <link>https://blog.yeskery.com/articles/343798501</link>
      <description>所谓遍历(Traversal)是指沿着某条搜索路线，依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一，是二叉树上进行其它运算之基础。二叉树的遍历分为：前序遍历、中序遍历和后序遍历。</description>
      <category>软件开发</category>
      <pubDate>Sun, 18 Aug 2019 16:18:29 CST</pubDate>
      <guid>343798501</guid>
    </item>
  </channel>
</rss>
