<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/xt00002003</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xt00002003]]></copyright><item><title><![CDATA[对公司招人限制985的思考]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/136675997</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/136675997</guid><author>xt00002003</author><pubDate>Wed, 13 Mar 2024 11:56:18 +0800</pubDate><description><![CDATA[最后，用我技术老师的一句话来总结思考：人生没有白走的路，每一步走算数。有因必有果，每一步都铸就了今天的我们。]]></description><category></category></item><item><title><![CDATA[langchain学习-翻译工具]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/132512966</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/132512966</guid><author>xt00002003</author><pubDate>Sat, 26 Aug 2023 16:45:12 +0800</pubDate><description><![CDATA[langchain作为大模型的框架，将使用大模型的流程进行抽象。让使用者可以比较简单的应用大模型进行开发。有点像java中的spring。或者说langchain想成为大模型开发中的"spring"。]]></description><category></category></item><item><title><![CDATA[Druid源码（八）-怎么设计连接池]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124891883</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124891883</guid><author>xt00002003</author><pubDate>Fri, 20 May 2022 23:42:21 +0800</pubDate><description><![CDATA[通过2周的学习梳理，对Druid的怎么操作数据库有了一个粗浅的了解。同时随着对Druid的学习，我也一直思考一个问题，怎么样设计一个连接池呢？作为一个底层框架需要考虑哪些方面呢？这篇文章是我对这个问题的思考。总体上是从战略设计、战术设计总体2个层面分析。如图所示：



战略设计

Druid的目标是什么

从Druid最早的一个tag（0.2）可以看出这个框架最早就明确要实现一些基本功能：连接池、过滤器、统计、代理、防火墙等。这几个包一直延续到了现在的版本。也就是说Druid的目标是实现一个高性能、高可用]]></description><category></category></item><item><title><![CDATA[Druid源码学习（七）-shirk逻辑]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124873802</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124873802</guid><author>xt00002003</author><pubDate>Thu, 19 May 2022 23:20:07 +0800</pubDate><description><![CDATA[在前面介绍了DruidDataSource类的init方法中有三个线程：createAndLogThread()、createAndStartCreatorThread()、createAndStartDestroyThread() 分别是创建日志、创建连接，销毁线程。这个线程是守护线程。

整体代码如下：


    public void shrink(boolean checkTime, boolean keepAlive) {
        try {
            lock.lockI]]></description><category></category></item><item><title><![CDATA[Druid源码学习（六）-统计stat之获取连接]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124832925</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124832925</guid><author>xt00002003</author><pubDate>Tue, 17 May 2022 23:36:01 +0800</pubDate><description><![CDATA[统计功能算是Druid工具亮点之一了。统计可以帮助研发或者运维获取到数据连接实时的一些指标，从而能够更好的定位问题。

    stat统计是从StatFilter开始。其中connection代码如下：


   public ConnectionProxy connection_connect(FilterChain chain, Properties info) throws SQLException {
        ConnectionProxy connection = null;

...]]></description><category></category></item><item><title><![CDATA[Druid源码学习（五）-内置Filter的调用]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124829489</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124829489</guid><author>xt00002003</author><pubDate>Tue, 17 May 2022 20:57:05 +0800</pubDate><description><![CDATA[上篇文章介绍了Filter是如何加载的。那么接下来就介绍Filter的关键类。

Filter

这个接口定义了Filter需要具备的功能，分成2部分：生命周期、必要操作。

生命周期方法为了做更好的扩展。


   void init(DataSourceProxy dataSource);

    void destroy();

其他方法基本上都是与数据库操作有关的方法。这里注意一个细节就是其他接口方法定义的参数中都会包含FilterChain 这个参数。这个对象使用了责任链方式对Filter进行扩]]></description><category></category></item><item><title><![CDATA[Druid源码学习（五）-内置Filter加载]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124792459</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124792459</guid><author>xt00002003</author><pubDate>Mon, 16 May 2022 23:26:13 +0800</pubDate><description><![CDATA[前面介绍完了连接池的大体流程，今天来梳理Druid中Filter的整体流程
]]></description><category></category></item><item><title><![CDATA[Druid源码学习（四）-连接总结]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124775282</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124775282</guid><author>xt00002003</author><pubDate>Sat, 14 May 2022 23:46:32 +0800</pubDate><description><![CDATA[通过前面几篇文章把获取数据库连接的逻辑粗略的梳理了一下。在这过程中我产生了以下几个问题：

什么是连接池
	在连接池模式下，获取连接应该注意哪些
	可用进行哪些扩展
带着以上的问题思考，画了一张思维导图。





作为一个数据库连接池工具，应该把场景放宽。就是说数据库无论是单机、还是负载均衡亦或者是主从的方式都应该支持。所以第一层应该是数据库组成方式的支持。对于Druid这个项目源码，对负载均衡、主从方式的支持还没有分析到。所以这里不做介绍。本文先只介绍单机的情况。在单机的方式下，我把思路分为了3个阶段.]]></description><category></category></item><item><title><![CDATA[Druid源码学习（三）]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124760593</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124760593</guid><author>xt00002003</author><pubDate>Fri, 13 May 2022 23:38:35 +0800</pubDate><description><![CDATA[前面介绍了Druid数据源获取连接的init 方法。那么作为数据连接池是如何获取连接以及释放连接的呢？今天就来学习连接池对连接的管理。

获取连接

获取数据库连接的代码如下所示：


    @Override
    public DruidPooledConnection getConnection() throws SQLException {
        return getConnection(maxWait);
    }

    public DruidPooledConnection]]></description><category></category></item><item><title><![CDATA[Druid源码学习（二）-init创建连接]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124723224</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124723224</guid><author>xt00002003</author><pubDate>Thu, 12 May 2022 23:44:33 +0800</pubDate><description><![CDATA[总图





JDBC获取连接


DriverManager.getConnection(url, username, password);

//getConnection 方法
 private static Connection getConnection(
        String url, java.util.Properties info, Class&lt;?&gt; caller) throws SQLException {
        /*
         * When c.]]></description><category></category></item><item><title><![CDATA[Druid源码学习（二）-init方法的驱动加载]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124719191</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124719191</guid><author>xt00002003</author><pubDate>Wed, 11 May 2022 23:15:22 +0800</pubDate><description><![CDATA[今天继续看DruidDataSource的init 方法。这个方法从字面意思上看是初始化的含义。也就是说在真正获取连接之前数据源还需要做一些工作。这里我会分几篇文章来总结自己的学习，因为init很复杂。



第一篇文章会从头梳理一个问题： Druid连接池如果获取连接

在介绍Druid之前，先回顾一下JDBC如果获取连接的。JDBC获取连接2步骤：


//1.加载驱动(开发推荐的方式)
Class.forName("com.mysql.jdbc.Driver");

String url = "jdb]]></description><category></category></item><item><title><![CDATA[Druid源码学习（一）]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/124678043</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/124678043</guid><author>xt00002003</author><pubDate>Tue, 10 May 2022 23:10:19 +0800</pubDate><description><![CDATA[从有个测试用例看连接的建立：Demo0


public class Demo0 extends TestCase {

    private String jdbcUrl;
    private String user;
    private String password;
    private String driverClass;
    private int    initialSize = 10;
    private int    minPoolSize = 1;
    priv]]></description><category></category></item><item><title><![CDATA[CAT集成阿里RocketMQ产品]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/117443358</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/117443358</guid><author>xt00002003</author><pubDate>Tue, 01 Jun 2021 15:01:53 +0800</pubDate><description><![CDATA[背景

在上面介绍了CAT如何做跨进程追踪的。公司项目采用业务垂直切分的方式开发、前后端也是分离方式。那么实时监控埋点的地方有如下几处：

前端和后端交互
	后端业务逻辑
	数据库存储
	远程PRC调用
	消息队列


消息队列介绍

这里介绍的是阿里云RocketMQ产品。由于公司现阶段运维实力不足，所以对于中间件采用的策略是直接购买产品。这样可以减少运维成本，同时中间件的稳定性也得到了保证。

使用的客户端版本是1.8.8Fianl。如果使用的版本是1.7.x 是没有spi这个包的。



集成思路..]]></description><category></category></item><item><title><![CDATA[CAT集成Dubbo]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/117376147</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/117376147</guid><author>xt00002003</author><pubDate>Fri, 28 May 2021 23:37:39 +0800</pubDate><description><![CDATA[背景

在上面介绍了CAT如何做跨进程追踪的。公司项目采用业务垂直切分的方式开发、前后端也是分离方式。那么实时监控埋点的地方有如下几处：

前端和后端交互
	后端业务逻辑
	数据库存储
	远程PRC调用
	消息队列


RPC框架

公司选用的RPC框架是apache dubbo ，版本是2.7.5 。dubbo是一款非常优秀的RPC框架。对于框架我就不做过多的介绍了。cat 集成 dubbo 首要考虑的就是让业务系统无感。那么优秀的框架一定有扩展点。在dubbo中可以使用Filter 来进行扩展。

..]]></description><category></category></item><item><title><![CDATA[CAT集成spring boot]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/117256570</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/117256570</guid><author>xt00002003</author><pubDate>Tue, 25 May 2021 15:09:12 +0800</pubDate><description><![CDATA[1.背景

在上面介绍了CAT如何做跨进程追踪的。公司项目采用业务垂直切分的方式开发、前后端也是分离方式。那么实时监控埋点的地方有如下几处：

前端和后端交互
	后端业务逻辑
	数据库存储
	远程PRC调用
	消息队列


2.集成spring boot

在git官网中有一个包是大家贡献的集成代码。里面就有各种的集成。里面就有和spring boot集成的代码。代码是直接使用了cat client包中catfilter这个类。这个类的逻辑比较复杂，分了不同的情况。然而公司系统结构中没有那么复杂。整体流程.]]></description><category></category></item><item><title><![CDATA[CAT介绍]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/117235513</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/117235513</guid><author>xt00002003</author><pubDate>Mon, 24 May 2021 23:46:50 +0800</pubDate><description><![CDATA[1.CAT的定位

CAT是点评开源的一个实时监控系统，主要体现在监控报表Transaction、event、problem、heartbeat等，cat系统定制的监控模型以及定制的实时分析报表也是cat系统核心优势。这里强调了CAT相比于其他系统的二开优势。

这也是我选择CAT作为公司正式环境实时监控系统的一个主要原因。相较于其他APM监控系统，大部分使用的是字节码agent技术。公司现在研发对agent以及字节码技术掌握度不高。使用这些技术的链路追踪系统在公司现在的环境下很难进行定制以及维护。


.]]></description><category></category></item><item><title><![CDATA[java内存模型(二)]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/115388002</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/115388002</guid><author>xt00002003</author><pubDate>Fri, 02 Apr 2021 00:14:43 +0800</pubDate><description><![CDATA[上一篇介绍了java的内存结构，那么接下来总结java在多核多线程的环境下如何解决数据访问的复杂问题。

二、JMM与线程规范

我们知道，计算机按支持的指令大致可以分为两类：

精简指令集计算机(RISC)，代表是如今大家熟知的ARM芯片，功耗低，运算能
力相对较弱。

复杂指令集计算机(CISC) ,代表作是Intel的X86芯片系列，比如奔腾，酷睿，至
强，以及AMD的CPU。

CPU与缓存的结构如图
	

	
	


CPU接收到指令后，它会最先向CPU中的一级缓存（L1 Cache）去...]]></description><category></category></item><item><title><![CDATA[java内存模型(一)]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/115363822</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/115363822</guid><author>xt00002003</author><pubDate>Wed, 31 Mar 2021 23:16:39 +0800</pubDate><description><![CDATA[在提到java的内存模型是，一般都会说堆栈、程序计数器、方法区等这些设计。这里我更觉得秦大哥的说明更加容易理解。那么接下来我会根据秦大哥的解释进行总结说明。



一、内存结构：

内存结构通常说的就是栈、堆这些结构。从逻辑结构上分为线程栈、堆内存、非堆内存。

线程栈：为什么叫线程栈呢？因为首先这部分的数据结构是栈。每个线程都会有自己栈。JVM为每个新创建的线程都分配一个堆栈。线程栈包含了当前正在执行的方法链/调用链上的所有方法的状态信息。线程栈中保存了方法内的局部变量。线程栈有如下特点：
	每个线程都.]]></description><category></category></item><item><title><![CDATA[JVM 类加载器]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/114682061</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/114682061</guid><author>xt00002003</author><pubDate>Thu, 11 Mar 2021 22:33:59 +0800</pubDate><description><![CDATA[一、字节码与运行时程序的关系：

写好的代码经过编译变成了字节码，并且可以打包成Jar文件。然后就可以让JVM去加载需要的字节码，变成持久代/元数据区上的Class对象，接着才会执行我们的程序逻辑。



二、类的生命周期和加载过程

一个类的生命周期包括以下几个方面：

加载
	验证
	准备
	解析
	初始化
	使用
	卸载
在这些过程中，1-5步骤被称作类加载。



三、类加载时机

提到类加载时机，有个细节需要记录的是：类会在哪些情况下被初始化？这里记录下一些情况。

初始化何时会被触发：

...]]></description><category></category></item><item><title><![CDATA[Java字节码(二)]]></title><link>https://blog.youkuaiyun.com/xt00002003/article/details/114420071</link><guid>https://blog.youkuaiyun.com/xt00002003/article/details/114420071</guid><author>xt00002003</author><pubDate>Fri, 05 Mar 2021 23:39:56 +0800</pubDate><description><![CDATA[一、字节码的执行模型

VM是一台基于栈的计算机器。每个线程都有一个独属于自己的线程栈(JVMstack)，

用于存储 栈帧 (Frame)。每一次方法调用，JVM都会自动创建一个栈帧。 栈帧 由操作数栈 ，局部变量数组 以及一个 class引用 组成。 class引用 指向当前方法在运行时常量池中对应的class)。



二、方法调用的常见指令

invokestatic，顾名思义，这个指令用于调用某个类的静态方法，这是方法调用指令中最
快的一个。

invokespecial, 用来调用...]]></description><category></category></item></channel></rss>