diff --git "a/javadoc2019/k8s/Docker Compose \345\221\275\344\273\244\350\257\264\346\230\216.md" "b/javadoc2019/k8s/Docker Compose \345\221\275\344\273\244\350\257\264\346\230\216.md" index 650d65b..af87992 100644 --- "a/javadoc2019/k8s/Docker Compose \345\221\275\344\273\244\350\257\264\346\230\216.md" +++ "b/javadoc2019/k8s/Docker Compose \345\221\275\344\273\244\350\257\264\346\230\216.md" @@ -12,7 +12,7 @@ docker-compose [-f=...] [options] [COMMAND] [ARGS...] ``` -1 + ## 命令选项 @@ -71,7 +71,7 @@ docker-compose [-f=...] [options] [COMMAND] [ARGS...] $ docker-compose kill -s SIGINT ``` -1 + ## `logs` diff --git "a/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428210810978.png" "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428210810978.png" new file mode 100644 index 0000000..d758f0b Binary files /dev/null and "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428210810978.png" differ diff --git "a/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428210813332.png" "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428210813332.png" new file mode 100644 index 0000000..d758f0b Binary files /dev/null and "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428210813332.png" differ diff --git "a/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428211719819.png" "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428211719819.png" new file mode 100644 index 0000000..721d5c6 Binary files /dev/null and "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.assets/image-20200428211719819.png" differ diff --git "a/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.md" "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.md" new file mode 100644 index 0000000..aeda4ff --- /dev/null +++ "b/javadoc2019/k8s/jenkins\346\226\260\345\242\236\347\224\250\346\210\267.md" @@ -0,0 +1,42 @@ +http://39.100.254.140:12012/ + +admin/adminloit + + + +![image-20200428211719819](F:\3GitHub\learnDoc\javadoc2019\k8s\jenkins新增用户.assets\image-20200428211719819.png) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/javadoc2019/k8s/k8s\344\271\213helm\345\256\211\350\243\205.md" "b/javadoc2019/k8s/k8s\344\271\213helm\345\256\211\350\243\205.md" index 3cfe137..1d93a63 100644 --- "a/javadoc2019/k8s/k8s\344\271\213helm\345\256\211\350\243\205.md" +++ "b/javadoc2019/k8s/k8s\344\271\213helm\345\256\211\350\243\205.md" @@ -1,6 +1,4 @@ - - ``` wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz tar -zxvf helm-v2.13.1-linux-amd64.tar.gz diff --git "a/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202442054.png" "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202442054.png" new file mode 100644 index 0000000..1039597 Binary files /dev/null and "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202442054.png" differ diff --git "a/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202506959.png" "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202506959.png" new file mode 100644 index 0000000..b5f8f37 Binary files /dev/null and "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202506959.png" differ diff --git "a/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202645619.png" "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202645619.png" new file mode 100644 index 0000000..5ea5ac7 Binary files /dev/null and "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.assets/image-20200428202645619.png" differ diff --git "a/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.md" "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.md" new file mode 100644 index 0000000..fbd8a34 --- /dev/null +++ "b/javadoc2019/k8s/nexus\344\270\212\344\274\240jar.md" @@ -0,0 +1,30 @@ +http://39.100.254.140:12010/ + +* admin/loit9527 + + + +# 上传 + +![image-20200428202442054](F:\3GitHub\learnDoc\javadoc2019\k8s\nexus上传jar.assets\image-20200428202442054.png) + + + +![image-20200428202506959](F:\3GitHub\learnDoc\javadoc2019\k8s\nexus上传jar.assets\image-20200428202506959.png) + + + +![image-20200428202645619](F:\3GitHub\learnDoc\javadoc2019\k8s\nexus上传jar.assets\image-20200428202645619.png) + + + +上传成功 + +``` + + com.aliyun + aliyun-sdk-vod-upload + 2.0.0 + +``` + diff --git "a/javadoc2019/k8s/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241\345\257\271\346\257\224 - \345\211\257\346\234\254.md" "b/javadoc2019/k8s/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241\345\257\271\346\257\224 - \345\211\257\346\234\254.md" new file mode 100644 index 0000000..a82d042 --- /dev/null +++ "b/javadoc2019/k8s/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241\345\257\271\346\257\224 - \345\211\257\346\234\254.md" @@ -0,0 +1,12 @@ +http://39.100.254.140:12010/ + +* admin/loit9527 + + + +![image-20200428202442054](F:\3GitHub\learnDoc\javadoc2019\k8s\nexus上传jar.assets\image-20200428202442054.png) + + + +![image-20200428202506959](F:\3GitHub\learnDoc\javadoc2019\k8s\nexus上传jar.assets\image-20200428202506959.png) + diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/Centos8.md" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/Centos8.md" new file mode 100644 index 0000000..b6bec9b --- /dev/null +++ "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/Centos8.md" @@ -0,0 +1,18 @@ +# centos 8 + + + +cat /etc/os-release + +\# systemctl is-active NetworkManager +\# systemctl is-enabled NetworkManager +\# systemctl status NetworkManager + +\# systemctl start NetworkManager + +\# systemctl stop NetworkManager + + + + + diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230358492.png" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230358492.png" new file mode 100644 index 0000000..705a09c Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230358492.png" differ diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230447025.png" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230447025.png" new file mode 100644 index 0000000..e893157 Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230447025.png" differ diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230510873.png" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230510873.png" new file mode 100644 index 0000000..9dd8715 Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418230510873.png" differ diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418235106003.png" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418235106003.png" new file mode 100644 index 0000000..4d1dc6b Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418235106003.png" differ diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418235121944.png" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418235121944.png" new file mode 100644 index 0000000..e5b300a Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\344\275\277\347\224\250-v1.assets/image-20200418235121944.png" differ diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\345\274\200\345\217\221\347\211\210\346\234\254\347\256\241\347\220\206\350\247\204\350\214\203V1.0.md" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\345\274\200\345\217\221\347\211\210\346\234\254\347\256\241\347\220\206\350\247\204\350\214\203V1.0.md" new file mode 100644 index 0000000..6b49b00 --- /dev/null +++ "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/Git\345\274\200\345\217\221\347\211\210\346\234\254\347\256\241\347\220\206\350\247\204\350\214\203V1.0.md" @@ -0,0 +1,94 @@ +## Git开发版本管理规范V1.0 + +#### Git版本开发主要事项 + +- Tag 项目版本归档,与版本编号一一对应 +- master ————> 归档 +- release ————> 发布上线 +- dev ————> 开发&test +- Bugfix(更新是否使用) + +> 主要关注dev分支,研发多个人,可以创建多个分支,最终发布测试,合并dev,进行测试发布,【预发布,合并到release,进行版本发布】,正式上线后,release合并到master,打标签tag进行归档 + +###### 各分支使用办法说明如下: + +master分支 + +master和develop分支都是主分支,主分支是所有开发活动的核心分支。所有的开发活动产生的输出物最终都会反映到主分支的代码中。 + +master分支上存放的应该是随时可供在生产环境中部署的代码(Production Ready state)。当开发活动告一段落,产生了一份新的可供部署的代码时,master分支上的代码会被更新。同时,每一次更新,都有对应的版本号标签(TAG)。 + +develop分支 + +develop分支是保存当前最新开发成果的分支。通常这个分支上的代码也是可进行每日夜间发布的代码(Nightly build)。因此这个分支有时也可以被称作“integration branch”。 + +当develop分支上的代码已实现了软件需求说明书中所有的功能,通过了所有的测试后,并且代码已经足够稳定时,就可以将所有的开发成果合并回master分支了。对于master分支上的新提交的代码建议都打上一个新的版本号标签(TAG),供后续代码跟踪使用。 + +release分支 + +使用规范: + +1.可以从develop分支派生 + +2.必须合并回develop分支和master分支 + +3.分支命名惯例:release-* + +release分支是为发布新的产品版本而设计的。在这个分支上的代码允许做小的缺陷修正、准备发布版本所需的各项说明信息(版本号、发布时间、编译时间等等)。通过在release分支上进行这些工作可以让develop分支空闲出来以接受新的feature分支上的代码提交,进入新的软件开发迭代周期。 + +当develop分支上的代码已经包含了所有即将发布的版本中所计划包含的软件功能,并且已通过所有测试时,我们就可以考虑准备创建release分支了。而所有在当前即将发布的版本之外的业务需求一定要确保不能混到release分支之内(避免由此引入一些不可控的系统缺陷)。 + +成功的派生了release分支,并被赋予版本号之后,develop分支就可以为“下一个版本”服务了。所谓的“下一个版本”是在当前即将发布的版本之后发布的版本。版本号的命名可以依据项目定义的版本号命名规则进行。 + +hotfix分支 + +使用规范: + +1.可以从master分支派生 + +2.必须合并回master分支和develop分支 + +3.分支命名惯例:fix-* + +除了是计划外创建的以外,hotfix分支与release分支十分相似:都可以产生一个新的可供在生产环境部署的软件版本。当生产环境中的软件遇到了异常情况或者发现了严重到必须立即修复的软件缺陷的时候,就需要从master分支上指定的TAG版本派生hotfix分支来组织代码的紧急修复工作。 + +### 整体交付流程如下: + +![img](http://doc.bigaka.com/Public/Uploads/2018-05-28/5b0bec9d0d9d3.png) + +#### dev(开发分支) + +*开发分支是研发同学最需要关心的,所有的开发工作应该围绕dev分支进行展开,创建dev分支脚本如下:* + +dev分支在实际工作中主要有两种常用场景: + +1. 单个版本开发 +2. 多个版本并行开发 + +第一种情况,属于比较常见的情况,即开发过程中都是按顺序进行的,即1.0.0开发完成之后才会进行开发1.1.0的需求开发,1.1.0完成上线后再进行1.2.0的版本开发,针对这种,工作直接在dev分支上开展就可以了,不需要做特殊处理,因为不会产生任何干扰~~ + +相关操作脚本: + +``` +#切换到dev分支下进行开发git checkout dev#同步最新的代码git pull#。。。。。开发代码,各种commit,push,这里就不列了#。。。。。#开发完测试通过后合并到主干,先把本地的dev代码更新到最新,接着执行下面脚本git checkout mastergit pullgit merge --no-ff devgit push +``` + +针对第二种情况,可能在互联网公司会比较常见,在开发资源比较充足的情况下,多个版本可能同时并行,即1.1.0和1.2.0或者更多版本在同时开发,但是又想快速试水一些功能,不可能等到全部做完都上线,所以1.1.0会先发,1.2.0会在另外一个时间点发,产品经理通常会很着急,认为错过这个时间点就会损失十几亿的感觉,碎碎的忧伤,所以分支的合理管理非常重要,不然在开发过程中会显得非常混乱,如果都在dev分支上进行开发就会把没做完的功能都发线上了,这时候就更碎了~~~ git 也给我们使用feature功能模式,即功能分支,可以通过这个来划分,如下: + +先创建两个feature分支,跟创建dev分支一样,不过这次是从dev分支进行创建 + +``` +git checkout -b feature-1.1 dev git checkout -b feature-1.2 dev +``` + +开发1.1.0版本操作的相关脚本: + +``` +git checkout feature-1.1#又是各种commit push操作,开发完成测试通过后执行下面操作,合并代码到dev分支:git checkout devgit pull origin devgit merge --no-ff feature-1.1git push#删除本地feature分支git branch -d feature-1.1#删除远程feature分支git push origin --delete feature-1.1 +``` + +开发1.2.0版本操作的相关脚本: + +``` +git checkout feature-1.2#又是各种commit push操作,开发完成测试通过后执行下面操作,合并代码到dev分支:git checkout devgit pull origin devgit merge --no-ff feature-1.2git push#删除本地feature分支git branch -d feature-1.2#删除远程feature分支git push origin --delete feature-1.2 +``` \ No newline at end of file diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\344\275\277\347\224\250.md" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\344\275\277\347\224\250.md" new file mode 100644 index 0000000..4b58d8d --- /dev/null +++ "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\344\275\277\347\224\250.md" @@ -0,0 +1,57 @@ + + +Dev + +Test + +master + + + +开发分支dev 开发,项目组长合并到test,测试人员在test发现问题,来个test紧急分支上修改。 + + + +Tag + + + + + +开发分支的协作开发者注意以下事项,就可减少错误: + +首先要了解Git的基本原理和基本命令,知其然就知其所以然,就能减少失误。 + +及时提交代码、更新代码,避免因为长时间不更新代码而产生过多冲突文件,在解决冲突的过程中初级人员也是非常容易出错的。 + +开发人员一定要熟悉你所使用的git工具,无论是小乌龟还是IDE里集成的git工具,避免因为对工具不熟悉造成误操作。 + +本地修改前应该尽可能的避免本地库与远程之间有过多的差异,本地修改前执行一次git pull先把远程更新拉到本地; + +\1. 推荐的操作步骤,提交前先把本地修改存入栈,然后从服务器端更新代码,这样可以避免过多的代码merge: + +\``` + +1、git stash + +2、git pull + +3、git stash pop + +4、若有冲突解决冲突 + +\``` + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\346\242\263\347\220\206temp.doc" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\346\242\263\347\220\206temp.doc" new file mode 100644 index 0000000..84d63db Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\346\242\263\347\220\206temp.doc" differ diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\346\265\201\347\250\213.ppt" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\346\265\201\347\250\213.ppt" new file mode 100644 index 0000000..0f2fd4f Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/git\346\265\201\347\250\213.ppt" differ diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/timeloit-Git\344\275\277\347\224\250\350\247\204\350\214\203v1.0.md" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/timeloit-Git\344\275\277\347\224\250\350\247\204\350\214\203v1.0.md" new file mode 100644 index 0000000..28319ab --- /dev/null +++ "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/timeloit-Git\344\275\277\347\224\250\350\247\204\350\214\203v1.0.md" @@ -0,0 +1,283 @@ +## Git开发版本管理规范V1.0 + +**Git版本开发主要事项** + +- master ————> 归档 +- release ————> 发布上线 +- dev ————> 开发 +- test ————>test +- Bugfix(更新是否使用) +- Tag 项目版本归档,与版本编号一一对应 + + +> 多个研发人员在dev分支上开发, 在test分支上进行测试,【预发布,合并到release, 进行版本发布】,正式上线后,release合并到master, 打标签tag进行归档 + + + +**各分支使用办法说明如下:** + + + +**master分支** + +master和dev分支都是主分支,主分支是所有开发活动的核心分支。所有的开发活动产生的输出物最终都会反映到主分支的代码中。 + +master分支上存放的应该是随时可供在生产环境中部署的代码(Production Ready state)。当开发活动告一段落,产生了一份新的可供部署的代码时,master分支上的代码会被更新。同时,每一次更新,都有对应的版本号标签(TAG)。 + + + +**dev分支** + +dev分支是保存当前最新开发成果的分支。通常这个分支上的代码也是可进行每日夜间发布的代码(Nightly build)。因此这个分支有时也可以被称作“integration branch”。 + +当develop分支上的代码已实现了软件需求说明书中所有的功能,通过了所有的测试后,并且代码已经足够稳定时,就可以将所有的开发成果合并回master分支了。对于master分支上的新提交的代码建议都打上一个新的版本号标签(TAG),供后续代码跟踪使用。 + + + +**test分支** + +当开发人员将代码交付测试部门时,测试人员,将代码merge到test分支中,此时触发测试分支的构建的流程,完成构建后,通过管理平台进行测试环境的发布。 + + + +**release分支** + +![image-20200418230510873](F:\3GitHub\learnDoc\javadoc2019\k8s\技术文档\git\Git使用-v1.assets\image-20200418230510873.png) + +使用规范: + + + +1.可以从dev分支派生 + +2.必须合并回dev分支和master分支 + +3.分支命名惯例:release-* + +release分支是为发布新的产品版本而设计的。在这个分支上的代码允许做小的缺陷修正、准备发布版本所需的各项说明信息(版本号、发布时间、编译时间等等)。通过在release分支上进行这些工作可以让develop分支空闲出来以接受新的feature分支上的代码提交,进入新的软件开发迭代周期。 + +当develop分支上的代码已经包含了所有即将发布的版本中所计划包含的软件功能,并且已通过所有测试时,我们就可以考虑准备创建release分支了。而所有在当前即将发布的版本之外的业务需求一定要确保不能混到release分支之内(避免由此引入一些不可控的系统缺陷)。 + +成功的派生了release分支,并被赋予版本号之后,develop分支就可以为“下一个版本”服务了。所谓的“下一个版本”是在当前即将发布的版本之后发布的版本。版本号的命名可以依据项目定义的版本号命名规则进行。 + + + +**hotfix分支** + +使用规范: + +1.可以从test分支派生 + +2.必须合并回master分支和dev分支 + +3.分支命名惯例:fix-* + +除了是计划外创建的以外,hotfix分支与release分支十分相似:都可以产生一个新的可供在生产环境部署的软件版本。当生产环境中的软件遇到了异常情况或者发现了严重到必须立即修复的软件缺陷的时候,就需要从master分支上指定的TAG版本派生hotfix分支来组织代码的紧急修复工作。 + + +**整体交付流程如下:** + +![image-20200418235106003](F:\3GitHub\learnDoc\javadoc2019\k8s\技术文档\git\Git使用-v1.assets\image-20200418235106003.png) + +根据实际项目情况选择是否需要RELEASE分支 + +![image-20200418235121944](F:\3GitHub\learnDoc\javadoc2019\k8s\技术文档\git\Git使用-v1.assets\image-20200418235121944.png) + +**dev(开发分支)** + + + +*开发分支是研发同学最需要关心的,所有的开发工作应该围绕dev分支进行展开,创建dev分支脚本如下:* + +dev分支在实际工作中主要有两种常用场景: + +1. 单个版本开发 +2. 多个版本并行开发 + +第一种情况,属于比较常见的情况,即开发过程中都是按顺序进行的,即1.0.0开发完成之后才会进行开发1.1.0的需求开发,1.1.0完成上线后再进行1.2.0的版本开发,针对这种,工作直接在dev分支上开展就可以了,不需要做特殊处理,因为不会产生任何干扰~~ + +相关操作脚本: + +``` +#切换到dev分支下进行开发 +git checkout dev +#同步最新的代码 +git pull +#。。。。。 +开发代码,各种commit,push,这里就不列了 +#。。。。。 +#开发完测试通过后合并到主干,先把本地的dev代码更新到最新,接着执行下面脚本 +git checkout master +git pull +git merge --no-ff dev +git push +``` + +针对第二种情况,可能在互联网公司会比较常见,在开发资源比较充足的情况下,多个版本可能同时并行,即1.1.0和1.2.0或者更多版本在同时开发,但是又想快速试水一些功能,不可能等到全部做完都上线,所以1.1.0会先发,1.2.0会在另外一个时间点发,产品经理通常会很着急,认为错过这个时间点就会损失十几亿的感觉,碎碎的忧伤,所以分支的合理管理非常重要,不然在开发过程中会显得非常混乱,如果都在dev分支上进行开发就会把没做完的功能都发线上了,这时候就更碎了~~~ git 也给我们使用feature功能模式,即功能分支,可以通过这个来划分,如下: + +先创建两个feature分支,跟创建dev分支一样,不过这次是从dev分支进行创建 + +``` +git checkout -b feature-1.1 dev +git checkout -b feature-1.2 dev +``` + +开发1.1.0版本操作的相关脚本: + +``` +git checkout feature-1.1 +#又是各种commit push操作,开发完成测试通过后执行下面操作,合并代码到dev分支: +git checkout dev +git pull origin dev +git merge --no-ff feature-1.1 +git push +#删除本地feature分支 +git branch -d feature-1.1 +#删除远程feature分支 +git push origin --delete feature-1.1 +``` + +开发1.2.0版本操作的相关脚本: + +``` +git checkout feature-1.2 +#又是各种commit push操作,开发完成测试通过后执行下面操作,合并代码到dev分支: +git checkout dev +git pull origin dev +git merge --no-ff feature-1.2 +git push +#删除本地feature分支 +git branch -d feature-1.2 +#删除远程feature分支 +git push origin --delete feature-1.2 +``` + + + +## Bug分支解决方案 + +软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。 + +当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支xxxx-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交。 + +并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办? + +幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作: + +``` +git stash +``` + +现在,用git status查看工作区,就是干净的(除非有没有被 Git 管理的文件),因此可以放心地创建分支来修复bug。 + +首先确定要在哪个分支上修复bug,假定需要在test分支上修复,就从test创建临时分支: + +``` +git checkout test +git checkout -b xxxx-101 +``` + +现在修复bug,然后提交: + +``` +git add readme.md +git commit -m "fix bug 101" +``` + +修复完成后,切换到test分支,并完成合并,最后删除issue-101分支: + +``` +git checkout test +git merge --no-ff -m "merged bug fix 101" xxxx-101 +``` + +太棒了,原计划两个小时的bug修复只花了5分钟!现在,是时候接着回到dev分支干活了! + +``` +git checkout devgit status +``` + +工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看: + +``` +git stash list +``` + +工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法: + +一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除; + +另一种方式是用git stash pop,恢复的同时把stash内容也删了: + +``` +git stash pop +``` + +再用git stash list查看,就看不到任何stash内容了。 + +你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令 + +``` +git stash apply stash@{0} +``` + + + +## 标签管理 + +**标签管理** + +![image-20200418230447025](F:\3GitHub\learnDoc\javadoc2019\k8s\技术文档\git\Git使用-v1.assets\image-20200418230447025.png) + + + +发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。 + +命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id。 + +git tag -a -m “blablabla…”可以指定标签信息。 + +还可以通过-s用私钥签名一个标签: + +``` +git tag -s v0.5 -m "signed version 0.2 released" fec145a +``` + +git tag可以查看所有标签。 + +用命令git show 可以查看某个标签的详细信息。 + +如果标签打错了,也可以删除: + +``` +git tag -d v0.1 +``` + +因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。 + +如果要推送某个标签到远程,使用命令git push origin : + +``` +git push origin v1.0 +``` + +或者,一次性推送全部尚未推送到远程的本地标签: + +``` +git push origin --tags +``` + +如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除: + +``` +git tag -d v0.9 +``` + +然后,从远程删除。删除命令也是push,但是格式如下: + +``` +git push origin :refs/tags/v0.9 +``` + + + diff --git "a/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/timeloit-Git\344\275\277\347\224\250\350\247\204\350\214\203v1.0.pdf" "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/timeloit-Git\344\275\277\347\224\250\350\247\204\350\214\203v1.0.pdf" new file mode 100644 index 0000000..5d67bb6 Binary files /dev/null and "b/javadoc2019/k8s/\346\212\200\346\234\257\346\226\207\346\241\243/git/timeloit-Git\344\275\277\347\224\250\350\247\204\350\214\203v1.0.pdf" differ diff --git "a/javadoc2019/k8s/\346\236\266\346\236\204/SkyWalking\345\256\211\350\243\205.docx" "b/javadoc2019/k8s/\346\236\266\346\236\204/SkyWalking\345\256\211\350\243\205.docx" new file mode 100644 index 0000000..ba051bf Binary files /dev/null and "b/javadoc2019/k8s/\346\236\266\346\236\204/SkyWalking\345\256\211\350\243\205.docx" differ diff --git "a/javadoc2019/k8s/\346\236\266\346\236\204/SkyWalking\345\256\211\350\243\205.md" "b/javadoc2019/k8s/\346\236\266\346\236\204/SkyWalking\345\256\211\350\243\205.md" new file mode 100644 index 0000000..88153a9 --- /dev/null +++ "b/javadoc2019/k8s/\346\236\266\346\236\204/SkyWalking\345\256\211\350\243\205.md" @@ -0,0 +1,168 @@ +#### 二、skywalking 搭建 + + + +##### 1、软件包版本 + +``` +1、apache-skywalking-apm-6.6.0.tar.gz + +``` + +将以上三个软件包上传至服务器/usr/local/src/路径下 + + + +##### 3、安装Skywalking服务 + +``` +cd /usr/local/src +tar -zxvf apache-skywalking-apm-6.6.0.tar.gz +mv apache-skywalking-apm-incubating skywalking +mv skywalking/ /HWStor/usr/local/ + +vim /HWStor/usr/local/skywalking/config/application.yml +修改配置如下: + +storage: +# h2: +# driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource} +# url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db} +# user: ${SW_STORAGE_H2_USER:sa} + elasticsearch: + # nameSpace: ${SW_NAMESPACE:""} + clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.251.146:9200} + indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} + indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} + # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html + bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # Execute the bulk every 2000 requests + bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # flush the bulk every 20mb + flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests + concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests + +vim /HWStor/usr/local/skywalking/webapp/webapp.yml +修改配置如下: + +server: + port: 8081 + +collector: + path: /graphql + ribbon: + ReadTimeout: 10000 + # Point to all backend's restHost:restPort, split by , + listOfServers: 192.168.251.146:12800 + +启动: +cd /HWStor/usr/local/skywalking/bin/ +sh startup.sh + +``` + +##### 4、客户端代理:agent + +``` +实际开发时候,每一个jar包获取应用都应该单独使用一个agent, +所以将agent这个目录拷贝到各自对应的jar包路径下。 + +核心部分的目录信息如下: + +├── activations +├── config +│ └── agent.config +├── logs +│ └── skywalking-api.log +├── optional-plugins +├── plugins +└── skywalking-agent.jar + +其中,config/agent.config是最重要的,需要修改的核心参数如下所示 + +# 应用名称,当前代理的应用名称,用于UI界面分类和展示 +agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} +# 收集器的地址,这个根据实际情况设置,上述`Collector`在哪台服务器启动,ip就设置为多少。 +collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.251.146:11800} + +开发11800、12800端口: +firewall-cmd --list-ports +firewall-cmd --zone=public --add-port=11800/tcp --permanent +firewall-cmd --reload + + +设置好参数后,对于 Java 应用,添加核心的-javaagent进行启动 +java -javaagent:agent/skywalking-agent.jar -jar xxx.jar + +idea里启动,添加VM启动参数,例如: +-javaagent:.../agent/skywalking-agent.jar +-Dskywalking.agent.service_name=test_etl-local +-Dskywalking.collector.backend_service=192.168.251.146:11800 + +``` + +##### 5、附:启动/关闭命令: + +``` +# 启动ES +su es +cd /usr/local/es/elasticsearch-6.3.2/bin/ +./elasticsearch -d + +# 关闭ES +netstat -ntap | grep 9200 +kill -9 pid + +# 启动kibana +su root +cd /usr/local/kibana/kibana-6.3.2-linux-x86_64/bin/ +nohup ./kibana > /dev/null 2>&1 & + +# 关闭kinana +kill -9 `cat /var/run/kibana.pid` + +# 启动skywalking +cd /usr/local/skywalking/bin/ +sh startup.sh + +# 关闭skywalking +netstat -ntap | grep 12000 +kill -9 pid +``` + + + +``` + + # 关闭 skywalking web + ps -ef|grep skywalking-webapp + + kill -9 pid + + + # 关闭 OAPServer + ps -ef|grep skywalking.oap.server.starter.OAPServerStartUp + + kill -9 pid + + + + # 启动skywalking + cd /usr/local/loit/soft/skywalking/bin/ + sh startup.sh +``` + + + +11800 -> 12001 client + +12800-> 12002 collection + +8080 > 12000 web + +``` +nohup java -javaagent:/usr/local/loit/soft/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=loit-xx -Dskywalking.collector.backend_service=39.100.254.140:12001 -Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -jar $KILL_PROCESS_NAME --spring.profiles.active=test7011 >/var/www/law-7011/loit-law.log 2>&1 & +``` + + + + + diff --git "a/javadoc2019/k8s/\346\236\266\346\236\204/\345\210\206\345\270\203\345\274\217\345\237\272\347\241\200\346\236\266\346\236\204\347\273\204\344\273\266.md" "b/javadoc2019/k8s/\346\236\266\346\236\204/\345\210\206\345\270\203\345\274\217\345\237\272\347\241\200\346\236\266\346\236\204\347\273\204\344\273\266.md" index 0295f17..57c9621 100644 --- "a/javadoc2019/k8s/\346\236\266\346\236\204/\345\210\206\345\270\203\345\274\217\345\237\272\347\241\200\346\236\266\346\236\204\347\273\204\344\273\266.md" +++ "b/javadoc2019/k8s/\346\236\266\346\236\204/\345\210\206\345\270\203\345\274\217\345\237\272\347\241\200\346\236\266\346\236\204\347\273\204\344\273\266.md" @@ -193,7 +193,6 @@ Zipkin,Pinpoint,SkyWalking,CAT * HBase 服务 相关产品 -* TIBD * Flume * Phoenix * TiDB diff --git "a/javadoc2019/k8s/\346\236\266\346\236\204/\346\263\250\345\206\214\344\270\255\345\277\203\345\222\214\351\205\215\347\275\256\344\270\255\345\277\203\345\210\207\346\215\242.md" "b/javadoc2019/k8s/\346\236\266\346\236\204/\346\263\250\345\206\214\344\270\255\345\277\203\345\222\214\351\205\215\347\275\256\344\270\255\345\277\203\345\210\207\346\215\242.md" index 33bbce1..f1cb0bb 100644 --- "a/javadoc2019/k8s/\346\236\266\346\236\204/\346\263\250\345\206\214\344\270\255\345\277\203\345\222\214\351\205\215\347\275\256\344\270\255\345\277\203\345\210\207\346\215\242.md" +++ "b/javadoc2019/k8s/\346\236\266\346\236\204/\346\263\250\345\206\214\344\270\255\345\277\203\345\222\214\351\205\215\347\275\256\344\270\255\345\277\203\345\210\207\346\215\242.md" @@ -6,8 +6,6 @@ pom 2.添加jar依赖 - - ``` 0.0.1-SNAPSHOT diff --git "a/javadoc2019/\346\226\260\351\227\273/2020-07.md" "b/javadoc2019/\346\226\260\351\227\273/2020-07.md" new file mode 100644 index 0000000..2ac9365 --- /dev/null +++ "b/javadoc2019/\346\226\260\351\227\273/2020-07.md" @@ -0,0 +1,17 @@ +## 2020-07-27 + +1、腾讯斥资百亿收购搜狗,搜狗的主要产品包括搜索引擎、浏览器和输入法、AI等产品。 +2、Docker 、 k8s(docker容器管理工具)、 GKE(Google Kubernetes Engine) 容器管理工具、anthos安托斯(多集群管理平台) +3、规模机器学习平台,GPU、FPGA、谷歌 TPU 等高级硬件 +4、大数据计算相关的框架Hadoop、Spark 、Tensorflow +5、数字城市及智慧城市的建设,三维 GIS、倾斜摄影测量、移动测量技术 +6、三维实景,来自北京大学、上海华测、Astrium、立得空间、微软亚洲研究院、天下图、华正三维影像、英伟达公司的嘉宾共同就三维实景的话题,涵盖可视化分析、空间信息获取、倾斜摄影测量、街景、三维建模等热点论题 +7、多角度拍摄的倾斜航空摄影技术,即刻形成真三维立体地图画面 +8、鲲鹏开发套件、工具链、加速库 + +## 2020-07-28 + +1、技术+管理的软件质量管理方式就该登场了。我们会引入代码扫描(SonarQube)、持续集成(Jenkins)、自动化测试(语言相关的各种测试框架)、专项测试工具(Jmeter)、资源监控&瓶颈发现(prometheus + grafana)等等 + + + diff --git "a/javadoc20200803/1\343\200\201\347\275\221\345\205\263gateway\351\231\220\346\265\201\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/javadoc20200803/1\343\200\201\347\275\221\345\205\263gateway\351\231\220\346\265\201\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 0000000..b90f29f --- /dev/null +++ "b/javadoc20200803/1\343\200\201\347\275\221\345\205\263gateway\351\231\220\346\265\201\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,612 @@ +## 一. 概述 + +**1.1介绍** + +Sentinel 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含**网关限流的规则**和**自定义 API** 的实体和管理逻辑: + +* GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 **route_id**或**自定义的 API** 分组进行限流,支持针对请求中的**参数**、**Header**、**来源 IP** 等进行定制化的限流。 +* ApiDefinition:**用户自定义的 API 定义分组**,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。 + + + + +**1.2 参数说明** + +其中网关限流规则 GatewayFlowRule 的字段解释如下: + +- resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。 +- resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。 +- grade:限流指标维度,同限流规则的 grade 字段 +- count:限流阈值 +- intervalSec:统计时间窗口,单位是秒,默认是 1 秒 +- controlBehavior:**流量整形的控制效果**,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。 +- burst:应对突发请求时额外允许的请求数目。 +- maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。 +- paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段: +- parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。 +- fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。 +- pattern 和 matchStrategy:为后续参数匹配特性预留,目前未实现。 + + + + +相关参数 + +``` +public final class SentinelGatewayConstants { + public static final int APP_TYPE_GATEWAY = 1; + public static final int RESOURCE_MODE_ROUTE_ID = 0; + public static final int RESOURCE_MODE_CUSTOM_API_NAME = 1; + public static final int PARAM_PARSE_STRATEGY_CLIENT_IP = 0; + public static final int PARAM_PARSE_STRATEGY_HOST = 1; + public static final int PARAM_PARSE_STRATEGY_HEADER = 2; + public static final int PARAM_PARSE_STRATEGY_URL_PARAM = 3; + public static final int PARAM_PARSE_STRATEGY_COOKIE = 4; + public static final int URL_MATCH_STRATEGY_EXACT = 0; + public static final int URL_MATCH_STRATEGY_PREFIX = 1; + public static final int URL_MATCH_STRATEGY_REGEX = 2; + public static final int PARAM_MATCH_STRATEGY_EXACT = 0; + public static final int PARAM_MATCH_STRATEGY_PREFIX = 1; + public static final int PARAM_MATCH_STRATEGY_REGEX = 2; + public static final int PARAM_MATCH_STRATEGY_CONTAINS = 3; +} +``` + + + + +**1.3 网关限流参数组合说明:** + +**限流参数组合1:** (按照QPS限流:快速失败) + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、阈值类型:QPS +4、QPS阈值:阈值 +5、间隔时间:秒、时、分 +6、流控方式:快速失败 +7、Burst size:0 +``` + +**限流参数组合2:** (按照QPS限流:匀速排队) + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、阈值类型:QPS +4、QPS阈值:阈值 +5、间隔时间:秒、时、分 +6、流控方式:匀速排队 +7、超时时间:毫秒 +``` + +**限流参数组合3:** (按照线程数限流) + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、阈值类型:线程数 +4、线程数:阈值 +``` + +**限流参数组合4:** (按照请求参数限流: Client IP\Remote Host) + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、请求参数: Client IP\Remote Host +``` + +IP: 0 HOST:1 +``` + { + "resource": "httpbin_route", + "count": 0, + "paramItem": { + "parseStrategy": 0 + } + } +``` + + +**限流参数组合5:**(按照请求参数限流: Header) + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、请求参数: Header +4、Header名称:header名称 +``` + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、请求参数: Header +4、Header名称:header名称 +5、属性值匹配: 精确、子串、正则 +6、匹配串:匹配串 +``` + +``` + { + "resource": "httpbin_route", + "count": 0, + "paramItem": { + "parseStrategy": 2, + "fieldName": "Spring-Cloud-Alibaba" + } + } +``` + + + +**限流参数组合6:**(按照请求参数限流: URL参数) + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、请求参数: Header +4、URL参数:URL参数 +``` + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、请求参数: Header +4、URL参数:URL参数 +5、属性值匹配: 精确、子串、正则 +6、匹配串:匹配串 +``` + + + +``` + { + "resource": "httpbin_route", + "count": 0, + "paramItem": { + "parseStrategy": 3, + "fieldName": "name" + } + } +``` + + + +**限流参数组合7:**(按照请求参数限流: Cookie) + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、请求参数: Header +4、Cookie:Cookie +``` + +``` +1、API类型:RoutID\API分组 +2、API名称:RoutID\API分组名称 +3、请求参数: Header +4、Cookie:Cookie +5、属性值匹配: 精确、子串、正则 +6、匹配串:匹配串 +``` + + + + + +**1.4 网关降级参数组合说明:** + +降级参数组合1:(按照相应时间) + +``` +1、资源名:资源名 +2、降级策略:RT +3、RT: 毫秒 +4、时间窗口:降级时间间隔,单位秒 +``` + +降级参数组合2:(按照异常比率) + +``` +1、资源名:资源名 +2、降级策略:RT +3、按照异常比率: 0.0~1.0 +4、时间窗口:降级时间间隔,单位秒 +``` + +降级参数组合3:(按照异常数) + +``` +1、资源名:资源名 +2、降级策略:RT +3、异常数: 异常数 +4、时间窗口:降级时间间隔,单位秒 +``` + + + + + +**1.5、限流类型 RuleType** + +``` +public enum RuleType { + + /** + * flow. + */ + FLOW("flow", FlowRule.class), + /** + * degrade. + */ + DEGRADE("degrade", DegradeRule.class), + /** + * param flow. + */ + PARAM_FLOW("param-flow", ParamFlowRule.class), + /** + * system. + */ + SYSTEM("system", SystemRule.class), + /** + * authority. + */ + AUTHORITY("authority", AuthorityRule.class), + /** + * gateway flow. + */ + GW_FLOW("gw-flow", + "com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule"), + /** + * api. + */ + GW_API_GROUP("gw-api-group", + "com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition"); +} +``` + + + +**1.6 当前版本如下:** + +``` +nacos: 1.1.4 或 1.2.1 +sentinel: 1.6.3 +springboot: 2.0.6.RELEASE +springCloud: Finchley.SR2 +``` + + + +## 二、 项目配置 + +**2.1 网关配置** + +pom.xml + +``` + + + com.timeloit.cloud + spring-cloud-starter-timeloit-nacos-discovery + + + + + com.timeloit.cloud + spring-cloud-starter-timeloit-sentinel + + + + com.timeloit.cloud + spring-cloud-timeloit-sentinel-gateway + + + + + com.timeloit.cloud + spring-cloud-timeloit-sentinel-datasource + + + + com.alibaba.csp + sentinel-datasource-nacos + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.cloud + spring-cloud-starter-gateway + + +``` + + + +**2.2 配置文件** + +application.yml + +``` +spring: + application: + name: gateway-service + main: + allow-bean-definition-overriding: true + cloud: + # 使用 Naoos 作为服务注册发现 + nacos.discovery: + server-addr: 47.114.50.99:8010 + namespace: 46c2400a-5773-4c26-be68-2e90a673259b + gateway: + enabled: true + discovery: + locator: + lower-case-service-id: true + routes: + - id: loit-portal-id + uri: lb://loit-portal + predicates: + - Path=/api-portal/** + filters: + - StripPrefix=1 + logoutSign: true + sentinel: +# 配置文件存储在本地 +# datasource.ds2.file: +# file: "classpath: gateway-service-sentinel-gateway" +# ruleType: gw-flow +# datasource.ds1.file: +# file: "classpath: gateway-service-sentinel-api" +# ruleType: gw-api-group + enabled: true + datasource: + ds2: + nacos: + data-id: ${spring.application.name}-sentinel-gateway + group-id: DEFAULT_GROUP + rule-type: gw-flow + server-addr: 47.114.50.99:8010 + namespace: 46c2400a-5773-4c26-be68-2e90a673259b + data-type: json + + ds1: + nacos: + data-id: ${spring.application.name}-sentinel-api + group-id: DEFAULT_GROUP + rule-type: gw-api-group + server-addr: 47.114.50.99:8010 + namespace: 46c2400a-5773-4c26-be68-2e90a673259b + data-type: json + + ## 应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer + transport: + ## Sentinel 控制台地址 + dashboard: localhost:8080 + ## 应用与Sentinel控制台的心跳间隔时间 + heartbeat-interval-ms: 60000 + filter: + enabled: true + scg.fallback: + ## Spring Cloud Gateway 熔断后的响应模式(选择 redirect or response) + mode: response + ## Spring Cloud Gateway 响应模式为 'response' 模式对应的响应码 + response-status: 444 + ## Spring Cloud Gateway 响应模式为 'response' 模式对应的响应内容 + response-body: 系统繁忙请稍后再试 + scg: + order: -100 +``` + + + + + +## 三、 限流规则使用说明 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806085308994.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +**3.1、例子:根据自定义API分组进行流控** + +gateway-service-sentinel-api + +* **用户自定义的 API 定义分组**,定义一个 API 叫 **loit-portal-api**,请求 path 模式为/api-portal/** 和 /loit-portal/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。 +* 创建了针对该 API 分组的**单独**流控规则,允许**每个 URL** 的 QPS 限流 +* 例子说明:对微服务**loit-portal**统一限流 +* matchStrategy:0 表示精确匹配。matchStrategy:0 表示精确匹配。 + +``` +[{ + "apiName": "loit-portal-api", + "predicateItems": [ + { + "pattern": "/api-portal/**", + "matchStrategy": 1 + },{ + "pattern": "/loit-portal/**", + "matchStrategy": 1 + },{ + "pattern": "/api-portal/api/v1/dict/list", + "matchStrategy": 0 + } + ] + } +] +``` + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806085340353.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +gateway-service-sentinel-gateway + +* 针对这个自定义的 API:**loit-portal-api** 分组维度进行限流 +* 例子说明 api分组限流规则:每秒钟(intervalSec:1)限制次数 8(count:8) +* 其中限流参数及规则参照第一章节中的“**网关限流参数组合组合说明**” + +``` +[ { + "resource": "loit-portal-api", + "count": 8, + "intervalSec": 1 + } +] +``` + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806085439133.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +**3.2、例子:根据route_id 进行限流** + +其中spring gateway配置的路由如下: 其中routeId为:**loit-portal-id** + +``` +spring: + cloud: + gateway: + routes: + - id: loit-portal-id + uri: lb://loit-portal + predicates: + - Path=/api-portal/** + filters: + - StripPrefix=1 + logoutSign: true +``` + + + +gateway-service-sentinel-api + +* 配置网关限流规则: 每秒钟(intervalSec:1)限制次数 1(count:1) + +``` +[{ + "resource": "loit-portal-id", + "count": 1, + "intervalSec": 1 + } +] +``` + + + +**3.3、例子:根据参数限流(待验证)** + + + +``` +[ + { + "resource": "cloud-discovery-client", + "count": 10, + "intervalSec": 2, + "controlBehavior": 1, + "maxQueueingTimeoutMs": 200, + "paramItem": { + "parseStrategy": 3, + "fieldName": "test" + } + } +] +``` + + + +## 四、降级 + +注:待优化 + +降级关键配置 + +``` +#spring.cloud.sentinel.datasource.ds2.file.file=classpath: degraderule.json +#spring.cloud.sentinel.datasource.ds2.file.data-type=json +#spring.cloud.sentinel.datasource.ds2.file.rule-type=degrade + +spring: + sentinel: + datasource: + + ds3: + nacos: + server-addr: 47.114.50.99:8010 + namespace: 46c2400a-5773-4c26-be68-2e90a673259b + dataId: ${spring.application.name}-degrade-rules + data-type: json + rule-type: degrade + +# datasource.ds3.file: +# file: "classpath: gateway-service-degrade-rules" +# ruleType: degrade +# dataType: json + +# 断路器设置 +feign: + sentinel: + enabled: true +``` + + + +降级规则配置 + +``` +[ + { + "resource": "abc0", + "count": 20.0, + "grade": 0, + "passCount": 0, + "timeWindow": 10 + }, + { + "resource": "abc1", + "count": 15.0, + "grade": 0, + "passCount": 0, + "timeWindow": 10 + } +] +``` + + + +``` +DegradeRule +``` + + + +## 五、核心代码解读 + +1、Nacos的客户端从获取配置文件代码 + +![img](https://img2018.cnblogs.com/blog/1496041/201908/1496041-20190825000541997-984971765.png) + +​ + +示例 使用http工具查看nacos上的配置文件 + +``` +http://39.100.254.140:8103/nacos/v1/cs/configs?dataId=gateway-service-sentinel-gateway&group=DEFAULT_GROUP&tenant=195cfbd3-bd2b-433b-b673-d440d4f8d234 +``` + + + +## 六、待完善 + +1、系统保护规则(LOAD、RT、线程数、入口QPS、CPU使用率) + +2、授权规则: (白名单、黑名单) + +3、集群流控 + +4、热点规则 + +5、dashboard配置存储到nacos + + diff --git "a/javadoc20200803/2\343\200\201nginx\346\200\247\350\203\275\346\265\213\350\257\225.md" "b/javadoc20200803/2\343\200\201nginx\346\200\247\350\203\275\346\265\213\350\257\225.md" new file mode 100644 index 0000000..7ce4e9f --- /dev/null +++ "b/javadoc20200803/2\343\200\201nginx\346\200\247\350\203\275\346\265\213\350\257\225.md" @@ -0,0 +1,632 @@ +## 一、centos7编译安装nginx 1.16.1稳定版 + + + +**1.1 下载地址** + +已上传140SVN + +``` +http://39.100.254.140:12011/loit-Infrastructure-doc/loit-initproject-doc/blob/master/3%E3%80%81other/tools/nginx-1.16.1.tar.gz + +http://39.100.254.140:12011/loit-Infrastructure-doc/loit-initproject-doc/blob/master/3%E3%80%81other/tools/echo-nginx-module-0.61.tar.gz +``` + +nginx-1.16.1.tar.gz 上传到目录:/usr/local/src +echo-nginx-module-0.61.tar.gz 上传到root/echo-nginx-module-0.61.tar.gz 并解压 + +``` +tar -zxvf echo-nginx-module-0.61.tar.gz +``` + + + +**1.2 安装nginx** + +安装`nginx`编译所需的lib库 + +``` +yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel +yum -y install pcre pcre-devel + +``` + +查看`pcre`(正则库)版本 + +``` +pcre-config --version + +8.32 +``` + +进入编译目录 + +``` +cd /usr/local/src +``` + + +解压nginx压缩包 + +``` +tar -zxvf nginx-1.16.1.tar.gz +``` + +进入解压目录 + +``` +cd nginx-1.16.1 +``` + +运行配置脚本(--prefix参数指定nginx安装的目录,默认安装在/usr/local/nginx ) + +``` +./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.61 --with-http_stub_status_module +``` + +编译安装nginx + +``` +make && make install +``` + +将`nginx`执行命令软链接到`/usr/bin` + +``` +ln -s /usr/local/nginx/sbin/nginx /usr/bin +``` + +启动nginx + +``` +nginx +``` + +设置开机自启动 + +``` +echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.d/rc.local +chmod +x /etc/rc.d/rc.local +``` + + + +**1.3 测试echo模块** + +``` +location /hello { + default_type 'text/plain'; + return 200 'hello!'; +} + +location /hello_echo { + default_type 'text/plain'; + echo "hello, echo!"; +} +``` + + + +``` +curl http://127.0.0.1/hello +``` + +**1.4 stub_status模块用法** + +提供了查看 Nginx 运行的基本状态信息,我们只想让部分 IP 的人可以查看,此时可以配置一个访问控制: + +``` +vi /usr/local/nginx/conf/nginx.conf +``` + +``` +location /nginx-status { + stub_status; + access_log off; + #allow 192.168.179.0/24; + #deny all; +} +``` + + + +``` +curl 127.0.0.1/nginx-status +``` + + + +**1.4 nginx相关命令** + +执行`nginx -h`查看相关命令 + +``` +[root@localhost ~]# nginx -h +nginx version: nginx/1.16.1 +Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives] + +Options: + -?,-h : this help + -v : show version and exit + -V : show version and configure options then exit + -t : test configuration and exit + -T : test configuration, dump it and exit + -q : suppress non-error messages during configuration testing + -s signal : send signal to a master process: stop, quit, reopen, reload + -p prefix : set prefix path (default: /usr/local/nginx/) + -c filename : set configuration file (default: conf/nginx.conf) + -g directives : set global directives out of configuration file +复制代码 +``` + +查看nginx安装目录 + +``` +whereis nginx +``` + +停止重启 + +``` +启动 +[root sbin]# ./nginx +停止 +[root sbin]# ./nginx -s stop +重启 +[root sbin]# ./nginx -s reload +``` + + + +开启端口80 + +``` +firewall-cmd --zone=public --add-port=80/tcp --permanent +``` + +命令含义: + +–zone #作用域 + +–add-port=80/tcp #添加端口,格式为:端口/通讯协议 + +–permanent #永久生效,没有此参数重启后失效 + +重启防火墙 + +``` +firewall-cmd --reload #重启firewall +systemctl stop firewalld.service #停止firewall +systemctl disable firewalld.service #禁止firewall开机启动 +firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running) +``` + + + +**1.5 测试工具** + +1、ab 测试工具安装 + +``` +yum -y install httpd-tools +``` + +测试2000连接数,50000次请求 + +``` +ab -c 2000 -n 50000 http://172.16.203.78/hello +``` + +2、wrk测试工具 + +``` +wrk -t50 -c300 -d30s -T30 http://172.16.203.78/hello +``` + + + +## 二、性能问题 + +**2.1 未优化前** + + + +测试环境 + +``` +虚拟机 +cpu 核数: 8核 +内存: 4G +``` + +查看当前cpu的状态: + +``` +[root ~]# lscpu |grep "CPU(s)" +``` + + + +🚚 **1000 并发** + +``` +wrk -t50 -c1000 -d30s -T30 http://172.16.203.78/hello + +Running 30s test @ http://192.168.66.52/hello + 50 threads and 1000 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 38.67ms 229.80ms 6.47s 97.16% + Req/Sec 1.90k 1.46k 17.12k 76.88% + 2609441 requests in 30.08s, 380.63MB read + Socket errors: connect 29, read 0, write 0, timeout 0 +Requests/sec: 86757.38 +Transfer/sec: 12.65MB + +``` + +- QPS 为 **86757.38** +- 平均延迟为 38.67ms +- 其中出现 **Socket errors**: connect 29 + + + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807100438118.png) + +* Active connections: 在200左右比较低 +* Waiting数量比较多 + + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807101956910.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +* CPU使用率 100% +* 内存0.1% + +🚚 **1000 并发** + +``` +wrk -t50 -c2000 -d30s -T30 http://192.168.66.52/hello +unable to create thread 28: Too many open files +``` + +查看nginx错误日志 + +``` +# tail /usr/local/nginx/logs/error.log +``` + +``` +2020/08/07 08:33:30 [error] 44039#0: *59630 open() "/usr/local/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.66.240, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.66.52" +2020/08/07 08:48:19 [crit] 44039#0: accept4() failed (24: Too many open files) +``` + +* 出现错误 Too many open files + + + +**2.2 问题总结** + +* 并发1000出现socket异常、nginx Active 数量少、Waiting数量多。 +* 并发2000出现 Too many open files 异常。 + + + +## 三、优化思路 + +> 1、系统和nginx是否可以建立多个socket连接 +> +> 2、系统和nginx是否允许一次性打开多个文件 +> +> + +**建立socket连接,从操作系统和nginx两个层面分析** + +(1) 从nginx + +>1、http连接快速关闭即配置nginx的 keep_alivetime:0。因为在HTTP 1.0中协议是 请求-》连接-》断开,即每次请求之后都需要再次握手,但是随着web应用的丰富出现很多css文件和其他资源文件,这就使得要求是否一次请求可以请求多个文件,这就是HTTP 1.1。 +> +>2、子进程允许打开的连接即配置nginx的(worker_connections) + + + +(2) 从系统层面: + +> (1)修改最大连接数 somaxconn(具体路径在 /proc/sys/net/core/somaxconn) +> (2)加快tcp连接的回收,即修改(/proc/sys/net/ipv4/tcp_tw_recycle) +> (3)空闲的tcp是否允许回收利用,即修改(/proc/sys/net/ipv4/tcp_tw_reuse) +> (4)是否对洪水抵御做相应的cookie操作,修改(/proc/sys/net/ipv4/tcp_syncookies) + + + +**打开文件方面** + +1.nginx: 子进程允许打开的文件数量:配置添加:worker_rlimit_nofile +2.系统:设置ulimit -n 设置一个较大的值 + +一、 最大打开文件数的限制 + +``` +vi /etc/security/limits.conf + +最后添加 + +# End of file +root soft nofile 65535 +root hard nofile 65535 +* soft nofile 65535 +* hard nofile 65535 + +``` + +二、用户进程限制 + +``` +vi /etc/security/limits.d/20-nproc.conf + + #加大普通用户限制 也可以改为unlimited + * soft nproc 40960 + root soft nproc unlimited + +``` + + + +## 四、优化 + + + +内核参数: + +vi /etc/sysctl.conf + +``` +net.ipv4.conf.default.rp_filter = 1 + +net.ipv4.ip_forward = 1 +net.ipv4.conf.default.accept_source_route = 0 +kernel.sysrq = 0 +kernel.core_uses_pid = 1 +kernel.msgmnb = 65536 +kernel.msgmax = 65536 +kernel.shmmax = 68719476736 +kernel.shmall = 4294967296 +net.ipv4.ip_local_port_range = 1024 65535 +net.ipv4.tcp_max_syn_backlog = 65535 + +net.ipv4.tcp_max_tw_buckets = 262144 + +net.core.somaxconn = 65535 +net.core.netdev_max_backlog = 200000 +net.core.rmem_default = 67108864 +net.core.wmem_default = 67108864 +net.core.rmem_max = 67108864 +net.core.wmem_max = 67108864 +net.ipv4.tcp_rmem = 4096 87380 6291456 +net.ipv4.tcp_wmem = 4096 65536 4194304 +net.ipv4.tcp_mem = 3097431 4129911 6194862 +net.ipv4.tcp_timestamps = 0 + +net.ipv4.tcp_syncookies = 1 + +net.ipv4.tcp_synack_retries = 1 +net.ipv4.tcp_syn_retries = 1 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.tcp_tw_recycle = 0 +net.ipv4.ip_forward = 1 +net.ipv4.tcp_fin_timeout = 15 +net.ipv4.tcp_keepalive_time = 120 +vm.overcommit_memory = 1 +fs.file-max = 1048576 + +``` + + + + +运行 sysctl -p后配置生效 + +``` +sysctl -p + + +``` + +部分参数说明 + +``` +net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; +net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; +net.ipv4.tcp_fin_timeout = 720 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。 +``` + + + +Nginx 参考配置文件如下: + +``` +user root; +worker_processes 10; +#daemon off; +#master_process off; + +worker_cpu_affinity +#000000000001 +#000000000010 +000000000100 +000000001000 +000000010000 +000000100000 +000001000000 +000010000000 +000100000000 +001000000000 +010000000000 +100000000000 +; + +#error_log logs/error.log debug; +error_log logs/error.log; + +worker_rlimit_core 200m; +working_directory /tmp; + +pid logs/nginx.pid; +events { + worker_connections 204800; + use epoll; + accept_mutex off; + multi_accept on; +} + +http { + sendfile on; + tcp_nodelay on; + tcp_nopush on; + + access_log off; + + server_tokens off; + reset_timedout_connection on; + + keepalive_timeout 120; + keepalive_requests 100000; + + client_max_body_size 20m; + client_body_buffer_size 1024k; + client_body_temp_path /tmp; + + upstream redis_cluster { + testupstream_node $node_ip; + server 0.0.0.0; + keepalive 1024; + } + + server { + listen 80; + server_name localhost backlog=204800; + + set $backserver "redis_cluster"; + set $node_ip ""; + + location ~* "^/hdp/kvstore/" { + testupstream_pass $backserver; + testupstream_next_upstream error timeout invalid_response; + } + + location /hello { + default_type 'text/plain'; + return 200 'hello!'; + } + + location /hello_echo { + default_type 'text/plain'; + echo "hello, echo!"; + } + + + location /nginx-status { + stub_status; + access_log off; + #allow 192.168.179.0/24; + #deny all; + } + + } +} + +``` + +## 五、优化后测试 + +服务器配置 + +``` +cpu 8核 +内存 32G +``` + + + + +🚚 **300 并发** + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807160835875.png) + +- QPS 为 **28523.93** +- 平均延迟为 17.26ms + + + +🚚 **5000 并发** +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807160919856.png) + +- QPS 为 **30625.28** +- 平均延迟为 122.32ms + + + +🚚 **8000 并发** +![在这里插入图片描述](https://img-blog.csdnimg.cn/2020080716094624.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +- QPS 为 **29120.44** +- 平均延迟为 219.62ms +- socket errors: **read 7** + + + +🚚 **10000 并发** +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807161013306.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +- QPS 为 **28526** + +- 平均延迟为 286.33ms + +- socket errors: **read 19** + + ​ + +🚚 **20000 并发** +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807161037912.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +- QPS 为 **30553.62** +- 平均延迟为 286.33ms +- socket errors: **connect 7 read 483** + + + +**CPU使用情况** + + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807160059967.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +* 测试过程平均cpu使用率40% + + + + +## 六、nginx性能测试结论 + +nginx优化的方法三种,第一种优化linux内核参数,使内核变的更为强大,第二种是优化nginx配置文件,使nginx变的更为强大, 第三种是扩展服务器的cpu和内存,使服务器变的更为强大。 + + + +**单机测试:** + +* 单机8核cpu的平均在30000QPS, 1万并发连接数平均消耗40%cpu。 + + +* nginx并发数与**cpu核数**有关,cpu核数到达**88核**可以实现百万QPS数量。 + + +* 并发连接数达到8000 ~ 10000 开始有很少量的error,并发连接数达到20000 error 数量开始上升。 + + ​ + +参考内存配置要求: + +在操作系统层面每个TCP连接会占用3k-10k的内存,以20万来计算,需要2G内存。nginx程序本身还要消耗内存,特别是nginx反向代理POST请求比较多的情况,20万连接情况下推荐16G内存配置。 + + + + + + diff --git "a/javadoc20200803/3\343\200\201\346\227\266\344\273\243\345\207\214\345\256\207skywalking\351\223\276\350\267\257\347\233\221\346\216\247.md" "b/javadoc20200803/3\343\200\201\346\227\266\344\273\243\345\207\214\345\256\207skywalking\351\223\276\350\267\257\347\233\221\346\216\247.md" new file mode 100644 index 0000000..a079c53 --- /dev/null +++ "b/javadoc20200803/3\343\200\201\346\227\266\344\273\243\345\207\214\345\256\207skywalking\351\223\276\350\267\257\347\233\221\346\216\247.md" @@ -0,0 +1,987 @@ + + +# Skywalking链路监控 + +## 1、Skywalking概述 + +**请求链路追踪,故障快速定位**:可以通过调用链结合业务日志快速定位错误信息。 + +**可视化**:各个阶段耗时,进行性能分析。 + +**依赖优化**:各个调用环节的可用性、梳理服务依赖关系以及优化。 + +**数据分析,优化链路**:可以得到用户的行为路径,汇总分析应用在很多业务场景 + + + + +### 1.1 APM系统概述 + +APM (Application Performance Management) 即应用性能管理系统,是对企业系统即时监控以实现 +对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理,主要指对企业的关键业务应用进 +行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本。 + +**APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。** + +### 1.2 分布式链路追踪 + +随着分布式系统和微服务架构的出现,一次用户的请求会经过多个系统,不同服务之间的调用关系十分 +复杂,任何一个系统出错都可能影响整个请求的处理结果。以往的监控系统往往只能知道单个系统的健 +康状况、一次请求的成功失败,无法快速定位失败的根本原因。 + +### 1.3 主流的开源APM产品 + +**SkyWalking** +SkyWalking是apache基金会下面的一个开源APM项目,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM会感知应用间关系和服务间关系,并进行相应的指标统计。Skywalking支持链路追踪和监控应用组件基本涵盖 + +**Zipkin** +Zipkin是由Twitter开源,是分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。Zipkin基于Google的Dapper论文实现,主要完成数据的收集、存储、搜索与界面展示。 + +**PinPoint** +Pinpoint是由一个韩国团队实现并开源,针对Java编写的大规模分布式系统设计,通过JavaAgent的机制做字节代码植入,实现加入traceid和获取性能数据的目的,对应用代码零侵入。 + +**CAT** +CAT是由大众点评开源的项目,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控,可以提供十几张报表展示。 + + +## 2、Skywalking原理 + +### 2.1 java agent原理 + +使用Skywalking去监控服务,需要在其 VM 参数中添加 “- +javaagent:/usr/local/skywalking/agent//skywalking-agent.jar"。这里就 使用到了java agent技术。 + +**2.1.1、Java agent 是什么?** + +Java agent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包。 + +1. 这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项。 +2. Premain-Class 指定的那个类必须实现 premain() 方法。 + +当Java 虚拟机启动时,在执行 main 函数之前,JVM 会先运行 -javaagent所指定 jar 包内 Premain- Class 这个类的 premain 方法 。 + +**2.1.2、如何使用java agent?** +使用 java agent 需要几个步骤: + +1. 定义一个 MANIFEST.MF 文件,必须包含 Premain-Class 选项,通常也会加入Can-Redefine- Classes 和 Can-Retransform-Classes 选项。 +2. 创建一个Premain-Class 指定的类,类中包含 premain 方法,方法逻辑由用户自己确定。 +3. 将 premain 的类和 MANIFEST.MF 文件打成 jar 包。 +4. 使用参数 -javaagent: jar包路径 启动要代理的方法。 + +** 示例代码** + +``` +import net.bytebuddy.agent.builder.AgentBuilder; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.matcher.ElementMatchers; +import net.bytebuddy.utility.JavaModule; + +import java.lang.instrument.Instrumentation; + +public class PreMainAgent { + + public static void premain(String agentArgs, Instrumentation inst) { + System.out.println("=========premain方法执行1========"); + System.out.println(agentArgs); + } +} + +``` + +> 类中提供两个静态方法,方法名均为premain,不能拼错 + +在pom文件中添加打包插件 + +``` + + + + maven-assembly-plugin + + false + + jar-with-dependencies + + + + + true + + + PreMainAgent + PreMainAgent + true + true + + + + + + make-assembly + package + + single + + + + + + +``` + +该插件会在自动生成META-INF/MANIFEST.MF文件时,帮我们添加agent相关的配置信息。 使用maven的package命令进行打包: + +**2.1.3、 统计方法调用时间** + +Skywalking中对每个调用的时长都进行了统计,使用ByteBuddy和Java agent技术来 统计方法的调用时长。 + +Byte Buddy是开源的、基于Apache 2.0许可证的库,它致力于解决字节码操作和instrumentation API 的复杂性。Byte Buddy所声称的目标是将显式的字节码操作隐藏在一个类型安全的领域特定语言背 后。通过使用Byte Buddy,任何熟悉Java编程语言的人都有望非常容易地进行字节码操作。Byte Buddy提供了额外的API来生成Java agent,可以轻松的增强我们已有的代码。 + +添加依赖: + +``` + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + +``` + +修改PreMainAgent代码 + +``` +public class PreMainAgent { + + public static void premain(String agentArgs, Instrumentation inst) { + + //创建一个转换器,转换器可以修改类的实现 + //ByteBuddy对java agent提供了转换器的实现,直接使用即可 + AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() { + public DynamicType.Builder transform(DynamicType.Builder builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) { + return builder + // 拦截任意方法 + .method(ElementMatchers.any()) + // 拦截到的方法委托给TimeInterceptor + .intercept(MethodDelegation.to(MyInterceptor.class)); + } + }; + + new AgentBuilder // Byte Buddy专门有个AgentBuilder来处理Java Agent的场景 + .Default() + // 根据包名前缀拦截类 + .type(ElementMatchers.nameStartsWith("com.agent")) + // 拦截到的类由transformer处理 + .transform(transformer) + .installOn(inst); + } +} + +``` + +先生成一个转换器,ByteBuddy提供了java agent专用的转换器。通过实现Transformer接口利用 builder对象来创建一个转换器。转换器可以配置拦截方法的格式,比如用名称,本例中拦截所有方 法,并定义一个拦截器类MyInterceptor。 + +``` +public class MyInterceptor { + @RuntimeType + public static Object intercept(@Origin Method method, + @SuperCall Callable callable) + throws Exception { + long start = System.currentTimeMillis(); + try { + //执行原方法 + return callable.call(); + } finally { + //打印调用时长 + System.out.println(method.getName() + ":" + (System.currentTimeMillis() - start) + "ms"); + } + } +} + +``` + +MyInterceptor就是一个拦截器的实现,统计的调用的时长。参数中的method是反射出的方法对象,而 callable就是调用对象,可以通过callable.call()方法来执行原方法。 + + + +## 3、Skywalking 环境搭建 + +**3.1 软件准备** + +软件包版本已经上传140Gitlab + +apache-skywalking-apm-8.1.0.tar.gz + +``` +http://39.100.254.140:12011/loit-Infrastructure-doc/loit-initproject-doc/tree/master/3%E3%80%81other/%E9%9B%86%E6%88%90loit%E9%97%A8%E6%88%B7/skywalking/8.1.0/apache-skywalking-apm-8.1.0.tar.gz +``` + +将以上三个软件包上传至服务器/usr/local/src/路径下 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812105749288.png#pic_center) + + + +**3.2 安装Skywalking服务端** + +**解压安装包** +``` +cd /usr/local/src + +tar -zxvf apache-skywalking-apm-8.1.0.tar.gz +mv apache-skywalking-apm-bin skywalking +mv skywalking/ /usr/local/ +``` + +修改配置文件 + +``` +vim /usr/local/skywalking/config/application.yml +``` + +1、其中修改:selector与clusterNodes + +``` +storage: + selector: ${SW_STORAGE:elasticsearch} + elasticsearch: + nameSpace: ${SW_NAMESPACE:""} + clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172.16.203.79:9200,172.16.203.78:9200,172.16.203.79:9200} + +``` +2、其中 gRPCHost改成本机服务器IP + +``` +core: + selector: ${SW_CORE:default} + default: + gRPCHost: ${SW_CORE_GRPC_HOST:172.16.203.77} +``` +2、其中存储为es +``` +storage: + selector: ${SW_STORAGE:elasticsearch} + elasticsearch: + nameSpace: ${SW_NAMESPACE:""} + clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172.16.203.77:9200,172.16.203.78:9200,172.16.203.79:9200} +``` + +**collector 集群** + +分别在一下3台服务器启动collector : + +``` +172.16.203.76 +172.16.203.77 172.16.203.78 +cd /usr/local/skywalking/bin/sh oapService.sh +``` + +**dashboard配置及启动** + +在其中一台172.16.203.76配置及其启动 +``` +vim /usr/local/skywalking/webapp/webapp.yml +``` + +修改端口号server.port 与 listOfServers(根据实际情况修改) + +``` +server: + port: 8051 + +collector: + path: /graphql + ribbon: + ReadTimeout: 10000 + # Point to all backend's restHost:restPort, split by , + listOfServers: 172.16.203.76:12800,172.16.203.77:12800,172.16.203.78:12800 +``` + +启动dashboard: + +``` +cd /usr/local/skywalking/bin/ +sh webappService.sh +``` + +**服务端产生的日志路径** + +``` +/usr/local/skywalking/logs +``` + +**停止skywalking** + +``` +# 关闭 skywalking web + + ps -ef|grep skywalking-webapp + kill -9 pid + +``` + +注意*skywalking*默认会使用(8080, 10800, **11800**, 12800)端口, 前面已经把8080 修改为8051 + + +**3.3 安装Skywalking agent 端** + +实际开发时候,每一个jar包获取应用都应该单独使用一个agent, +所以将agent这个目录拷贝到各自对应的jar包路径下。 +核心部分的目录信息如下: + +``` +├── activations +├── config +│ └── agent.config +├── logs +│ └── skywalking-api.log +├── optional-plugins +├── plugins +└── skywalking-agent.jar + +``` + + + +上传skywalking 并解压 + +``` +cd /usr/local/src + +tar -zxvf apache-skywalking-apm-8.1.0.tar.gz +mv apache-skywalking-apm-bin skywalking +mv skywalking/ /usr/local/ +``` + +添加gateway plugin 插件 + +``` +cd /usr/local/skywalking/agent/optional-plugins +cp apm-spring-cloud-gateway-2.0.x-plugin-8.1.0.jar /usr/local/skywalking/agent/plugins/ +``` + + + +设置好参数后,对于 Java 应用,添加核心的-javaagent进行启动 + +``` +-javaagent:/usr/local/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=loit-gateway -Dskywalking.collector.backend_service=172.16.203.76:11800,172.16.203.77:11800,172.16.203.78:11800 +``` + + + +示例启动脚本如下: + +``` +nohup /usr/local/java/jdk1.8/bin/java -javaagent:/usr/local/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=loit-gateway -Dskywalking.collector.backend_service=172.16.203.76:11800,172.16.203.77:11800,172.16.203.78:11800 -Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -jar -Dlogging.config=/home/soft/loit-gateway-7001/logback-dev.xml -Dlogging.path=/home/soft/loit-gateway-7001/logs $KILL_PROCESS_NAME --spring.config.location=file:./application-test7001.yml & + +``` + + + +## 4、Skywalking 性能测试 + + + +> 测试包含一些几点内容 + +1、测试使用skywalking前后的cpu、内存、磁盘、QPS变化情况 +2、Skywalking挂掉后对微服务的影响 +3、链路监控日志增长情况 +4、Skywalking重启后是否可以继续收集链路日志(客户端不重启) +5、高并发、长时间压测微服务,skywalking是否能正常使用 + + + +### 4.1 测试环境准备 + +服务端IP如下 + +``` +http://121.196.16.86:8051 +``` + + + +客户端服务器IP如下: + +``` +172.16.203.77 +172.16.203.78 +172.16.203.79 +``` + +> 三台服务器都按照《3.3 安装Skywalking agent 端》安装客户端。 + + + +三台服务器都启动gateway (其中 **deploy-gateway-sky-7001.sh** 为带skywalking脚本,deploy-gateway-7001.sh 为无skywalking启动脚本) + +``` +cd /home/soft/loit-gateway-7001/ +sh deploy-gateway-sky-7001.sh +``` + + + +三台启动portal(其中 **deploy-portal-sky-7005.sh** 为带skywalking脚本,deploy-portal-7005.s 为无skywalking启动脚本) + +``` +cd /home/soft/portal-7005/ +sh deploy-portal-sky-7005.sh +``` + + + +### 4.2 过程测试 + + + +**4.2.1 性能影响测试** + +* 在172.16.203.77 服务器上运行wrk进行测试 +* 分别测试使用skywalking前后变化情况,发连接数分别测试**500、1000、5000** +* 测试指标比对使用skywalking前后的 **QPS、内存、cpu、磁盘空间**变化情况 + +``` +wrk -t30 -c500 -d30s http://172.16.203.78/test/json +``` + + + +🚚 **500 并发(无链路监控)** + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811214652104.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811212743656.png) + +- 8核CPU使用668.9%,内存使用2.5% ,QPS 为 **28482.96** +- 平均延迟为 17.27ms + + + +🚚 **1000 并发(无链路监控)** + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811214553945.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811212620981.png) + +- 8核CPU使用662.1%,内存使用2.5% ,QPS 为 **26296.37** + +- 平均延迟为 38.14ms + + ​ + +🚚 **5000 并发(无链路监控)** + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811214508182.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811212524762.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + + + +- 8核CPU使用646.1%,内存使用2.5% ,QPS 为 **17829.78** +- 平均延迟为 213.71ms + + + +🚚 **500 并发(skywalking)** + + + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811211434358.png) + +- QPS 为 **23867.47** +- 平均延迟为 20.48ms + + + +🚚 **1000 并发(skywalking)** +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811211654142.png) + +- QPS 为 **22053.67** +- 平均延迟为 45.82ms + + + +🚚 **5000 并发(skywalking)** + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811212117759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) +--- + +- QPS 为 **15207.78** +- 平均延迟为 248.63ms + + + +🚚 **500 并发(停止skywalking server)** + + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811213347347.png) +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811213413640.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +- 8核cpu使用658.8%,内存使用2.0%,QPS 为 **26894.59** +- 平均延迟为 18.29ms + + + +🚚 **1000 并发(停止skywalking server)** +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811213531204.png) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811213457827.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +- 8核cpu使用655.5%,内存使用2.7%,QPS 为 **24091.45** +- 平均延迟为 41.85ms + + + +🚚 **5000 并发(停止skywalking server)** + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811213604363.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200811213628781.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3Mzg0NzY5,size_16,color_FFFFFF,t_70) + +- 8核cpu使用644%,内存使用2.7%,QPS 为 **16669.53** +- 平均延迟为 217.09ms + + + +### 4.3 测试结果 + +**500并发(客户端性能指标)** + +| 场景 | CPU(8核) | 内存(32G) | QPS | 平均延迟 | +| --------------- | ------- | ------- | -------- | ------- | +| 链路监控(无) | 668.90% | 2.50% | 28482.96 | 17.27ms | +| 链路监控(有) | | | 23867.47 | 20.48ms | +| 链路监控(server 停止) | 658.80% | 2.00% | 26894.59 | 18.29ms | + + +**1000并发(客户端性能指标)** + +| 场景 | CPU(8核) | 内存(32G) | QPS | 平均延迟 | +| --------------- | ------- | ------- | -------- | ------- | +| 链路监控(无) | 662.10% | 2.50% | 26296.37 | 38.14ms | +| 链路监控(有) | | | 22053.67 | 45.82ms | +| 链路监控(server 停止) | 655.50% | 2.70% | 24091.45 | 41.85ms | + +**5000并发(客户端性能指标)** + +| 场景 | CPU(8核) | 内存(32G) | QPS | 平均延迟 | +| --------------- | ------- | ------- | -------- | -------- | +| 链路监控(无) | 646.10% | 2.50% | 17829.78 | 213.71ms | +| 链路监控(有) | | | 15207.78 | 248.63ms | +| 链路监控(server 停止) | 644% | 2.70% | 16669.53 | 217.09ms | + +* 1、链路压测对QPS和平均延时有影响。 +* 2、skywalking 挂掉后对微服务正常使用且性能较有链路监控有所提升 +* 3、skywalking客户端对cpu及内存影响不是很明显 + + + + +**ES中链路日志增长情况** + + +| 场景 | 磁盘使用情况 | 日志数 | 使用情况 | 场景 | +| ---------- | ------ | ------- | ---- | ---------- | +| 磁盘使用(未测试前) | 138G | 0 | 0 | 磁盘使用(未测试前) | +| 磁盘使用(测试中) | 153G | 1141511 | 15G | 磁盘使用(测试中) | +| 磁盘使用(测试中) | 197G | 3799685 | 59G | 磁盘使用(测试中) | + + + +**其他测试及结论** + +> skywalking停掉后重新启动后是否恢复日志收集功能? + +* yes + + + + +## 5 使用说明 + + + +### 5.1 配置覆盖 + + + +Skywalking支持的几种配置方式其中优先级如下: + +探针配置 > 系统配置 >系统环境变量 > 配置文件中的值 + +**5.1.1 系统配置(System properties)** + +通过使用-Dskywalking. 如下进行 agent.service_name 的覆盖 +``` +-Dskywalking.agent.service_name=skywalking_mysql +``` + + + +**5.1.2 探针配置(Agent options)** + + +``` +-javaagent:/path/to/skywalking-agent.jar=[option1]=[value1],[option2]=[value2] +``` + +**案例** +通过 如下进行 agent.service_name 的覆盖 + +``` +-javaagent:/path/to/skywalking-agent.jar=agent.service_name=skywalking_mysql +``` + +**特殊字符** +如果配置中包含分隔符( , 或者 =) , 就必须使用引号包裹起来 + +``` +-javaagent:/path/to/skywalking-agent.jar=agent.ignore_suffix='.jpg,.jpeg' +``` + + + +**5.1.3 系统环境变量(System environment variables)** + +配置在操作系统的环境变量中 +由于agent.service_name配置项如下所示: + +``` +# The service name in UI +agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} +12 +``` + +可以在环境变量中设置SW_AGENT_NAME的值来指定服务名。 + + + +**覆盖优先级** +探针配置 > 系统配置 >系统环境变量 > 配置文件中的值 + +所以我们的启动命令可以修改为 + +``` +java -javaagent:/usr/local/skywalking/apache-skywalking-apm- +bin/agent_mysql/skywalking-agent.jar - +Dskywalking.agent.service_name=skywalking_mysql -jar skywalking_mysql.jar & +``` + +或者 + +``` +java -javaagent:/usr/local/skywalking/apache-skywalking-apm- +bin/agent_mysql/skywalking-agent.jar=agent.service_name=skywalking_mysql -jar skywalking_mysql.jar & +``` + + + +### 5.2 代码中添加额外链路信息 + +Skywalking提供我们Trace工具包,用于在追踪链路时进行信息的打印 + +**pom文件** + +``` + + 1.8 + 8.1.0 + + + + + org.apache.skywalking + apm-toolkit-trace + ${skywalking.version} + +``` + + +> 添加了skywalking trace的工具包, 该工具包版本需要与skywalking版本相同, 这里采用8.1.0 + + + +**PluginController** + +``` +import org.apache.skywalking.apm.toolkit.trace.ActiveSpan; +import org.apache.skywalking.apm.toolkit.trace.TraceContext; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PluginController { + + //获取trace id,可以在RocketBot追踪中进行查询 + @GetMapping("/getTraceId") + public String getTraceId(){ + //使当前链路报错,并且提示报错信息 + ActiveSpan.error(new RuntimeException("Test-Error-Throwable")); + //打印info信息 + ActiveSpan.info("Test-Info-Msg"); + //打印debug信息 + ActiveSpan.debug("Test-debug-Msg"); + return TraceContext.traceId(); + } +} + +``` + +使用TraceContext.traceId()可以打印出当前追踪的ID,方便在RocketBot中进行搜索。 + +**ActiveSpan提供了三个方法进行信息的打印** + +- error方法会将本次调用变为失败状态,同时可以打印对应的堆栈信息和错误提示。 +- info方法打印info级别的信息。 +- debug方法打印debug级别的信息。 + + + + +### 5.3 过滤指定的端点 + +在开发过程中,有一些端点(接口)并不需要去进行监控, + + +**部署方式** + +将agent中的 /agent/optional-plugins/apm-trace-ignore-plugin-6.4.0.jar插件拷贝到 plugins目录中。 + +``` +cd /usr/local/skywalking/agent +cp optional-plugins/apm-trace-ignore-plugin-8.1.0.jar plugins/apm-trace-ignore-plugin-8.1.0.jar +``` + +启动应用 + +``` +/usr/local/java/jdk1.8/bin/java -javaagent:/usr/local/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=loit-gateway -Dskywalking.collector.backend_service=172.16.203.76:11800 - +Dskywalking.trace.ignore_path=/exclude -Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -jar -Dlogging.config=/home/soft/loit-gateway-7001/logback-dev.xml -Dlogging.path=/home/soft/loit-gateway-7001/logs $KILL_PROCESS_NAME --spring.config.location=file:./application-test7001.yml & + +``` + +> 这里添加-Dskywalking.trace.ignore_path=/exclude参数来标识需要过滤哪些请求,支持 Ant Path表达式: + +- /path/*, /path/**, /path/? + - ? 匹配任何单字符 + - \* 匹配0或者任意数量的字符 + - ** 匹配0或者更多的目录 + + + +### 5.4 告警功能 + + + +**5.4.1 告警功能简介** + +Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应 时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完 成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告 警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。 + +以下是默认的告警规则配置,位于skywalking安装目录下的config文件夹下 alarm-settings.yml文件 中: + +``` +rules: + # Rule unique name, must be ended with `_rule`. + service_resp_time_rule: + metrics-name: service_resp_time + op: ">" + threshold: 1000 + period: 10 + count: 3 + silence-period: 5 + message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes. + +webhooks: +# - http://127.0.0.1/notify/ +# - http://127.0.0.1/go-wechat/ +``` + +**以上文件定义了默认的4种规则** + +1. 最近3分钟内服务的平均响应时间超过1秒 +2. 最近2分钟服务成功率低于80% +3. 最近3分钟90%服务响应时间超过1秒 +4. 最近2分钟内服务实例的平均响应时间超过1秒 规则中的参数属性如下 + +**属性参照表** + +| 属性 | 含义 | +| -------------- | --------------------------- | +| metrics-name | oal脚本中的度量名称 | +| threshold | 阈值,与metrics-name和下面的比较符号相匹配 | +| op | 比较操作符,可以设定>,<,= | +| period | 多久检查一次当前的指标数据是否符合告警规则,单位分钟 | +| count | 达到多少次后,发送告警消息 | +| silence-period | 在多久之内,忽略相同的告警消息 | +| message | 告警消息内容 | +| include-names | 本规则告警生效的服务列表 | + +> webhooks可以配置告警产生时的调用地址。 + + + +**5.4.2 告警功能说明** + + +**WebHooks** + +> 产生告警时会调用webhook接口,该接口必须是Post类型,同时接口参数使用RequestBody。参 数格式为: + +``` +[{ + "scopeId": 1, + "scope": "SERVICE", + "name": "serviceA", + "id0": 12, + "id1": 0, + "ruleName": "service_resp_time_rule", + "alarmMessage": "alarmMessage xxxx", + "startTime": 1560524171000 +}, { + "scopeId": 1, + "scope": "SERVICE", + "name": "serviceB", + "id0": 23, + "id1": 0, + "ruleName": "service_resp_time_rule", + "alarmMessage": "alarmMessage yyy", + "startTime": 1560524171000 +}] +``` + +**AlarmMessage** + +``` +public class AlarmMessage { + private int scopeId; + private String name; + private int id0; + private int id1; + //告警的消息 + private String alarmMessage; + //告警的产生时间 + private long startTime; +} +``` + +在生产中使用可以在webhook接口中对接短 信、邮件等平台,当告警出现时能迅速发送信息给对应的处理人员,提高故障处理的速度。 + + + +## 6、集群及其性能 + +### 集群配置 + +1.评估在业务服务的极致qps下,skywalking是否对业务有影响。这个是最重要的。 +* 即使是biz机器的cpu%us高达100%,它对biz的请求也没有影响 + +2.压测skywalking-collector单节点QPS极限。 +*每个收集器 支持10K+qps +* 使用3台skywalking-collector + +线上skywalking-collector的jvm参数使用: +``` + -server -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms6000M -Xmx6000M -XX:+UseG1GC -XX:LargePageSizeInBytes=128m +``` + + +### 集群配置 + +**application.yml** + +修改集群注册中心配置 + +``` +cluster: + selector: ${SW_CLUSTER:nacos} + nacos: + serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} + hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:172.16.203.79:8010} + # Nacos Configuration namespace + namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"} +``` + +其中 gRPCHost改成对应服务器的IP + +``` +core: + selector: ${SW_CORE:default} + default: + gRPCHost: ${SW_CORE_GRPC_HOST:172.16.203.77} + +``` + + + +修改存储es + +``` +storage: + selector: ${SW_STORAGE:elasticsearch} + elasticsearch: + nameSpace: ${SW_NAMESPACE:""} + clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172.16.203.77:9200,172.16.203.78:9200,172.16.203.79:9200} +``` + + + +**dashboard 配置修改** + +/webapp/webapp.yml 修改 listOfServerrs + +``` +server: + port: 8080 + +collector: + path: /graphql + ribbon: + ReadTimeout: 10000 + # Point to all backend's restHost:restPort, split by , + listOfServers: 172.16.203.76:12800,172.16.203.77:12800,172.16.203.78:12800 + +``` + + + +**agent 端配置** + +``` +collector.direct_servers=www.skywalking.service.io/collector.direct_servers=10.20.30.123:11800,10.20.30.124:11800,10.20.30.125:11800 +``` + +``` +172.16.203.76:11800,172.16.203.77:11800,172.16.203.78:11800 +``` + + + +### 7、UI界面介绍 + +CPM:每分钟请求调用次数(平均吞吐量)。 + +SLA: 服务等级协议(简称:SLA,全称:service level agreement)。是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。即服务可用性,如99.9,99.99,99.999 + +CLR:(公共语言运行库,Common Language Runtime)和 Java 虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境。CLR 的核心功能包括:内存管理、程序集加载、安全性、异常处理和线程同步,可由面向 CLR 的所有语言使用。并保证应用和底层操作系统之间必要的分离。 + +百分位数:skywalking中有P50,P75,P90,P95,P99这种统计口径,就是百分位数的概念。 + +> 如 有50%的请求响应时间低于1020ms,有75%的请求响应时间低于1200ms,有90%的请求响应时间低于2150ms,有95%的请求响应时间低于3140ms,有99%的请求响应时间低于3220ms。 + + + +### 8、错误排查 + +skywalking-oap-server.log + +错误信息**Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)** 表示ElasticSearch进入“只读”模式,节点无法更改。可能原因是存储空间不足导致。解决方式1、保证存储空间充足 2、设置对应的索引解除“只读模式”。 skywalking每天都会参数新索引,新索引是是解除只读模式的。 + diff --git "a/javapdf20200803/Grafana\344\275\277\347\224\250\345\217\212\347\233\270\345\205\263\351\205\215\347\275\256\350\257\264\346\230\216.doc" "b/javapdf20200803/Grafana\344\275\277\347\224\250\345\217\212\347\233\270\345\205\263\351\205\215\347\275\256\350\257\264\346\230\216.doc" new file mode 100644 index 0000000..3ef94e5 Binary files /dev/null and "b/javapdf20200803/Grafana\344\275\277\347\224\250\345\217\212\347\233\270\345\205\263\351\205\215\347\275\256\350\257\264\346\230\216.doc" differ diff --git "a/javapdf20200803/nginx\346\200\247\350\203\275\346\265\213\350\257\225\344\270\216\344\274\230\345\214\226.pdf" "b/javapdf20200803/nginx\346\200\247\350\203\275\346\265\213\350\257\225\344\270\216\344\274\230\345\214\226.pdf" new file mode 100644 index 0000000..3c16cfb Binary files /dev/null and "b/javapdf20200803/nginx\346\200\247\350\203\275\346\265\213\350\257\225\344\270\216\344\274\230\345\214\226.pdf" differ diff --git "a/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207ELK\345\210\206\345\270\203\345\274\217\346\227\245\345\277\227\346\224\266\351\233\206.doc" "b/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207ELK\345\210\206\345\270\203\345\274\217\346\227\245\345\277\227\346\224\266\351\233\206.doc" new file mode 100644 index 0000000..3b5936f Binary files /dev/null and "b/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207ELK\345\210\206\345\270\203\345\274\217\346\227\245\345\277\227\346\224\266\351\233\206.doc" differ diff --git "a/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207GPE\346\234\215\345\212\241\347\233\221\346\216\247.doc" "b/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207GPE\346\234\215\345\212\241\347\233\221\346\216\247.doc" new file mode 100644 index 0000000..727db58 Binary files /dev/null and "b/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207GPE\346\234\215\345\212\241\347\233\221\346\216\247.doc" differ diff --git "a/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207skywalking\351\223\276\350\267\257\347\233\221\346\216\247.docx" "b/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207skywalking\351\223\276\350\267\257\347\233\221\346\216\247.docx" new file mode 100644 index 0000000..bdd3fd7 Binary files /dev/null and "b/javapdf20200803/\346\227\266\344\273\243\345\207\214\345\256\207skywalking\351\223\276\350\267\257\347\233\221\346\216\247.docx" differ diff --git "a/javapdf20200803/\347\275\221\345\205\263gateway\351\231\220\346\265\201\344\275\277\347\224\250\350\257\264\346\230\216.pdf" "b/javapdf20200803/\347\275\221\345\205\263gateway\351\231\220\346\265\201\344\275\277\347\224\250\350\257\264\346\230\216.pdf" new file mode 100644 index 0000000..9527674 Binary files /dev/null and "b/javapdf20200803/\347\275\221\345\205\263gateway\351\231\220\346\265\201\344\275\277\347\224\250\350\257\264\346\230\216.pdf" differ diff --git "a/\346\257\224\350\276\203\345\245\275\347\232\204\346\226\207\347\253\240\345\234\260\345\235\200.adoc" "b/\346\257\224\350\276\203\345\245\275\347\232\204\346\226\207\347\253\240\345\234\260\345\235\200.adoc" index 9c76bef..c1ecb62 100644 --- "a/\346\257\224\350\276\203\345\245\275\347\232\204\346\226\207\347\253\240\345\234\260\345\235\200.adoc" +++ "b/\346\257\224\350\276\203\345\245\275\347\232\204\346\226\207\347\253\240\345\234\260\345\235\200.adoc" @@ -274,4 +274,19 @@ https://tool.lu/tables/ # TCC分布式事务 https://tech.antfin.com/community/live/462/data/736 -https://tech.antfin.com/community/live/1076 \ No newline at end of file +https://tech.antfin.com/community/live/1076 + + +# 物联网平台 +https://github.com/thingsboard/thingsboard + +# 黑马教程 +http://yun.itheima.com/course/index/p/2.html?a5 + + + +-------------------------------------- + +jwt + +https://www.cnblogs.com/xieqing/p/6519907.html \ No newline at end of file