英文原文:How to Read Code

“我讨厌阅读别人的代码”是所有经验层级上的软件开发人员之间普遍存在的问题。然而,这又是一个必要的技能,特别是对于开发人员进入到现有的代码库中的时候,如果你以正确的角度和正确的工具来处理它,这可能是一个愉快和有启发性的体验。

作为读者,你看到的所有产品都是成品,除非你做一点挖掘,否则你唯一得到的就是屏幕上的其他单词。

1. 善用 git 命令

假设你使用 Git ,但是如果你使用 SVN ,那么这个想法也是同样适用的。

使用** git log 查看整个代码仓库的提交历史记录**。此命令将打印提交消息,因此,如果要执行类似搜索提交消息中引用 someFunction 的提交,请勿忘记使用 grep 命令:git log | grep someFunction -C 3(-C 3将显示匹配到的上下文三行内容)。

git log 还可以显示具有 -p 标志的单个文件的历史记录:git log -p index.js。 注意最近一直在修改代码的人,这样你就能知道在出现问题时找谁咨询了。

如果你的项目托管在 GitHub 或类似的网站上,你可以通过阅读问题、pull 请求和代码复审来获得大量的信息。格外留意产生最大讨论的问题。这些可能是你最终会遇到的痛点,你会提前知道如何处理它们。

2. 阅读规范

规范是新的注释。 阅读单元规范,以确定什么功能和模块是被支持的以及哪些边界情况要被处理。 阅读集成规范,以了解用户如何与应用程序进行交互,以及应用程序支持哪些工作流程。

3. 查看使用的插件

查看项目使用到的插件,然后根据这些插件可以找到使用的地方,一般通过插件的用途也可以知道项目使用这个的作用了,也可以用作以后实现相同功能的方法参考。

4.查看 Main 文档

这可能看起来是很明显,但请确保您知道代码开始执行的位置以及如何设置。查看这里包含的文件,正在实例化的类和正在设置的配置选项。

你可能会在代码库的其余部分看到它们。这里的一些模块可能非常通用,并与其他代码分离。它们代表更小,更易消化的功能,您应该在尝试解决大型应用之前熟悉这些功能。

尝试在某些其他源代码中查找对这些模块的引用,以感受一下这些模块是如何被使用的。这可以帮助您了解如何适应整个应用程序。

1.场景

磁盘IO操作、网络IO操作、JDBC操作等都是非常耗时的,往往我们也需要在这些地方来写日志记录。对于频繁和大量的日志记录,采用异步方式的话可以将这些日志记录耗时的操作从主线程当中分离出去来实现性能的提升,当然是在线程间同步开销小于耗时操作时使用异步方式才真正有效 !

2.原理

AsyncAppender 并不处理日志,只是将日志缓冲(logging Event)到一个Buffer(如:BlockingQueue)里面去,并在内部创建一个工作线程(worker)从队列头部获取日志,之后将获取的日志循环记录到附加的其他appender上去,从而达到不阻塞主线程的效果。因此AsynAppender仅仅充当事件转发器,必须引用另一个appender来做事。

3.实现

logback的异步日志设置

<appender name="FILE" class= "ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
         <fileNamePattern>/crm/test.%d{yyyy-MM-dd}.log</fileNamePattern>
         <!-- 如果按天来回滚,则最大保存时间为1天,1天之前的都将被清理掉 -->
         <maxHistory>30</maxHistory>
    <!-- 日志输出格式 -->
    <layout class="ch.qos.logback.classic.PatternLayout">
         <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
    </layout>
</appender>
<!-- 异步输出 -->
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
    <discardingThreshold >0</discardingThreshold>
    <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
    <queueSize>512</queueSize>
    <!-- 添加附加的appender,最多只能添加一个 -->
 <appender-ref ref ="FILE"/>
</appender>

<root level ="trace">
    <appender-ref ref ="ASYNC"/>
</root>

log4j的异步日志设置

