<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[谁用谁的流年，乱了浮生……]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/henlf</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; henlf]]></copyright><item><title><![CDATA[Spring Boot 集成 prometheus，Grafana 监控]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/107063045</link><guid>https://blog.youkuaiyun.com/henlf/article/details/107063045</guid><author>henlf</author><pubDate>Wed, 01 Jul 2020 14:19:56 +0800</pubDate><description><![CDATA[1 prometheus

Prometheus是一个根据应用的metrics来进行监控的开源工具。具体可见官网

2 Spring Boot 集成 prometheus
2.1 构建 spring boot 应用


pom 依赖
&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;sprin]]></description><category></category></item><item><title><![CDATA[Java并发——深入 ThreadPoolExecutor 任务执行原理]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/106986387</link><guid>https://blog.youkuaiyun.com/henlf/article/details/106986387</guid><author>henlf</author><pubDate>Sat, 27 Jun 2020 18:52:10 +0800</pubDate><description><![CDATA[1 Executor

它用于执行指定的任务，把任务提交与任务执行分离，程序员不需要关注线程的管理，以及任务的执行。
ExecutorService 接口对 Executor 接口提供更多的扩展，ThreadPoolExecutor 类提供
可以扩展的线程池实现，而 Executors 只是对这些 Executor 提供方便的工厂方法。

1.1 类图

2 Future
2.1 类图

2.2 FutureTask
类结构：
class FutureTask {
    // 任务运行状态
    /*
]]></description><category></category></item><item><title><![CDATA[Java并发——深入 ReadWriteLock 原理]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/106635292</link><guid>https://blog.youkuaiyun.com/henlf/article/details/106635292</guid><author>henlf</author><pubDate>Tue, 09 Jun 2020 10:13:02 +0800</pubDate><description><![CDATA[ReadWriteLock 背后维护着一对相互关联的锁，一个用于读，一个用于写。读锁可以被多个读线程并发获取，
只要没有写线程。而写锁不支持此种情况。读写锁，读-读能共存，读-写不能共存，写-写不能共存。

自实现

如果某个线程想要读取资源，只要没有线程正在对该资源进行写操作且没有线程请求对该资源的写操作即可。

public class ReadWriteLock {
	private int readers = 0;
	private int writers = 0;
	private int wr.]]></description><category></category></item><item><title><![CDATA[Java并发——别再问 ReentrantLock 的原理了]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/106501224</link><guid>https://blog.youkuaiyun.com/henlf/article/details/106501224</guid><author>henlf</author><pubDate>Tue, 02 Jun 2020 17:37:54 +0800</pubDate><description><![CDATA[说到并发，我们会马上想到锁，使用锁来保证各线程之间能够安全访问临界区以及非线程安全的数据。
那为啥 Java 要提供另一种机制呢？难道 synchronized 关键字不香吗？嗯，它确实在有些场景
不是那么香，从而迫切需要提供一种更灵活，更易于控制的锁机制。那在去了解 Doug Lea 大佬写的
锁机制原理之前，我们自己先想想应该怎么去实现。

自实现思考
1、需要一个标志是否可以访问共享资源，如果直接使用 boolean 变量来做标记，可以控制。但是，
在如果在可以并发性访问某个共享资源，那么就不好做了.]]></description><category></category></item><item><title><![CDATA[分布式概述]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/106456216</link><guid>https://blog.youkuaiyun.com/henlf/article/details/106456216</guid><author>henlf</author><pubDate>Sun, 31 May 2020 15:43:06 +0800</pubDate><description><![CDATA[分布式系统架构第一原则就是不分布式。

分布式系统的两个关键目标：

性能
容错性
场景业务不一样，容错性策略也不一样。

设计思路：


中心化

思想：
分布式集群中节点机器按角色分工，基本上分两种角色：“领导” 和 “干活的”。“领导” 通常负责分派任务并监督“干活的”。
问题

“领导”的单点问题
主备两个“领导”的设计方案，可以是热备或冷备，可以是自动切换或手动切换。
“领导”的能力问题





去中心化

思想
各节点机器地位平等，不存在角色的分工。
问题
脑裂问题。脑裂指单个集群由于网络的.]]></description><category></category></item><item><title><![CDATA[Spring 源码阅读(三)：自定义标签解析原理]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/88411784</link><guid>https://blog.youkuaiyun.com/henlf/article/details/88411784</guid><author>henlf</author><pubDate>Mon, 11 Mar 2019 22:46:20 +0800</pubDate><description><![CDATA[在很多情况下，我们需要为系统提供可配置化支持。因此 spring 提供了可扩展 schema 的支持，扩展spring 自定义标签配置大致需要以下几个步骤：

创建一个需要扩展的组件
定义一个 XSD 文件描述组件内容
创建一个文件，实现 BeanDefinitionParser 接口，用于解析 XSD 文件中的定义和组件定义
创建一个 Handler 文件，扩展自 NamespaceHandle...]]></description><category></category></item><item><title><![CDATA[zookeeper 集群搭建]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/84348245</link><guid>https://blog.youkuaiyun.com/henlf/article/details/84348245</guid><author>henlf</author><pubDate>Thu, 22 Nov 2018 20:26:30 +0800</pubDate><description><![CDATA[
假设 zookeeper 集群规划为 3 台机器（zookeeper 推荐集群机器个数为奇数），分别命名为：zk1、zk2 和 zk3。

安装


解压 zookeeper 安装包到 /opt/module/ 目录下
  tar -zxvf zookeeper-3.4.9.tar.gz -C /opt/module/



在 /opt/module/zookeeper-3.4.9/ 目录下创...]]></description><category></category></item><item><title><![CDATA[Spring 源码阅读(二)：bean 元素解析以及注册]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83834055</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83834055</guid><author>henlf</author><pubDate>Wed, 07 Nov 2018 23:26:16 +0800</pubDate><description><![CDATA[在上一篇文章中，我们了解了加载 bean 的整个过程，在最后会走入到 XMLBeanDefinitionReader 类下的 doLoadBeanDefinitions() 方法，在此之前会对 Resource 进行封装，目的是考虑到 Resource 可能存在编码要求的情况，其次，通过 SAX 读取 XML 文件的方式来准备 InputResource 对象，最后将准备的数据通过参数传入真正的核...]]></description><category></category></item><item><title><![CDATA[zookeeper 源码：客户端连接过程]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83716449</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83716449</guid><author>henlf</author><pubDate>Sun, 04 Nov 2018 15:44:13 +0800</pubDate><description><![CDATA[可能我们直接使用 zookeeper 的机会并不多，甚至都不会直接去使用，但是 zookeeper 作为分布式协调框架，在如今分布式系统领域有着非常大的作用，很多流行框架都有使用它，如分布式治理框架 dubbo，大数据领域中的 hbase，所以了解 zookeeper 是非常有必要的。			
此篇文章是从源码的角度去了解下底层是怎么连接 zookeeper 的，肯定感觉很奇怪，一个连接操作有啥好了...]]></description><category></category></item><item><title><![CDATA[Spring 源码阅读(一)：Bean 的加载过程]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83629072</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83629072</guid><author>henlf</author><pubDate>Thu, 01 Nov 2018 23:53:47 +0800</pubDate><description><![CDATA[在使用 Spring 的过程中，不知道大家有时候是否像我有一样的疑问，都说 Spring 主要提供两大机制：IoC 容器和 AOP 编程，而 IoC 容器是根本，提供控制反转的功能，我们在使用的过程中只管声明 bean 或使用注解的方式，IoC 容器就为我们管理这些对象，并且帮我注入对象依赖，那么这一切都是怎么做到的呢？既然有这样的疑问，那就得去弄明白，而想明白 IoC 容器的原理，首先就得需明白...]]></description><category></category></item><item><title><![CDATA[Mybatis 源码分析：数据源与连接池]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83544215</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83544215</guid><author>henlf</author><pubDate>Tue, 30 Oct 2018 16:32:02 +0800</pubDate><description><![CDATA[1. mybatis 数据源原理分析
mybatis 数据源 DataSource 的创建是在解析配置文件 &amp;lt;environment /&amp;gt; 元素下子元素 &amp;lt;dataSource /&amp;gt; 时创建的。配置如下：
&amp;lt;dataSource type=&quot;POOLED&quot;&amp;gt;
	&amp;lt;property name=&quot;url&quot; value=&quot;&quot; /&amp;gt;
	&amp;]]></description><category></category></item><item><title><![CDATA[Mybatis 源码分析：事物管理]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83386195</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83386195</guid><author>henlf</author><pubDate>Thu, 25 Oct 2018 20:47:47 +0800</pubDate><description><![CDATA[1. mybatis 事物概述
mybatis 使用 Transaction 接口封装了数据库连接 Connection 的生命周期，它由 creation、preparation、commit/rollback 和 close 组成。
public interface Transaction {
	Connection getConnection() throws SQLException;

...]]></description><category></category></item><item><title><![CDATA[UML 类之间关系总结]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83349890</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83349890</guid><author>henlf</author><pubDate>Wed, 24 Oct 2018 20:12:46 +0800</pubDate><description><![CDATA[UML 表示类之间的关系有如下几种：


泛化关系（generalization）
泛化关系其实就是说在面向对象编程中继承这个概念，表示的是 is-a 关系，即表示 A 是 B 的关系。



实现关系（realization）
实现关系从字面就可以知道它表示的是面向对象编程中对接口实现这个概念。


聚合关系（aggregation）
聚合关系是用一条带空心的菱形箭头的直线表示，如下图表示 A ...]]></description><category></category></item><item><title><![CDATA[Mybatis 源码分析：获取 Mapper 接口对象]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83349785</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83349785</guid><author>henlf</author><pubDate>Wed, 24 Oct 2018 20:07:17 +0800</pubDate><description><![CDATA[我们知道使用 mybatis 作为 ORM 框架时，想要使用面向接口的方式操作数据库，即使用 mapper 文件形式，那么就需要获取 Mapper 接口对象，从而才能对数据库进行操作。那么问题来了，在 java 中是不可能对 interface 进行 new 的，那么 mybatis 是怎么做到面向 Mapper 接口的呢？那就从源码的角度揭开这层其实没有想象那么高深的面纱！	
首先来看看 Sql...]]></description><category></category></item><item><title><![CDATA[Mybatis 源码分析：Mapper 解析过程]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83317591</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83317591</guid><author>henlf</author><pubDate>Tue, 23 Oct 2018 23:43:11 +0800</pubDate><description><![CDATA[在上一篇文章中我们已经知道了 SqlSessionFactory 对象的过程，但是没有具体对 XMLConfigBuilder 类的 parse() 方法进行讲解，那么此次就通过了解 mapper 的解析过程来顺便把 parse() 方法的流程给讲喽！

核心代码就是通过 parseConfiguration() 方法解析 xml 配置文件下 &amp;amp;amp;lt;configuration/&amp;amp;amp;gt; 元素下的...]]></description><category></category></item><item><title><![CDATA[Mybatis 源码分析：SqlSessionFactory 的创建过程]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83280351</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83280351</guid><author>henlf</author><pubDate>Mon, 22 Oct 2018 22:44:55 +0800</pubDate><description><![CDATA[最近工作不忙，上班时间看了下 mybatis 源码，学习学习…
我们要使用 mybatis，就必须得有 SqlSession 对象，它是 mybatis 的核心接口，它提供了执行 sql 、获取 mapper 和管理事物的功能。而想要得到 SqlSession 对象。从源码可知 SqlSession 是一个接口，并不能直接 new 出来，那么肯定就有实现类让我们使用，而 mybatis 确实也提供...]]></description><category></category></item><item><title><![CDATA[HBase 配置]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83217225</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83217225</guid><author>henlf</author><pubDate>Sat, 20 Oct 2018 21:41:44 +0800</pubDate><description><![CDATA[1.1 HBase 配置文件文件概述


backup-masters
默认情况在 conf/ 目录下是不存在的。它只是一个普通的文本问你件，内容是列举运行 backpu HMaster 进程的主机名


hadoop-metrics2-hbase.properties
连接 HBase Hadoop 的 Metrics2 框架，可以点击这里了解更多关于 Metrics2 框架的信息。默认情况下，...]]></description><category></category></item><item><title><![CDATA[HBase 入门]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/83210642</link><guid>https://blog.youkuaiyun.com/henlf/article/details/83210642</guid><author>henlf</author><pubDate>Sat, 20 Oct 2018 09:11:51 +0800</pubDate><description><![CDATA[1.1 单机模式
HBase 可以以单机模式方式运行，如果以此种方式运行，那么所有的 HBase 进程：Master、RegionServers 和 zookeeper 都运行在一个 JVM 实例上。
1.1.1 配置
在 conf/hbase-env.sh 文件配置 JAVA_HOME。
编辑 conf/hbase-site.xml 文件，配置如下属性：
&amp;amp;amp;lt;configuration&amp;amp;amp;gt...]]></description><category></category></item><item><title><![CDATA[kafka 入门]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/82085685</link><guid>https://blog.youkuaiyun.com/henlf/article/details/82085685</guid><author>henlf</author><pubDate>Sun, 26 Aug 2018 22:48:50 +0800</pubDate><description><![CDATA[1 kafka 是什么

Apache kafka is a distributed streaming platform，即官方定义 kafka 是一个分布式流式计算平台。而在大部分企业开发人员中，都是把 kafka 当成消息系统使用，即它是一个分布式消息队列，很少会使用 kafka 的流式计算。它有四个关键概念：          


topic 
    kafka 把收到的消息按 top...]]></description><category></category></item><item><title><![CDATA[异常：javassist.CannotCompileException: [source error] getPropertyValue]]></title><link>https://blog.youkuaiyun.com/henlf/article/details/81674517</link><guid>https://blog.youkuaiyun.com/henlf/article/details/81674517</guid><author>henlf</author><pubDate>Tue, 14 Aug 2018 21:03:32 +0800</pubDate><description><![CDATA[
  由于在 dubbo 接口服务中添加了一个接口，之后项目运行出现如下异常信息：




java.lang.IllegalStateException: Failed to load ApplicationContext

    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.l...]]></description><category></category></item></channel></rss>