本文整理构建Maven项目和模块的最佳实践的关键事项,其中包含依赖、版本、属性、模块划分等关键因素,推荐使用 Maven 3.6.3 及以上版本。 为了便于理解,我们假设有一个 API 网关项目,这个网关项目包含服务端、客户端、通知服务端支持插件。 目标 通过多模块方式组织项目 管理项目版本、依赖,属性 规划模块依赖关系 主项目 POM 每个项目都应该在项目根目录下有一个主 POM 文件,并通过主 POM 文件管理下级子模块。在主 POM 中至少会使用一下标签 properties: 定义字符集编码、JDK 版本、插件版本; modules: 下级子模块; pluginRepositories: 插件仓库地址(非必须,主要解决国内访问慢的问题); repositories: 定义 Maven 私服地址; distributionManagement: 定义发布用 Maven 私服地址 pluginManagement: 定义管理类插件版本 profiles: (非必须) 例如: <?xml version="1.0" encoding="UTF-8"?> <build xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.coolbeevip.apigateway</groupId> <artifactId>apigateway-parent</artifactId> <version>${revision}</version> <packaging>pom</packaging> <properties> <!-- 使用 revision 管理项目版本 --> <revision>1.0.0-SNAPSHOT</revision> <!-- project --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncodi ng>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <!-- plugins version --> <maven-compiler-plugin.
Read more压缩合并 Commits,将多个 commit 整理合并的方法,这样可以使提交记录更加清晰 查看提交记录,选择你要合并的范围 git log commit 6d757f70af289b5a90d00bd5e4b93d892d64a258 (HEAD -> SCB-1669) Author: Lei Zhang <zhanglei@apache.org> Date: Thu Dec 19 13:53:26 2019 +0800 SCB-1669 Fixed reverse compensation sort bug in FSM commit 37e0c5d99d0e6dae188cbd78f543ba69433b928f (origin/SCB-1669) Author: Lei Zhang <zhanglei@apache.org> Date: Thu Dec 19 02:00:20 2019 +0800 SCB-1669 Fixed Reverse compensation sort bug in FSM commit b4ea8717a86d1eba1956d21727d05c466ff6d8a2 (upstream/master, origin/master, origin/HEAD, master) Author: Lei Zhang <zhanglei@apache.org> Date: Tue Dec 10 16:25:48 2019 +0800 SCB-1658 Improve encapsulation on txEntityMap of SagaData 可以看到最后两次提交,都是为了修复 SCB-1669 这个问题,此时我想合并最后两次提交 6d757f70af289b5a90d00bd5e4b93d892d64a258 和 37e0c5d99d0e6dae188cbd78f543ba69433b928f
Read more你在当前分支上开发代码,此时不想 commit,但是又想切换到其他分支完成其他的工作,此时可以用 stash 在当前分支执行 stash 将当前分支未提交的代码隐藏起来 $ git stash Saved working directory and index state WIP on SCB-1577: 2554be3d SCB-1593 Add notice for Boringssl support ciphers (base) bogon:servicecomb-pack zhanglei$ 此时你可以看到已经存储到一个id为 2554be3d 里了,这时你可以用 git status 查看已经没有要提交的内容了 git status On branch SCB-1577 nothing to commit, working tree clean (base) bogon:servicecomb-pack zhanglei$ 这时你就可以切换到其他分支开始新的工作 (base) bogon:servicecomb-pack zhanglei$ git checkout master Switched to branch 'master' Your branch is up to date with 'origin/master'. 返回原来的分支继续工作 git checkout SCB-1577 Switched to branch 'SCB-1577' 查看以前隐藏的修改内容 git stash list stash@{0}: WIP on SCB-1577: 2554be3d SCB-1593 Add notice for Boringssl support ciphers (base) bogon:servicecomb-pack zhanglei$ 恢复隐藏内容继续工作,使用 git stash apply {id} (base) bogon:servicecomb-pack zhanglei$ git stash apply stash@{0} On branch SCB-1577 Changes not staged for commit: (use "git add <file>.
Read more当你 fork 一个仓库后,可以时用此方法使你 fork 后的仓库 master 分支保持和上游 master 分支的同步 使用 rebase 命令同步上游 master 分支到你本地的 master 分支,并推送到你 fork 后的仓库 git fetch upstream git checkout master git rebase upstream/master git push -f origin master 或者你确定放弃你本地所有的修改,则可以简单的重置为上游版本 git fetch upstream git checkout master git reset --hard upstream/master git push -f origin master 如果你也想同步 master 分支的修改到你的功能分支 git checkout <分支名> git rebase master git push -f origin <分支名>
Linux 网络相关命令 可以使用 yum install iperf3 安装这个工具,或者从网站 https://iperf.fr/iperf-download.php 下载 测试 TCP 吞吐量 假设我们要测试 10.1.207.180 和 10.1.207.181 两个服务器之间的带宽 先在其中一台服务器 10.1.207.181 服上启动 iperf3 服务 [root@oss-irms-181 ~]# iperf3 -s -p 5001 ----------------------------------------------------------- Server listening on 5001 ----------------------------------------------------------- 再在另一台机器 10.1.207.180 启动客户端连接服务端 10.1.207.181 测试 [root@oss-irms-180 ~]# iperf3 -c 10.1.207.181 -P 4 -t 30 -i 2 -p 5001 Connecting to host 10.1.207.181, port 5001 [ 4] local 10.1.207.180 port 49244 connected to 10.1.207.181 port 5001 [ 6] local 10.
Read moreGit 分支非常有用,您可以根据需要创建一个新分支,合并一个分支或删除一个分支。 您可以使用许多 git 命令来管理 git 中的分支。 当您使用 git checkout 分支时,HEAD会指出最后的提交。 简单来说,您可以说 Git HEAD 是当前分支。 每当您签出一个分支或创建一个新分支时,Git HEAD 都会转移它。 HEAD 是对当前检出分支中最后一次提交的引用。 在存储库中,HEAD 始终指向当前分支的起点。 换句话说,HEAD 是指向下一个提交的父对象或下一个提交将发生的地方的指针。 更具体地说,HEAD 是一个移动指针,它可以引用或可以不引用当前分支,但是它始终引用当前提交。 什么是 HEAD^ 插入符(^)是 Commit 的父级。 什么是 HEAD~ 代字号(〜)是一行几个字符(^)的简写字符。 HEAD〜2 与 HEAD ^^ 的作用相同。 如果写数字,则使用的默认值为1,因此 HEAD〜 等价于 HEAD ^。 如何检查HEAD的状态 您可以使用以下命令查看当前 Git HEAD 指向的位置: $ cat .git/HEAD ref: refs/heads/master 并且,你可以使用以下命令查看指向 HEAD 的 commit 的 Hash ID: $ git rev-parse --short HEAD 6f975a5 Detached HEAD HEAD 是您目前的工作分支。 当您尝试 git checkout 分支时,HEAD 指向该分支的顶部,这样您就可以继续工作而没有任何困难。
Read more撤销上一次提交 $ git revert HEAD 撤销上两次提交 ISSUE-4 解决网关服务日志中无法正确显示经过代理访问的请求端 IP 问题 $ git revert [倒数第一个提交] [倒数第二个提交]
Heap Memory -XX:MetaspaceSize Metaspace 空间初始大小,如果不设置的话,默认是20.79M。这个初始大小是触发首次 Metaspace Full GC 的阈值,例如 -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize Metaspace 最大值,默认不限制大小,但是线上环境建议设置,例如 -XX:MaxMetaspaceSize=512M GC -Xnoclassgc 表示关闭JVM对类的垃圾回收,缺省情况下,当一个类没有任何活动实例时,JVM 就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销 -XX:+UseParNewGC 设置年轻代为并行收集 -XX:MaxTenuringThreshold 控制新生代需要经历多少次GC晋升到老年代中的最大阈值,默认值 15 -XX:+CMSParallelRemarkEnabled CMS收集算法步骤如下:初始标记 -> 并发标记 -> 重新标记 -> 标记清除。 其中 初始标记和重新标记都需要STW,即暂停用户线程。 CMSParallelRemarkEnabled参数可以让重新标记阶段进行并行重新标记,减少暂停时间 -XX:SurvivorRatio 设置 Eden、S0、S1 分配比例,默认值是 8 -XX:SurvivorRatio=5 表示 Eden 占 50%,S0、S1 平分剩余空间 -XX:+UseCompressedOops In short, don’t turn it on, use a version which has it on by default. https://stackoverflow.com/questions/11054548/what-does-the-usecompressedoops-jvm-flag-do-and-when-should-i-use-it -XX:+DisableExplicitGC 禁止 System.gc() 触发 GC 操作,当没有开启 DisableExplicitGC 这个参数时,你会发现JVM每个小时会执行一次Full GC,这是因为JVM在做分布式GC,为RMI服务的, 可以通过 sun.
Read moreLinux 磁盘相关命令 磁盘IO dd [root@localhost ~]# dd if=/dev/zero of=./a.dat bs=8K count=1M conv=fdatasync 记录了8192+0 的读入 记录了8192+0 的写出 8589934592字节(8.6 GB)已复制,14.8606 秒,578 MB/秒 [root@localhost ~]# dd if=./a.dat of=/dev/null bs=1M count=8k iflag=direct 记录了8192+0 的读入 记录了8192+0 的写出 8589934592字节(8.6 GB)已复制,14.2462 秒,603 MB/秒 磁盘空间 df 查看磁盘各个分区的空间大小、占用、可用等信息 $ df -h Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5 466Gi 10Gi 128Gi 8% 488463 4881964417 0% / devfs 192Ki 192Ki 0Bi 100% 663 0 100% /dev /dev/disk1s1 466Gi 318Gi 128Gi 72% 4557528 4877895352 0% /System/Volumes/Data /dev/disk1s4 466Gi 8.
Read more常用 Git 命令 Init 在已有目录中初始化 GIT 仓库 $ git init $ git remote add origin <仓库地址> $ git add . $ git commit -m "Initial commit" $ git push -u origin master Branch 创建分支 git checkout -b <分支名> 推送分支 git push origin <分支名> 修改分支名 git branch -m <旧分支名> <新分支名> 删除本地分支 git branch -D <分支名> 删除远程分支 git push origin --delete <分支名> 拉取远程分支 git fetch origin <分支名> 拉取远程分支并切换 git checkout -b <分支名> origin/<分支名> 当前分支会退到指定版本
Read more