- 博客(33)
- 收藏
- 关注
原创 tomcat源码分析-如何接收连接?如何读数据?
接收客户端连接,是一个专门的线程。说白了,就是这个线程,专门干这个事情:只接收客户端连接。从客户端读数据是读线程池处理。读数据:调用servlet类的service方法。读线程池配置(最小10,最大200-这里就是tomcat默认200的来源)。真正创建读线程池的地方。具体是交给读线程池处理读数据。监听事件是一个独立的线程,专门用于监听事件,本质是不断轮询事件。最终的读数据是交给读数据线程池去执行。即读数据,最终是交给读线程池读数据。在监听端口的时候,就已经创建了。核心步骤:接收客户端连接。
2022-08-25 12:29:55
370
原创 spring-调试源码
但是,官方一般都会提供demo/sample和测试代码,直接用自带的就可以,没必要自己去创建。当然,你自己创建一个测试项目,然后写一个包含main方法的入口类,也是一样。但是其实不应该阻断,因为warn没有影响。全局搜了一下关键字werror,把截图里的类的error配置去掉。那调试spring源码,就是调试创建容器和创建bean。该测试类的测试方法,可以测试创建容器和创建bean。所谓spring,核心就是容器和bean。找到报错模块,去掉error配置。再次执行,仍然异常。比如,添加打印日志啥的。...
2022-07-21 19:30:42
592
原创 tomcat-如何调试源码?
因为启动tomcat源码项目的时候,需要读工作目录的server.xml配置文件,然后还需要部署工作目录下的webapps目录里的项目。准备好内容之后,导入idea(导入之后,就是目录结构里展示的那样),然后需要配置一些东西。先看下整体的目录结构是什么样子,以及每个内容的作用,然后后面讲怎么得到这些内容。下面的界面应该会自动生成,因为可以自动找到main方法的类。启动类是Bootstrap,其实就是包含main方法的类。然后把刚才下载的2个东西,解压之后,复制到根目录。一个是源码项目,一个是作为工作目录。.
2022-07-20 11:17:44
747
原创 zookeeper-如何解决高可用?
比如,如果leader节点挂了,这个时候就要选举——问题就在这里,如果参与选举的节点数量过多,就会导致选举速度变慢。上文有提到观察者节点的作用,分担读请求,但是不参与选举——这里的数据一致性过半节点确认,观察者节点也不参与,这样的话就减少了参与确认节点的数量,从而提高写性能。如果leader节点挂了,会选举,过半节点选择某个从节点,该从节点就晋升为leader节点。如果leader节点挂了,会选举,过半节点选择某个从节点,该从节点就晋升为leader节点。集群的每个节点之间,都会通信。...
2022-07-19 15:43:13
600
原创 redis如何解决高可用问题?
使用redis集群。目前解决redis高可用的最佳实践,就是使用redis集群。一般就是几主几从,就够用了。比如,3主3从,或者5主5从。每个主节点,一般只需要一个从节点就够了。从节点会自动晋升为新的主节点。注:实现原理是,剩下的主节点会从从节点里面选择一个作为新的主节点。一般情况下,每个主节点就一个从节点,所以直接选择那个唯一的从节点晋升为主节点即可。影响范围?只影响挂的那一瞬间。自动晋升完成之后,就不会影响。那旧的主节点怎么处理?旧的主节点后面如果恢复了,就自动降级为新主节点的从节点。也就是说,主节点和
2022-07-14 11:23:10
714
原创 java序列化实现原理和深度分析
java序列化什么是序列化?对象和二进制的转换。转换的目的是啥?对象转换为二进制,然后再把二进制恢复为对象。具体应用场景是,把对象写到磁盘文件,或者更常见的就是把对象传到远程机器(比如,dubbo rpc框架)。什么是java序列化?java序列化特殊一点点,是对象和字节数组( byte[] )的转换。但是,字节数组的本质也是二进制。序列化的作用?所以,无论是其他语言,还是java语言的序列化,本质作用都是为了从磁盘文件或者远程机器恢复对象。官方文档介绍Serialization i
2021-12-09 15:55:40
428
原创 Linux常用命令-如何操作文件?
创建文件touch 文件名字复制文件1、目标文件名字使用默认和源文件名字一样的名字cp 源文件目录/源文件名字 目标文件目录/2、自定义目标文件名字cp 源文件目录/源文件名字 目标文件目录/目标文件名字注:cp,是copy的意思。移动文件mv 源文件目录/源文件名字 目标文件目录/目标文件名字注:mv,是move的意思。删除文件删除单个文件rm 文件名字删除所有文件rm -r 文件目录注:rm是remove的意思。-r参数,是递归的意思,即递归删除文件夹里的所有内容
2021-12-07 20:04:33
863
原创 linux常用命令-grep之各种搜索
按进程名字搜进程如何使用?//查询进程ps -ef | grep tomcat说明一下,ps(process status)是查看进程的意思。grep,是搜索的意思。然后,主要是结合了管道|,即把前面一个命令的输出,作为后面一个命令的输入。这里再重点讲一下,参数-ef。因为如果不知道参数是什么意思,就很难记住。平时更多的可能是完全靠死记硬背,但是如果知道是什么意思,那么就不用刻意记忆了。那-ef,到底指什么呢?不加行不行?不行。e的作用和A一样,A的作用是显示进程所有信息,A一看就知道是
2021-12-01 18:20:22
679
原创 linux常用命令-如何操作目录?如何查看文件内容?
如何操作目录?切换目录-cdcd比较简单。这里稍微提一点,就是生产环境的日志目录可能就是在当前用户目录,然后应用程序目录和其他相关文件的目录也都是在当前用户目录,然后你可能切换到了其他的目录,这个时候想要快速的切换到当前用户目录,怎么切换?直接cd即可,不用指定任何目录,因为默认就是切换到当前用户目录。查看当前目录-pwd因为默认不会显示当前目录完整路径,所以想要看当前在哪个目录,怎么办?pwd。pwd是print working directory的意思,就是打印当前目录。这个命令用的是比
2021-11-28 11:13:09
799
原创 idea提交代码失败-github failed to connect to github.com port 443 timed out
问题idea提交代码失败:github failed to connect to github.com port 443 timed out原因可能是github的token安全规则改变了,因为收到邮件。token过期了,要重新生成token。解决方法点击重新生成按钮,跳转到github,然后重新生成token。点击重新生成按钮点击重新生成按钮即可。得到token点击更新token按钮即可idea也要更新token点击使用token登陆填写新的token登陆授
2021-11-27 11:45:26
725
原创 idea-如何提交本地项目到gitee?
先在gitee创建项目在idea也创建一个项目创建本地仓库点击菜单vcs——》import into version control——》create git repository选择当前项目目录作为git仓库目录创建git本地仓库之后,在项目目录多了一个git仓库目录右键项目提交文件到本地仓库最后再把本地仓库更新push到远程仓库因为是第一次提交,此时本地仓库还没有和远程
2021-11-26 10:50:37
345
原创 java jvm-old gc耗时几十s,导致系统告警
问题生产环境告警,接口超时。原因old gc耗时几十s,导致系统瞬间卡死,然后接口都超时了。另外一个应用也是耗时好几s,导致系统瞬间卡死,然后很多告警。不是每次old gc都会卡死,而是偶尔一次old gc才会耗时很久,大部分时候正常。本质原因为什么old gc耗时这么久?原因是因为之前有一个节点接入skywalking,然后调整了jvm配置,具体是:新生代和老年代的比例,默认是2。现在是4,老的内存大小翻倍——导致老年代的gc阈值变高了,所以才会很久gc一次,但是有可能导致单次耗时太
2021-11-25 17:12:52
1687
原创 idea-高级调试技巧
背景高级调试技巧,其实就是用的比较少。但是,如果需要使用的时候,还是很方便的。返回“上一步”什么时候需要返回上一步?我们调试的时候,就是刚刚执行了某个方法的代码,现在已经进入到了子方法,然后又想要回去看一下变量的值,即回到父方法。怎么做?点击返回上一步按钮即可。步骤如下先进入到子方法点击返回父方法按钮即点击drop frame按钮,就可以返回到父方法(在这里是main方法)。回到了父方法的子方法调用处。然后,我们就可以看父方法的变量了。注意,这里返回父方法,看起来好像和执
2021-11-25 15:11:02
580
原创 springboot-如何运行jsp项目?
直接用springboot官方自带的例子程序运行程序有异常,需要解决异常。找不到servlet类,缺servlet jar报错Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext原因没有引入servlet jar。那就引入jar<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->&
2021-11-24 14:25:49
2420
原创 idea-如何合并代码?
背景如何合并代码?这里指的是,工作当中,一般在dev分支开发,然后上线的时候,需要把dev合并到master,用master的代码上线。怎么做呢?先选择目标端master为什么是先选择目标端Master?因为现在是要把dev分支合并到master,所以要选进入目标端master分支。开始合并代码要选择源端分支是哪个。现在是要把dev分支合并到master,所以选择dev分支。合并成功如果没有冲突,就直接提示合并成功。现在已经把dev分支修改代码合并到了master分支,但是现在是在本
2021-11-23 19:06:13
4374
原创 idea-代码智能提示
打开智能提示功能步骤打开智能提示功能并且打开首字母大小写敏感因为如果大小写不敏感,就会提示很多不匹配的结果,提示项太多了,还要找半天。main方法步骤输入psvm,会智能提示psvm是public void static main的首字母。然后选择对应的提示项,按回车即可打印日志步骤输入so,会智能提示so是system.out的首字母。选择对应的提示项,按回车即可for循环步骤输入fori,会智能提示选择对应的智能提示,然后按回车即可i
2021-11-23 03:25:38
30627
1
原创 git-回滚到某次提交reset current branch to here
背景情形1:提交了多次错误的提交,想回滚到之前的某次提交。情形2:合并了错误的分支,想回滚到合并之前。解决方法基于git reset current branch to here。直接在idea上面操作即可。回滚(git reset current branch to here)现在来模拟,比如提交了四次,现在想回滚到第一次提交,去掉后面三次的提交,选择某次提交,右键选择hard,回滚到某次提交。现在本地已经完成,后面三次提交记录也被删除,看不到了。强制push(force pu
2021-08-23 19:52:32
23113
1
原创 dubbo消费者新增了一个字段,上线的时候兼容吗?
背景和结论上线的时候,不同项目组开发进度不一样,但是服务有依赖,消费者可能先上线,消费者的入参对象添加了一个字段,但是提供者没有上线,所以没有添加该字段。会不会有问题?结论是没有。测试过程见截图。消费者多了一个字段提供者少了一个字段消费者调用之后,返回数据官方文档看官方文档,提供者少了字段,有兼容问题,实际测试并没有兼容问题。...
2021-08-23 19:24:03
1197
原创 dubbo timeout 优先级以及最佳实践
理论一般,接口都有设置超时时间,不管是http接口,还是dubbo接口。为什么要设置超时时间?因为不设置的时候,一旦高并发,就会把系统搞挂。具体就是可能部分交易请求很慢,耗时很久,但是没有设置超时,然后就一直占着dubbo线程池的线程资源,这个时候,就会因为部分慢交易,影响和导致了整个系统,因为其他本来正常的交易,现在由于dubbo线程池满了,也处理不了了,这个时候,系统就崩溃了,所有的交易都耗时很慢。dubbo超时的维度有2个维度,一个是作用域粒度,一个是消费者还是生产者。粒度有3个1、所
2021-08-22 17:28:42
629
原创 jedis源码分析-写数据
调用栈sendCommand:100, Protocol (redis.clients.jedis) //发送命令到redis服务器sendCommand:85, Protocol (redis.clients.jedis)sendCommand:115, Connection (redis.clients.jedis)set:133, BinaryClient (redis.clients.jedis)set:58, Client (redis.clients.jedis)set:153,
2020-12-20 14:14:10
381
1
原创 dbcp源码分析-获取连接对象
入口-BasicDataSource/** * Create (if necessary) and return a connection to the database. * * @throws SQLException if a database access error occurs * @return a database connection */public Connection getConnection() throws SQLException { return cr
2020-11-28 21:05:11
497
原创 数据库连接池监控
连接池数量到底该配置成多少?加了数据库连接池监控之后,就可以验证连接池数量是否配置的太大,因为之前都是乱配的,配了好几百,后面发现实际的活跃连接数量只有几个,所以配置数量一般只要几十个就可以了,因为1.并发请求没有那么高,可能就是个位数,高的时候是十位数,所以几十个就足够了。2.如果不考虑并发数量,也只需要配置几十个,就是cpu的数量*2,20来个就可以了。所以最终的结果是,如果没有并发,配置cpu数量*2就可以了,20个就足够了。如果有一点并发(几十个),就30到50个就够了。如果并发达到50
2020-11-20 11:35:48
1564
原创 maven-两大依赖原则
两大依赖原则-深度原则和顺序原则1、深度不同最终使用的是最浅的,或者说路径最短的。2、深度相同按声明顺序,位置在最前面的优先级最高。两大依赖原则对间接依赖也生效。为什么有依赖原则,打包的时候还是会出现多个版本jar?因为有可能jar的组的名字不一样,比如有的公司把jar组名字改为公司名字,如果组名字不一样,就算是不同的jar,所以导致会出现多个版本的jar,但是实际上是不同的jar。依赖管理标签会影响浅路径原则和申明顺序原则,导致原则失效。即dependencyManagement的
2020-10-28 15:04:57
553
原创 集中日志系统ELK
作用以前都是登陆到每个机器去看日志,特别是一个服务有多个机器集群部署,还要下载多个机器的日志(运维下载日志,然后给开发排查问题),现在elk是集中式日志系统,所有的项目和项目集群都在一个日志系统里,而且可以搜索。界面组成L是收集日志,还有解析日志E是搜索引擎,就是ElasticSearchK就是界面流程原始日志(L的客户端)——收集和解析日志(L的服务器端)——搜索引擎(E)——界面展示(K)解释1.收集日志和解析日志收集日志就是客户端到服务器,就是把L客户端安装到部署项目的机器,
2020-10-03 12:19:40
303
原创 maven-使用国内仓库
背景国外仓库速度极其慢。使用国内仓库,快的飞起。用了就回不去了。setting.xml文件阿里仓库<?xml version="1.0" encoding="UTF-8"?><!--Licensed to the Apache Software Foundation (ASF) under oneor more contributor license agreements. See the NOTICE filedistributed with this work f
2020-10-01 21:45:45
1627
原创 一种基于dubbo的分布式服务全链路追踪的解决方案
背景目前,微服务和分布式服务架构在互联网公司被普遍应用,在国内阿里dubbo用的比较多,但是,dubbo只是一个rpc框架,缺乏全链路追踪组件,并不像springcloud是一个生态,包含了各种分布式组件。我们公司也是用dubbo,分布式服务虽然解决了水平扩展的问题,但是却又带来了其他新的问题,比如链路追踪这一块,如果是单体应用,所有的日志都在一个项目,现在是服务集群,各个服务之间的调用关系是错综复杂的,同一个服务具体是走的哪一个机器,是根据负载均衡算法路由的,所以不好查日志。哪怕是用了elk中心化日志
2020-09-27 03:42:37
904
原创 dbcp监控
背景实现数据库连接池的监控功能,比如活跃连接数量/总数量,超过阈值就告警。实现重写dbcp数据源,主要是重写获取连接的方法,从而实现监控功能。步骤1.获取数据源对象重写dbcp数据源,主要是重写获取连接的方法,然后获取数据源对象,打印连接池的监控数据,并且计算获取数据库连接的耗时。2.配置数据源配置数据源的时候,使用自己重写的数据源类。代码获取数据源对象/** * 重写dbcp数据源,主要是重写获取连接的方法,从而实现监控功能 * * @author gzh * @creat
2020-09-23 20:28:09
1178
原创 java-对象引用和对象本身
示意图应用场景1.赋值只有用新的对象本身直接赋值给对应引用,该对象引用的值会改变,因为对象引用指向的对象本身改变了。2.方法入参调用方法和被调用方法。代码import com.alibaba.fastjson.JSONObject;import java.util.ArrayList;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * @author gzh *
2020-09-07 21:53:43
917
原创 tomcat-SEVERE: Error listenerStart和SEVERE: Context [/******] startup failed due
问题启动tomcat报错org.apache.catalina.core.StandardContext startInternal SEVERE: Error listenerStart //报错org.apache.catalina.core.StandardContext startInternal SEVERE: Context [/******] startup failed due to previous errors //报错启动成功报错 //实际上,在这之前,就已经失败了
2020-08-28 17:28:26
179
原创 idea-部署tomcat
步骤1.添加tomcat2.关联项目和tomcat3.启动tomcat,部署项目,启动部署成功先添加tomcat最好给每个项目单独添加一个tomcat,这样就不用每次修改部署项目添加完成部署项目菜单run关联项目和刚才添加的tomcat关联完成每个项目和单独的tomcat关联,部署的时候直接部署即可,不需要每次修改部署项目...
2020-08-27 22:04:23
175
原创 支付-微信h5
背景h5支付分两种1.浏览器2.app浏览器里的h5,最终也会跳转到app。而app里的h5,本质是公众号。在微信里叫公众号,支付宝叫服务窗。这里主要讲微信h5。核心原理最终目标是下单,所以先倒着看,直接看最后一步需要什么入参,然后倒推。1.下单需要用户id //核心就是获取用户id,前面的获取授权码只是为了安全的获取用户id2.如何获取用户id?需要先授权所以流程是1.授权获取授权码 //不同的app,名字不同,微信叫code,其实目的就是获取授权码2.用户id根据公
2020-08-27 19:41:48
260
原创 Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current
问题具体的场景是,cat监控到查询报错。报错信息Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current operation字面意思是,客户端取消数据库连接,于是报错。这个报错分两个部分:1.数据库服务器ORA-01013: user requested cancel of current operation //这个是数据库服务器返回的错误2.客户端Cause: java.sql.S
2020-08-26 20:53:53
7429
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人