<appender name="DRFOUT" class="org.apache.log4j.DailyRollingFileAppender">
 <param name="File" value="logs/brws.log" />
 <param name="Append" value="true" />
 <param name="DatePattern" value="yyyy_MM_dd'.'" />
 <layout class="org.apache.log4j.PatternLayout">
     <param name="ConversionPattern" value="%d [%t] %-5p %l %x - %m%n" />
 </layout>
</appender>

<appender name="ASYNCOUT" class="org.apache.log4j.AsyncAppender">
 <param name="BufferSize" value="512" />
<appender-ref ref="DRFOUT" />
</appender>

4.总结

除了设置异步的方式外,通过遵守 java日志记录规范 、设置缓存、对上线的项目设置其日志记录级别为Error、Warn、使用slf4j等也可以提高日志的读写效率。

5.参考资料

  1. log4j日志输出性能优化-缓存、异步

转自-linux SSH互信配置

ssh命令的跳转其它机器的时候通常需要输入机器的密码,而互信的机器就不再需要输入密码了。

1.环境

node1: 192.168.3.20 node2: 192.168.3.21

用到的命令
  • ssh-keygen:创建公钥和密钥,会生成id_rsa和id_rsa.pub两个文件

  • ssh-copy-id:把本地的公钥复制到远程主机的authorized_keys文件(不会覆盖文件,是追加到文件末尾),并且会设置远程主机用户目录的.ssh和.ssh/authorized_keys权限,默认权限为:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

2.实现步骤

1.在两台机器上生成认证文件,就是ssh互信的认证文件,需要放在用户的home目录中,所以我们需要先创建这个目录,且保证这个目录的权限是755,然后在home目录下创建 .ssh ,操作如下:

[root@192.168.3.20 ]# mkdir ~/.ssh
[root@192.168.3.20 ]# chmod 755 ~/.ssh
[root@192.168.3.20 ]# cd ~/.ssh
[root@192.168.3.20 ]# /usr/bin/ssh-keygen -t rsa

[root@192.168.3.21 ]# mkdir ~/.ssh
[root@192.168.3.21 ]# chmod 755 ~/.ssh
[root@192.168.3.21 ]# cd ~/.ssh
[root@192.168.3.21 ]# /usr/bin/ssh-keygen -t rsa

2.通过命令 ssh-copy-id 将每个主机上的公共密钥文件id_rsa.pub的内容复制到其他每一个主机的~/.ssh/authorized_keys文件中。注意,当您第一次使用ssh访问远程主机时,其RSA密钥是未知的,所以提示确认一下,确认完毕后SSH将纪录远程主机的RSA密钥,以后连接该主机将不再做出相应的提示。

[root@192.168.3.20]#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.3.21
[root@192.168.3.21]#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.3.20

注:如果不是默认的端口,可以这样写

ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 2022 root@192.168.3.21"

注:如果不想安装 ssh-copy-id 命令的方式来实现,可以按照以下步骤操作

[root@192.168.3.20]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[root@192.168.3.20]# ssh root@192.168.3.21 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

然后,在192.168.3.20上存了一份完整的key认证文件,我们只需要把这个目录拷贝到192.168.3.21这台机器的对应目录里去就可以了,别忘了把authorized_keys 的权限设置成600

[root@192.168.3.20]# scp ~/.ssh/authorized_keys root@192.168.3.21:~/.ssh/authorized_keys
[root@192.168.3.20]# chmod 600 ~/.ssh/authorized_keys

3.到此为止,互信配置完毕,检测一下是否成功

[root@192.168.3.20]#ssh root@192.168.3.21

3.说明:

  • 上面是以root用户配置互信,如果想要其它用户,可以切到相应的用户下执行命令即可

  • 如果单纯的只需要单向信任,在一台机器上执行命令就可以了,比如说node1连接node2,不用密码的话,在node1上执行命令就可以了

  • 3.也可以把ip地址和主机名对应关系加到 /etc/hosts里 这样直接 ssh 主机名 就可以了(例如: 192.168.3.21 node2 加到hosts里)