<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[农村外出务工男的博客]]></title><description><![CDATA[程序猿要坚持写博客，哪怕没有读者]]></description><link>https://blog.youkuaiyun.com/charry_a</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; charry_a]]></copyright><item><title><![CDATA[一次生产问题的排查---解决springboot集成dubbo并使用外部容器部署在应用重启出现dataSource has already close 异常]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/90519447</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/90519447</guid><author>charry_a</author><pubDate>Fri, 24 May 2019 17:02:58 +0800</pubDate><description><![CDATA[一、场景复现：
1、生产环境在上线得时候，重启应用，出现如下报错

2、使用技术栈 springboot 1.5.7 dubbo 2.6.1 druid 1.1.0 …
二、问题分析
​     上面错误是说 拿到得数据库连接已经被关闭，这种情况一般是由于停机得时候应用里面还有请求在处理，而这些处理中得请求所需要得资源，比如依赖的某个bean已经被spring容器关闭。
三、错误复现
主要复现流程...]]></description><category></category></item><item><title><![CDATA[深入浅出MYSQL索引实现机制]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/89073402</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/89073402</guid><author>charry_a</author><pubDate>Thu, 11 Apr 2019 23:07:16 +0800</pubDate><description><![CDATA[一、什么是索引

  提到数据库索引，我想你并不陌生，在日常工作中会经常接触到。比如 我们的某一个SQL查询语句响应很慢，你可能第一反应是 给这个SQL 加个索引吧，那么到底什么是索引昵，今天我们就来聊一下这个话题（本文以MYSQL 5.6 为例）。

 索引是为了加速对表中数据的检索速度而创建的一种数据结构，索引是在存储引擎层实现的，在MYSQL里面，不同的存储引擎实现索引...]]></description><category></category></item><item><title><![CDATA[浅析MyBatis的工作原理]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/88920141</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/88920141</guid><author>charry_a</author><pubDate>Sat, 30 Mar 2019 23:36:05 +0800</pubDate><description><![CDATA[一、Mybatis是什么

 myBatis是常见的Java数据库访问层框架，相比于传统的JDBC，Mybatis可以进行更为细致的SQL优化，减少查询字段、统一的SQL管理。

二、Mybatis的原理

 当我们使用mybatis的时候，通常需要配置一个xml文件，假如叫mybatis-config.xml文件，类似下面这样


&lt;?xml version="1.0"...]]></description><category></category></item><item><title><![CDATA[kafka提交异常org.apache.kafka.clients.consumer.CommitFailedException]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79892107</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79892107</guid><author>charry_a</author><pubDate>Sun, 03 Jun 2018 14:08:55 +0800</pubDate><description><![CDATA[一、背景       kafka使用版本为0.10.1.0，今天在测试kafkaConsumer的时候，代码如下public static void main(String[] args) {
        Properties props = new Properties();
        props.put(&quot;bootstrap.servers&quot;, &quot;192.168.80.132:909...]]></description><category></category></item><item><title><![CDATA[Springboot集成Rabbitmq实现延时消费，并实现可靠的消息处理]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/80514550</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/80514550</guid><author>charry_a</author><pubDate>Wed, 30 May 2018 19:18:46 +0800</pubDate><description><![CDATA[一、Rabbitmq简介1.1 rabbitmq 架构1.2 rabbitmq相关组件介绍exchange: 交换机,主要用来将生产者发送的消息路由给服务器中的队列。routing-key: 消息路由的key，生产者在将消息发到到exchange的时候，需要指定routing-key,这样exchange才知道将这条消息路由给哪些队列。message: 消息体，主要由消息头和消息body组成，消息...]]></description><category></category></item><item><title><![CDATA[Kafka生产端源码分析之RecordAccmulator]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79861059</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79861059</guid><author>charry_a</author><pubDate>Mon, 09 Apr 2018 14:43:36 +0800</pubDate><description><![CDATA[一、RecordAccmulator分析        注意，当前使用的kafka版本是0.10.1.0。       在kafkaProducer发送消息的时候，其实它并不是直接和kafka server进行通信，而是将消息暂存在一个缓冲区里面，主线程通过send方法发送后就可以立即返回而无需阻塞，业务线程不断通过KafkaProducer.send方法将消息发送到RecordAcccmulat...]]></description><category></category></item><item><title><![CDATA[深入分析KafkaProducer消息发送流程]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79816575</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79816575</guid><author>charry_a</author><pubDate>Fri, 06 Apr 2018 13:20:09 +0800</pubDate><description><![CDATA[一、Kafka生产者发送消息示例        注意：以下所用kafka版本为0.10.1.0       KafkaProducer是线程安全对象，建议可以将其封装成多线程共享一个实例，效率反而比多实例更高，在深入分析前，先简单看一个生产者生产消息的demo  package com.tanjie.kafka;

import java.util.List;
import java.util.P...]]></description><category></category></item><item><title><![CDATA[Kafka多线程生产消费]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79621324</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79621324</guid><author>charry_a</author><pubDate>Tue, 20 Mar 2018 10:00:35 +0800</pubDate><description><![CDATA[一、kafka生产者       kafka目前在0.9版本后采用java版本实现，生产者KafkaProducer是线程安全对象，所以我们建议KafkaProducer采用单例模式,多个线程共享一个实例    package com.kafka.singleton;

import java.io.IOException;
import java.io.InputStream;
import j...]]></description><category></category></item><item><title><![CDATA[Hdfs 架构浅析]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79621238</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79621238</guid><author>charry_a</author><pubDate>Tue, 20 Mar 2018 09:54:34 +0800</pubDate><description><![CDATA[    导读：最近因工作需要，学习了下hdfs，将学习笔记分享出来，与大家共勉，也欢迎大家指正。一、HDFS的特点    1:一次写入，多次读取:HDFS适合一次写入多次读取的模式,不支持对文件系统进行大量的随机修改。简化数据一致性处理。  2:适合批量处理文件，不建议大量存储小文件，其更倾向于高吞吐而不是低延迟。  3:成本低廉,廉价的机器就可以组成一个大集群。二、HDFS的架构        ...]]></description><category></category></item><item><title><![CDATA[Hadoop NameNode 高可用实现源码分析]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79621190</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79621190</guid><author>charry_a</author><pubDate>Tue, 20 Mar 2018 09:51:45 +0800</pubDate><description><![CDATA[一、NameNode的单节点问题      在hadoop1.x版本中,我们知道HDFS架构中的NameNode节点存在单点问题,一旦NameNode节点宕机了,整个HDFS集群将不可用，因为NameNode保存了整个HDFS的元数据信息。不过在Hadoop2.x版本解决了单点问题,下面我们结合源代码来分析其具体实现。二、NameNode的高可用架构  先上一张图片(来源于网络)     从上图可...]]></description><category></category></item><item><title><![CDATA[Jdk1.8版本Semaphore实现源码分析]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79128939</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79128939</guid><author>charry_a</author><pubDate>Fri, 09 Mar 2018 13:57:44 +0800</pubDate><description><![CDATA[一、Semaphore      Semaphore，信号量，常用在限流的场景，一般用来构建一些对象池，资源池之类的，Semaphore用来管理一组许可，当没有许可时，线程阻塞等待其他线程用完后归还许可后阻塞的线程才能获取许可。Semaphore里面分为了公平和非公平模式，默认是非公平的。二、看个例子import java.util.concurrent.CountDownLatch;
impor...]]></description><category></category></item><item><title><![CDATA[深入分析JAVA线程池的实现原理]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79492870</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79492870</guid><author>charry_a</author><pubDate>Fri, 09 Mar 2018 13:57:24 +0800</pubDate><description><![CDATA[一、前言               线程是属于稀缺资源，在应用中，如果频繁的创建销毁线程，势必会造成大量的CPU资源浪费，因此，合理的使用线程池不仅能加快任务处理速度还可以提高资源利用率，本篇主要基于JDK1.8来深入分析JAVA线程池的核心实现原理，由于能力有限，难免会有遗漏或错误的地方，欢迎读者指正。二、Exectors       在JAVA里面，主要是通过Exectors框架来提供了多种...]]></description><category></category></item><item><title><![CDATA[如何将多个java源文件打包成可执行jar包]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79414617</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79414617</guid><author>charry_a</author><pubDate>Thu, 01 Mar 2018 16:58:49 +0800</pubDate><description><![CDATA[一、背景       今天在开发中，遇到个问题，我们的应用依赖了一个第三方jar包，于是第三方开发人员就打了个包过来，刚开始一切正常，等开发完了准备放到服务器上跑的时候，启动服务报错了             这个错误以前遇到过，52.0表示是需要Jdk1.8运行的，而我的linux服务器上的jdk版本是1.7(不方便改)，所以唯一的解决办法就是让第三方开发人员将java源文件给我自己打包(当然，...]]></description><category></category></item><item><title><![CDATA[JAVA栈-实现字符串反转]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79388858</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79388858</guid><author>charry_a</author><pubDate>Thu, 01 Mar 2018 08:48:25 +0800</pubDate><description><![CDATA[一、需求分析      前段时间出去招聘，主要是面向大四学生，问的问题都比较基础，其中也问了一个在网上可以找见的题目，如何实现字符串反转，我发现很多同学都是有一定思路的，比如反向遍历，或者使用stringbuilder.reverse等都可以，然而这里我们要分享的是通过栈来实现。       栈是一种先进后出的数据结构，恰好可以用来实现对字符串的反转操作。二、代码实现     import jav...]]></description><category></category></item><item><title><![CDATA[设计模式之-观察者模式]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79389733</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79389733</guid><author>charry_a</author><pubDate>Thu, 01 Mar 2018 08:47:24 +0800</pubDate><description><![CDATA[一、观察者模式       JAVA设计模式有23种，平时工作中也使用了一些，比如单例，模板，策略，建造者等，但最近在学习zk过程中，发现zk提供的发布订阅功能和设计模式里面的观察者模式原理差不多，故顺便了解观察者模式是如何实现的，整体来说比较简单，一个被观察者，N个观察者，当被观察者的行为发生改变的时候，观察者能够监听到这个变化，从而做出相应的行为处理。二、代码实现    这里我们模拟实现一个这...]]></description><category></category></item><item><title><![CDATA[如何找到占用CPU最高的是哪一个线程]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79322212</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79322212</guid><author>charry_a</author><pubDate>Thu, 01 Mar 2018 08:46:33 +0800</pubDate><description><![CDATA[一、需求分析           经常听到朋友说他们线上CPU有时候突然飙升，想找到是哪个线程导致的，我相信他们肯定有自己的定位方法，今天我要分享的也仅仅是其中一种而已。二、如何定位       为了模拟这种现象，写一个程序，先看代码   public static void main(String[] args) {
		for(int i=1;i&amp;lt;=3;i++) {
			new Thr...]]></description><category></category></item><item><title><![CDATA[深入探究JVM | 探秘 Metaspace]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79320381</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79320381</guid><author>charry_a</author><pubDate>Tue, 13 Feb 2018 10:27:57 +0800</pubDate><description><![CDATA[Java 8 彻底将永久代 (PermGen) 移除出了 HotSpot JVM，将其原有的数据迁移至 Java Heap 或 Metaspace。这一篇文章我们来总结一下Metaspace（元空间）的特性。如有错误，敬请指出，谢谢~引言：永久代为什么被移出HotSpot JVM了？在 HotSpot JVM 中，永久代中用于存放类和方法的元数据以及常量池，比如Class和Method。每当一个类...]]></description><category></category></item><item><title><![CDATA[flume自定义拦截器(Interceptor)拼接header和body信息]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79316814</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79316814</guid><author>charry_a</author><pubDate>Mon, 12 Feb 2018 15:18:28 +0800</pubDate><description><![CDATA[一、需求背景       最近项目有这样一个需求，分别采集不同应用不同机器上的日志，在做日志清洗后存入DB，数据库表字段需要存当前日志的来源，比如，来自于哪个项目，该项目的哪台机器，由于我们使用的是flume来做日志采集，故去翻flume的官网，发现有拦截器可以支持我的需求，一个是主机拦截器，可以在source之后配置，在header里面拼上ip信息，另一个是static拦截器，可以自定义key和...]]></description><category></category></item><item><title><![CDATA[Storm集成Redis(使用redis的发布订阅功能)]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79289820</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79289820</guid><author>charry_a</author><pubDate>Thu, 08 Feb 2018 15:43:06 +0800</pubDate><description><![CDATA[一、需求分析       在上一篇中，我们搭建了一套实时日志分析平台，目前该平台的主要需求就是监测日志中是否含有某些敏感信息，对于不同的日志来源渠道，规则是不同的，有些是默认规则，有些是用户个性化需求，比如A系统，我的日志里面不允许出现hello这个单词，B系统我的日志里面不允许出现world这个单词，当用户新增了敏感信息后，要求应用能够近乎实时的更新其本地缓存(默认情况下，当storm启动的时候...]]></description><category></category></item><item><title><![CDATA[使用flume-ng+kafka+storm+mysql 搭建实时日志处理平台]]></title><link>https://blog.youkuaiyun.com/charry_a/article/details/79279077</link><guid>https://blog.youkuaiyun.com/charry_a/article/details/79279077</guid><author>charry_a</author><pubDate>Wed, 07 Feb 2018 15:25:45 +0800</pubDate><description><![CDATA[一、架构介绍
        因为要采集的日志已经在线上，为了不侵入代码(主要也是其他产品不会因为我们搞这个日志监控而修改代码后重新上线)，已经不能再规范日志化输出，也就是需要对老系统进行日志分析。对于不同的应用，不同的日志类型，比如nginx日志、tomcat日志、应用日志等都需要分别采集；调研了flume和Logstash，当然还有更轻量级的filebeta；最后选择了flume，有以下几个]]></description><category></category></item></channel></rss>