<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Java个体户]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qingxiangjava</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qingxiangjava]]></copyright><item><title><![CDATA[tomcat源码分析-如何接收连接？如何读数据？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/126521302</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/126521302</guid><author>qingxiangjava</author><pubDate>Thu, 25 Aug 2022 12:29:55 +0800</pubDate><description><![CDATA[接收客户端连接，是一个专门的线程。说白了，就是这个线程，专门干这个事情：只接收客户端连接。从客户端读数据是读线程池处理。读数据：调用servlet类的service方法。读线程池配置(最小10，最大200-这里就是tomcat默认200的来源)。真正创建读线程池的地方。具体是交给读线程池处理读数据。监听事件是一个独立的线程，专门用于监听事件，本质是不断轮询事件。最终的读数据是交给读数据线程池去执行。即读数据，最终是交给读线程池读数据。在监听端口的时候，就已经创建了。核心步骤：接收客户端连接。]]></description><category></category></item><item><title><![CDATA[spring-调试源码]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/125919413</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/125919413</guid><author>qingxiangjava</author><pubDate>Thu, 21 Jul 2022 19:30:42 +0800</pubDate><description><![CDATA[但是，官方一般都会提供demo/sample和测试代码，直接用自带的就可以，没必要自己去创建。当然，你自己创建一个测试项目，然后写一个包含main方法的入口类，也是一样。但是其实不应该阻断，因为warn没有影响。全局搜了一下关键字werror，把截图里的类的error配置去掉。那调试spring源码，就是调试创建容器和创建bean。该测试类的测试方法，可以测试创建容器和创建bean。所谓spring，核心就是容器和bean。找到报错模块，去掉error配置。再次执行，仍然异常。比如，添加打印日志啥的。...]]></description><category></category></item><item><title><![CDATA[tomcat-如何调试源码？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/125888472</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/125888472</guid><author>qingxiangjava</author><pubDate>Wed, 20 Jul 2022 11:17:44 +0800</pubDate><description><![CDATA[因为启动tomcat源码项目的时候，需要读工作目录的server.xml配置文件，然后还需要部署工作目录下的webapps目录里的项目。准备好内容之后，导入idea(导入之后，就是目录结构里展示的那样)，然后需要配置一些东西。先看下整体的目录结构是什么样子，以及每个内容的作用，然后后面讲怎么得到这些内容。下面的界面应该会自动生成，因为可以自动找到main方法的类。启动类是Bootstrap，其实就是包含main方法的类。然后把刚才下载的2个东西，解压之后，复制到根目录。一个是源码项目，一个是作为工作目录。.]]></description><category></category></item><item><title><![CDATA[zookeeper-如何解决高可用？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/125873695</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/125873695</guid><author>qingxiangjava</author><pubDate>Tue, 19 Jul 2022 15:43:13 +0800</pubDate><description><![CDATA[比如，如果leader节点挂了，这个时候就要选举——问题就在这里，如果参与选举的节点数量过多，就会导致选举速度变慢。上文有提到观察者节点的作用，分担读请求，但是不参与选举——这里的数据一致性过半节点确认，观察者节点也不参与，这样的话就减少了参与确认节点的数量，从而提高写性能。如果leader节点挂了，会选举，过半节点选择某个从节点，该从节点就晋升为leader节点。如果leader节点挂了，会选举，过半节点选择某个从节点，该从节点就晋升为leader节点。集群的每个节点之间，都会通信。...]]></description><category></category></item><item><title><![CDATA[rocketmq-如何解决高可用问题？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/125798230</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/125798230</guid><author>qingxiangjava</author><pubDate>Fri, 15 Jul 2022 10:01:18 +0800</pubDate><description><![CDATA[rocketmq高可用]]></description><category></category></item><item><title><![CDATA[redis如何解决高可用问题？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/125780632</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/125780632</guid><author>qingxiangjava</author><pubDate>Thu, 14 Jul 2022 11:23:10 +0800</pubDate><description><![CDATA[使用redis集群。目前解决redis高可用的最佳实践，就是使用redis集群。一般就是几主几从，就够用了。比如，3主3从，或者5主5从。每个主节点，一般只需要一个从节点就够了。从节点会自动晋升为新的主节点。注：实现原理是，剩下的主节点会从从节点里面选择一个作为新的主节点。一般情况下，每个主节点就一个从节点，所以直接选择那个唯一的从节点晋升为主节点即可。影响范围？只影响挂的那一瞬间。自动晋升完成之后，就不会影响。那旧的主节点怎么处理？旧的主节点后面如果恢复了，就自动降级为新主节点的从节点。也就是说，主节点和]]></description><category></category></item><item><title><![CDATA[java序列化实现原理和深度分析]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121827727</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121827727</guid><author>qingxiangjava</author><pubDate>Thu, 09 Dec 2021 15:55:40 +0800</pubDate><description><![CDATA[java序列化
什么是序列化？
对象和二进制的转换。
转换的目的是啥？
对象转换为二进制，然后再把二进制恢复为对象。
具体应用场景是，把对象写到磁盘文件，或者更常见的就是把对象传到远程机器(比如，dubbo rpc框架)。
什么是java序列化？
java序列化特殊一点点，是对象和字节数组( byte[] )的转换。但是，字节数组的本质也是二进制。
序列化的作用？
所以，无论是其他语言，还是java语言的序列化，本质作用都是为了从磁盘文件或者远程机器恢复对象。

官方文档介绍
Serialization i]]></description><category></category></item><item><title><![CDATA[Linux常用命令-如何操作文件？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121777450</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121777450</guid><author>qingxiangjava</author><pubDate>Tue, 07 Dec 2021 20:04:33 +0800</pubDate><description><![CDATA[创建文件
touch 文件名字
复制文件
1、目标文件名字使用默认和源文件名字一样的名字
cp 源文件目录/源文件名字 目标文件目录/
2、自定义目标文件名字
cp 源文件目录/源文件名字 目标文件目录/目标文件名字
注：cp，是copy的意思。
移动文件
mv 源文件目录/源文件名字 目标文件目录/目标文件名字
注：mv，是move的意思。
删除文件

删除单个文件

rm 文件名字

删除所有文件

rm -r 文件目录
注：rm是remove的意思。-r参数，是递归的意思，即递归删除文件夹里的所有内容]]></description><category></category></item><item><title><![CDATA[linux常用命令-grep之各种搜索]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121661476</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121661476</guid><author>qingxiangjava</author><pubDate>Wed, 01 Dec 2021 18:20:22 +0800</pubDate><description><![CDATA[按进程名字搜进程
如何使用？
//查询进程
ps -ef | grep tomcat说明一下，ps(process status)是查看进程的意思。
grep，是搜索的意思。
然后，主要是结合了管道|，即把前面一个命令的输出，作为后面一个命令的输入。

这里再重点讲一下，参数-ef。
因为如果不知道参数是什么意思，就很难记住。平时更多的可能是完全靠死记硬背，但是如果知道是什么意思，那么就不用刻意记忆了。
那-ef，到底指什么呢？不加行不行？不行。
e的作用和A一样，A的作用是显示进程所有信息，A一看就知道是]]></description><category></category></item><item><title><![CDATA[linux常用命令-如何操作目录？如何查看文件内容？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121588588</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121588588</guid><author>qingxiangjava</author><pubDate>Sun, 28 Nov 2021 11:13:09 +0800</pubDate><description><![CDATA[如何操作目录？
切换目录-cd
cd比较简单。
这里稍微提一点，就是生产环境的日志目录可能就是在当前用户目录，然后应用程序目录和其他相关文件的目录也都是在当前用户目录，然后你可能切换到了其他的目录，这个时候想要快速的切换到当前用户目录，怎么切换？
直接cd即可，不用指定任何目录，因为默认就是切换到当前用户目录。
查看当前目录-pwd
因为默认不会显示当前目录完整路径，所以想要看当前在哪个目录，怎么办？pwd。
pwd是print working directory的意思，就是打印当前目录。
这个命令用的是比]]></description><category></category></item><item><title><![CDATA[idea提交代码失败-github failed to connect to github.com port 443 timed out]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121574869</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121574869</guid><author>qingxiangjava</author><pubDate>Sat, 27 Nov 2021 11:45:26 +0800</pubDate><description><![CDATA[问题
idea提交代码失败：
github failed to connect to github.com port 443 timed out

原因
可能是github的token安全规则改变了，因为收到邮件。

token过期了，要重新生成token。
解决方法
点击重新生成按钮，跳转到github，然后重新生成token。

点击重新生成按钮

点击重新生成按钮即可。
得到token

点击更新token按钮即可

idea也要更新token

点击使用token登陆

填写新的token

登陆授]]></description><category></category></item><item><title><![CDATA[idea-如何提交本地项目到gitee？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121555039</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121555039</guid><author>qingxiangjava</author><pubDate>Fri, 26 Nov 2021 10:50:37 +0800</pubDate><description><![CDATA[先在gitee创建项目

在idea也创建一个项目

创建本地仓库
点击菜单vcs——》import into version control——》create git repository

选择当前项目目录作为git仓库目录

创建git本地仓库之后，在项目目录多了一个git仓库目录

右键项目提交文件到本地仓库

最后再把本地仓库更新push到远程仓库

因为是第一次提交，此时本地仓库还没有和远程]]></description><category></category></item><item><title><![CDATA[java jvm-old gc耗时几十s，导致系统告警]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121542410</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121542410</guid><author>qingxiangjava</author><pubDate>Thu, 25 Nov 2021 17:12:52 +0800</pubDate><description><![CDATA[问题
生产环境告警，接口超时。
原因
old gc耗时几十s，导致系统瞬间卡死，然后接口都超时了。


另外一个应用也是耗时好几s，导致系统瞬间卡死，然后很多告警。

不是每次old gc都会卡死，而是偶尔一次old gc才会耗时很久，大部分时候正常。

本质原因
为什么old gc耗时这么久？原因是因为之前有一个节点接入skywalking，然后调整了jvm配置，具体是：新生代和老年代的比例，默认是2。现在是4，老的内存大小翻倍——导致老年代的gc阈值变高了，所以才会很久gc一次，但是有可能导致单次耗时太]]></description><category></category></item><item><title><![CDATA[idea-高级调试技巧]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121538346</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121538346</guid><author>qingxiangjava</author><pubDate>Thu, 25 Nov 2021 15:11:02 +0800</pubDate><description><![CDATA[背景
高级调试技巧，其实就是用的比较少。
但是，如果需要使用的时候，还是很方便的。
返回“上一步”
什么时候需要返回上一步？我们调试的时候，就是刚刚执行了某个方法的代码，现在已经进入到了子方法，然后又想要回去看一下变量的值，即回到父方法。
怎么做？点击返回上一步按钮即可。
步骤如下

先进入到子方法



点击返回父方法按钮

即点击drop frame按钮，就可以返回到父方法(在这里是main方法)。

回到了父方法的子方法调用处。

然后，我们就可以看父方法的变量了。注意，这里返回父方法，看起来好像和执]]></description><category></category></item><item><title><![CDATA[springboot-如何运行jsp项目？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121514682</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121514682</guid><author>qingxiangjava</author><pubDate>Wed, 24 Nov 2021 14:25:49 +0800</pubDate><description><![CDATA[直接用springboot官方自带的例子程序

运行程序
有异常，需要解决异常。
找不到servlet类，缺servlet jar
报错
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext


原因
没有引入servlet jar。
那就引入jar
&lt;!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --&gt;
&]]></description><category></category></item><item><title><![CDATA[idea-如何合并代码？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121500251</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121500251</guid><author>qingxiangjava</author><pubDate>Tue, 23 Nov 2021 19:06:13 +0800</pubDate><description><![CDATA[背景
如何合并代码？这里指的是，工作当中，一般在dev分支开发，然后上线的时候，需要把dev合并到master，用master的代码上线。
怎么做呢？
先选择目标端master
为什么是先选择目标端Master？因为现在是要把dev分支合并到master，所以要选进入目标端master分支。

开始合并代码
要选择源端分支是哪个。现在是要把dev分支合并到master，所以选择dev分支。

合并成功

如果没有冲突，就直接提示合并成功。
现在已经把dev分支修改代码合并到了master分支，但是现在是在本]]></description><category></category></item><item><title><![CDATA[idea-代码智能提示]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/121484805</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/121484805</guid><author>qingxiangjava</author><pubDate>Tue, 23 Nov 2021 03:25:38 +0800</pubDate><description><![CDATA[打开智能提示功能
步骤

打开智能提示功能
并且打开首字母大小写敏感

因为如果大小写不敏感，就会提示很多不匹配的结果，提示项太多了，还要找半天。

main方法
步骤

输入psvm，会智能提示

psvm是public void static main的首字母。

然后选择对应的提示项，按回车即可


打印日志
步骤

输入so，会智能提示

so是system.out的首字母。

选择对应的提示项，按回车即可


for循环
步骤

输入fori，会智能提示
选择对应的智能提示，然后按回车即可


i]]></description><category></category></item><item><title><![CDATA[git-回滚到某次提交reset current branch to here]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/119876400</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/119876400</guid><author>qingxiangjava</author><pubDate>Mon, 23 Aug 2021 19:52:32 +0800</pubDate><description><![CDATA[背景
情形1：提交了多次错误的提交，想回滚到之前的某次提交。
情形2：合并了错误的分支，想回滚到合并之前。
解决方法
基于git reset current branch to here。
直接在idea上面操作即可。
回滚(git reset current branch to here)
现在来模拟，比如提交了四次，现在想回滚到第一次提交，去掉后面三次的提交，

选择某次提交，右键


选择hard，回滚到某次提交。
现在本地已经完成，后面三次提交记录也被删除，看不到了。
强制push(force pu]]></description><category></category></item><item><title><![CDATA[dubbo消费者新增了一个字段，上线的时候兼容吗？]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/119875923</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/119875923</guid><author>qingxiangjava</author><pubDate>Mon, 23 Aug 2021 19:24:03 +0800</pubDate><description><![CDATA[背景和结论
上线的时候，不同项目组开发进度不一样，但是服务有依赖，消费者可能先上线，消费者的入参对象添加了一个字段，但是提供者没有上线，所以没有添加该字段。会不会有问题？
结论是没有。测试过程见截图。
消费者多了一个字段

提供者少了一个字段

消费者调用之后，返回数据

官方文档

看官方文档，提供者少了字段，有兼容问题，实际测试并没有兼容问题。

...]]></description><category></category></item><item><title><![CDATA[dubbo timeout 优先级以及最佳实践]]></title><link>https://blog.youkuaiyun.com/qingxiangjava/article/details/119855237</link><guid>https://blog.youkuaiyun.com/qingxiangjava/article/details/119855237</guid><author>qingxiangjava</author><pubDate>Sun, 22 Aug 2021 17:28:42 +0800</pubDate><description><![CDATA[理论
一般，接口都有设置超时时间，不管是http接口，还是dubbo接口。
为什么要设置超时时间？因为不设置的时候，一旦高并发，就会把系统搞挂。
具体就是可能部分交易请求很慢，耗时很久，但是没有设置超时，然后就一直占着dubbo线程池的线程资源，这个时候，就会因为部分慢交易，影响和导致了整个系统，因为其他本来正常的交易，现在由于dubbo线程池满了，也处理不了了，这个时候，系统就崩溃了，所有的交易都耗时很慢。
dubbo超时的维度
有2个维度，一个是作用域粒度，一个是消费者还是生产者。
粒度
有3个
1、所]]></description><category></category></item></channel></rss>