-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdb.json
1 lines (1 loc) · 768 KB
/
db.json
1
{"meta":{"version":1,"warehouse":"2.2.0"},"models":{"Asset":[{"_id":"source/favicon.ico","path":"favicon.ico","modified":0,"renderable":0},{"_id":"themes/cactus/source/css/rtl.styl","path":"css/rtl.styl","modified":0,"renderable":1},{"_id":"themes/cactus/source/css/style.styl","path":"css/style.styl","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/apple-touch-icon.png","path":"images/apple-touch-icon.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/favicon-192x192.png","path":"images/favicon-192x192.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/logo.png","path":"images/logo.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/js/main.js","path":"js/main.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/js/search.js","path":"js/search.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/clipboard/clipboard.min.js","path":"lib/clipboard/clipboard.min.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff","path":"lib/vazir-font/Vazir-Black.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff2","path":"lib/vazir-font/Vazir-Black.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff","path":"lib/vazir-font/Vazir-Bold.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff2","path":"lib/vazir-font/Vazir-Bold.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff","path":"lib/vazir-font/Vazir-Light.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff2","path":"lib/vazir-font/Vazir-Light.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff","path":"lib/vazir-font/Vazir-Medium.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff2","path":"lib/vazir-font/Vazir-Medium.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff","path":"lib/vazir-font/Vazir-Thin.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff2","path":"lib/vazir-font/Vazir-Thin.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff2","path":"lib/vazir-font/Vazir.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff","path":"lib/vazir-font/Vazir.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/font-face.css","path":"lib/vazir-font/font-face.css","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/jquery/jquery.min.js","path":"lib/jquery/jquery.min.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.eot","path":"lib/vazir-font/Vazir-Black.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.ttf","path":"lib/vazir-font/Vazir-Black.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.eot","path":"lib/vazir-font/Vazir-Bold.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.ttf","path":"lib/vazir-font/Vazir-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.eot","path":"lib/vazir-font/Vazir-Light.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.ttf","path":"lib/vazir-font/Vazir-Light.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.eot","path":"lib/vazir-font/Vazir-Medium.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.ttf","path":"lib/vazir-font/Vazir-Medium.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.eot","path":"lib/vazir-font/Vazir-Thin.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.ttf","path":"lib/vazir-font/Vazir-Thin.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.eot","path":"lib/vazir-font/Vazir.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.ttf","path":"lib/vazir-font/Vazir.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.eot","path":"lib/font-awesome/webfonts/fa-regular-400.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff","path":"lib/font-awesome/webfonts/fa-regular-400.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.ttf","path":"lib/font-awesome/webfonts/fa-regular-400.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff2","path":"lib/font-awesome/webfonts/fa-regular-400.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff2","path":"lib/font-awesome/webfonts/fa-solid-900.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/css/all.min.css","path":"lib/font-awesome/css/all.min.css","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/justified-gallery/css/justifiedGallery.min.css","path":"lib/justified-gallery/css/justifiedGallery.min.css","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/justified-gallery/js/jquery.justifiedGallery.min.js","path":"lib/justified-gallery/js/jquery.justifiedGallery.min.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff","path":"lib/font-awesome/webfonts/fa-brands-400.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff2","path":"lib/font-awesome/webfonts/fa-brands-400.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff","path":"lib/font-awesome/webfonts/fa-solid-900.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.eot","path":"lib/font-awesome/webfonts/fa-brands-400.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.ttf","path":"lib/font-awesome/webfonts/fa-brands-400.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.eot","path":"lib/font-awesome/webfonts/fa-solid-900.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.svg","path":"lib/font-awesome/webfonts/fa-regular-400.svg","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.ttf","path":"lib/font-awesome/webfonts/fa-solid-900.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-BoldItalic.ttf","path":"lib/meslo-LG/MesloLGM-BoldItalic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Italic.ttf","path":"lib/meslo-LG/MesloLGM-Italic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Italic.ttf","path":"lib/meslo-LG/MesloLGS-Italic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-BoldItalic.ttf","path":"lib/meslo-LG/MesloLGS-BoldItalic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-BoldItalic.ttf","path":"lib/meslo-LG/MesloLGL-BoldItalic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Italic.ttf","path":"lib/meslo-LG/MesloLGL-Italic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Bold.ttf","path":"lib/meslo-LG/MesloLGM-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Regular.ttf","path":"lib/meslo-LG/MesloLGL-Regular.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Regular.ttf","path":"lib/meslo-LG/MesloLGM-Regular.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Bold.ttf","path":"lib/meslo-LG/MesloLGS-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Bold.ttf","path":"lib/meslo-LG/MesloLGL-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Regular.ttf","path":"lib/meslo-LG/MesloLGS-Regular.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.svg","path":"lib/font-awesome/webfonts/fa-brands-400.svg","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.svg","path":"lib/font-awesome/webfonts/fa-solid-900.svg","modified":0,"renderable":1}],"Cache":[{"_id":"source/404.html","hash":"b080b815bee2cad5e44356a4658b73e85a0280d3","modified":1568246988976},{"_id":"themes/cactus/.gitignore","hash":"8d1ea5895c15244978ee32f4ef280124512d995a","modified":1568172820756},{"_id":"themes/cactus/.jshintrc","hash":"d6ee46102ed2ff00acb555557f47241b701e99a4","modified":1568172820756},{"_id":"themes/cactus/.stylintrc","hash":"8bbbee5eae70fbe7dd53c9ce43d244b47d58385b","modified":1568172820769},{"_id":"themes/cactus/README.md","hash":"9d2b515c089758f81db80c062cf53b8091006358","modified":1568172820771},{"_id":"themes/cactus/LICENSE","hash":"06806c75801c9ae870a1b47d588ef8e00d3c7c94","modified":1568172820770},{"_id":"themes/cactus/gulpfile.js","hash":"367c889c599c6595b9a2df0bbdcc1f8b1181b992","modified":1568172820772},{"_id":"themes/cactus/_config.yml","hash":"f6483762b9b9d8a3cafee62d631fa5bfde5619ef","modified":1599980715526},{"_id":"themes/cactus/package.json","hash":"645ae67fde94dd1b78c4f6fdf3e91f3baf7b155c","modified":1568172820797},{"_id":"source/favicon.ico","hash":"6606244b893abf5048902b7edb7ae14cf720e660","modified":1568167225243},{"_id":"source/_posts/acme-sh-free-ssl.md","hash":"45330cff786dbd4c93b2d61a2e91e0917607e360","modified":1599980065126},{"_id":"source/_posts/build-blog.md","hash":"2a377964ea2aaf75581f8625825233de7724cf95","modified":1599979893701},{"_id":"source/_posts/change-themes.md","hash":"b3a964718261381d60f40354ac325e77a8a10c85","modified":1599980076559},{"_id":"source/_posts/cordova-plugin.md","hash":"f684358ab0ee2089adbe9eb0fca689158a611d30","modified":1599980085235},{"_id":"source/_posts/distributed-system-transaction.md.bak","hash":"28e50cf6bbec62d6af4fbc7e94927a032d59aeed","modified":1582702897079},{"_id":"source/_posts/docker-change-storage.md","hash":"7ef99c7132274214606ec676078f61bd4107bff2","modified":1599980092669},{"_id":"source/_posts/docker-install-docker-compose-install.md","hash":"efbaa782f325afcb65d98c8f6fe89c000192045c","modified":1599980099874},{"_id":"source/_posts/docker-rancher-drone-gitea.md","hash":"8a384159f89c23b2fbeb111691cdd3a4b57eba4a","modified":1599980172778},{"_id":"source/_posts/elasticsearch-cluster-install.md","hash":"5b92496302e2464f7420eecdf85e62d2cee18e81","modified":1599980182347},{"_id":"source/_posts/elasticsearch-error-1.md","hash":"f9790b2136cf6b3fb5e0da2c5f344f99f49e0e98","modified":1599980192760},{"_id":"source/_posts/elasticsearch-error-2.md","hash":"5cb49dcdc8b5cb552baf850e69c55b1795eddc51","modified":1599980199596},{"_id":"source/_posts/golang-install.md","hash":"8dc0251f3f7e63f8f9632092d41cabc0d94e40fc","modified":1599980610003},{"_id":"source/_posts/jenkins-maven.md","hash":"f3ae87bdc8432d9e2049f5090af9c7379dd6e90d","modified":1599980369131},{"_id":"source/_posts/joehisaishi-wdo-2018-ch.md","hash":"18d266b9a185f25c000f7b5bcdc89bcbc1ee7fec","modified":1568167225240},{"_id":"source/_posts/k8s-install.md.bak","hash":"fde56ecc25dd654f64838a3f945b1d3b4db621ab","modified":1585531072264},{"_id":"source/_posts/learn-blender.md.bak","hash":"51f9b23c92b1cc1415657be1a346e4e18371c341","modified":1568871627890},{"_id":"source/_posts/mysql-timezone.md","hash":"f60239896256c4b2b62e063e7c9fff8acceb2023","modified":1599980230891},{"_id":"source/_posts/prometheus-grafana.md","hash":"c5d6b4b7e53f014ccf19f69263f55a3cba083886","modified":1599980295352},{"_id":"source/_posts/python-picture.md.bak","hash":"29d576dade253c75ee51135645a38daf5e232591","modified":1599981114352},{"_id":"source/_posts/springboot-seate-multiple-datasource-mybatis-plus.md","hash":"987d014286b399de9d813dd57b5ceabe05fca5cc","modified":1599980340992},{"_id":"source/_posts/ssh-key-login.md","hash":"c63541e120d77daa90f099c9888a32f4ed53aa89","modified":1599980354649},{"_id":"source/_posts/use-canal.md","hash":"a963747c2b4d007d099bf66ab5fdfda8100b475d","modified":1599980364587},{"_id":"source/_posts/use-jenkins.md","hash":"8196f37e8f2fac5abae02b87da3bef0f8532d96a","modified":1599980384163},{"_id":"source/_posts/use-kong.md.bak","hash":"beb1c7a387ddc4818687b5fd92a3a5516202f053","modified":1599980404239},{"_id":"source/_posts/use-multi-datasource.md","hash":"1aced82bc5499add72b7ef1645b054ce0ccbaa73","modified":1599980435725},{"_id":"source/_posts/use-mycat.md","hash":"ae62266d9558b313467ca63112ff39afd47eb646","modified":1599980034178},{"_id":"source/booklist/index.md","hash":"fff60f7ce01c580f9aa90c8c288932fcbe315bbd","modified":1582946004178},{"_id":"source/about/index.md","hash":"fab51153540a8db956b8b51c438cd5675cf1dbbb","modified":1568167225241},{"_id":"source/categories/index-1.md","hash":"dacc668d49905572a52c83c43ed474244316a360","modified":1568175158512},{"_id":"source/categories/index.md","hash":"694c741e8ceba3287469011c00865df8a2984fa2","modified":1568167225242},{"_id":"source/search/index.md","hash":"1dce80623eb1fcb3186766e64128f18e5d8663bd","modified":1568174874822},{"_id":"source/tags/index-1.md","hash":"94604bf7942ff952856d8854a57799849c760ca0","modified":1568175172271},{"_id":"source/tags/index.md","hash":"9b473e88ba8795b93e81dd3f5c7281e1626fabd7","modified":1568167225244},{"_id":"source/todo/index.md","hash":"98a3c5b4ec420bf4434777158050f225436426e7","modified":1568867092170},{"_id":"source/tools/index.md","hash":"42aba552747e4d78bf404f9280caa9131355ab98","modified":1570512216134},{"_id":"themes/cactus/.git/FETCH_HEAD","hash":"76a3cac85f1509ae7a591babfe6f6ea57311b30c","modified":1599980679729},{"_id":"themes/cactus/.git/HEAD","hash":"acbaef275e46a7f14c1ef456fff2c8bbe8c84724","modified":1568172820734},{"_id":"themes/cactus/.git/config","hash":"bbfb2d2962522ab703a9b119c7306ce589ec6438","modified":1568172820742},{"_id":"themes/cactus/.git/description","hash":"9635f1b7e12c045212819dd934d809ef07efa2f4","modified":1568172549440},{"_id":"themes/cactus/.git/index","hash":"1f4c4f80e308374c41b3d522cacc239f85457837","modified":1568179723501},{"_id":"themes/cactus/.git/packed-refs","hash":"bc4cbf0eda01b6c5ebf8d4962fcac81732dc6b40","modified":1568172820725},{"_id":"themes/cactus/languages/ca.yml","hash":"6f9897fe8c7b7bf23be7fa58c530602217aea898","modified":1568172820773},{"_id":"themes/cactus/languages/default.yml","hash":"ea5e6aee4cb14510793ac4593a3bddffe23e530c","modified":1568172820774},{"_id":"themes/cactus/languages/en.yml","hash":"0a4985438ac00ef9f20f8836ac356a3436ff7552","modified":1568172820774},{"_id":"themes/cactus/languages/es.yml","hash":"56ddfd9081641c45272bdc2df750e41ab8b600bf","modified":1568172820775},{"_id":"themes/cactus/languages/fa.yml","hash":"05fb8dad765af2b9eec32582f5d277eb2735ffc3","modified":1568172820775},{"_id":"themes/cactus/languages/fr.yml","hash":"7e8269d0c2ca031b7c037168c9c3d45ec83b1d0e","modified":1568172820776},{"_id":"themes/cactus/languages/it.yml","hash":"501bfc9aed86964ee75354a805378740a02af799","modified":1568172820777},{"_id":"themes/cactus/languages/pl.yml","hash":"3677b782edd98986bb82568c6ff6c8b77140b75a","modified":1568172820778},{"_id":"themes/cactus/languages/nl.yml","hash":"4c36921322e782775ccff9aec78d4261153cf5e5","modified":1568172820777},{"_id":"themes/cactus/languages/ru.yml","hash":"47fb1672f36d5adadf2f6c3a5c4d1714f5bd563b","modified":1568172820779},{"_id":"themes/cactus/languages/pt-br.yml","hash":"417d25e3dae260a2503ec6a8f1b590fa00534b14","modified":1568172820778},{"_id":"themes/cactus/languages/vi.yml","hash":"1a1dfc60e952c3429c038f69a9e0ca2057784fca","modified":1568172820780},{"_id":"themes/cactus/languages/tr.yml","hash":"7971cbff7f90ffe1dc40402be6332890be1ed2c7","modified":1568172820780},{"_id":"themes/cactus/languages/zh-TW.yml","hash":"d02ac645f87c5841ff35499818654df85bd872f5","modified":1568172820782},{"_id":"themes/cactus/languages/zh-CN.yml","hash":"d4ee3ab34b7d34f51b81be813df92f123fafe39a","modified":1568172820781},{"_id":"themes/cactus/layout/archive.ejs","hash":"3009339c4258c63943a14a61481dcb358b63e98f","modified":1568172820794},{"_id":"themes/cactus/layout/index.ejs","hash":"2dc13298bb00497c575b1b819c5024f2eaf5923c","modified":1568172820795},{"_id":"themes/cactus/layout/layout.ejs","hash":"e14f83a23128ce0d4208f04f419363fd7d0cab18","modified":1568172820796},{"_id":"themes/cactus/layout/page.ejs","hash":"1700d4f434170e1eeb0e2a9470fc3c0732b2ba7e","modified":1568172820796},{"_id":"themes/cactus/layout/post.ejs","hash":"0d6d97deb5c0820fdc82a0b4caed4f64015f1fd8","modified":1568172820797},{"_id":"themes/cactus/scripts/merge-configs.js","hash":"98b79403945fa7f8dc177e6da283681677d02567","modified":1568172820798},{"_id":"themes/cactus/scripts/meta.js","hash":"6b05bc75ab2478a1f01deab46919164895eb1f6d","modified":1568172820799},{"_id":"themes/cactus/scripts/page_title.js","hash":"03b5c8b6215f0b305327e8d9b5d49add83b4b95f","modified":1568172820800},{"_id":"themes/cactus/scripts/thumbnail.js","hash":"3d841aa267026703a5cc29f4ffbb613f0a2bbd45","modified":1568172820801},{"_id":"source/_posts/build-blog/Githubpicture.png","hash":"c013fb3cd2dc82adca7cc4f15061b0b269f6ffb5","modified":1568167225237},{"_id":"themes/cactus/.git/hooks/applypatch-msg.sample","hash":"4de88eb95a5e93fd27e78b5fb3b5231a8d8917dd","modified":1568172549441},{"_id":"themes/cactus/.git/hooks/commit-msg.sample","hash":"ee1ed5aad98a435f2020b6de35c173b75d9affac","modified":1568172549441},{"_id":"themes/cactus/.git/hooks/fsmonitor-watchman.sample","hash":"f7c0aa40cb0d620ff0bca3efe3521ec79e5d7156","modified":1568172549453},{"_id":"themes/cactus/.git/hooks/post-update.sample","hash":"b614c2f63da7dca9f1db2e7ade61ef30448fc96c","modified":1568172549453},{"_id":"themes/cactus/.git/hooks/pre-applypatch.sample","hash":"f208287c1a92525de9f5462e905a9d31de1e2d75","modified":1568172549454},{"_id":"themes/cactus/.git/hooks/pre-push.sample","hash":"5c8518bfd1d1d3d2c1a7194994c0a16d8a313a41","modified":1568172549455},{"_id":"themes/cactus/.git/hooks/pre-commit.sample","hash":"33729ad4ce51acda35094e581e4088f3167a0af8","modified":1568172549455},{"_id":"themes/cactus/.git/hooks/pre-rebase.sample","hash":"288efdc0027db4cfd8b7c47c4aeddba09b6ded12","modified":1568172549456},{"_id":"themes/cactus/.git/hooks/pre-receive.sample","hash":"705a17d259e7896f0082fe2e9f2c0c3b127be5ac","modified":1568172549456},{"_id":"themes/cactus/.git/hooks/prepare-commit-msg.sample","hash":"2584806ba147152ae005cb675aa4f01d5d068456","modified":1568172549457},{"_id":"themes/cactus/.git/hooks/update.sample","hash":"e729cd61b27c128951d139de8e7c63d1a3758dde","modified":1568172549458},{"_id":"themes/cactus/.git/info/exclude","hash":"c879df015d97615050afa7b9641e3352a1e701ac","modified":1568172549459},{"_id":"themes/cactus/.git/logs/HEAD","hash":"904d9be614a44fbb4f42b87254f460538e992a8b","modified":1568172820737},{"_id":"themes/cactus/layout/_partial/comments.ejs","hash":"fc4bc4421f2ed388b30fd3e63cba30f66c0df331","modified":1568172820784},{"_id":"themes/cactus/layout/_partial/footer.ejs","hash":"c5e082095facfb4de2944cdb11f44c8a4f68f2e5","modified":1568172820784},{"_id":"themes/cactus/layout/_partial/head.ejs","hash":"63ebdd4d96e96e48cdde724b1099710f4ed2af79","modified":1568172820785},{"_id":"themes/cactus/layout/_partial/pagination.ejs","hash":"f561e68e9dd10ae1cf2e79e8425f7e9b86ed723e","modified":1568172820787},{"_id":"themes/cactus/layout/_partial/header.ejs","hash":"4ebbfc58eac02acd2940390e7b4e52bda4e1d402","modified":1568172820786},{"_id":"themes/cactus/layout/_partial/search.ejs","hash":"12dba799ae5736dfbf1548e1923bbb7447de8a6d","modified":1568172820793},{"_id":"themes/cactus/layout/_partial/scripts.ejs","hash":"cb2ea8a2e473a3109e3db1ac85b683bafa6ff127","modified":1568172820793},{"_id":"themes/cactus/layout/_partial/styles.ejs","hash":"b7cf29a0cbe44d93766f89113ba3cfd832e75dfb","modified":1568172820794},{"_id":"themes/cactus/source/css/_extend.styl","hash":"739b6942438fec016bf489d9729382735927e3f0","modified":1568172820805},{"_id":"themes/cactus/source/css/_fonts.styl","hash":"5c1727836f5d6076a65cf91dbbeaba8d16b5132b","modified":1568172820806},{"_id":"themes/cactus/source/css/_mixins.styl","hash":"37093d2a554283ab652b59e5e0ff9b542edced0f","modified":1568172820868},{"_id":"themes/cactus/source/css/_util.styl","hash":"1c7bed7376f04d7b77d817e132aee08cf65e6395","modified":1568172820878},{"_id":"themes/cactus/source/css/_variables.styl","hash":"18f57fe9dada74c458ab3e3e7ba829ea535e75e7","modified":1568172820879},{"_id":"themes/cactus/source/css/rtl.styl","hash":"ff61ec57dada4914e8cfba84ddecd04a1b333638","modified":1568172820880},{"_id":"themes/cactus/source/css/style.styl","hash":"a907b87fb74d9ee0dcab0d1d8a2d5e22c4c1f5c7","modified":1568172820880},{"_id":"themes/cactus/source/images/apple-touch-icon.png","hash":"75c1369b3a20ca1e9209c931cdfec34eaa5a0126","modified":1568179529186},{"_id":"themes/cactus/source/images/favicon-192x192.png","hash":"75c1369b3a20ca1e9209c931cdfec34eaa5a0126","modified":1568179529186},{"_id":"themes/cactus/source/images/logo.png","hash":"750f2e3d3333f01a66d3bdfa86fc9561105d1005","modified":1568178697293},{"_id":"themes/cactus/source/js/main.js","hash":"bad144490654ac2518d15e82f426ecbd66b22fd5","modified":1568172820887},{"_id":"themes/cactus/source/js/search.js","hash":"e17274ed3347055bf6432a712d880ec68411944f","modified":1568172820888},{"_id":"themes/cactus/.git/objects/pack/pack-053e8c7dec703952e476ac8bd06cc44d599224d9.idx","hash":"39d57b082cb4195d8de7402a05ca16c0852bd59f","modified":1585534132777},{"_id":"themes/cactus/.git/refs/heads/master","hash":"ffd29f6409dbddc76f20ff2ef4101a781cef6d56","modified":1568172820737},{"_id":"themes/cactus/layout/_partial/post/actions_desktop.ejs","hash":"684ab77be954f73853ee9407567b4c5c0ef6af74","modified":1568172820788},{"_id":"themes/cactus/layout/_partial/post/actions_mobile.ejs","hash":"c8d06799755147a64cdd0cb2728d3ce46a044dae","modified":1568172820788},{"_id":"themes/cactus/layout/_partial/post/category.ejs","hash":"75567a2de037857cb3e4c9fc5fc87094a23fb119","modified":1568172820789},{"_id":"themes/cactus/layout/_partial/post/date.ejs","hash":"bb624f77d29594b8d3a7dd82f1aee6eead6b9b61","modified":1568172820790},{"_id":"themes/cactus/layout/_partial/post/share.ejs","hash":"062bdcea5efc37cd7cd3478e4ff0a97db6be3fb1","modified":1568172820791},{"_id":"themes/cactus/layout/_partial/post/gallery.ejs","hash":"725ab823c2fb4a5e444eca3afa617d88f305ef71","modified":1568172820791},{"_id":"themes/cactus/layout/_partial/post/tag.ejs","hash":"98fe03d5a8835dbc22869d519cc5b5f48808b1e5","modified":1568172820792},{"_id":"themes/cactus/layout/_partial/post/title.ejs","hash":"67da1757316408a72393e6d2aab4ec635e1d30c1","modified":1568172820792},{"_id":"themes/cactus/source/css/_colors/classic.styl","hash":"750cae11fd67684c0b9f73892e9b4dc0b18e6e59","modified":1568172820803},{"_id":"themes/cactus/source/css/_colors/dark.styl","hash":"2c949ae926ae73ef5e5e7b7ebe8ba173d6afd234","modified":1568172820803},{"_id":"themes/cactus/source/css/_colors/light.styl","hash":"9d6e813e1612dd51f9e41038376348c561bd33bd","modified":1568172820804},{"_id":"themes/cactus/source/css/_colors/white.styl","hash":"6aef2765112d3daa32fb770dc7c5ea478c7baf3d","modified":1568172820805},{"_id":"themes/cactus/source/css/_highlight/agate.styl","hash":"fc289ba8f47ead6331ec3a51533cfa93251c5634","modified":1568172820807},{"_id":"themes/cactus/source/css/_highlight/arduino-light.styl","hash":"591962bfc758a521b4cb907750c19a1a2423b4d5","modified":1568172820808},{"_id":"themes/cactus/source/css/_highlight/androidstudio.styl","hash":"4d67bdab6cc9c614486ca42f98199a04d053e7f0","modified":1568172820808},{"_id":"themes/cactus/source/css/_highlight/arta.styl","hash":"262167aaebcf28de7f85af7ac77a76fa1fa284f7","modified":1568172820809},{"_id":"themes/cactus/source/css/_highlight/ascetic.styl","hash":"ca087a3c70998c7ac6b0b42d5cf7a653b8707591","modified":1568172820809},{"_id":"themes/cactus/source/css/_highlight/atelier-cave-dark.styl","hash":"7e83c7f2acaaaa98864660afe2794745c36c8e51","modified":1568172820810},{"_id":"themes/cactus/source/css/_highlight/atelier-cave-light.styl","hash":"f47de0b9d66617728f68096ed48371dd6bb9e67a","modified":1568172820811},{"_id":"themes/cactus/source/css/_highlight/atelier-dune-dark.styl","hash":"68584ed0e99c7d0e49ef8a2e67cd4dcdad359de4","modified":1568172820812},{"_id":"themes/cactus/source/css/_highlight/atelier-dune-light.styl","hash":"657fe215931fd06e21b56374df699a94890f7ab4","modified":1568172820812},{"_id":"themes/cactus/source/css/_highlight/atelier-estuary-dark.styl","hash":"1cecd13e0d6b24042ff86372f0596c1441bb834a","modified":1568172820813},{"_id":"themes/cactus/source/css/_highlight/atelier-estuary-light.styl","hash":"2b416a0567a53aa0fa8898b196ddd44315c1a5f3","modified":1568172820814},{"_id":"themes/cactus/source/css/_highlight/atelier-forest-dark.styl","hash":"a741eba35cdfe2cfd67dfbf109655f253d6b4795","modified":1568172820814},{"_id":"themes/cactus/source/css/_highlight/atelier-forest-light.styl","hash":"8d7c7242974aa2454fa792c5d7a47c5f9632355a","modified":1568172820815},{"_id":"themes/cactus/source/css/_highlight/atelier-heath-dark.styl","hash":"f186b357dcebded89b7bcc77389b2cff76533d72","modified":1568172820816},{"_id":"themes/cactus/source/css/_highlight/atelier-heath-light.styl","hash":"c1db353e8613607580d40b12ddc162d029560576","modified":1568172820817},{"_id":"themes/cactus/source/css/_highlight/atelier-lakeside-dark.styl","hash":"802979cea895a0a384645cb30a43de9572cb0e3f","modified":1568172820817},{"_id":"themes/cactus/source/css/_highlight/atelier-plateau-dark.styl","hash":"0d51ddc580ccb0a291271fa9632bc91dab632df6","modified":1568172820819},{"_id":"themes/cactus/source/css/_highlight/atelier-lakeside-light.styl","hash":"8659eaae6a0c2e00b4b9199803e50adf4ff0128d","modified":1568172820818},{"_id":"themes/cactus/source/css/_highlight/atelier-plateau-light.styl","hash":"96181544eeadc5b0749229f11607e7c01f81e078","modified":1568172820820},{"_id":"themes/cactus/source/css/_highlight/atelier-savanna-dark.styl","hash":"bbad7a9512b4873294e73ce806e36e43973e6ed8","modified":1568172820821},{"_id":"themes/cactus/source/css/_highlight/atelier-savanna-light.styl","hash":"8a5207a0c30262a0bf5e1a41411a306f7a89a7e7","modified":1568172820821},{"_id":"themes/cactus/source/css/_highlight/atelier-seaside-dark.styl","hash":"2f008271299042f2443bca98c9bcadbc8c45e837","modified":1568172820822},{"_id":"themes/cactus/source/css/_highlight/atelier-seaside-light.styl","hash":"08e2df313c272d5c70c93e713639663c168180d0","modified":1568172820823},{"_id":"themes/cactus/source/css/_highlight/atelier-sulphurpool-dark.styl","hash":"18dcb00ab9c62eb810d492047214331c51bb654f","modified":1568172820824},{"_id":"themes/cactus/source/css/_highlight/atelier-sulphurpool-light.styl","hash":"add3d88c9d12567dcfae7a8e49984d119fc72227","modified":1568172820825},{"_id":"themes/cactus/source/css/_highlight/brown-paper.styl","hash":"d14846542a26b75fd26df5b5df6c5493733f73f6","modified":1568172820825},{"_id":"themes/cactus/source/css/_highlight/brown-papersq.png","hash":"3a1332ede3a75a3d24f60b6ed69035b72da5e182","modified":1568172820826},{"_id":"themes/cactus/source/css/_highlight/codepen-embed.styl","hash":"1de45e603e2c71c7f6b0c1372a3ba00b1bc153a8","modified":1568172820827},{"_id":"themes/cactus/source/css/_highlight/color-brewer.styl","hash":"9c4905eab730d0b389e6972e907057577f7e25f1","modified":1568172820828},{"_id":"themes/cactus/source/css/_highlight/dark.styl","hash":"98d7884806838a0b46132d759d60ac27c0c4bd9c","modified":1568172820829},{"_id":"themes/cactus/source/css/_highlight/darkula.styl","hash":"8965ad6920601c275ca97e617beff5536925a266","modified":1568172820830},{"_id":"themes/cactus/source/css/_highlight/docco.styl","hash":"7bd3389ce16d20488ab336d557056cc703c921c7","modified":1568172820832},{"_id":"themes/cactus/source/css/_highlight/far.styl","hash":"8da83d66724f2ce508a40f21b4f6dc0d704be562","modified":1568172820833},{"_id":"themes/cactus/source/css/_highlight/foundation.styl","hash":"28c59a31467c33bd51cbf3b6085782c2a724ff6c","modified":1568172820834},{"_id":"themes/cactus/source/css/_highlight/github-gist.styl","hash":"71f4b0fca91a587e6eba15a5306dca963bb8f441","modified":1568172820835},{"_id":"themes/cactus/source/css/_highlight/github.styl","hash":"a84eb710b302006120c3e7f8ca18f9e6fbc231c3","modified":1568172820836},{"_id":"themes/cactus/source/css/_highlight/googlecode.styl","hash":"7f5082ae008925a23eb713f160773fe647eb3ff7","modified":1568172820836},{"_id":"themes/cactus/source/css/_highlight/gruvbox-dark.styl","hash":"f66403ce77dcb16b1f98a5061b72f7581630d69f","modified":1568172820843},{"_id":"themes/cactus/source/css/_highlight/grayscale.styl","hash":"c83804abe39faebd80f8f4ff64fbd7137674cb1c","modified":1568172820837},{"_id":"themes/cactus/source/css/_highlight/hopscotch.styl","hash":"dd3c78c42d4a865f11623235e5e5f6829d789706","modified":1568172820844},{"_id":"themes/cactus/source/css/_highlight/highlightjs.styl","hash":"fd796a58c5d4590cda67c998187933788d45f30a","modified":1568172820844},{"_id":"themes/cactus/source/css/_highlight/idea.styl","hash":"e284c1760e8da0848f56cd5601d867ceeb0192d7","modified":1568172820846},{"_id":"themes/cactus/source/css/_highlight/index.styl","hash":"36c44375229613a5bb9ee84a8e90214978070439","modified":1568172820846},{"_id":"themes/cactus/source/css/_highlight/hybrid.styl","hash":"4906456025787de04b48a87c42bb704c5ff67065","modified":1568172820845},{"_id":"themes/cactus/source/css/_highlight/kimbie.dark.styl","hash":"3b998c640eeb2c6192fee24bc78b4137de475dd7","modified":1568172820848},{"_id":"themes/cactus/source/css/_highlight/ir-black.styl","hash":"aa31b30069ebee39e2c3ebb75e2c96ba8678eb14","modified":1568172820847},{"_id":"themes/cactus/source/css/_highlight/kimbie.light.styl","hash":"e901738455ec9a1bddde7b62bbd8595de6033e1e","modified":1568172820849},{"_id":"themes/cactus/source/css/_highlight/kimbie.styl","hash":"13113af220dfed09cb49d85102babb352c3eff97","modified":1568172820850},{"_id":"themes/cactus/source/css/_highlight/magula.styl","hash":"ab179306c12a1cf2949482beaca328e379ef034a","modified":1568172820851},{"_id":"themes/cactus/source/css/_highlight/monokai-sublime.styl","hash":"84a27bd29d939105d65f4164c219d6cc2e09ae60","modified":1568172820852},{"_id":"themes/cactus/source/css/_highlight/mono-blue.styl","hash":"14fb8678739b77f35771b6d63101ddbf1e7a9fbc","modified":1568172820851},{"_id":"themes/cactus/source/css/_highlight/monokai.styl","hash":"c3a3bfae1eb864505fbc8748db734600057af1af","modified":1568172820853},{"_id":"themes/cactus/source/css/_highlight/obsidian.styl","hash":"efba069860181d2b709e1548dd16cf102ca267fa","modified":1568172820853},{"_id":"themes/cactus/source/css/_highlight/paraiso-dark.styl","hash":"50f1cee8a5b3b165b4184ead0a99dc564b62ef4f","modified":1568172820854},{"_id":"themes/cactus/source/css/_highlight/paraiso-light.styl","hash":"e428e8202b01e83b0f018a96058d806e7f4c76bf","modified":1568172820854},{"_id":"themes/cactus/source/css/_highlight/paraiso.styl","hash":"846a06a57fa0b3db7f83ec7ac2bf34911f32cf66","modified":1568172820855},{"_id":"themes/cactus/source/css/_highlight/pojoaque.styl","hash":"4d4a9360c35f3c5a0c5b9b49a1f2284e7e21317b","modified":1568172820857},{"_id":"themes/cactus/source/css/_highlight/pojoaque.jpg","hash":"c5fe6533b88b21f8d90d3d03954c6b29baa67791","modified":1568172820856},{"_id":"themes/cactus/source/css/_highlight/railscasts.styl","hash":"5dc9ce33cecee87fe9ca8f2ed9342602194484ec","modified":1568172820857},{"_id":"themes/cactus/source/css/_highlight/rainbow.styl","hash":"95246afef181bd96f9adb1a2e84fb3ef302d4598","modified":1568172820858},{"_id":"themes/cactus/source/css/_highlight/school-book.png","hash":"711ec983c874e093bb89eb77afcbdf6741fa61ee","modified":1568172820858},{"_id":"themes/cactus/source/css/_highlight/school-book.styl","hash":"186c37e9c39e65aa291cce3317e35904693598d1","modified":1568172820859},{"_id":"themes/cactus/source/css/_highlight/solarized-dark.styl","hash":"9fc9400d3a8cae97eb5761c284140acb0f847538","modified":1568172820860},{"_id":"themes/cactus/source/css/_highlight/solarized-light.styl","hash":"bb04944fc06c12ecd7b56ad933dbedde60c2259a","modified":1568172820860},{"_id":"themes/cactus/source/css/_highlight/sunburst.styl","hash":"e6e4c009b10b9805f0c593446bf013edec47d146","modified":1568172820861},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night-blue.styl","hash":"92f4423d4964fcfe34ff7ca6cb21012b5738c697","modified":1568172820862},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night-bright.styl","hash":"e6b025b247e4027fb3c1b7833588f5a5b04a549c","modified":1568172820863},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night-eighties.styl","hash":"8b16876cf205111d5d5454100de712bc3ea8f477","modified":1568172820863},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night.styl","hash":"eb8441364bb1664ecebde77b965dc36c91133aa0","modified":1568172820864},{"_id":"themes/cactus/source/css/_highlight/tomorrow.styl","hash":"502335f0fac07ed74ca78207bcf3ef8dd2252cf6","modified":1568172820865},{"_id":"themes/cactus/source/css/_highlight/vs.styl","hash":"14fbb0c43af440a290280b26968c8a5c0786b27f","modified":1568172820866},{"_id":"themes/cactus/source/css/_highlight/xcode.styl","hash":"5fa8999c7f807c1aae29c7a1cdf681678576fb69","modified":1568172820866},{"_id":"themes/cactus/source/css/_highlight/zenburn.styl","hash":"f63534764dd6598e81177d64714a184f98153b11","modified":1568172820867},{"_id":"themes/cactus/source/css/_partial/archive.styl","hash":"c89529b82ff8bd059384aedf36e7690a9a67da7a","modified":1568172820869},{"_id":"themes/cactus/source/css/_partial/article.styl","hash":"1101e1dd5a763bc415b60fa66471a913f6ebfa40","modified":1568172820870},{"_id":"themes/cactus/source/css/_partial/categories.styl","hash":"92fffe2baacb9d19021b3d120d2038417ca466df","modified":1568172820871},{"_id":"themes/cactus/source/css/_partial/comments.styl","hash":"6e839bae0ddc11447579c34541e79b50d3670bbd","modified":1568172820871},{"_id":"themes/cactus/source/css/_partial/footer.styl","hash":"60e6220a944859f1cd0b73b301bdfea6d017c96f","modified":1568172820872},{"_id":"themes/cactus/source/css/_partial/header.styl","hash":"7d5aa9a75d48ae9e24643829af47a55577a8bd5f","modified":1568172820872},{"_id":"themes/cactus/source/css/_partial/index.styl","hash":"4a0da5d7052204b23d390a7f76cdc903b9eef52b","modified":1568172820873},{"_id":"themes/cactus/source/css/_partial/pagination.styl","hash":"4ff9755163aae6039bb72eac8360bc1c50fa26b6","modified":1568172820874},{"_id":"themes/cactus/source/css/_partial/search.styl","hash":"680ea535e5a20c01a31bee4d3eb680b86267a281","modified":1568172820876},{"_id":"themes/cactus/source/css/_partial/tooltip.styl","hash":"6cb13a9f4a7c01aa7ab8f73739a7d385377c5465","modified":1568172820878},{"_id":"themes/cactus/source/css/_partial/tags.styl","hash":"7a2f9051b21bce525ecb71799d37c4b65a4f9171","modified":1568172820877},{"_id":"themes/cactus/source/lib/clipboard/clipboard.min.js","hash":"dc144353ec85169bb3c5f3c6d68b4e75f9bf28ea","modified":1568172820890},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff","hash":"37443d0040f0d7af381c955e4c15919a15d0349e","modified":1568172820970},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff2","hash":"0a257c8b60e0f20802c1dc8daeed2d3cb0d44f17","modified":1568172820971},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff","hash":"df15fd1e74b6f4a50bea57e2b44d9627f38495b5","modified":1568172820975},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff2","hash":"62447a951d48b21c4696ae72df4bc4adef636e26","modified":1568172820976},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff","hash":"32ae5c0d1d5943c8bb8e0f6ab07c3269c6f8b8a8","modified":1568172820980},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff2","hash":"ef07a250766fea840c1049e67c0405d9216ee0a8","modified":1568172820981},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff","hash":"f5653059b2a5929516e4aab02329a978600b9b67","modified":1568172820986},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff2","hash":"668400ae92700965f03f2371faaee0ab8c8347c3","modified":1568172820987},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff","hash":"ad4d46a99a1daf6353c86c79ac3a2b030213859c","modified":1568172820991},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff2","hash":"c3be79b553ec394db71268d604b1d29183b867dc","modified":1568172820992},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff2","hash":"30ce165216db078951a690a6ad665b9b78f5dd81","modified":1568172820996},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff","hash":"bbee70033f0f5882e9869e417b69c6a38f56f187","modified":1568172820996},{"_id":"themes/cactus/source/lib/vazir-font/font-face.css","hash":"b75063e015641d22130bb8be3f176d7c20533aad","modified":1568172820997},{"_id":"themes/cactus/.git/objects/pack/pack-5c44ea2445e8ccc9466a69cf32397c7a8642d704.idx","hash":"956e34aca1e8c2b13dc3da496ea644a623920cb0","modified":1568172820646},{"_id":"themes/cactus/source/lib/jquery/jquery.min.js","hash":"0c3192b500a4fd550e483cf77a49806a5872185b","modified":1568172820919},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.eot","hash":"13d026ff857c853cbd0dc519b6e58669db309441","modified":1568172820967},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.ttf","hash":"594dc3344ad14903c247615427d1009709f0f5a4","modified":1568172820969},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.eot","hash":"f76ec625e15522ff60d21f7a9a3b71c65bc27556","modified":1568172820972},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.ttf","hash":"2e6c9df9f775373fb1988ae8529aa8f05313dae6","modified":1568172820974},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.eot","hash":"3edffd7bb61eee8cd46b57225f9f9e5264e3362b","modified":1568172820977},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.ttf","hash":"9f1e2934098a6a4a7c5584c8f3fa24a707070da3","modified":1568172820979},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.eot","hash":"1f5a73db7947ef22c8a2bb19d6449b80496c03c4","modified":1568172820983},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.ttf","hash":"295f7e02c9b157e7ea63ad09613b00ceab85c5cd","modified":1568172820985},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.eot","hash":"08e1503d1181188690fd9c81860d6c890c1465f6","modified":1568172820989},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.ttf","hash":"a6aa450ee6e0f85786474ca6b04827ef97e81af4","modified":1568172820990},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.eot","hash":"31a9219c25fe1991fb745ec8dbbcf45c6094a702","modified":1568172820993},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.ttf","hash":"f22b219824026e490a581ddb3b36b07997dff0e3","modified":1568172820995},{"_id":"themes/cactus/.git/logs/refs/heads/master","hash":"904d9be614a44fbb4f42b87254f460538e992a8b","modified":1568172820739},{"_id":"themes/cactus/.git/refs/remotes/origin/HEAD","hash":"d9427cda09aba1cdde5c69c2b13c905bddb0bc51","modified":1568172820731},{"_id":"themes/cactus/.git/refs/remotes/origin/gh-pages","hash":"b4892cd8e0b3e4f54e1e9d9ab965eae37d6b6abc","modified":1585534011572},{"_id":"themes/cactus/.git/refs/remotes/origin/master","hash":"51cba6934d091be08b14ddaa5fba50e35bddfddf","modified":1585534011570},{"_id":"themes/cactus/.git/refs/remotes/origin/site","hash":"efcd71d1e29992aedcb36eb397add3b9b0c17ed6","modified":1585534011573},{"_id":"themes/cactus/source/css/_partial/post/actions_mobile.styl","hash":"b06410ed34b5ecbcac11357aa359149e1f827aa6","modified":1568172820876},{"_id":"themes/cactus/source/css/_partial/post/actions_desktop.styl","hash":"0231316551b187fa7cccecd64ea90b83844e953c","modified":1568172820875},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.eot","hash":"42ff503f20e97503cef8e5b2ec10ae07699d7c01","modified":1568172820903},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff","hash":"7b3f44b4d3028f3c87ddf0f4bd62511c9bf4a87e","modified":1568172820906},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.ttf","hash":"c140085833a38abec6b7df99d4ccac93eb266031","modified":1568172820906},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff2","hash":"9784edb76f8a2ed595ea4bf74d46cda4eff3b303","modified":1568172820907},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff2","hash":"92da6e3c7121e21cdfde25ef08797a3937a683e1","modified":1568172820918},{"_id":"themes/cactus/source/lib/font-awesome/css/all.min.css","hash":"cd4637e23ddae0dd64a8076261adc6fe90307c0f","modified":1568172820891},{"_id":"themes/cactus/source/lib/justified-gallery/css/justifiedGallery.min.css","hash":"a21698ea1b6caf22116d82e27c81115b8d5e9dcc","modified":1568172820921},{"_id":"themes/cactus/source/lib/justified-gallery/js/jquery.justifiedGallery.min.js","hash":"6f5433cc9f19ce2403e903e5d01a4c7b38f0969b","modified":1568172820922},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff","hash":"f9d835a0f9248b1bb33d66968e87c4a50103ed8d","modified":1568172820901},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff2","hash":"d902f8db3e021155f177f698a252fb98d6e61768","modified":1568172820902},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff","hash":"80d33a73cbb60e206ef6f5c898988641576c7dda","modified":1568172820917},{"_id":"themes/cactus/.git/logs/refs/remotes/origin/HEAD","hash":"904d9be614a44fbb4f42b87254f460538e992a8b","modified":1568172820731},{"_id":"themes/cactus/.git/logs/refs/remotes/origin/master","hash":"907a561fc56ec13d2968821c41fe92f6f22bfeee","modified":1585534011571},{"_id":"themes/cactus/.git/logs/refs/remotes/origin/gh-pages","hash":"f0635c3f0b319f3b1743c25f4fc9c7a7613d08ed","modified":1585534011572},{"_id":"themes/cactus/.git/logs/refs/remotes/origin/site","hash":"d0555452a3c7d0a4468e3e41e82076d211cfb628","modified":1585534011573},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.eot","hash":"644ece8263d2f96b087eebf7f6d4e309e5898eb5","modified":1568172820894},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.ttf","hash":"19e302760e39e25a5f8d90d6cd0164ef6cd74f8c","modified":1568172820901},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.eot","hash":"10740942ec6b3f4985529d343402d0bf32f9f847","modified":1568172820909},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.svg","hash":"6fcc06741ad4cdeefa546ce3e1af3a9b682a8429","modified":1568172820905},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.ttf","hash":"c445864a9646948e0d7ff44930ad732ee61427d8","modified":1568172820916},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-BoldItalic.ttf","hash":"b542b9591fbf33925d93f0695b6e123a9f0cfd43","modified":1568172820947},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Italic.ttf","hash":"93ebc5098cf57a32b7b8d297681f31692c09bdfa","modified":1568172820950},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Italic.ttf","hash":"9d757cc9f928fc83b2133283dd639c12b11d94ad","modified":1568172820961},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-BoldItalic.ttf","hash":"926035f0156cccf1b0ca507347f39bf9c510f51e","modified":1568172820959},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-BoldItalic.ttf","hash":"b7d24ab1e4fad720f31a2b0cca1904ce1740d846","modified":1568172820933},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Italic.ttf","hash":"9a23c6898b0943bd3d96c04df9a0f66e919451d8","modified":1568172820937},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Bold.ttf","hash":"58be4b7760e9a84daa81929d046f9a15c4fd1c1a","modified":1568172820943},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Regular.ttf","hash":"6c090d6bff3928fbf8a5f4104e58ed7f421aea7c","modified":1568172820939},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Regular.ttf","hash":"20ce1fc7ae1254558ca044ae48283faaa58897e5","modified":1568172820953},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Bold.ttf","hash":"f9918fb93d6ab6850f5d38069a999c311af78816","modified":1568172820956},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Bold.ttf","hash":"34f7db59f1d023294e69976aa20b7d52b86165a4","modified":1568172820930},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Regular.ttf","hash":"de559f8d70d5b1ab2810597bfd0b1b9506f3ef01","modified":1568172820964},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.svg","hash":"ec8851ea10277bc5c73eb56da111b3e3f52b9def","modified":1568172820898},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.svg","hash":"21731b0d1c81d0eb710b89fafb50a056dda00b97","modified":1568172820914},{"_id":"themes/cactus/.git/objects/pack/pack-053e8c7dec703952e476ac8bd06cc44d599224d9.pack","hash":"f213191029a474afb14efc0d1c32165f6f07c0d3","modified":1585534132755},{"_id":"themes/cactus/.git/objects/pack/pack-5c44ea2445e8ccc9466a69cf32397c7a8642d704.pack","hash":"30222fc54e1f24b36738eb3cd487b89d96694e3e","modified":1568172820644},{"_id":"public/search.xml","hash":"99fd7a0310103c78ae23de8802797d15e9f98388","modified":1599981443851},{"_id":"public/404.html","hash":"efc9097cef2f48fab25a64cc74ef35f900ab2fe2","modified":1599981444371},{"_id":"public/booklist/index.html","hash":"e081750778e7b70450586d070ec637e7d27253eb","modified":1599981444371},{"_id":"public/categories/index.html","hash":"5277e986642ebbb3bf3518fc1308022c1a9ac1d5","modified":1599981444426},{"_id":"public/categories/index-1.html","hash":"9db322039dffc24a2fcfac2a388af237a40b601b","modified":1599981444427},{"_id":"public/about/index.html","hash":"2e25a3459182ca033bd0c37336a2dde6be561662","modified":1599981444427},{"_id":"public/tags/index-1.html","hash":"314d6ad86d10b670fdfa33cc7cbf52504616ba7d","modified":1599981444428},{"_id":"public/search/index.html","hash":"3e86ae548724d4cb2ec0fb7d87d425061dd37d0b","modified":1599981444428},{"_id":"public/todo/index.html","hash":"f5d753148ea3b09065d3a225ab9b4691414977d1","modified":1599981444428},{"_id":"public/tools/index.html","hash":"b4867d392bb94ea56e842b69ef9f9fad97cda8b6","modified":1599981444428},{"_id":"public/tags/index.html","hash":"6eea1c7b16ab78c19f63db22e6f917ca49c4ac5c","modified":1599981444428},{"_id":"public/2019/10/19/mysql-timezone/index.html","hash":"0317f60b4fc1d8d052688030cd28cf39c9b2cf48","modified":1599981444428},{"_id":"public/2019/09/12/use-jenkins/index.html","hash":"6fb3514e9bfcc2ee51d320f31e169d63a425c247","modified":1599981444428},{"_id":"public/tags/Hexo/index.html","hash":"062bffb9b52dfe75e1d4c2cc3493314fbd6ae329","modified":1599981444428},{"_id":"public/tags/博客/index.html","hash":"9742d892529e2ea923db10a14fe335632f7fbe15","modified":1599981444429},{"_id":"public/tags/Node-js/index.html","hash":"71808911382fff5d758c32471eaea2956b00b6e2","modified":1599981444429},{"_id":"public/tags/https/index.html","hash":"b8d0e236b0c5f4809d4d74fb372fc4057ccd3f25","modified":1599981444429},{"_id":"public/tags/acme-sh/index.html","hash":"c122cfba108da3db4357d742a662ee5f1ac5c4d4","modified":1599981444429},{"_id":"public/tags/docker/index.html","hash":"05d3fa26c67d86c524cdb30cace5c64cdeefcba3","modified":1599981444429},{"_id":"public/tags/证书/index.html","hash":"c6c08248c2f5ae5ac1971954255067a3ba63fd9c","modified":1599981444429},{"_id":"public/tags/nginx/index.html","hash":"870ce0b002470f79fb9a00c7a5f8b85065097848","modified":1599981444429},{"_id":"public/tags/storage/index.html","hash":"4d0906466e35d5970f3ecd0080d806b0c555f85f","modified":1599981444429},{"_id":"public/tags/存储位置/index.html","hash":"b09827f87d309143a19b60902bd6ccc61db76ec9","modified":1599981444429},{"_id":"public/tags/hexo/index.html","hash":"64aec0f7db87fe568ef5993c089bcab7c51bab3d","modified":1599981444429},{"_id":"public/tags/docker-compose/index.html","hash":"48233b7ada29f9609fffc3ab9f0a0347de7b0c20","modified":1599981444429},{"_id":"public/tags/cactus/index.html","hash":"cb1f2f3d770e538fb6342142048f54cc9b10dc42","modified":1599981444429},{"_id":"public/tags/themes/index.html","hash":"3c1162ca4ca44ddec0e18d4a152daf14ae4a9ae1","modified":1599981444429},{"_id":"public/tags/cordova/index.html","hash":"cb4948e4b387d2b00acbdb64394bebe44900dd12","modified":1599981444429},{"_id":"public/tags/插件/index.html","hash":"19d0cac672a81700c0417f56aa4b5be83406721a","modified":1599981444429},{"_id":"public/tags/plugin/index.html","hash":"b258d8c91ab0d14475c270eb3ec3b0453c8ca171","modified":1599981444429},{"_id":"public/tags/cordova-plugin/index.html","hash":"7557002daf03757bba430da0b4cbfcb7e92b3bb4","modified":1599981444429},{"_id":"public/tags/开发/index.html","hash":"85dea74f7ec753bbc2ac46910157d2f44c185e53","modified":1599981444429},{"_id":"public/tags/drone/index.html","hash":"db5ce7563ee9654ffbf21eccb794f9f571f40383","modified":1599981444429},{"_id":"public/tags/rancher/index.html","hash":"72f40bf8b8ea7d10c969739f0f7b6017197c56eb","modified":1599981444429},{"_id":"public/tags/gitea/index.html","hash":"5a847519ac80487d7f3f55df2c034a3dc1d74883","modified":1599981444429},{"_id":"public/tags/golang/index.html","hash":"c8bfd4661206992cb3860fa528a49f6c722b5b35","modified":1599981444429},{"_id":"public/tags/go/index.html","hash":"60292611be208f6bdee581d845620f2fd652b9a9","modified":1599981444430},{"_id":"public/tags/goproxy/index.html","hash":"35c80728ea2f91b1e0457059b7d84c80bb25ad6a","modified":1599981444430},{"_id":"public/tags/2018/index.html","hash":"2fbc7c5d8b107d5cb06dd72be0fe72d98305a2c3","modified":1599981444430},{"_id":"public/tags/wdo/index.html","hash":"f02fa3403da10d8f041515866a65169768b732ee","modified":1599981444430},{"_id":"public/tags/joehisaishi/index.html","hash":"7c22797a5a01adf647f886e191cb6a0462ac5337","modified":1599981444430},{"_id":"public/tags/久石让/index.html","hash":"eeff616201f509c7cc51c6204bc12e83fd29b456","modified":1599981444430},{"_id":"public/tags/jenkins/index.html","hash":"2572b4fa8952a369c7cc0ac3baae8d106d89a8b7","modified":1599981444430},{"_id":"public/tags/maven/index.html","hash":"150ecf58f4bed337ecf04152223afaba692f13f6","modified":1599981444430},{"_id":"public/tags/seata/index.html","hash":"a554f25f88b710e1bfa685efa8e33f1085277460","modified":1599981444430},{"_id":"public/tags/mybatis-plus/index.html","hash":"2257f740dae3d6265797f472192604cb4825b3f2","modified":1599981444430},{"_id":"public/tags/spring-boot/index.html","hash":"6f47ad489cb6cb3f29e9c43dab068dc84a678076","modified":1599981444430},{"_id":"public/tags/多数据源/index.html","hash":"0bb78a830f09b6875600677407185abd20dcd393","modified":1599981444430},{"_id":"public/tags/事务/index.html","hash":"dd896a32781cb762b7c0a1bdc4d0fbc8f92a227c","modified":1599981444430},{"_id":"public/tags/nacos/index.html","hash":"cdd308ebfd88a783318f28880040da6bbb9f2ac3","modified":1599981444430},{"_id":"public/tags/Prometheus/index.html","hash":"0e328f3ded85fabad0010c0a340eec11ef0c8846","modified":1599981444430},{"_id":"public/tags/Java/index.html","hash":"0665df4ee04b5e58d9a963c31552deae40f87680","modified":1599981444430},{"_id":"public/tags/Grafana/index.html","hash":"8915f7bd4113c9a043235430a9c320d25b343a2a","modified":1599981444430},{"_id":"public/tags/mysql/index.html","hash":"9c7b95da45addd794b81f42e3ceedc8c39f6b49a","modified":1599981444430},{"_id":"public/tags/java/index.html","hash":"61ded7114b62b5faaf82b2b076b601723fa73f9c","modified":1599981444430},{"_id":"public/tags/自动化构建/index.html","hash":"bd367fd60cd4835b1204a83d609339660dc889c8","modified":1599981444430},{"_id":"public/tags/ssh/index.html","hash":"3f4481c60c5144a10301b438090ed4ac1612575e","modified":1599981444430},{"_id":"public/tags/mybaits/index.html","hash":"5b6868c2efc84c24a7c190746ad9d47d79f56ff1","modified":1599981444430},{"_id":"public/tags/自动部署/index.html","hash":"edddba12c0ff18aaa55a37256a8bf43fda877906","modified":1599981444430},{"_id":"public/tags/CI-CD/index.html","hash":"178257c55d451eefc57813596146040631393c8a","modified":1599981444430},{"_id":"public/tags/持续集成/index.html","hash":"8873fd7072e4be8ddb99ef4226425ffc204171c5","modified":1599981444431},{"_id":"public/tags/持续部署/index.html","hash":"06829ea3fcb767a4eae40deae5f6cb99739c2946","modified":1599981444431},{"_id":"public/tags/canal/index.html","hash":"acb5c697438eb3a7fc2b71160f7c51094c2eb49e","modified":1599981444431},{"_id":"public/tags/canal-server/index.html","hash":"1fd7ef9230740f4f09a36344af976022130a80b6","modified":1599981444431},{"_id":"public/tags/canal-adapter/index.html","hash":"2fff4fcb1515306c339e8527beed5425d2582df7","modified":1599981444431},{"_id":"public/tags/mycat/index.html","hash":"9fcedc2f863bde0a6ba2df1e26353dcc7e24fdd0","modified":1599981444431},{"_id":"public/tags/database/index.html","hash":"4c59e79b376e686ca86993bff08325ed48b0cd20","modified":1599981444431},{"_id":"public/tags/sharding-jdbc/index.html","hash":"411172818650d8cae3c09da2dfaa908b58dd1f54","modified":1599981444431},{"_id":"public/tags/分库分表/index.html","hash":"3a14a8f65eb222ced3b0925c2eb58e28b64e2b7f","modified":1599981444431},{"_id":"public/tags/sqlserver/index.html","hash":"a3a19d0f5754f2b2f4cbe265fac7a39420aea19f","modified":1599981444431},{"_id":"public/tags/springboot/index.html","hash":"fdebd0bbe9b58a19b2c21c3cf08840896a6fe9b2","modified":1599981444431},{"_id":"public/archives/index.html","hash":"1f2010969188f52a942f8fd7da33ac14cdfeb571","modified":1599981444431},{"_id":"public/archives/page/2/index.html","hash":"b4012653a4cc40ca00a22d7f92640ccd902dba86","modified":1599981444431},{"_id":"public/archives/2016/index.html","hash":"efc5436ec4af0ee99af82b435955b5fbae3820ee","modified":1599981444431},{"_id":"public/archives/2016/06/index.html","hash":"6c9e93464c7ad6cc9855798d8ebf7c0a682c08de","modified":1599981444431},{"_id":"public/archives/2018/index.html","hash":"28576f75c33c37cfa6f59eb5fa9bd8dd69d7e0d3","modified":1599981444431},{"_id":"public/archives/2018/09/index.html","hash":"f1f2baed3a2255a8fb6eadd92038e96815a0ed6d","modified":1599981444431},{"_id":"public/archives/2019/index.html","hash":"a08d95a3c837ff3ce300faf781997746b02ff58d","modified":1599981444431},{"_id":"public/archives/2019/09/index.html","hash":"8684d4c635ced58160f715b6cc951dc71d773363","modified":1599981444431},{"_id":"public/archives/2019/10/index.html","hash":"8f3f4b82e8a3e7cf0b60e2c65acbbb37b4db1816","modified":1599981444431},{"_id":"public/archives/2019/12/index.html","hash":"ec8e4e895e358a640bc00478c368a4f87a01b1d3","modified":1599981444431},{"_id":"public/archives/2020/index.html","hash":"03e8198c7cb7b35a0fce8e61de338c6c9a4708a4","modified":1599981444431},{"_id":"public/archives/2020/02/index.html","hash":"d35487a77a788b1c5e9aeef2e986deb10f70d413","modified":1599981444431},{"_id":"public/archives/2020/03/index.html","hash":"22d72ba82b10c41fe3c83e4858eda09bb86b3a50","modified":1599981444431},{"_id":"public/archives/2020/04/index.html","hash":"06c55ebbe19f5a6bada2baa13167a5a28950ac67","modified":1599981444431},{"_id":"public/archives/2020/09/index.html","hash":"b3f1a0c117593e30e1128da2da380041ca4d9a04","modified":1599981444431},{"_id":"public/page/2/index.html","hash":"155a3adfb2a6394cfb4c177e3fb51f9df9eb555c","modified":1599981444432},{"_id":"public/categories/学习/index.html","hash":"9b8faec815e2e8f6009bd59a002a41ecc67a2cec","modified":1599981444432},{"_id":"public/index.html","hash":"20c9cfb5048cf48ba0abe6f4985adb92f6b71ddc","modified":1599981444432},{"_id":"public/categories/音乐会/index.html","hash":"5a269e0feb7994da4d61a0d174baafd06117df95","modified":1599981444432},{"_id":"public/2020/09/12/acme-sh-free-ssl/index.html","hash":"9747e3acbae2eb6aa4e0f54fac3ea2ebb4aaaf1e","modified":1599981444432},{"_id":"public/2020/04/23/cordova-plugin/index.html","hash":"8eef9be4d63b85f32d1b7297f3be6fa20d49bb58","modified":1599981444432},{"_id":"public/2020/04/13/docker-change-storage/index.html","hash":"2236362f854f9b24727c2004be5ee0480e56aa1d","modified":1599981444432},{"_id":"public/2020/03/30/docker-install-docker-compose-install/index.html","hash":"2b49b5cfe84e911c6e090acb322e9b63afd4c469","modified":1599981444432},{"_id":"public/2020/04/13/ssh-key-login/index.html","hash":"261b7be392d0c40a5211abffdbbd69f70422b210","modified":1599981444432},{"_id":"public/2020/03/07/use-canal/index.html","hash":"fc5c0adeff1e74f04bb469bcea06d93dce4ce58a","modified":1599981444432},{"_id":"public/2020/03/07/prometheus-grafana/index.html","hash":"5ef11c4ecee794492a46c040ca5b0f07aa6b76fa","modified":1599981444432},{"_id":"public/2020/02/19/golang-install/index.html","hash":"a58a47324868fcbda2c5bcaebef83b77543854c5","modified":1599981444432},{"_id":"public/2020/02/18/docker-rancher-drone-gitea/index.html","hash":"fe64c1754185c91ad6090c4c51cc3b26264eb862","modified":1599981444432},{"_id":"public/2019/12/12/springboot-seate-multiple-datasource-mybatis-plus/index.html","hash":"0afc199b6cfad94da3297c98d326eb828176d77a","modified":1599981444432},{"_id":"public/2019/10/19/jenkins-maven/index.html","hash":"f06774a605184ccc87b68826a7af8f5f03bf79b5","modified":1599981444432},{"_id":"public/2019/09/11/use-mycat/index.html","hash":"7a39c7221244c4e789cc2d2b1841708fcb933994","modified":1599981444432},{"_id":"public/2019/09/11/use-multi-datasource/index.html","hash":"18679bc3176baba1555fd7c0256cbcfe323399df","modified":1599981444432},{"_id":"public/2019/09/11/change-themes/index.html","hash":"8ff2f0b741ccf90645b11328ca77aa3a7264891a","modified":1599981444432},{"_id":"public/2018/09/20/joehisaishi-wdo-2018-ch/index.html","hash":"49e43a4fa1f07ef39862fc92e27d4b1b03a76369","modified":1599981444433},{"_id":"public/2016/06/17/build-blog/index.html","hash":"03506cb9212accd6de067a0f9a20129fbe404ff0","modified":1599981444433},{"_id":"public/tags/elasticsearch/index.html","hash":"ba737e2af7e2b3158b0325a36c388dd6a8e1f27f","modified":1599981444460},{"_id":"public/tags/cluster/index.html","hash":"76618f4a484d37a77afc9e845d049c875c9c284a","modified":1599981444460},{"_id":"public/tags/异常/index.html","hash":"d13e88c70a5f63910be1410d6f3b87d144739313","modified":1599981444500},{"_id":"public/tags/elasticsearch集群安装/index.html","hash":"dac7d4b8f8fdcdd4e21d5120292edf929733cc6a","modified":1599981444500},{"_id":"public/tags/elasticsearch集群安装配置/index.html","hash":"01168b1bf484a44b1d8547350902a7dc57370a81","modified":1599981444501},{"_id":"public/tags/error/index.html","hash":"fc4aae6dba5f1b9d6b651ed4c3451c5516cb64d0","modified":1599981444501},{"_id":"public/tags/Data-too-large/index.html","hash":"c14d7030e76f28daba275612b7be7629cc38d382","modified":1599981444501},{"_id":"public/tags/maximum-allowed-to-be-analyzed-for-highlighting/index.html","hash":"2216e1274c0d90867b2252855c6dd16d6292e4bc","modified":1599981444501},{"_id":"public/archives/2020/07/index.html","hash":"c9fd9ac87d9b8774ab33062322f7e250bf353e1a","modified":1599981444501},{"_id":"public/archives/2020/08/index.html","hash":"7059fe3fb6588022a9feaab06d255d7ec48e6a64","modified":1599981444501},{"_id":"public/categories/学习/page/2/index.html","hash":"0c76ba8d05631807374bc029e020d33101341448","modified":1599981444501},{"_id":"public/categories/学习/docker/index.html","hash":"584609dcdfc44ed194f590505c293d4a9202a92c","modified":1599981444501},{"_id":"public/categories/学习/hexo/index.html","hash":"470ae2dea0c6d31c26674ddca61b9a0b0e32abdc","modified":1599981444501},{"_id":"public/categories/学习/nginx/index.html","hash":"480f16851eaacf2fc867ffab1a2fda5ef030d2b0","modified":1599981444501},{"_id":"public/categories/学习/cordova/index.html","hash":"d52df7d0ed2fac0f8044bbf5d10f97cf99661503","modified":1599981444501},{"_id":"public/categories/学习/docker/elasticsearch/index.html","hash":"a41d874cfd8489c7933f74ebff47d23737a02ac9","modified":1599981444501},{"_id":"public/categories/音乐会/久石让/index.html","hash":"5e3288baac57890b63def52e2f6299aaed3c1956","modified":1599981444501},{"_id":"public/2020/09/13/elasticsearch-error-1/index.html","hash":"8cbd2002f5d19b72f6ecc5327c5fada925b0e81c","modified":1599981444501},{"_id":"public/2020/08/13/elasticsearch-error-2/index.html","hash":"bd93e68ee9e04ba98d262a8ad544184bc4dc77d8","modified":1599981444501},{"_id":"public/2020/07/20/elasticsearch-cluster-install/index.html","hash":"cdedda1051afcc62bfe0461d32cb5ccae1d42d6e","modified":1599981444501},{"_id":"public/categories/学习/golang/index.html","hash":"9ff1b69980c88a2109e2029d5cf26bc6d4cf626d","modified":1599981444508},{"_id":"public/categories/学习/hexo/themes/index.html","hash":"50f95882bbd6dc9bf386fd9e29d2754e60e376f9","modified":1599981444508},{"_id":"public/categories/学习/jenkins/index.html","hash":"85b59dc256f56c1bc21395b6ed2132f3efee471f","modified":1599981444508},{"_id":"public/categories/学习/java/index.html","hash":"42e8cee9d795ae38750603aff2dce223b3d5627a","modified":1599981444508},{"_id":"public/categories/学习/cordova/plugin/index.html","hash":"b89fb0f166dea2d4906b59f73bf0c7d53e45c36c","modified":1599981444508},{"_id":"public/categories/学习/docker/Grafana/index.html","hash":"4fd093a9e23e8de4d963999a12458c794ea62d94","modified":1599981444508},{"_id":"public/categories/学习/mybatis/index.html","hash":"b1cd64f08ed06a65f19d2a49fa113340623932d4","modified":1599981444508},{"_id":"public/categories/学习/linux/index.html","hash":"9b5a87314f18a45a6a80c03efede283ad81231cf","modified":1599981444508},{"_id":"public/categories/学习/nginx/https/index.html","hash":"0d3ac4473d5b0b9bbb19983ec44649d3fbb856df","modified":1599981444508},{"_id":"public/categories/学习/data/index.html","hash":"71f52f747aa35a62da88dca80fedef80c28a1a17","modified":1599981444508},{"_id":"public/categories/学习/docker/rancher/index.html","hash":"bd84bc63a3ecf99a31c6c2cb178f9410281ddea6","modified":1599981444508},{"_id":"public/categories/学习/docker/elasticsearch/error/index.html","hash":"571db4c6fc5b531dfe0530187ff5f129ac0f7a30","modified":1599981444508},{"_id":"public/categories/学习/jenkins/error/index.html","hash":"233e092895af8ddd2c5c671873588ba656ebed8a","modified":1599981444508},{"_id":"public/categories/学习/java/事务/index.html","hash":"bfd0d7cbeeb821857f3b070236566800702799e0","modified":1599981444508},{"_id":"public/categories/学习/mybatis/error/index.html","hash":"84efaad8a176379af29357663c4afd091c76d090","modified":1599981444509},{"_id":"public/categories/学习/java/事务/多数据源/index.html","hash":"622572789e08de45835bf03685b179f4281590f3","modified":1599981444509},{"_id":"public/images/apple-touch-icon.png","hash":"75c1369b3a20ca1e9209c931cdfec34eaa5a0126","modified":1599981444509},{"_id":"public/images/favicon-192x192.png","hash":"75c1369b3a20ca1e9209c931cdfec34eaa5a0126","modified":1599981444509},{"_id":"public/images/logo.png","hash":"750f2e3d3333f01a66d3bdfa86fc9561105d1005","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Bold.woff","hash":"df15fd1e74b6f4a50bea57e2b44d9627f38495b5","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Bold.woff2","hash":"62447a951d48b21c4696ae72df4bc4adef636e26","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Black.woff","hash":"37443d0040f0d7af381c955e4c15919a15d0349e","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Light.woff","hash":"32ae5c0d1d5943c8bb8e0f6ab07c3269c6f8b8a8","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Black.woff2","hash":"0a257c8b60e0f20802c1dc8daeed2d3cb0d44f17","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Light.woff2","hash":"ef07a250766fea840c1049e67c0405d9216ee0a8","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Medium.woff","hash":"f5653059b2a5929516e4aab02329a978600b9b67","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Medium.woff2","hash":"668400ae92700965f03f2371faaee0ab8c8347c3","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Thin.woff2","hash":"c3be79b553ec394db71268d604b1d29183b867dc","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir-Thin.woff","hash":"ad4d46a99a1daf6353c86c79ac3a2b030213859c","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir.woff2","hash":"30ce165216db078951a690a6ad665b9b78f5dd81","modified":1599981444509},{"_id":"public/lib/vazir-font/Vazir.woff","hash":"bbee70033f0f5882e9869e417b69c6a38f56f187","modified":1599981444509},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.eot","hash":"42ff503f20e97503cef8e5b2ec10ae07699d7c01","modified":1599981444509},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.woff","hash":"7b3f44b4d3028f3c87ddf0f4bd62511c9bf4a87e","modified":1599981444509},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.woff2","hash":"9784edb76f8a2ed595ea4bf74d46cda4eff3b303","modified":1599981444509},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.ttf","hash":"c140085833a38abec6b7df99d4ccac93eb266031","modified":1599981444509},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.woff2","hash":"92da6e3c7121e21cdfde25ef08797a3937a683e1","modified":1599981444509},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.woff2","hash":"d902f8db3e021155f177f698a252fb98d6e61768","modified":1599981444509},{"_id":"public/2016/06/17/build-blog/Githubpicture.png","hash":"c013fb3cd2dc82adca7cc4f15061b0b269f6ffb5","modified":1599981444509},{"_id":"public/favicon.ico","hash":"6606244b893abf5048902b7edb7ae14cf720e660","modified":1599981444720},{"_id":"public/lib/vazir-font/Vazir-Black.eot","hash":"13d026ff857c853cbd0dc519b6e58669db309441","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Black.ttf","hash":"594dc3344ad14903c247615427d1009709f0f5a4","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Bold.ttf","hash":"2e6c9df9f775373fb1988ae8529aa8f05313dae6","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Light.eot","hash":"3edffd7bb61eee8cd46b57225f9f9e5264e3362b","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Bold.eot","hash":"f76ec625e15522ff60d21f7a9a3b71c65bc27556","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Light.ttf","hash":"9f1e2934098a6a4a7c5584c8f3fa24a707070da3","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Medium.eot","hash":"1f5a73db7947ef22c8a2bb19d6449b80496c03c4","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Medium.ttf","hash":"295f7e02c9b157e7ea63ad09613b00ceab85c5cd","modified":1599981444721},{"_id":"public/lib/vazir-font/Vazir-Thin.eot","hash":"08e1503d1181188690fd9c81860d6c890c1465f6","modified":1599981444722},{"_id":"public/lib/vazir-font/Vazir-Thin.ttf","hash":"a6aa450ee6e0f85786474ca6b04827ef97e81af4","modified":1599981444722},{"_id":"public/lib/vazir-font/Vazir.eot","hash":"31a9219c25fe1991fb745ec8dbbcf45c6094a702","modified":1599981444722},{"_id":"public/lib/vazir-font/Vazir.ttf","hash":"f22b219824026e490a581ddb3b36b07997dff0e3","modified":1599981444722},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.woff","hash":"f9d835a0f9248b1bb33d66968e87c4a50103ed8d","modified":1599981444722},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.woff","hash":"80d33a73cbb60e206ef6f5c898988641576c7dda","modified":1599981444722},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.eot","hash":"644ece8263d2f96b087eebf7f6d4e309e5898eb5","modified":1599981444722},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.ttf","hash":"19e302760e39e25a5f8d90d6cd0164ef6cd74f8c","modified":1599981444722},{"_id":"public/css/rtl.css","hash":"c2c2bc4ce311b3129275e009e903088b45e7ed77","modified":1599981444767},{"_id":"public/lib/clipboard/clipboard.min.js","hash":"ee60ca5ba9401456105ef703a98092369b579c80","modified":1599981444767},{"_id":"public/js/search.js","hash":"a74d0c601f820160825a2e4ad13618074d714933","modified":1599981444767},{"_id":"public/js/main.js","hash":"584c5a69ac81a483a1c4377a2e2cf326c2795e7b","modified":1599981444767},{"_id":"public/lib/vazir-font/font-face.css","hash":"8f2bf6b59ae1f2ed4c2fead6cea4b8314fcf62e5","modified":1599981444767},{"_id":"public/lib/justified-gallery/css/justifiedGallery.min.css","hash":"92bb6e468a1db7fbd99ccb960e15e28572254263","modified":1599981444767},{"_id":"public/css/style.css","hash":"8daf4819724da501297cf0b2b26f9dbfc7a64b86","modified":1599981444767},{"_id":"public/lib/jquery/jquery.min.js","hash":"0dc32db4aa9c5f03f3b38c47d883dbd4fed13aae","modified":1599981444767},{"_id":"public/lib/font-awesome/css/all.min.css","hash":"cf1a3fd771900af34f2af22142beecfb47367548","modified":1599981444767},{"_id":"public/lib/justified-gallery/js/jquery.justifiedGallery.min.js","hash":"82ab395176c927ffbb2f7c95132ee0a06cd5d64a","modified":1599981444767},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.ttf","hash":"c445864a9646948e0d7ff44930ad732ee61427d8","modified":1599981444768},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.svg","hash":"6fcc06741ad4cdeefa546ce3e1af3a9b682a8429","modified":1599981444814},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.eot","hash":"10740942ec6b3f4985529d343402d0bf32f9f847","modified":1599981444866},{"_id":"public/lib/meslo-LG/MesloLGM-BoldItalic.ttf","hash":"b542b9591fbf33925d93f0695b6e123a9f0cfd43","modified":1599981444878},{"_id":"public/lib/meslo-LG/MesloLGM-Italic.ttf","hash":"93ebc5098cf57a32b7b8d297681f31692c09bdfa","modified":1599981444878},{"_id":"public/lib/meslo-LG/MesloLGL-BoldItalic.ttf","hash":"b7d24ab1e4fad720f31a2b0cca1904ce1740d846","modified":1599981444878},{"_id":"public/lib/meslo-LG/MesloLGS-Italic.ttf","hash":"9d757cc9f928fc83b2133283dd639c12b11d94ad","modified":1599981444878},{"_id":"public/lib/meslo-LG/MesloLGS-BoldItalic.ttf","hash":"926035f0156cccf1b0ca507347f39bf9c510f51e","modified":1599981444878},{"_id":"public/lib/meslo-LG/MesloLGL-Italic.ttf","hash":"9a23c6898b0943bd3d96c04df9a0f66e919451d8","modified":1599981444879},{"_id":"public/lib/meslo-LG/MesloLGM-Bold.ttf","hash":"58be4b7760e9a84daa81929d046f9a15c4fd1c1a","modified":1599981444881},{"_id":"public/lib/meslo-LG/MesloLGS-Bold.ttf","hash":"f9918fb93d6ab6850f5d38069a999c311af78816","modified":1599981444881},{"_id":"public/lib/meslo-LG/MesloLGS-Regular.ttf","hash":"de559f8d70d5b1ab2810597bfd0b1b9506f3ef01","modified":1599981444881},{"_id":"public/lib/meslo-LG/MesloLGL-Bold.ttf","hash":"34f7db59f1d023294e69976aa20b7d52b86165a4","modified":1599981444882},{"_id":"public/lib/meslo-LG/MesloLGM-Regular.ttf","hash":"20ce1fc7ae1254558ca044ae48283faaa58897e5","modified":1599981444883},{"_id":"public/lib/meslo-LG/MesloLGL-Regular.ttf","hash":"6c090d6bff3928fbf8a5f4104e58ed7f421aea7c","modified":1599981444883},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.svg","hash":"21731b0d1c81d0eb710b89fafb50a056dda00b97","modified":1599981444890},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.svg","hash":"ec8851ea10277bc5c73eb56da111b3e3f52b9def","modified":1599981444896}],"Category":[{"name":"学习","_id":"ckf0rn2gj000558sy0razs9mf"},{"name":"docker","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2gz000m58syhci847uf"},{"name":"hexo","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2h2000r58syhf4m8y9o"},{"name":"cordova","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2h5000y58syzd9j2riz"},{"name":"nginx","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2h7001358syhvl5mjt0"},{"name":"elasticsearch","parent":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2hh001o58syy5hj412c"},{"name":"golang","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hi001v58sy0mq826jl"},{"name":"音乐会","_id":"ckf0rn2hj001y58sywo5n1vfq"},{"name":"themes","parent":"ckf0rn2h2000r58syhf4m8y9o","_id":"ckf0rn2hk002258sy7n6ndcht"},{"name":"jenkins","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hl002558sy9zol191j"},{"name":"java","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hm002958syg0yxzzsx"},{"name":"plugin","parent":"ckf0rn2h5000y58syzd9j2riz","_id":"ckf0rn2hn002f58sy868tvw93"},{"name":"Grafana","parent":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2ho002h58sy7tvum34o"},{"name":"mybatis","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hp002k58sykkf71qtv"},{"name":"linux","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hq002o58sylxdw4018"},{"name":"https","parent":"ckf0rn2h7001358syhvl5mjt0","_id":"ckf0rn2hr002t58syc5gxc5an"},{"name":"data","parent":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hv003458syl8ajwww7"},{"name":"rancher","parent":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2hw003958sy3yn0kltb"},{"name":"error","parent":"ckf0rn2hh001o58syy5hj412c","_id":"ckf0rn2i2003s58syvtpvfavv"},{"name":"久石让","parent":"ckf0rn2hj001y58sywo5n1vfq","_id":"ckf0rn2i3003x58sy96r1h13t"},{"name":"error","parent":"ckf0rn2hl002558sy9zol191j","_id":"ckf0rn2i4004058syes8ogi9b"},{"name":"事务","parent":"ckf0rn2hm002958syg0yxzzsx","_id":"ckf0rn2i6004658sy2gsuojqa"},{"name":"error","parent":"ckf0rn2hp002k58sykkf71qtv","_id":"ckf0rn2i7004d58sycsmzdgnh"},{"name":"多数据源","parent":"ckf0rn2i6004658sy2gsuojqa","_id":"ckf0rn2ib004r58syjzhxw79t"}],"Data":[],"Page":[{"_content":"<!DOCTYPE html>\n<html>\n<head>\n\t<title>404</title>\n</head>\n<body>\n<center>\n<div style=\"font-size: 180px\">404</div>\n<p style=\"font-size: 50px\">Page not found</p>\n<a style=\"color: black;text-decoration: none;font-size: 30px\" href=\"/\">返回首页</a>\n</center>\n</body>\n</html>","source":"404.html","raw":"<!DOCTYPE html>\n<html>\n<head>\n\t<title>404</title>\n</head>\n<body>\n<center>\n<div style=\"font-size: 180px\">404</div>\n<p style=\"font-size: 50px\">Page not found</p>\n<a style=\"color: black;text-decoration: none;font-size: 30px\" href=\"/\">返回首页</a>\n</center>\n</body>\n</html>","date":"2019-09-12T00:09:48.976Z","updated":"2019-09-12T00:09:48.976Z","path":"404.html","title":"","comments":1,"layout":"page","_id":"ckf0rn2fp000058syzgyb0h3b","content":"<!DOCTYPE html>\n<html>\n<head><meta name=\"generator\" content=\"Hexo 3.9.0\">\n\t<title>404</title>\n</head>\n<body>\n<center>\n<div style=\"font-size: 180px\">404</div>\n<p style=\"font-size: 50px\">Page not found</p>\n<a style=\"color: black;text-decoration: none;font-size: 30px\" href=\"/\">返回首页</a>\n</center>\n</body>\n</html>","site":{"data":{}},"excerpt":"","more":"<!DOCTYPE html>\n<html>\n<head><meta name=\"generator\" content=\"Hexo 3.9.0\">\n\t<title>404</title>\n</head>\n<body>\n<center>\n<div style=\"font-size: 180px\">404</div>\n<p style=\"font-size: 50px\">Page not found</p>\n<a style=\"color: black;text-decoration: none;font-size: 30px\" href=\"/\">返回首页</a>\n</center>\n</body>\n</html>"},{"title":"书单","date":"2019-09-19T01:46:46.000Z","_content":"\n>绝大多数从1949年到1976年的中国当代文学作品不必读。\n>很多当代中国人写的历史小说不必读。\n>绝大多数西方通俗小说不必读。\n>所有名著的续书不必读。\n>一些古老的哲学著作不必读。\n>所有的成功学、心灵学、鸡汤类书都不必读。\n>所有阴谋论的书不要读。 [——摘自知乎](https://zhuanlan.zhihu.com/p/55960306)\n\n---\n- [x] [《解忧杂货店》](https://book.douban.com/subject/25862578/)\n- [x] [《人间失格》](https://book.douban.com/subject/6973970/)\n- [x] [《流浪地球》](https://book.douban.com/subject/3266609/)\n- [x] [《祈祷落幕时》](https://book.douban.com/subject/26118072/)\n- [x] [《嫌疑人X的献身》](https://book.douban.com/subject/25924253/)\n- [x] [《三体》](https://book.douban.com/subject/2567698/)\n- [x] [《时生》](https://book.douban.com/subject/4152754/)\n\n---\n- [ ] [《自控力》](https://book.douban.com/subject/10786473/) 10%\n- [ ] [《原则》](https://book.douban.com/subject/27608239/) 40%\n- [ ] [《傲慢与偏见》](https://book.douban.com/subject/4881639/) 20%\n- [ ] [《刻意练习》](https://book.douban.com/subject/26895993/) 25%\n- [ ] [《白夜行》](https://book.douban.com/subject/27112607/) 30%\n- [ ] [《金瓶梅》](https://book.douban.com/subject/1916451/) 20%\n- [ ] [《聊斋》](https://book.douban.com/subject/1036397/) 10%\n\n---\n- [ ] [《精力管理》](https://book.douban.com/subject/1019959/)\n- [ ] [《资治通鉴》](https://book.douban.com/subject/2029680/) [https://tongjian.qiaopang.com/](https://tongjian.qiaopang.com/)\n- [ ] [《娱乐至死》](https://book.douban.com/subject/26319730/)\n- [ ] [《影响力》](https://book.douban.com/subject/1786387/)\n- [ ] [《思考,快与慢》](https://book.douban.com/subject/10785583/)\n- [ ] [《富爸爸穷爸爸》](https://book.douban.com/subject/1033778/)\n- [ ] [《学会提问》](https://book.douban.com/subject/20428922/)\n- [ ] [《系统思考》](https://book.douban.com/subject/1156866/)\n- [ ] [《少有人走的路》](https://book.douban.com/subject/6438010/)\n- [ ] [《慢思考》](https://book.douban.com/subject/26839427/)\n- [ ] [《一日浮生:十个探问生命意义的故事》](https://book.douban.com/subject/26296901/)\n- [ ] [《心理学的故事》](https://book.douban.com/subject/1007667/)\n- [ ] [《红与黑》](https://book.douban.com/subject/1007433/)\n- [ ] [《活着》](https://book.douban.com/subject/4913064/)\n- [ ] [《亲爱的安德烈》](https://book.douban.com/subject/3369793/)\n- [ ] [《挪威的森林》](https://book.douban.com/subject/27200257/)\n- [ ] [《我们时代的神经症人格》](https://book.douban.com/subject/25768155/)\n- [ ] [《非暴力沟通》](https://book.douban.com/subject/3533221/)\n- [ ] [《关键对话》](https://book.douban.com/subject/10586741/)\n- [ ] [《人类简史》](https://book.douban.com/subject/25985021/)\n- [ ] [《斯坦福大学人生设计课》](https://book.douban.com/subject/27601926/)\n- [ ] [《复活》](https://book.douban.com/subject/1255288/)\n- [ ] [《纸牌屋》](https://book.douban.com/subject/25808056/)\n- [ ] [《老人与海》](https://book.douban.com/subject/26983338/)\n- [ ] [《后来的事情》](https://book.douban.com/subject/4311472/)\n- [ ] [《门》](https://book.douban.com/subject/4311471/)\n- [ ] [《我是猫》](https://book.douban.com/subject/26410730/)\n- [ ] [《罗马帝国衰亡史》](https://book.douban.com/subject/30248326/)\n- [ ] [《人性的弱点》](https://book.douban.com/subject/30262779/)\n- [ ] [《百年孤独》](https://book.douban.com/subject/27107109/)\n- [ ] [《巴黎圣母院》](https://book.douban.com/subject/30259724/)\n- [ ] [《九型人格》](https://book.douban.com/subject/4275052/)\n- [ ] [《和时间做朋友》](https://book.douban.com/subject/27166782/)\n- [ ] [《瓦尔登湖》](https://book.douban.com/subject/3522695/)\n- [ ] [《人类动物园》](https://book.douban.com/subject/4312825/)\n- [ ] [《巨人的陨落》](https://book.douban.com/subject/26698660/)\n- [ ] [《双城记》](https://book.douban.com/subject/26915894/)\n- [ ] [《叛逆精神》](https://book.douban.com/subject/27913606/)\n- [ ] [《战胜拖延症》](https://book.douban.com/subject/30184839/)\n- [ ] [《未来简史》](https://book.douban.com/subject/26943161/)\n- [ ] [《万历十五年》](https://book.douban.com/subject/26418524/)\n- [ ] [《拖延心理学》](https://book.douban.com/subject/4180711/)\n- [ ] [《洛丽塔》](https://book.douban.com/subject/1465324/)\n- [ ] [《恶意》](https://book.douban.com/subject/26877752/)\n- [ ] [《罪与罚》](https://book.douban.com/subject/2253402/)\n- [ ] [《1984》](https://book.douban.com/subject/23774518/)\n- [ ] [《变形记》](https://book.douban.com/subject/1873900/)\n- [ ] [《姑获鸟之夏》](https://book.douban.com/subject/3140801/)\n\n","source":"booklist/index.md","raw":"---\ntitle: 书单\ndate: 2019-09-19 09:46:46\n---\n\n>绝大多数从1949年到1976年的中国当代文学作品不必读。\n>很多当代中国人写的历史小说不必读。\n>绝大多数西方通俗小说不必读。\n>所有名著的续书不必读。\n>一些古老的哲学著作不必读。\n>所有的成功学、心灵学、鸡汤类书都不必读。\n>所有阴谋论的书不要读。 [——摘自知乎](https://zhuanlan.zhihu.com/p/55960306)\n\n---\n- [x] [《解忧杂货店》](https://book.douban.com/subject/25862578/)\n- [x] [《人间失格》](https://book.douban.com/subject/6973970/)\n- [x] [《流浪地球》](https://book.douban.com/subject/3266609/)\n- [x] [《祈祷落幕时》](https://book.douban.com/subject/26118072/)\n- [x] [《嫌疑人X的献身》](https://book.douban.com/subject/25924253/)\n- [x] [《三体》](https://book.douban.com/subject/2567698/)\n- [x] [《时生》](https://book.douban.com/subject/4152754/)\n\n---\n- [ ] [《自控力》](https://book.douban.com/subject/10786473/) 10%\n- [ ] [《原则》](https://book.douban.com/subject/27608239/) 40%\n- [ ] [《傲慢与偏见》](https://book.douban.com/subject/4881639/) 20%\n- [ ] [《刻意练习》](https://book.douban.com/subject/26895993/) 25%\n- [ ] [《白夜行》](https://book.douban.com/subject/27112607/) 30%\n- [ ] [《金瓶梅》](https://book.douban.com/subject/1916451/) 20%\n- [ ] [《聊斋》](https://book.douban.com/subject/1036397/) 10%\n\n---\n- [ ] [《精力管理》](https://book.douban.com/subject/1019959/)\n- [ ] [《资治通鉴》](https://book.douban.com/subject/2029680/) [https://tongjian.qiaopang.com/](https://tongjian.qiaopang.com/)\n- [ ] [《娱乐至死》](https://book.douban.com/subject/26319730/)\n- [ ] [《影响力》](https://book.douban.com/subject/1786387/)\n- [ ] [《思考,快与慢》](https://book.douban.com/subject/10785583/)\n- [ ] [《富爸爸穷爸爸》](https://book.douban.com/subject/1033778/)\n- [ ] [《学会提问》](https://book.douban.com/subject/20428922/)\n- [ ] [《系统思考》](https://book.douban.com/subject/1156866/)\n- [ ] [《少有人走的路》](https://book.douban.com/subject/6438010/)\n- [ ] [《慢思考》](https://book.douban.com/subject/26839427/)\n- [ ] [《一日浮生:十个探问生命意义的故事》](https://book.douban.com/subject/26296901/)\n- [ ] [《心理学的故事》](https://book.douban.com/subject/1007667/)\n- [ ] [《红与黑》](https://book.douban.com/subject/1007433/)\n- [ ] [《活着》](https://book.douban.com/subject/4913064/)\n- [ ] [《亲爱的安德烈》](https://book.douban.com/subject/3369793/)\n- [ ] [《挪威的森林》](https://book.douban.com/subject/27200257/)\n- [ ] [《我们时代的神经症人格》](https://book.douban.com/subject/25768155/)\n- [ ] [《非暴力沟通》](https://book.douban.com/subject/3533221/)\n- [ ] [《关键对话》](https://book.douban.com/subject/10586741/)\n- [ ] [《人类简史》](https://book.douban.com/subject/25985021/)\n- [ ] [《斯坦福大学人生设计课》](https://book.douban.com/subject/27601926/)\n- [ ] [《复活》](https://book.douban.com/subject/1255288/)\n- [ ] [《纸牌屋》](https://book.douban.com/subject/25808056/)\n- [ ] [《老人与海》](https://book.douban.com/subject/26983338/)\n- [ ] [《后来的事情》](https://book.douban.com/subject/4311472/)\n- [ ] [《门》](https://book.douban.com/subject/4311471/)\n- [ ] [《我是猫》](https://book.douban.com/subject/26410730/)\n- [ ] [《罗马帝国衰亡史》](https://book.douban.com/subject/30248326/)\n- [ ] [《人性的弱点》](https://book.douban.com/subject/30262779/)\n- [ ] [《百年孤独》](https://book.douban.com/subject/27107109/)\n- [ ] [《巴黎圣母院》](https://book.douban.com/subject/30259724/)\n- [ ] [《九型人格》](https://book.douban.com/subject/4275052/)\n- [ ] [《和时间做朋友》](https://book.douban.com/subject/27166782/)\n- [ ] [《瓦尔登湖》](https://book.douban.com/subject/3522695/)\n- [ ] [《人类动物园》](https://book.douban.com/subject/4312825/)\n- [ ] [《巨人的陨落》](https://book.douban.com/subject/26698660/)\n- [ ] [《双城记》](https://book.douban.com/subject/26915894/)\n- [ ] [《叛逆精神》](https://book.douban.com/subject/27913606/)\n- [ ] [《战胜拖延症》](https://book.douban.com/subject/30184839/)\n- [ ] [《未来简史》](https://book.douban.com/subject/26943161/)\n- [ ] [《万历十五年》](https://book.douban.com/subject/26418524/)\n- [ ] [《拖延心理学》](https://book.douban.com/subject/4180711/)\n- [ ] [《洛丽塔》](https://book.douban.com/subject/1465324/)\n- [ ] [《恶意》](https://book.douban.com/subject/26877752/)\n- [ ] [《罪与罚》](https://book.douban.com/subject/2253402/)\n- [ ] [《1984》](https://book.douban.com/subject/23774518/)\n- [ ] [《变形记》](https://book.douban.com/subject/1873900/)\n- [ ] [《姑获鸟之夏》](https://book.douban.com/subject/3140801/)\n\n","updated":"2020-02-29T03:13:24.178Z","path":"booklist/index.html","comments":1,"layout":"page","_id":"ckf0rn2gg000258syfel1y44k","content":"<blockquote>\n<p>绝大多数从1949年到1976年的中国当代文学作品不必读。<br>很多当代中国人写的历史小说不必读。<br>绝大多数西方通俗小说不必读。<br>所有名著的续书不必读。<br>一些古老的哲学著作不必读。<br>所有的成功学、心灵学、鸡汤类书都不必读。<br>所有阴谋论的书不要读。 <a href=\"https://zhuanlan.zhihu.com/p/55960306\" target=\"_blank\" rel=\"noopener\">——摘自知乎</a></p>\n</blockquote>\n<hr>\n<ul>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25862578/\" target=\"_blank\" rel=\"noopener\">《解忧杂货店》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/6973970/\" target=\"_blank\" rel=\"noopener\">《人间失格》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3266609/\" target=\"_blank\" rel=\"noopener\">《流浪地球》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26118072/\" target=\"_blank\" rel=\"noopener\">《祈祷落幕时》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25924253/\" target=\"_blank\" rel=\"noopener\">《嫌疑人X的献身》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/2567698/\" target=\"_blank\" rel=\"noopener\">《三体》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4152754/\" target=\"_blank\" rel=\"noopener\">《时生》</a></li>\n</ul>\n<hr>\n<ul>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/10786473/\" target=\"_blank\" rel=\"noopener\">《自控力》</a> 10%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27608239/\" target=\"_blank\" rel=\"noopener\">《原则》</a> 40%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4881639/\" target=\"_blank\" rel=\"noopener\">《傲慢与偏见》</a> 20%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26895993/\" target=\"_blank\" rel=\"noopener\">《刻意练习》</a> 25%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27112607/\" target=\"_blank\" rel=\"noopener\">《白夜行》</a> 30%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1916451/\" target=\"_blank\" rel=\"noopener\">《金瓶梅》</a> 20%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1036397/\" target=\"_blank\" rel=\"noopener\">《聊斋》</a> 10%</li>\n</ul>\n<hr>\n<ul>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1019959/\" target=\"_blank\" rel=\"noopener\">《精力管理》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/2029680/\" target=\"_blank\" rel=\"noopener\">《资治通鉴》</a> <a href=\"https://tongjian.qiaopang.com/\" target=\"_blank\" rel=\"noopener\">https://tongjian.qiaopang.com/</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26319730/\" target=\"_blank\" rel=\"noopener\">《娱乐至死》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1786387/\" target=\"_blank\" rel=\"noopener\">《影响力》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/10785583/\" target=\"_blank\" rel=\"noopener\">《思考,快与慢》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1033778/\" target=\"_blank\" rel=\"noopener\">《富爸爸穷爸爸》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/20428922/\" target=\"_blank\" rel=\"noopener\">《学会提问》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1156866/\" target=\"_blank\" rel=\"noopener\">《系统思考》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/6438010/\" target=\"_blank\" rel=\"noopener\">《少有人走的路》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26839427/\" target=\"_blank\" rel=\"noopener\">《慢思考》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26296901/\" target=\"_blank\" rel=\"noopener\">《一日浮生:十个探问生命意义的故事》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1007667/\" target=\"_blank\" rel=\"noopener\">《心理学的故事》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1007433/\" target=\"_blank\" rel=\"noopener\">《红与黑》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4913064/\" target=\"_blank\" rel=\"noopener\">《活着》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3369793/\" target=\"_blank\" rel=\"noopener\">《亲爱的安德烈》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27200257/\" target=\"_blank\" rel=\"noopener\">《挪威的森林》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25768155/\" target=\"_blank\" rel=\"noopener\">《我们时代的神经症人格》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3533221/\" target=\"_blank\" rel=\"noopener\">《非暴力沟通》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/10586741/\" target=\"_blank\" rel=\"noopener\">《关键对话》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25985021/\" target=\"_blank\" rel=\"noopener\">《人类简史》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27601926/\" target=\"_blank\" rel=\"noopener\">《斯坦福大学人生设计课》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1255288/\" target=\"_blank\" rel=\"noopener\">《复活》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25808056/\" target=\"_blank\" rel=\"noopener\">《纸牌屋》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26983338/\" target=\"_blank\" rel=\"noopener\">《老人与海》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4311472/\" target=\"_blank\" rel=\"noopener\">《后来的事情》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4311471/\" target=\"_blank\" rel=\"noopener\">《门》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26410730/\" target=\"_blank\" rel=\"noopener\">《我是猫》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30248326/\" target=\"_blank\" rel=\"noopener\">《罗马帝国衰亡史》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30262779/\" target=\"_blank\" rel=\"noopener\">《人性的弱点》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27107109/\" target=\"_blank\" rel=\"noopener\">《百年孤独》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30259724/\" target=\"_blank\" rel=\"noopener\">《巴黎圣母院》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4275052/\" target=\"_blank\" rel=\"noopener\">《九型人格》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27166782/\" target=\"_blank\" rel=\"noopener\">《和时间做朋友》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3522695/\" target=\"_blank\" rel=\"noopener\">《瓦尔登湖》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4312825/\" target=\"_blank\" rel=\"noopener\">《人类动物园》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26698660/\" target=\"_blank\" rel=\"noopener\">《巨人的陨落》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26915894/\" target=\"_blank\" rel=\"noopener\">《双城记》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27913606/\" target=\"_blank\" rel=\"noopener\">《叛逆精神》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30184839/\" target=\"_blank\" rel=\"noopener\">《战胜拖延症》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26943161/\" target=\"_blank\" rel=\"noopener\">《未来简史》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26418524/\" target=\"_blank\" rel=\"noopener\">《万历十五年》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4180711/\" target=\"_blank\" rel=\"noopener\">《拖延心理学》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1465324/\" target=\"_blank\" rel=\"noopener\">《洛丽塔》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26877752/\" target=\"_blank\" rel=\"noopener\">《恶意》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/2253402/\" target=\"_blank\" rel=\"noopener\">《罪与罚》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/23774518/\" target=\"_blank\" rel=\"noopener\">《1984》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1873900/\" target=\"_blank\" rel=\"noopener\">《变形记》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3140801/\" target=\"_blank\" rel=\"noopener\">《姑获鸟之夏》</a></li>\n</ul>\n","site":{"data":{}},"excerpt":"","more":"<blockquote>\n<p>绝大多数从1949年到1976年的中国当代文学作品不必读。<br>很多当代中国人写的历史小说不必读。<br>绝大多数西方通俗小说不必读。<br>所有名著的续书不必读。<br>一些古老的哲学著作不必读。<br>所有的成功学、心灵学、鸡汤类书都不必读。<br>所有阴谋论的书不要读。 <a href=\"https://zhuanlan.zhihu.com/p/55960306\" target=\"_blank\" rel=\"noopener\">——摘自知乎</a></p>\n</blockquote>\n<hr>\n<ul>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25862578/\" target=\"_blank\" rel=\"noopener\">《解忧杂货店》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/6973970/\" target=\"_blank\" rel=\"noopener\">《人间失格》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3266609/\" target=\"_blank\" rel=\"noopener\">《流浪地球》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26118072/\" target=\"_blank\" rel=\"noopener\">《祈祷落幕时》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25924253/\" target=\"_blank\" rel=\"noopener\">《嫌疑人X的献身》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/2567698/\" target=\"_blank\" rel=\"noopener\">《三体》</a></li>\n<li><input checked disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4152754/\" target=\"_blank\" rel=\"noopener\">《时生》</a></li>\n</ul>\n<hr>\n<ul>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/10786473/\" target=\"_blank\" rel=\"noopener\">《自控力》</a> 10%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27608239/\" target=\"_blank\" rel=\"noopener\">《原则》</a> 40%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4881639/\" target=\"_blank\" rel=\"noopener\">《傲慢与偏见》</a> 20%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26895993/\" target=\"_blank\" rel=\"noopener\">《刻意练习》</a> 25%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27112607/\" target=\"_blank\" rel=\"noopener\">《白夜行》</a> 30%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1916451/\" target=\"_blank\" rel=\"noopener\">《金瓶梅》</a> 20%</li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1036397/\" target=\"_blank\" rel=\"noopener\">《聊斋》</a> 10%</li>\n</ul>\n<hr>\n<ul>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1019959/\" target=\"_blank\" rel=\"noopener\">《精力管理》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/2029680/\" target=\"_blank\" rel=\"noopener\">《资治通鉴》</a> <a href=\"https://tongjian.qiaopang.com/\" target=\"_blank\" rel=\"noopener\">https://tongjian.qiaopang.com/</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26319730/\" target=\"_blank\" rel=\"noopener\">《娱乐至死》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1786387/\" target=\"_blank\" rel=\"noopener\">《影响力》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/10785583/\" target=\"_blank\" rel=\"noopener\">《思考,快与慢》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1033778/\" target=\"_blank\" rel=\"noopener\">《富爸爸穷爸爸》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/20428922/\" target=\"_blank\" rel=\"noopener\">《学会提问》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1156866/\" target=\"_blank\" rel=\"noopener\">《系统思考》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/6438010/\" target=\"_blank\" rel=\"noopener\">《少有人走的路》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26839427/\" target=\"_blank\" rel=\"noopener\">《慢思考》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26296901/\" target=\"_blank\" rel=\"noopener\">《一日浮生:十个探问生命意义的故事》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1007667/\" target=\"_blank\" rel=\"noopener\">《心理学的故事》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1007433/\" target=\"_blank\" rel=\"noopener\">《红与黑》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4913064/\" target=\"_blank\" rel=\"noopener\">《活着》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3369793/\" target=\"_blank\" rel=\"noopener\">《亲爱的安德烈》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27200257/\" target=\"_blank\" rel=\"noopener\">《挪威的森林》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25768155/\" target=\"_blank\" rel=\"noopener\">《我们时代的神经症人格》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3533221/\" target=\"_blank\" rel=\"noopener\">《非暴力沟通》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/10586741/\" target=\"_blank\" rel=\"noopener\">《关键对话》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25985021/\" target=\"_blank\" rel=\"noopener\">《人类简史》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27601926/\" target=\"_blank\" rel=\"noopener\">《斯坦福大学人生设计课》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1255288/\" target=\"_blank\" rel=\"noopener\">《复活》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/25808056/\" target=\"_blank\" rel=\"noopener\">《纸牌屋》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26983338/\" target=\"_blank\" rel=\"noopener\">《老人与海》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4311472/\" target=\"_blank\" rel=\"noopener\">《后来的事情》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4311471/\" target=\"_blank\" rel=\"noopener\">《门》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26410730/\" target=\"_blank\" rel=\"noopener\">《我是猫》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30248326/\" target=\"_blank\" rel=\"noopener\">《罗马帝国衰亡史》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30262779/\" target=\"_blank\" rel=\"noopener\">《人性的弱点》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27107109/\" target=\"_blank\" rel=\"noopener\">《百年孤独》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30259724/\" target=\"_blank\" rel=\"noopener\">《巴黎圣母院》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4275052/\" target=\"_blank\" rel=\"noopener\">《九型人格》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27166782/\" target=\"_blank\" rel=\"noopener\">《和时间做朋友》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3522695/\" target=\"_blank\" rel=\"noopener\">《瓦尔登湖》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4312825/\" target=\"_blank\" rel=\"noopener\">《人类动物园》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26698660/\" target=\"_blank\" rel=\"noopener\">《巨人的陨落》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26915894/\" target=\"_blank\" rel=\"noopener\">《双城记》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/27913606/\" target=\"_blank\" rel=\"noopener\">《叛逆精神》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/30184839/\" target=\"_blank\" rel=\"noopener\">《战胜拖延症》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26943161/\" target=\"_blank\" rel=\"noopener\">《未来简史》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26418524/\" target=\"_blank\" rel=\"noopener\">《万历十五年》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/4180711/\" target=\"_blank\" rel=\"noopener\">《拖延心理学》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1465324/\" target=\"_blank\" rel=\"noopener\">《洛丽塔》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/26877752/\" target=\"_blank\" rel=\"noopener\">《恶意》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/2253402/\" target=\"_blank\" rel=\"noopener\">《罪与罚》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/23774518/\" target=\"_blank\" rel=\"noopener\">《1984》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/1873900/\" target=\"_blank\" rel=\"noopener\">《变形记》</a></li>\n<li><input disabled type=\"checkbox\"> <a href=\"https://book.douban.com/subject/3140801/\" target=\"_blank\" rel=\"noopener\">《姑获鸟之夏》</a></li>\n</ul>\n"},{"title":"about","date":"2016-06-17T01:40:35.000Z","_content":"关于\n===\n###### 建立此博客原因\n\n> 记录学习经历以及遇到的问题\n\n###### 本人是程序员&二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮(╯-╰)╭)\n\n#### 技能:\n> 既然是程序员当然会编程了,\n主攻Java,开发了一套一卡通的管理平台,在其中负责卡的充值消费等功能;\n使用PHP开发过一些网站;\n开发了一个Android应用(并未上架应用市场,只供公司内部使用);\n开发过iOS,使用Objective-c开发了两套应用,一套使用纯代码,一套使用了storyboard,其中使用了一些第三方库。因各种原因,应用并未上架。\n","source":"about/index.md","raw":"---\ntitle: about\ndate: 2016-06-17 09:40:35\n---\n关于\n===\n###### 建立此博客原因\n\n> 记录学习经历以及遇到的问题\n\n###### 本人是程序员&二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮(╯-╰)╭)\n\n#### 技能:\n> 既然是程序员当然会编程了,\n主攻Java,开发了一套一卡通的管理平台,在其中负责卡的充值消费等功能;\n使用PHP开发过一些网站;\n开发了一个Android应用(并未上架应用市场,只供公司内部使用);\n开发过iOS,使用Objective-c开发了两套应用,一套使用纯代码,一套使用了storyboard,其中使用了一些第三方库。因各种原因,应用并未上架。\n","updated":"2019-09-11T02:00:25.241Z","path":"about/index.html","comments":1,"layout":"page","_id":"ckf0rn2gi000458syu9cgvz2d","content":"<h1 id=\"关于\"><a href=\"#关于\" class=\"headerlink\" title=\"关于\"></a>关于</h1><h6 id=\"建立此博客原因\"><a href=\"#建立此博客原因\" class=\"headerlink\" title=\"建立此博客原因\"></a>建立此博客原因</h6><blockquote>\n<p>记录学习经历以及遇到的问题</p>\n</blockquote>\n<h6 id=\"本人是程序员-amp-二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮-╯-╰-╭)\"><a href=\"#本人是程序员-amp-二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮-╯-╰-╭)\" class=\"headerlink\" title=\"本人是程序员&二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮(╯-╰)╭)\"></a>本人是程序员&二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮(╯-╰)╭)</h6><h4 id=\"技能:\"><a href=\"#技能:\" class=\"headerlink\" title=\"技能:\"></a>技能:</h4><blockquote>\n<p>既然是程序员当然会编程了,<br>主攻Java,开发了一套一卡通的管理平台,在其中负责卡的充值消费等功能;<br>使用PHP开发过一些网站;<br>开发了一个Android应用(并未上架应用市场,只供公司内部使用);<br>开发过iOS,使用Objective-c开发了两套应用,一套使用纯代码,一套使用了storyboard,其中使用了一些第三方库。因各种原因,应用并未上架。</p>\n</blockquote>\n","site":{"data":{}},"excerpt":"","more":"<h1 id=\"关于\"><a href=\"#关于\" class=\"headerlink\" title=\"关于\"></a>关于</h1><h6 id=\"建立此博客原因\"><a href=\"#建立此博客原因\" class=\"headerlink\" title=\"建立此博客原因\"></a>建立此博客原因</h6><blockquote>\n<p>记录学习经历以及遇到的问题</p>\n</blockquote>\n<h6 id=\"本人是程序员-amp-二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮-╯-╰-╭)\"><a href=\"#本人是程序员-amp-二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮-╯-╰-╭)\" class=\"headerlink\" title=\"本人是程序员&二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮(╯-╰)╭)\"></a>本人是程序员&二次元死宅,喜欢动漫,爱猫,爱纯音乐、钢琴曲。(虽然不会弹钢琴╮(╯-╰)╭)</h6><h4 id=\"技能:\"><a href=\"#技能:\" class=\"headerlink\" title=\"技能:\"></a>技能:</h4><blockquote>\n<p>既然是程序员当然会编程了,<br>主攻Java,开发了一套一卡通的管理平台,在其中负责卡的充值消费等功能;<br>使用PHP开发过一些网站;<br>开发了一个Android应用(并未上架应用市场,只供公司内部使用);<br>开发过iOS,使用Objective-c开发了两套应用,一套使用纯代码,一套使用了storyboard,其中使用了一些第三方库。因各种原因,应用并未上架。</p>\n</blockquote>\n"},{"title":"categories","date":"2016-06-17T01:41:38.000Z","type":"categories","_content":"","source":"categories/index.md","raw":"---\ntitle: categories\ndate: 2016-06-17 09:41:38\ntype: \"categories\"\n---\n","updated":"2019-09-11T02:00:25.242Z","path":"categories/index.html","comments":1,"layout":"page","_id":"ckf0rn2gm000858sy3kve1t1q","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"categories","date":"2019-09-11T04:12:38.000Z","_content":"","source":"categories/index-1.md","raw":"---\ntitle: categories\ndate: 2019-09-11 12:12:38\n---\n","updated":"2019-09-11T04:12:38.512Z","path":"categories/index-1.html","comments":1,"layout":"page","_id":"ckf0rn2gn000a58sypz7wosmo","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"Search","type":"search","_content":"\n","source":"search/index.md","raw":"title: Search\n\ntype: search\n---\n\n","date":"2019-09-11T04:07:54.822Z","updated":"2019-09-11T04:07:54.822Z","path":"search/index.html","comments":1,"layout":"page","_id":"ckf0rn2gq000e58sys11nns1z","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"tags","date":"2019-09-11T04:12:52.000Z","_content":"","source":"tags/index-1.md","raw":"---\ntitle: tags\ndate: 2019-09-11 12:12:52\n---\n","updated":"2019-09-11T04:12:52.271Z","path":"tags/index-1.html","comments":1,"layout":"page","_id":"ckf0rn2jl007k58syxnf585ru","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"tags","date":"2016-06-17T01:36:44.000Z","type":"tags","_content":"","source":"tags/index.md","raw":"---\ntitle: tags\ndate: 2016-06-17 09:36:44\ntype: \"tags\"\n---\n","updated":"2019-09-11T02:00:25.244Z","path":"tags/index.html","comments":1,"layout":"page","_id":"ckf0rn2jm007l58sygswtlkr1","content":"","site":{"data":{}},"excerpt":"","more":""},{"title":"todo","date":"2019-09-19T01:51:08.000Z","_content":"\n## Spring\n\n- [ ] Spring boot demo [https://github.com/xkcoding/spring-boot-demo](https://github.com/xkcoding/spring-boot-demo)\n- [ ] Spring All [wuyouzhuguli/SpringAll: 循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码](https://github.com/wuyouzhuguli/SpringAll)\n\n\n\n\n\n- [ ] TencentOS-tiny [https://github.com/Tencent/TencentOS-tiny](https://github.com/Tencent/TencentOS-tiny)\n- [ ] TubeMQ [https://github.com/Tencent/TubeMQ](https://github.com/Tencent/TubeMQ)\n\n","source":"todo/index.md","raw":"---\ntitle: todo\ndate: 2019-09-19 09:51:08\n---\n\n## Spring\n\n- [ ] Spring boot demo [https://github.com/xkcoding/spring-boot-demo](https://github.com/xkcoding/spring-boot-demo)\n- [ ] Spring All [wuyouzhuguli/SpringAll: 循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码](https://github.com/wuyouzhuguli/SpringAll)\n\n\n\n\n\n- [ ] TencentOS-tiny [https://github.com/Tencent/TencentOS-tiny](https://github.com/Tencent/TencentOS-tiny)\n- [ ] TubeMQ [https://github.com/Tencent/TubeMQ](https://github.com/Tencent/TubeMQ)\n\n","updated":"2019-09-19T04:24:52.170Z","path":"todo/index.html","comments":1,"layout":"page","_id":"ckf0rn2jn007m58sy49y9aqvu","content":"<h2 id=\"Spring\"><a href=\"#Spring\" class=\"headerlink\" title=\"Spring\"></a>Spring</h2><ul>\n<li><input disabled type=\"checkbox\"> Spring boot demo <a href=\"https://github.com/xkcoding/spring-boot-demo\" target=\"_blank\" rel=\"noopener\">https://github.com/xkcoding/spring-boot-demo</a></li>\n<li><input disabled type=\"checkbox\"> Spring All <a href=\"https://github.com/wuyouzhuguli/SpringAll\" target=\"_blank\" rel=\"noopener\">wuyouzhuguli/SpringAll: 循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码</a></li>\n</ul>\n<ul>\n<li><input disabled type=\"checkbox\"> TencentOS-tiny <a href=\"https://github.com/Tencent/TencentOS-tiny\" target=\"_blank\" rel=\"noopener\">https://github.com/Tencent/TencentOS-tiny</a></li>\n<li><input disabled type=\"checkbox\"> TubeMQ <a href=\"https://github.com/Tencent/TubeMQ\" target=\"_blank\" rel=\"noopener\">https://github.com/Tencent/TubeMQ</a></li>\n</ul>\n","site":{"data":{}},"excerpt":"","more":"<h2 id=\"Spring\"><a href=\"#Spring\" class=\"headerlink\" title=\"Spring\"></a>Spring</h2><ul>\n<li><input disabled type=\"checkbox\"> Spring boot demo <a href=\"https://github.com/xkcoding/spring-boot-demo\" target=\"_blank\" rel=\"noopener\">https://github.com/xkcoding/spring-boot-demo</a></li>\n<li><input disabled type=\"checkbox\"> Spring All <a href=\"https://github.com/wuyouzhuguli/SpringAll\" target=\"_blank\" rel=\"noopener\">wuyouzhuguli/SpringAll: 循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码</a></li>\n</ul>\n<ul>\n<li><input disabled type=\"checkbox\"> TencentOS-tiny <a href=\"https://github.com/Tencent/TencentOS-tiny\" target=\"_blank\" rel=\"noopener\">https://github.com/Tencent/TencentOS-tiny</a></li>\n<li><input disabled type=\"checkbox\"> TubeMQ <a href=\"https://github.com/Tencent/TubeMQ\" target=\"_blank\" rel=\"noopener\">https://github.com/Tencent/TubeMQ</a></li>\n</ul>\n"},{"title":"tools","date":"2019-10-08T03:37:08.000Z","_content":"\n[生成二维码](../qr.html)\n\n","source":"tools/index.md","raw":"---\ntitle: tools\ndate: 2019-10-08 11:37:08\n---\n\n[生成二维码](../qr.html)\n\n","updated":"2019-10-08T05:23:36.134Z","path":"tools/index.html","comments":1,"layout":"page","_id":"ckf0rn2jn007n58syk45bl6uk","content":"<p><a href=\"../qr.html\">生成二维码</a></p>\n","site":{"data":{}},"excerpt":"","more":"<p><a href=\"../qr.html\">生成二维码</a></p>\n"}],"Post":[{"title":"使用Github Page和Hexo搭建个人博客","date":"2016-06-17T10:59:02.000Z","_content":"\n## 安装环境\n 安装git和Node.js,[git下载地址](https://git-scm.com/downloads),[Node.js下载地址](https://nodejs.org/en/download/)\n 安装完成之后,就可进行hexo博客框架的安装\n <!--more-->\n 这些都在本地完成的\n\n ```bash\n npm install -g hexo-cli\n ```\n 执行完成之后hexo就安装成功了,第一步结束,环境配置完毕就可以开始创建自己的博客了\n\n## Github上创建仓库\n 创建与用户名对应的仓库,仓库名为your_user_name.github.io(your_user_name.github.com的好像也可以)\n \n\n## 博客的创建\n\n ### 初始化项目\n ```bash\n #init后的名字可以随便起,不会有有什么影响\n hexo init deathswaltz.github.io\n cd deathswaltz.github.io\n npm install\n ```\n init后面是项目的名字,这样就会生成一个deathswaltz.github.io的文件夹\n ### 基础配置\n 打开创建出文件夹下的_config.yml文件进行配置,可以使用sublime text,这是个非常好用的编辑器\n ```coffeescript\n #博客名字\n title: Hexo\n #子标题\n subtitle:\n #博客描述\n description:\n #作者名字\n author: deathswaltz\n #语言\n language: zh-Hans\n #头像\n avatar: https://avatars0.githubusercontent.com/u/10008846?v=3&s=460\n #主题\n theme: next\n\n deploy:\n #使用Git发布\n type: git\n #仓库地址\n repository: https://github.com/DeathsWaltz/DeathsWaltz.github.io.git\n branch: master\n ```\n 其实到现在博客差不多已经搭建的好了\n 现在可以执行下列命令来在本地运行起来\n ```bash\n hexo clean\n hexo g\n hexo s\n ```\n 然后再浏览器通过[http://localhost:4000](http://localhost:4000)来进行访问\n\n 发布到Github上使用以下命令:\n ```bash\n hexo clean\n hexo g\n hexo d\n ```\n 或者\n ```bash\n hexo clean\n hexo d -g\n ```\n 发布到Github上之后可以使用刚才创建的仓库名来访问,如:[deathswaltz.github.io](http://deathswaltz.github.io)\n ### 安装主题\n >hexo的默认主题是landscape,个人觉得这个主题并不怎么好看,所以使用next主题。\n 在git bash 执行git clone [https://github.com/iissnan/hexo-theme-next](https://github.com/iissnan/hexo-theme-next) themes/next,这样即可进行next主题下载\n\n >下载完成后,在博客所在路径下的themes文件夹下面可以看到一个名为next的文件夹。要应用这个主题,需要我们修改站点配置文件_config.yml,注意这个_config.yml是themes/next下的不要和博客主目录下的弄混了,把之前的theme: landscape修改为theme: next。这时可以hexo g和hexo s,然后在刷新浏览器就可以看到博客是next的主题了\n\n >NexT 通过 Scheme 提供主题中的主题。 Mist 是 NexT 的第一款 Scheme。启用 Mist 仅需在 主题配置文件 中将 #scheme: Mist 前面的 # 注释去掉即可。\n\n 菜单配置在 主题配置文件 的 menu。 若站点运行在子目录中,请将链接前缀的 / 去掉。默认支持的菜单项有:\n ```coffeescript\n menu:\n home: /\n archives: /archives\n #about: /about\n #categories: /categories\n tags: /tags\n #commonweal: /404.html\n ```\n### 创建 “关于我” 页面\n 新建一个 about 页面:\n ```bash\n hexo new page \"about\"\n ```\n 菜单显示 about 链接,在主题的 _configy.yml 设置中将 menu 中 about 前面的注释去掉即可。\n\n### 创建分类页面\n 添加一个 分类 页面,并在菜单中显示页面链接。\n 1. 新建一个页面,命名为 categories 。命令如下:\n ```bash\n hexo new page \"categories\"\n ```\n 2. 编辑刚新建的页面,将页面的类型设置为 categories ,主题将自动为这个页面显示所有分类。\n ```coffeescript\n title: 分类\n date: 2014-12-22 12:39:04\n type: \"categories\"\n ```\n\n### 创建标签云页面\n添加一个标签云页面,并在菜单中显示页面链接。\n1. 新建一个页面,命名为 tags 。命令如下:\n```\nhexo new page \"tags\"\n```\n2. 编辑刚新建的页面,将页面的类型设置为 tags ,主题将自动为这个页面显示标签云。\n\n ```coffeescript\n title: All tags\n date: 2014-12-22 12:39:04\n type: \"tags\"\n ```\n3. 在菜单中添加链接。编辑主题的 _config.yml ,添加 tags 到 menu 中。\n\n### 文章摘要\n在需要显示摘要的地方添加如下代码即可:\n```tex\n以上是摘要\n<!--more-- >\n以下是余下全文\n```\n## 其他配置\n### 多说评论系统\n\n- 使用多说前需要先在 多说 创建一个站点。具体步骤如下:\n\n 登录后在首页选择 “我要安装”。\n 创建站点,填写站点相关信息。多说域名 这一栏填写的即是你的 duoshuo_shortname。\n 创建站点完成后在站点配置文件 中新增 duoshuo_shortname 字段,值设置成上一步中的值。\n\n\n本人第一次写博客,用Markdown也是第一次,哪里写的不好请指教。\n以上","source":"_posts/build-blog.md","raw":"---\ntitle: 使用Github Page和Hexo搭建个人博客\ndate: 2016-06-17 18:59:02\ntags: [Hexo, 博客, Node.js]\ncategories: [学习]\n---\n\n## 安装环境\n 安装git和Node.js,[git下载地址](https://git-scm.com/downloads),[Node.js下载地址](https://nodejs.org/en/download/)\n 安装完成之后,就可进行hexo博客框架的安装\n <!--more-->\n 这些都在本地完成的\n\n ```bash\n npm install -g hexo-cli\n ```\n 执行完成之后hexo就安装成功了,第一步结束,环境配置完毕就可以开始创建自己的博客了\n\n## Github上创建仓库\n 创建与用户名对应的仓库,仓库名为your_user_name.github.io(your_user_name.github.com的好像也可以)\n \n\n## 博客的创建\n\n ### 初始化项目\n ```bash\n #init后的名字可以随便起,不会有有什么影响\n hexo init deathswaltz.github.io\n cd deathswaltz.github.io\n npm install\n ```\n init后面是项目的名字,这样就会生成一个deathswaltz.github.io的文件夹\n ### 基础配置\n 打开创建出文件夹下的_config.yml文件进行配置,可以使用sublime text,这是个非常好用的编辑器\n ```coffeescript\n #博客名字\n title: Hexo\n #子标题\n subtitle:\n #博客描述\n description:\n #作者名字\n author: deathswaltz\n #语言\n language: zh-Hans\n #头像\n avatar: https://avatars0.githubusercontent.com/u/10008846?v=3&s=460\n #主题\n theme: next\n\n deploy:\n #使用Git发布\n type: git\n #仓库地址\n repository: https://github.com/DeathsWaltz/DeathsWaltz.github.io.git\n branch: master\n ```\n 其实到现在博客差不多已经搭建的好了\n 现在可以执行下列命令来在本地运行起来\n ```bash\n hexo clean\n hexo g\n hexo s\n ```\n 然后再浏览器通过[http://localhost:4000](http://localhost:4000)来进行访问\n\n 发布到Github上使用以下命令:\n ```bash\n hexo clean\n hexo g\n hexo d\n ```\n 或者\n ```bash\n hexo clean\n hexo d -g\n ```\n 发布到Github上之后可以使用刚才创建的仓库名来访问,如:[deathswaltz.github.io](http://deathswaltz.github.io)\n ### 安装主题\n >hexo的默认主题是landscape,个人觉得这个主题并不怎么好看,所以使用next主题。\n 在git bash 执行git clone [https://github.com/iissnan/hexo-theme-next](https://github.com/iissnan/hexo-theme-next) themes/next,这样即可进行next主题下载\n\n >下载完成后,在博客所在路径下的themes文件夹下面可以看到一个名为next的文件夹。要应用这个主题,需要我们修改站点配置文件_config.yml,注意这个_config.yml是themes/next下的不要和博客主目录下的弄混了,把之前的theme: landscape修改为theme: next。这时可以hexo g和hexo s,然后在刷新浏览器就可以看到博客是next的主题了\n\n >NexT 通过 Scheme 提供主题中的主题。 Mist 是 NexT 的第一款 Scheme。启用 Mist 仅需在 主题配置文件 中将 #scheme: Mist 前面的 # 注释去掉即可。\n\n 菜单配置在 主题配置文件 的 menu。 若站点运行在子目录中,请将链接前缀的 / 去掉。默认支持的菜单项有:\n ```coffeescript\n menu:\n home: /\n archives: /archives\n #about: /about\n #categories: /categories\n tags: /tags\n #commonweal: /404.html\n ```\n### 创建 “关于我” 页面\n 新建一个 about 页面:\n ```bash\n hexo new page \"about\"\n ```\n 菜单显示 about 链接,在主题的 _configy.yml 设置中将 menu 中 about 前面的注释去掉即可。\n\n### 创建分类页面\n 添加一个 分类 页面,并在菜单中显示页面链接。\n 1. 新建一个页面,命名为 categories 。命令如下:\n ```bash\n hexo new page \"categories\"\n ```\n 2. 编辑刚新建的页面,将页面的类型设置为 categories ,主题将自动为这个页面显示所有分类。\n ```coffeescript\n title: 分类\n date: 2014-12-22 12:39:04\n type: \"categories\"\n ```\n\n### 创建标签云页面\n添加一个标签云页面,并在菜单中显示页面链接。\n1. 新建一个页面,命名为 tags 。命令如下:\n```\nhexo new page \"tags\"\n```\n2. 编辑刚新建的页面,将页面的类型设置为 tags ,主题将自动为这个页面显示标签云。\n\n ```coffeescript\n title: All tags\n date: 2014-12-22 12:39:04\n type: \"tags\"\n ```\n3. 在菜单中添加链接。编辑主题的 _config.yml ,添加 tags 到 menu 中。\n\n### 文章摘要\n在需要显示摘要的地方添加如下代码即可:\n```tex\n以上是摘要\n<!--more-- >\n以下是余下全文\n```\n## 其他配置\n### 多说评论系统\n\n- 使用多说前需要先在 多说 创建一个站点。具体步骤如下:\n\n 登录后在首页选择 “我要安装”。\n 创建站点,填写站点相关信息。多说域名 这一栏填写的即是你的 duoshuo_shortname。\n 创建站点完成后在站点配置文件 中新增 duoshuo_shortname 字段,值设置成上一步中的值。\n\n\n本人第一次写博客,用Markdown也是第一次,哪里写的不好请指教。\n以上","slug":"build-blog","published":1,"updated":"2020-09-13T06:51:33.701Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gd000158sytze0zf8w","content":"<h2 id=\"安装环境\"><a href=\"#安装环境\" class=\"headerlink\" title=\"安装环境\"></a>安装环境</h2><p> 安装git和Node.js,<a href=\"https://git-scm.com/downloads\" target=\"_blank\" rel=\"noopener\">git下载地址</a>,<a href=\"https://nodejs.org/en/download/\" target=\"_blank\" rel=\"noopener\">Node.js下载地址</a><br> 安装完成之后,就可进行hexo博客框架的安装<br> <a id=\"more\"></a><br> 这些都在本地完成的</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install -g hexo-cli</span><br></pre></td></tr></table></figure>\n\n<p> 执行完成之后hexo就安装成功了,第一步结束,环境配置完毕就可以开始创建自己的博客了</p>\n<h2 id=\"Github上创建仓库\"><a href=\"#Github上创建仓库\" class=\"headerlink\" title=\"Github上创建仓库\"></a>Github上创建仓库</h2><p> 创建与用户名对应的仓库,仓库名为your_user_name.github.io(your_user_name.github.com的好像也可以)<br> <img src=\"/2016/06/17/build-blog/Githubpicture.png\" alt=\"Github\"></p>\n<h2 id=\"博客的创建\"><a href=\"#博客的创建\" class=\"headerlink\" title=\"博客的创建\"></a>博客的创建</h2><h3 id=\"初始化项目\"><a href=\"#初始化项目\" class=\"headerlink\" title=\"初始化项目\"></a>初始化项目</h3> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#init后的名字可以随便起,不会有有什么影响</span></span><br><span class=\"line\">hexo init deathswaltz.github.io</span><br><span class=\"line\"><span class=\"built_in\">cd</span> deathswaltz.github.io</span><br><span class=\"line\">npm install</span><br></pre></td></tr></table></figure>\n\n<p> init后面是项目的名字,这样就会生成一个deathswaltz.github.io的文件夹</p>\n<h3 id=\"基础配置\"><a href=\"#基础配置\" class=\"headerlink\" title=\"基础配置\"></a>基础配置</h3><p> 打开创建出文件夹下的_config.yml文件进行配置,可以使用sublime text,这是个非常好用的编辑器<br> <figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#博客名字</span></span><br><span class=\"line\">title: Hexo</span><br><span class=\"line\"><span class=\"comment\">#子标题</span></span><br><span class=\"line\">subtitle:</span><br><span class=\"line\"><span class=\"comment\">#博客描述</span></span><br><span class=\"line\">description:</span><br><span class=\"line\"><span class=\"comment\">#作者名字</span></span><br><span class=\"line\">author: deathswaltz</span><br><span class=\"line\"><span class=\"comment\">#语言</span></span><br><span class=\"line\">language: zh-Hans</span><br><span class=\"line\"><span class=\"comment\">#头像</span></span><br><span class=\"line\">avatar: https://avatars0.githubusercontent.com/u/<span class=\"number\">10008846</span>?v=<span class=\"number\">3</span>&s=<span class=\"number\">460</span></span><br><span class=\"line\"><span class=\"comment\">#主题</span></span><br><span class=\"line\">theme: next</span><br><span class=\"line\"></span><br><span class=\"line\">deploy:</span><br><span class=\"line\"> <span class=\"comment\">#使用Git发布</span></span><br><span class=\"line\"> type: git</span><br><span class=\"line\"> <span class=\"comment\">#仓库地址</span></span><br><span class=\"line\"> repository: https://github.com/DeathsWaltz/DeathsWaltz.github.io.git</span><br><span class=\"line\"> branch: master</span><br></pre></td></tr></table></figure></p>\n<p> 其实到现在博客差不多已经搭建的好了<br> 现在可以执行下列命令来在本地运行起来<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo clean</span><br><span class=\"line\">hexo g</span><br><span class=\"line\">hexo s</span><br></pre></td></tr></table></figure></p>\n<p> 然后再浏览器通过<a href=\"http://localhost:4000\" target=\"_blank\" rel=\"noopener\">http://localhost:4000</a>来进行访问</p>\n<p> 发布到Github上使用以下命令:<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo clean</span><br><span class=\"line\">hexo g</span><br><span class=\"line\">hexo d</span><br></pre></td></tr></table></figure></p>\n<p> 或者<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo clean</span><br><span class=\"line\">hexo d -g</span><br></pre></td></tr></table></figure></p>\n<p> 发布到Github上之后可以使用刚才创建的仓库名来访问,如:<a href=\"http://deathswaltz.github.io\" target=\"_blank\" rel=\"noopener\">deathswaltz.github.io</a></p>\n<h3 id=\"安装主题\"><a href=\"#安装主题\" class=\"headerlink\" title=\"安装主题\"></a>安装主题</h3><blockquote>\n<p>hexo的默认主题是landscape,个人觉得这个主题并不怎么好看,所以使用next主题。<br> 在git bash 执行git clone <a href=\"https://github.com/iissnan/hexo-theme-next\" target=\"_blank\" rel=\"noopener\">https://github.com/iissnan/hexo-theme-next</a> themes/next,这样即可进行next主题下载</p>\n</blockquote>\n<blockquote>\n<p>下载完成后,在博客所在路径下的themes文件夹下面可以看到一个名为next的文件夹。要应用这个主题,需要我们修改站点配置文件_config.yml,注意这个_config.yml是themes/next下的不要和博客主目录下的弄混了,把之前的theme: landscape修改为theme: next。这时可以hexo g和hexo s,然后在刷新浏览器就可以看到博客是next的主题了</p>\n</blockquote>\n<blockquote>\n<p>NexT 通过 Scheme 提供主题中的主题。 Mist 是 NexT 的第一款 Scheme。启用 Mist 仅需在 主题配置文件 中将 #scheme: Mist 前面的 # 注释去掉即可。</p>\n</blockquote>\n<p> 菜单配置在 主题配置文件 的 menu。 若站点运行在子目录中,请将链接前缀的 / 去掉。默认支持的菜单项有:<br> <figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">menu:</span><br><span class=\"line\">home: /</span><br><span class=\"line\">archives: /archives</span><br><span class=\"line\"><span class=\"comment\">#about: /about</span></span><br><span class=\"line\"><span class=\"comment\">#categories: /categories</span></span><br><span class=\"line\">tags: /tags</span><br><span class=\"line\"><span class=\"comment\">#commonweal: /404.html</span></span><br></pre></td></tr></table></figure></p>\n<h3 id=\"创建-“关于我”-页面\"><a href=\"#创建-“关于我”-页面\" class=\"headerlink\" title=\"创建 “关于我” 页面\"></a>创建 “关于我” 页面</h3><p> 新建一个 about 页面:<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page <span class=\"string\">\"about\"</span></span><br></pre></td></tr></table></figure></p>\n<p> 菜单显示 about 链接,在主题的 _configy.yml 设置中将 menu 中 about 前面的注释去掉即可。</p>\n<h3 id=\"创建分类页面\"><a href=\"#创建分类页面\" class=\"headerlink\" title=\"创建分类页面\"></a>创建分类页面</h3><p> 添加一个 分类 页面,并在菜单中显示页面链接。</p>\n<ol>\n<li><p>新建一个页面,命名为 categories 。命令如下:</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page <span class=\"string\">\"categories\"</span></span><br></pre></td></tr></table></figure>\n</li>\n<li><p>编辑刚新建的页面,将页面的类型设置为 categories ,主题将自动为这个页面显示所有分类。</p>\n<figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">title: 分类</span><br><span class=\"line\">date: <span class=\"number\">2014</span><span class=\"number\">-12</span><span class=\"number\">-22</span> <span class=\"number\">12</span>:<span class=\"number\">39</span>:<span class=\"number\">04</span></span><br><span class=\"line\">type: <span class=\"string\">\"categories\"</span></span><br></pre></td></tr></table></figure>\n\n</li>\n</ol>\n<h3 id=\"创建标签云页面\"><a href=\"#创建标签云页面\" class=\"headerlink\" title=\"创建标签云页面\"></a>创建标签云页面</h3><p>添加一个标签云页面,并在菜单中显示页面链接。</p>\n<ol>\n<li><p>新建一个页面,命名为 tags 。命令如下:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page "tags"</span><br></pre></td></tr></table></figure>\n</li>\n<li><p>编辑刚新建的页面,将页面的类型设置为 tags ,主题将自动为这个页面显示标签云。</p>\n <figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">title: All tags</span><br><span class=\"line\">date: <span class=\"number\">2014</span><span class=\"number\">-12</span><span class=\"number\">-22</span> <span class=\"number\">12</span>:<span class=\"number\">39</span>:<span class=\"number\">04</span></span><br><span class=\"line\">type: <span class=\"string\">\"tags\"</span></span><br></pre></td></tr></table></figure>\n</li>\n<li><p>在菜单中添加链接。编辑主题的 _config.yml ,添加 tags 到 menu 中。</p>\n</li>\n</ol>\n<h3 id=\"文章摘要\"><a href=\"#文章摘要\" class=\"headerlink\" title=\"文章摘要\"></a>文章摘要</h3><p>在需要显示摘要的地方添加如下代码即可:</p>\n<figure class=\"highlight tex\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">以上是摘要</span><br><span class=\"line\"><!--more-- ></span><br><span class=\"line\">以下是余下全文</span><br></pre></td></tr></table></figure>\n\n<h2 id=\"其他配置\"><a href=\"#其他配置\" class=\"headerlink\" title=\"其他配置\"></a>其他配置</h2><h3 id=\"多说评论系统\"><a href=\"#多说评论系统\" class=\"headerlink\" title=\"多说评论系统\"></a>多说评论系统</h3><ul>\n<li><p>使用多说前需要先在 多说 创建一个站点。具体步骤如下:</p>\n<p> 登录后在首页选择 “我要安装”。<br> 创建站点,填写站点相关信息。多说域名 这一栏填写的即是你的 duoshuo_shortname。<br> 创建站点完成后在站点配置文件 中新增 duoshuo_shortname 字段,值设置成上一步中的值。</p>\n</li>\n</ul>\n<p>本人第一次写博客,用Markdown也是第一次,哪里写的不好请指教。<br>以上</p>\n","site":{"data":{}},"excerpt":"<h2 id=\"安装环境\"><a href=\"#安装环境\" class=\"headerlink\" title=\"安装环境\"></a>安装环境</h2><p> 安装git和Node.js,<a href=\"https://git-scm.com/downloads\" target=\"_blank\" rel=\"noopener\">git下载地址</a>,<a href=\"https://nodejs.org/en/download/\" target=\"_blank\" rel=\"noopener\">Node.js下载地址</a><br> 安装完成之后,就可进行hexo博客框架的安装<br></p>","more":"<br> 这些都在本地完成的<p></p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install -g hexo-cli</span><br></pre></td></tr></table></figure>\n\n<p> 执行完成之后hexo就安装成功了,第一步结束,环境配置完毕就可以开始创建自己的博客了</p>\n<h2 id=\"Github上创建仓库\"><a href=\"#Github上创建仓库\" class=\"headerlink\" title=\"Github上创建仓库\"></a>Github上创建仓库</h2><p> 创建与用户名对应的仓库,仓库名为your_user_name.github.io(your_user_name.github.com的好像也可以)<br> <img src=\"/2016/06/17/build-blog/Githubpicture.png\" alt=\"Github\"></p>\n<h2 id=\"博客的创建\"><a href=\"#博客的创建\" class=\"headerlink\" title=\"博客的创建\"></a>博客的创建</h2><h3 id=\"初始化项目\"><a href=\"#初始化项目\" class=\"headerlink\" title=\"初始化项目\"></a>初始化项目</h3> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#init后的名字可以随便起,不会有有什么影响</span></span><br><span class=\"line\">hexo init deathswaltz.github.io</span><br><span class=\"line\"><span class=\"built_in\">cd</span> deathswaltz.github.io</span><br><span class=\"line\">npm install</span><br></pre></td></tr></table></figure>\n\n<p> init后面是项目的名字,这样就会生成一个deathswaltz.github.io的文件夹</p>\n<h3 id=\"基础配置\"><a href=\"#基础配置\" class=\"headerlink\" title=\"基础配置\"></a>基础配置</h3><p> 打开创建出文件夹下的_config.yml文件进行配置,可以使用sublime text,这是个非常好用的编辑器<br> <figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#博客名字</span></span><br><span class=\"line\">title: Hexo</span><br><span class=\"line\"><span class=\"comment\">#子标题</span></span><br><span class=\"line\">subtitle:</span><br><span class=\"line\"><span class=\"comment\">#博客描述</span></span><br><span class=\"line\">description:</span><br><span class=\"line\"><span class=\"comment\">#作者名字</span></span><br><span class=\"line\">author: deathswaltz</span><br><span class=\"line\"><span class=\"comment\">#语言</span></span><br><span class=\"line\">language: zh-Hans</span><br><span class=\"line\"><span class=\"comment\">#头像</span></span><br><span class=\"line\">avatar: https://avatars0.githubusercontent.com/u/<span class=\"number\">10008846</span>?v=<span class=\"number\">3</span>&s=<span class=\"number\">460</span></span><br><span class=\"line\"><span class=\"comment\">#主题</span></span><br><span class=\"line\">theme: next</span><br><span class=\"line\"></span><br><span class=\"line\">deploy:</span><br><span class=\"line\"> <span class=\"comment\">#使用Git发布</span></span><br><span class=\"line\"> type: git</span><br><span class=\"line\"> <span class=\"comment\">#仓库地址</span></span><br><span class=\"line\"> repository: https://github.com/DeathsWaltz/DeathsWaltz.github.io.git</span><br><span class=\"line\"> branch: master</span><br></pre></td></tr></table></figure></p>\n<p> 其实到现在博客差不多已经搭建的好了<br> 现在可以执行下列命令来在本地运行起来<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo clean</span><br><span class=\"line\">hexo g</span><br><span class=\"line\">hexo s</span><br></pre></td></tr></table></figure></p>\n<p> 然后再浏览器通过<a href=\"http://localhost:4000\" target=\"_blank\" rel=\"noopener\">http://localhost:4000</a>来进行访问</p>\n<p> 发布到Github上使用以下命令:<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo clean</span><br><span class=\"line\">hexo g</span><br><span class=\"line\">hexo d</span><br></pre></td></tr></table></figure></p>\n<p> 或者<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo clean</span><br><span class=\"line\">hexo d -g</span><br></pre></td></tr></table></figure></p>\n<p> 发布到Github上之后可以使用刚才创建的仓库名来访问,如:<a href=\"http://deathswaltz.github.io\" target=\"_blank\" rel=\"noopener\">deathswaltz.github.io</a></p>\n<h3 id=\"安装主题\"><a href=\"#安装主题\" class=\"headerlink\" title=\"安装主题\"></a>安装主题</h3><blockquote>\n<p>hexo的默认主题是landscape,个人觉得这个主题并不怎么好看,所以使用next主题。<br> 在git bash 执行git clone <a href=\"https://github.com/iissnan/hexo-theme-next\" target=\"_blank\" rel=\"noopener\">https://github.com/iissnan/hexo-theme-next</a> themes/next,这样即可进行next主题下载</p>\n</blockquote>\n<blockquote>\n<p>下载完成后,在博客所在路径下的themes文件夹下面可以看到一个名为next的文件夹。要应用这个主题,需要我们修改站点配置文件_config.yml,注意这个_config.yml是themes/next下的不要和博客主目录下的弄混了,把之前的theme: landscape修改为theme: next。这时可以hexo g和hexo s,然后在刷新浏览器就可以看到博客是next的主题了</p>\n</blockquote>\n<blockquote>\n<p>NexT 通过 Scheme 提供主题中的主题。 Mist 是 NexT 的第一款 Scheme。启用 Mist 仅需在 主题配置文件 中将 #scheme: Mist 前面的 # 注释去掉即可。</p>\n</blockquote>\n<p> 菜单配置在 主题配置文件 的 menu。 若站点运行在子目录中,请将链接前缀的 / 去掉。默认支持的菜单项有:<br> <figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">menu:</span><br><span class=\"line\">home: /</span><br><span class=\"line\">archives: /archives</span><br><span class=\"line\"><span class=\"comment\">#about: /about</span></span><br><span class=\"line\"><span class=\"comment\">#categories: /categories</span></span><br><span class=\"line\">tags: /tags</span><br><span class=\"line\"><span class=\"comment\">#commonweal: /404.html</span></span><br></pre></td></tr></table></figure></p>\n<h3 id=\"创建-“关于我”-页面\"><a href=\"#创建-“关于我”-页面\" class=\"headerlink\" title=\"创建 “关于我” 页面\"></a>创建 “关于我” 页面</h3><p> 新建一个 about 页面:<br> <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page <span class=\"string\">\"about\"</span></span><br></pre></td></tr></table></figure></p>\n<p> 菜单显示 about 链接,在主题的 _configy.yml 设置中将 menu 中 about 前面的注释去掉即可。</p>\n<h3 id=\"创建分类页面\"><a href=\"#创建分类页面\" class=\"headerlink\" title=\"创建分类页面\"></a>创建分类页面</h3><p> 添加一个 分类 页面,并在菜单中显示页面链接。</p>\n<ol>\n<li><p>新建一个页面,命名为 categories 。命令如下:</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page <span class=\"string\">\"categories\"</span></span><br></pre></td></tr></table></figure>\n</li>\n<li><p>编辑刚新建的页面,将页面的类型设置为 categories ,主题将自动为这个页面显示所有分类。</p>\n<figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">title: 分类</span><br><span class=\"line\">date: <span class=\"number\">2014</span><span class=\"number\">-12</span><span class=\"number\">-22</span> <span class=\"number\">12</span>:<span class=\"number\">39</span>:<span class=\"number\">04</span></span><br><span class=\"line\">type: <span class=\"string\">\"categories\"</span></span><br></pre></td></tr></table></figure>\n\n</li>\n</ol>\n<h3 id=\"创建标签云页面\"><a href=\"#创建标签云页面\" class=\"headerlink\" title=\"创建标签云页面\"></a>创建标签云页面</h3><p>添加一个标签云页面,并在菜单中显示页面链接。</p>\n<ol>\n<li><p>新建一个页面,命名为 tags 。命令如下:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page "tags"</span><br></pre></td></tr></table></figure>\n</li>\n<li><p>编辑刚新建的页面,将页面的类型设置为 tags ,主题将自动为这个页面显示标签云。</p>\n <figure class=\"highlight coffeescript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">title: All tags</span><br><span class=\"line\">date: <span class=\"number\">2014</span><span class=\"number\">-12</span><span class=\"number\">-22</span> <span class=\"number\">12</span>:<span class=\"number\">39</span>:<span class=\"number\">04</span></span><br><span class=\"line\">type: <span class=\"string\">\"tags\"</span></span><br></pre></td></tr></table></figure>\n</li>\n<li><p>在菜单中添加链接。编辑主题的 _config.yml ,添加 tags 到 menu 中。</p>\n</li>\n</ol>\n<h3 id=\"文章摘要\"><a href=\"#文章摘要\" class=\"headerlink\" title=\"文章摘要\"></a>文章摘要</h3><p>在需要显示摘要的地方添加如下代码即可:</p>\n<figure class=\"highlight tex\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">以上是摘要</span><br><span class=\"line\"><!--more-- ></span><br><span class=\"line\">以下是余下全文</span><br></pre></td></tr></table></figure>\n\n<h2 id=\"其他配置\"><a href=\"#其他配置\" class=\"headerlink\" title=\"其他配置\"></a>其他配置</h2><h3 id=\"多说评论系统\"><a href=\"#多说评论系统\" class=\"headerlink\" title=\"多说评论系统\"></a>多说评论系统</h3><ul>\n<li><p>使用多说前需要先在 多说 创建一个站点。具体步骤如下:</p>\n<p> 登录后在首页选择 “我要安装”。<br> 创建站点,填写站点相关信息。多说域名 这一栏填写的即是你的 duoshuo_shortname。<br> 创建站点完成后在站点配置文件 中新增 duoshuo_shortname 字段,值设置成上一步中的值。</p>\n</li>\n</ul>\n<p>本人第一次写博客,用Markdown也是第一次,哪里写的不好请指教。<br>以上</p>"},{"title":"acme.sh免费https证书","date":"2020-09-12T05:10:43.000Z","_content":"\n#### 安装acme.sh\n\n```shell\ncurl https://get.acme.sh | sh\n```\n\n或者\n\n```shell\nwget -O - https://get.acme.sh | sh\n```\n\n最好使用第二个命令,原因:**wget** 命令用来从指定的**URL**下载文件。**wget**非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,**wget**会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。\n\n添加环境变量:\n\n`/etc/profile`中添加`alias acme.sh=~/.acme.sh/acme.sh`,保存后执行`source /etc/profile`加载配置。\n\n\n\n#### 生成证书\n\n**http**\n\n`-d`参数后为需要生成https证书的域名,`--webroot`参数为网站跟目录, 然后自动完成验证.\n\n```shell\nacme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/\n```\n\n **apache**服务器\n\n```shell\nacme.sh --issue -d mydomain.com --apache\n```\n\n**nginx**服务器\n\n```shell\nacme.sh --issue -d mydomain.com --nginx\n```\n\n无**web**服务器,根据域名生成\n\n```shell\nacme.sh --issue -d mydomain.com --standalone\n```\n\n**dns**\n\n无需服务器\n\n```shell\nacme.sh --issue --dns -d mydomain.com\n```\n\n然后, **acme.sh** 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.\n\n等待解析完成之后, 重新生成证书:\n\n```shell\nacme.sh --renew -d mydomain.com\n```\n\n**dns** 方式的真正强大之处在于可以使用域名解析商提供的**api** 自动添加 txt 记录完成验证.\n\n**acme.sh** 目前支持 **cloudflare**, **dnspod**, **cloudxns**, **godaddy** 以及 **ovh** 等数十种解析商的自动集成.\n\n以 **dnspod** 为例, 你需要先登录到 **dnspod** 账号, 生成你的 **api id** 和 **api key**, 都是免费的. 然后:\n\n```shell\nexport DP_Id=\"1234\"\n\nexport DP_Key=\"sADDsdasdgdsf\"\n\nacme.sh --issue --dns dns_dp -d aa.com -d www.aa.com\n```\n\n证书就会自动生成了. 这里给出的 **api id **和 **api key** 会被自动记录下来, 将来你在使用**dnspod api** 的时候, 就不需要再次指定了. 直接生成就好了:\n\n```shell\nacme.sh --issue -d mydomain2.com --dns dns_dp\n```\n\n更多:[https://github.com/acmesh-official/acme.sh/wiki/dnsapi](https://github.com/acmesh-official/acme.sh/wiki/dnsapi)\n\n#### copy/安装证书\n\n默认生成的证书都放在安装目录下: `~/.acme.sh/`,请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.\n\n正确的使用方法是使用 `--install-cert` 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:\n\n**Apache example**:\n\n```\nacme.sh --install-cert -d mydomain.com \\\n--cert-file /path/to/certfile/in/apache/cert.pem \\\n--key-file /path/to/keyfile/in/apache/key.pem \\\n--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \\\n--reloadcmd \"service apache2 force-reload\"\n```\n\n**Nginx example**:\n\n```\nacme.sh --install-cert -d example.com \\\n--key-file /path/to/keyfile/in/nginx/key.pem \\\n--fullchain-file /path/to/fullchain/nginx/cert.pem \\\n--reloadcmd \"service nginx force-reload\"\n```\n\n(一个小提醒, 这里用的是 `service nginx force-reload`, 不是 `service nginx reload`, 据测试, `reload` 并不会重新加载证书, 所以用的 `force-reload`)\n\n**Nginx** 的配置 `ssl_certificate` 使用 `/etc/nginx/ssl/fullchain.cer` ,而非 `/etc/nginx/ssl/<domain>.cer` ,否则 [SSL Labs](https://www.ssllabs.com/ssltest/) 的测试会报 `Chain issues Incomplete` 错误。\n\n`--install-cert`命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.\n\n**Nginx**配置\n\n```properties\nserver {\n listen 443 ssl;\n server_name www.mydomain.com;\n \n ssl_certificate /path/to/keyfile/in/nginx/cert.pem;\n ssl_certificate_key /path/to/fullchain/nginx/key.pem;\n ssl_session_timeout 5m;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服务器端支持的协议版本\n ssl_ciphers HIGH:!aNULL:!MD5;\n #ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #指定加密算法\n ssl_prefer_server_ciphers on; #在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法\n}\n```\n\n#### 续期证书\n\n目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.\n\n#### 更新acme.sh\n\n目前由于 **acme** 协议和 **letsencrypt CA** 都在频繁的更新, 因此 **acme.sh** 也经常更新以保持同步.\n\n升级 acme.sh 到最新版 :\n\n```\nacme.sh --upgrade\n```\n\n如果你不想手动升级, 可以开启自动升级:\n\n```\nacme.sh --upgrade --auto-upgrade\n```\n\n之后, **acme.sh** 就会自动保持更新了.\n\n你也可以随时关闭自动更新:\n\n```\nacme.sh --upgrade --auto-upgrade 0\n```\n\n#### 错误\n\n如果出错, 请添加 **debug log**:\n\n```\nacme.sh --issue ..... --debug \n```\n\n或者:\n\n```\nacme.sh --issue ..... --debug 2\n```\n\n请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh\n\n更高级的用法请参看其他 **wiki **页面.\n\nhttps://github.com/Neilpang/acme.sh/wiki\n\n\n\n参考文档:\n\n[https://github.com/acmesh-official/acme.sh](https://github.com/acmesh-official/acme.sh)\n\n[https://github.com/acmesh-official/acme.sh/wiki/说明](https://github.com/acmesh-official/acme.sh/wiki/说明)\n\n[https://segmentfault.com/a/1190000022263697](https://segmentfault.com/a/1190000022263697)\n\n[https://github.com/acmesh-official/acme.sh/wiki/dnsapi](https://github.com/acmesh-official/acme.sh/wiki/dnsapi)\n\n","source":"_posts/acme-sh-free-ssl.md","raw":"---\ntitle: acme.sh免费https证书\ndate: 2020-09-12 13:10:43\ntags: ['.acme.sh','https','证书','nginx']\ncategories: [学习,nginx,https]\n---\n\n#### 安装acme.sh\n\n```shell\ncurl https://get.acme.sh | sh\n```\n\n或者\n\n```shell\nwget -O - https://get.acme.sh | sh\n```\n\n最好使用第二个命令,原因:**wget** 命令用来从指定的**URL**下载文件。**wget**非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,**wget**会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。\n\n添加环境变量:\n\n`/etc/profile`中添加`alias acme.sh=~/.acme.sh/acme.sh`,保存后执行`source /etc/profile`加载配置。\n\n\n\n#### 生成证书\n\n**http**\n\n`-d`参数后为需要生成https证书的域名,`--webroot`参数为网站跟目录, 然后自动完成验证.\n\n```shell\nacme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/\n```\n\n **apache**服务器\n\n```shell\nacme.sh --issue -d mydomain.com --apache\n```\n\n**nginx**服务器\n\n```shell\nacme.sh --issue -d mydomain.com --nginx\n```\n\n无**web**服务器,根据域名生成\n\n```shell\nacme.sh --issue -d mydomain.com --standalone\n```\n\n**dns**\n\n无需服务器\n\n```shell\nacme.sh --issue --dns -d mydomain.com\n```\n\n然后, **acme.sh** 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.\n\n等待解析完成之后, 重新生成证书:\n\n```shell\nacme.sh --renew -d mydomain.com\n```\n\n**dns** 方式的真正强大之处在于可以使用域名解析商提供的**api** 自动添加 txt 记录完成验证.\n\n**acme.sh** 目前支持 **cloudflare**, **dnspod**, **cloudxns**, **godaddy** 以及 **ovh** 等数十种解析商的自动集成.\n\n以 **dnspod** 为例, 你需要先登录到 **dnspod** 账号, 生成你的 **api id** 和 **api key**, 都是免费的. 然后:\n\n```shell\nexport DP_Id=\"1234\"\n\nexport DP_Key=\"sADDsdasdgdsf\"\n\nacme.sh --issue --dns dns_dp -d aa.com -d www.aa.com\n```\n\n证书就会自动生成了. 这里给出的 **api id **和 **api key** 会被自动记录下来, 将来你在使用**dnspod api** 的时候, 就不需要再次指定了. 直接生成就好了:\n\n```shell\nacme.sh --issue -d mydomain2.com --dns dns_dp\n```\n\n更多:[https://github.com/acmesh-official/acme.sh/wiki/dnsapi](https://github.com/acmesh-official/acme.sh/wiki/dnsapi)\n\n#### copy/安装证书\n\n默认生成的证书都放在安装目录下: `~/.acme.sh/`,请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.\n\n正确的使用方法是使用 `--install-cert` 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:\n\n**Apache example**:\n\n```\nacme.sh --install-cert -d mydomain.com \\\n--cert-file /path/to/certfile/in/apache/cert.pem \\\n--key-file /path/to/keyfile/in/apache/key.pem \\\n--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \\\n--reloadcmd \"service apache2 force-reload\"\n```\n\n**Nginx example**:\n\n```\nacme.sh --install-cert -d example.com \\\n--key-file /path/to/keyfile/in/nginx/key.pem \\\n--fullchain-file /path/to/fullchain/nginx/cert.pem \\\n--reloadcmd \"service nginx force-reload\"\n```\n\n(一个小提醒, 这里用的是 `service nginx force-reload`, 不是 `service nginx reload`, 据测试, `reload` 并不会重新加载证书, 所以用的 `force-reload`)\n\n**Nginx** 的配置 `ssl_certificate` 使用 `/etc/nginx/ssl/fullchain.cer` ,而非 `/etc/nginx/ssl/<domain>.cer` ,否则 [SSL Labs](https://www.ssllabs.com/ssltest/) 的测试会报 `Chain issues Incomplete` 错误。\n\n`--install-cert`命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.\n\n**Nginx**配置\n\n```properties\nserver {\n listen 443 ssl;\n server_name www.mydomain.com;\n \n ssl_certificate /path/to/keyfile/in/nginx/cert.pem;\n ssl_certificate_key /path/to/fullchain/nginx/key.pem;\n ssl_session_timeout 5m;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服务器端支持的协议版本\n ssl_ciphers HIGH:!aNULL:!MD5;\n #ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #指定加密算法\n ssl_prefer_server_ciphers on; #在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法\n}\n```\n\n#### 续期证书\n\n目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.\n\n#### 更新acme.sh\n\n目前由于 **acme** 协议和 **letsencrypt CA** 都在频繁的更新, 因此 **acme.sh** 也经常更新以保持同步.\n\n升级 acme.sh 到最新版 :\n\n```\nacme.sh --upgrade\n```\n\n如果你不想手动升级, 可以开启自动升级:\n\n```\nacme.sh --upgrade --auto-upgrade\n```\n\n之后, **acme.sh** 就会自动保持更新了.\n\n你也可以随时关闭自动更新:\n\n```\nacme.sh --upgrade --auto-upgrade 0\n```\n\n#### 错误\n\n如果出错, 请添加 **debug log**:\n\n```\nacme.sh --issue ..... --debug \n```\n\n或者:\n\n```\nacme.sh --issue ..... --debug 2\n```\n\n请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh\n\n更高级的用法请参看其他 **wiki **页面.\n\nhttps://github.com/Neilpang/acme.sh/wiki\n\n\n\n参考文档:\n\n[https://github.com/acmesh-official/acme.sh](https://github.com/acmesh-official/acme.sh)\n\n[https://github.com/acmesh-official/acme.sh/wiki/说明](https://github.com/acmesh-official/acme.sh/wiki/说明)\n\n[https://segmentfault.com/a/1190000022263697](https://segmentfault.com/a/1190000022263697)\n\n[https://github.com/acmesh-official/acme.sh/wiki/dnsapi](https://github.com/acmesh-official/acme.sh/wiki/dnsapi)\n\n","slug":"acme-sh-free-ssl","published":1,"updated":"2020-09-13T06:54:25.126Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gh000358sy3mcmary0","content":"<h4 id=\"安装acme-sh\"><a href=\"#安装acme-sh\" class=\"headerlink\" title=\"安装acme.sh\"></a>安装acme.sh</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl https://get.acme.sh | sh</span><br></pre></td></tr></table></figure>\n\n<p>或者</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">wget -O - https://get.acme.sh | sh</span><br></pre></td></tr></table></figure>\n\n<p>最好使用第二个命令,原因:<strong>wget</strong> 命令用来从指定的<strong>URL</strong>下载文件。<strong>wget</strong>非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,<strong>wget</strong>会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。</p>\n<p>添加环境变量:</p>\n<p><code>/etc/profile</code>中添加<code>alias acme.sh=~/.acme.sh/acme.sh</code>,保存后执行<code>source /etc/profile</code>加载配置。</p>\n<h4 id=\"生成证书\"><a href=\"#生成证书\" class=\"headerlink\" title=\"生成证书\"></a>生成证书</h4><p><strong>http</strong></p>\n<p><code>-d</code>参数后为需要生成https证书的域名,<code>--webroot</code>参数为网站跟目录, 然后自动完成验证.</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/</span><br></pre></td></tr></table></figure>\n\n<p> <strong>apache</strong>服务器</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com --apache</span><br></pre></td></tr></table></figure>\n\n<p><strong>nginx</strong>服务器</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com --nginx</span><br></pre></td></tr></table></figure>\n\n<p>无<strong>web</strong>服务器,根据域名生成</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com --standalone</span><br></pre></td></tr></table></figure>\n\n<p><strong>dns</strong></p>\n<p>无需服务器</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue --dns -d mydomain.com</span><br></pre></td></tr></table></figure>\n\n<p>然后, <strong>acme.sh</strong> 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.</p>\n<p>等待解析完成之后, 重新生成证书:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --renew -d mydomain.com</span><br></pre></td></tr></table></figure>\n\n<p><strong>dns</strong> 方式的真正强大之处在于可以使用域名解析商提供的<strong>api</strong> 自动添加 txt 记录完成验证.</p>\n<p><strong>acme.sh</strong> 目前支持 <strong>cloudflare</strong>, <strong>dnspod</strong>, <strong>cloudxns</strong>, <strong>godaddy</strong> 以及 <strong>ovh</strong> 等数十种解析商的自动集成.</p>\n<p>以 <strong>dnspod</strong> 为例, 你需要先登录到 <strong>dnspod</strong> 账号, 生成你的 <strong>api id</strong> 和 <strong>api key</strong>, 都是免费的. 然后:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">export DP_Id=\"1234\"</span><br><span class=\"line\"></span><br><span class=\"line\">export DP_Key=\"sADDsdasdgdsf\"</span><br><span class=\"line\"></span><br><span class=\"line\">acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com</span><br></pre></td></tr></table></figure>\n\n<p>证书就会自动生成了. 这里给出的 <strong>api id *<em>和 *</em>api key</strong> 会被自动记录下来, 将来你在使用<strong>dnspod api</strong> 的时候, 就不需要再次指定了. 直接生成就好了:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain2.com --dns dns_dp</span><br></pre></td></tr></table></figure>\n\n<p>更多:<a href=\"https://github.com/acmesh-official/acme.sh/wiki/dnsapi\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh/wiki/dnsapi</a></p>\n<h4 id=\"copy-安装证书\"><a href=\"#copy-安装证书\" class=\"headerlink\" title=\"copy/安装证书\"></a>copy/安装证书</h4><p>默认生成的证书都放在安装目录下: <code>~/.acme.sh/</code>,请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.</p>\n<p>正确的使用方法是使用 <code>--install-cert</code> 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:</p>\n<p><strong>Apache example</strong>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --install-cert -d mydomain.com \\</span><br><span class=\"line\">--cert-file /path/to/certfile/in/apache/cert.pem \\</span><br><span class=\"line\">--key-file /path/to/keyfile/in/apache/key.pem \\</span><br><span class=\"line\">--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \\</span><br><span class=\"line\">--reloadcmd "service apache2 force-reload"</span><br></pre></td></tr></table></figure>\n\n<p><strong>Nginx example</strong>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --install-cert -d example.com \\</span><br><span class=\"line\">--key-file /path/to/keyfile/in/nginx/key.pem \\</span><br><span class=\"line\">--fullchain-file /path/to/fullchain/nginx/cert.pem \\</span><br><span class=\"line\">--reloadcmd "service nginx force-reload"</span><br></pre></td></tr></table></figure>\n\n<p>(一个小提醒, 这里用的是 <code>service nginx force-reload</code>, 不是 <code>service nginx reload</code>, 据测试, <code>reload</code> 并不会重新加载证书, 所以用的 <code>force-reload</code>)</p>\n<p><strong>Nginx</strong> 的配置 <code>ssl_certificate</code> 使用 <code>/etc/nginx/ssl/fullchain.cer</code> ,而非 <code>/etc/nginx/ssl/<domain>.cer</code> ,否则 <a href=\"https://www.ssllabs.com/ssltest/\" target=\"_blank\" rel=\"noopener\">SSL Labs</a> 的测试会报 <code>Chain issues Incomplete</code> 错误。</p>\n<p><code>--install-cert</code>命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.</p>\n<p><strong>Nginx</strong>配置</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">server {</span><br><span class=\"line\"> listen 443 ssl;</span><br><span class=\"line\"> server_name www.mydomain.com;</span><br><span class=\"line\"> </span><br><span class=\"line\"> ssl_certificate /path/to/keyfile/in/nginx/cert.pem;</span><br><span class=\"line\"> ssl_certificate_key /path/to/fullchain/nginx/key.pem;</span><br><span class=\"line\"> ssl_session_timeout 5m;</span><br><span class=\"line\"> ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服务器端支持的协议版本</span><br><span class=\"line\"> ssl_ciphers HIGH:!aNULL:!MD5;</span><br><span class=\"line\"> #ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #指定加密算法</span><br><span class=\"line\"> ssl_prefer_server_ciphers on; #在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"续期证书\"><a href=\"#续期证书\" class=\"headerlink\" title=\"续期证书\"></a>续期证书</h4><p>目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.</p>\n<h4 id=\"更新acme-sh\"><a href=\"#更新acme-sh\" class=\"headerlink\" title=\"更新acme.sh\"></a>更新acme.sh</h4><p>目前由于 <strong>acme</strong> 协议和 <strong>letsencrypt CA</strong> 都在频繁的更新, 因此 <strong>acme.sh</strong> 也经常更新以保持同步.</p>\n<p>升级 acme.sh 到最新版 :</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --upgrade</span><br></pre></td></tr></table></figure>\n\n<p>如果你不想手动升级, 可以开启自动升级:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --upgrade --auto-upgrade</span><br></pre></td></tr></table></figure>\n\n<p>之后, <strong>acme.sh</strong> 就会自动保持更新了.</p>\n<p>你也可以随时关闭自动更新:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --upgrade --auto-upgrade 0</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"错误\"><a href=\"#错误\" class=\"headerlink\" title=\"错误\"></a>错误</h4><p>如果出错, 请添加 <strong>debug log</strong>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue ..... --debug</span><br></pre></td></tr></table></figure>\n\n<p>或者:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue ..... --debug 2</span><br></pre></td></tr></table></figure>\n\n<p>请参考: <a href=\"https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh\" target=\"_blank\" rel=\"noopener\">https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh</a></p>\n<p>更高级的用法请参看其他 *<em>wiki *</em>页面.</p>\n<p><a href=\"https://github.com/Neilpang/acme.sh/wiki\" target=\"_blank\" rel=\"noopener\">https://github.com/Neilpang/acme.sh/wiki</a></p>\n<p>参考文档:</p>\n<p><a href=\"https://github.com/acmesh-official/acme.sh\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh</a></p>\n<p><a href=\"https://github.com/acmesh-official/acme.sh/wiki/说明\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh/wiki/说明</a></p>\n<p><a href=\"https://segmentfault.com/a/1190000022263697\" target=\"_blank\" rel=\"noopener\">https://segmentfault.com/a/1190000022263697</a></p>\n<p><a href=\"https://github.com/acmesh-official/acme.sh/wiki/dnsapi\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh/wiki/dnsapi</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"安装acme-sh\"><a href=\"#安装acme-sh\" class=\"headerlink\" title=\"安装acme.sh\"></a>安装acme.sh</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl https://get.acme.sh | sh</span><br></pre></td></tr></table></figure>\n\n<p>或者</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">wget -O - https://get.acme.sh | sh</span><br></pre></td></tr></table></figure>\n\n<p>最好使用第二个命令,原因:<strong>wget</strong> 命令用来从指定的<strong>URL</strong>下载文件。<strong>wget</strong>非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,<strong>wget</strong>会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。</p>\n<p>添加环境变量:</p>\n<p><code>/etc/profile</code>中添加<code>alias acme.sh=~/.acme.sh/acme.sh</code>,保存后执行<code>source /etc/profile</code>加载配置。</p>\n<h4 id=\"生成证书\"><a href=\"#生成证书\" class=\"headerlink\" title=\"生成证书\"></a>生成证书</h4><p><strong>http</strong></p>\n<p><code>-d</code>参数后为需要生成https证书的域名,<code>--webroot</code>参数为网站跟目录, 然后自动完成验证.</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/</span><br></pre></td></tr></table></figure>\n\n<p> <strong>apache</strong>服务器</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com --apache</span><br></pre></td></tr></table></figure>\n\n<p><strong>nginx</strong>服务器</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com --nginx</span><br></pre></td></tr></table></figure>\n\n<p>无<strong>web</strong>服务器,根据域名生成</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain.com --standalone</span><br></pre></td></tr></table></figure>\n\n<p><strong>dns</strong></p>\n<p>无需服务器</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue --dns -d mydomain.com</span><br></pre></td></tr></table></figure>\n\n<p>然后, <strong>acme.sh</strong> 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.</p>\n<p>等待解析完成之后, 重新生成证书:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --renew -d mydomain.com</span><br></pre></td></tr></table></figure>\n\n<p><strong>dns</strong> 方式的真正强大之处在于可以使用域名解析商提供的<strong>api</strong> 自动添加 txt 记录完成验证.</p>\n<p><strong>acme.sh</strong> 目前支持 <strong>cloudflare</strong>, <strong>dnspod</strong>, <strong>cloudxns</strong>, <strong>godaddy</strong> 以及 <strong>ovh</strong> 等数十种解析商的自动集成.</p>\n<p>以 <strong>dnspod</strong> 为例, 你需要先登录到 <strong>dnspod</strong> 账号, 生成你的 <strong>api id</strong> 和 <strong>api key</strong>, 都是免费的. 然后:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">export DP_Id=\"1234\"</span><br><span class=\"line\"></span><br><span class=\"line\">export DP_Key=\"sADDsdasdgdsf\"</span><br><span class=\"line\"></span><br><span class=\"line\">acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com</span><br></pre></td></tr></table></figure>\n\n<p>证书就会自动生成了. 这里给出的 <strong>api id *<em>和 *</em>api key</strong> 会被自动记录下来, 将来你在使用<strong>dnspod api</strong> 的时候, 就不需要再次指定了. 直接生成就好了:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue -d mydomain2.com --dns dns_dp</span><br></pre></td></tr></table></figure>\n\n<p>更多:<a href=\"https://github.com/acmesh-official/acme.sh/wiki/dnsapi\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh/wiki/dnsapi</a></p>\n<h4 id=\"copy-安装证书\"><a href=\"#copy-安装证书\" class=\"headerlink\" title=\"copy/安装证书\"></a>copy/安装证书</h4><p>默认生成的证书都放在安装目录下: <code>~/.acme.sh/</code>,请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.</p>\n<p>正确的使用方法是使用 <code>--install-cert</code> 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:</p>\n<p><strong>Apache example</strong>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --install-cert -d mydomain.com \\</span><br><span class=\"line\">--cert-file /path/to/certfile/in/apache/cert.pem \\</span><br><span class=\"line\">--key-file /path/to/keyfile/in/apache/key.pem \\</span><br><span class=\"line\">--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \\</span><br><span class=\"line\">--reloadcmd "service apache2 force-reload"</span><br></pre></td></tr></table></figure>\n\n<p><strong>Nginx example</strong>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --install-cert -d example.com \\</span><br><span class=\"line\">--key-file /path/to/keyfile/in/nginx/key.pem \\</span><br><span class=\"line\">--fullchain-file /path/to/fullchain/nginx/cert.pem \\</span><br><span class=\"line\">--reloadcmd "service nginx force-reload"</span><br></pre></td></tr></table></figure>\n\n<p>(一个小提醒, 这里用的是 <code>service nginx force-reload</code>, 不是 <code>service nginx reload</code>, 据测试, <code>reload</code> 并不会重新加载证书, 所以用的 <code>force-reload</code>)</p>\n<p><strong>Nginx</strong> 的配置 <code>ssl_certificate</code> 使用 <code>/etc/nginx/ssl/fullchain.cer</code> ,而非 <code>/etc/nginx/ssl/<domain>.cer</code> ,否则 <a href=\"https://www.ssllabs.com/ssltest/\" target=\"_blank\" rel=\"noopener\">SSL Labs</a> 的测试会报 <code>Chain issues Incomplete</code> 错误。</p>\n<p><code>--install-cert</code>命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.</p>\n<p><strong>Nginx</strong>配置</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">server {</span><br><span class=\"line\"> listen 443 ssl;</span><br><span class=\"line\"> server_name www.mydomain.com;</span><br><span class=\"line\"> </span><br><span class=\"line\"> ssl_certificate /path/to/keyfile/in/nginx/cert.pem;</span><br><span class=\"line\"> ssl_certificate_key /path/to/fullchain/nginx/key.pem;</span><br><span class=\"line\"> ssl_session_timeout 5m;</span><br><span class=\"line\"> ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服务器端支持的协议版本</span><br><span class=\"line\"> ssl_ciphers HIGH:!aNULL:!MD5;</span><br><span class=\"line\"> #ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #指定加密算法</span><br><span class=\"line\"> ssl_prefer_server_ciphers on; #在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"续期证书\"><a href=\"#续期证书\" class=\"headerlink\" title=\"续期证书\"></a>续期证书</h4><p>目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.</p>\n<h4 id=\"更新acme-sh\"><a href=\"#更新acme-sh\" class=\"headerlink\" title=\"更新acme.sh\"></a>更新acme.sh</h4><p>目前由于 <strong>acme</strong> 协议和 <strong>letsencrypt CA</strong> 都在频繁的更新, 因此 <strong>acme.sh</strong> 也经常更新以保持同步.</p>\n<p>升级 acme.sh 到最新版 :</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --upgrade</span><br></pre></td></tr></table></figure>\n\n<p>如果你不想手动升级, 可以开启自动升级:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --upgrade --auto-upgrade</span><br></pre></td></tr></table></figure>\n\n<p>之后, <strong>acme.sh</strong> 就会自动保持更新了.</p>\n<p>你也可以随时关闭自动更新:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --upgrade --auto-upgrade 0</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"错误\"><a href=\"#错误\" class=\"headerlink\" title=\"错误\"></a>错误</h4><p>如果出错, 请添加 <strong>debug log</strong>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue ..... --debug</span><br></pre></td></tr></table></figure>\n\n<p>或者:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">acme.sh --issue ..... --debug 2</span><br></pre></td></tr></table></figure>\n\n<p>请参考: <a href=\"https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh\" target=\"_blank\" rel=\"noopener\">https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh</a></p>\n<p>更高级的用法请参看其他 *<em>wiki *</em>页面.</p>\n<p><a href=\"https://github.com/Neilpang/acme.sh/wiki\" target=\"_blank\" rel=\"noopener\">https://github.com/Neilpang/acme.sh/wiki</a></p>\n<p>参考文档:</p>\n<p><a href=\"https://github.com/acmesh-official/acme.sh\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh</a></p>\n<p><a href=\"https://github.com/acmesh-official/acme.sh/wiki/说明\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh/wiki/说明</a></p>\n<p><a href=\"https://segmentfault.com/a/1190000022263697\" target=\"_blank\" rel=\"noopener\">https://segmentfault.com/a/1190000022263697</a></p>\n<p><a href=\"https://github.com/acmesh-official/acme.sh/wiki/dnsapi\" target=\"_blank\" rel=\"noopener\">https://github.com/acmesh-official/acme.sh/wiki/dnsapi</a></p>\n"},{"title":"docker修改镜像文件存储位置","date":"2020-04-13T08:32:01.000Z","_content":"\n#### 修改docker文件存储位置\n\n#### 问题\n\n因为服务器磁盘存储空间剩余不多,然后挂载了新的存储,需要迁移docker镜像文件。\n\n#### 解决方法\n\nDocker默认的存放位置为:`/var/lib/docker`\n\n以下命令可查看具体位置:\n\n```shell\n docker info | grep \"Docker Root Dir\"\n```\n\n先将docker服务停止:\n\n```shell\nservice docker stop\n```\n\n将数据转移到新挂载的磁盘:\n\n```shell\nmv /var/lib/docker /data/docker\n```\n\n移动时出现`device or resource busy`问题,原因是因为`docker`运行的某些容器挂载的目录没有被卸载。\n\n使用以下命令查找为卸载的目录(`/var/lib/docker`为`docker`目录):\n\n```shell\ncat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}'\n```\n\n结果为:\n\n```shell\n/var/lib/docker/overlay2/5d89f720aaca052486928e57fb8a86568e8991b0ca327518f4704ba61718beb9/merged\n/var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm\n/var/lib/docker/overlay2/a27aaef652a6d9edeaa9d8672ae0b79feef3cf58e28ac34c6f56d6d777af8c02/merged\n/var/lib/docker/containers/89483898e50f02171486bfa86708e530aa7bd257f717c8a336fba4a79e2e0b2c/mounts/shm\n/var/lib/docker/overlay2/94bc54b30dcc128d258a8ec94293071fddd053bc40ebf4692d2fbb719fb596e4/merged\n\n```\n\n然后使用以下命令卸载对应目录:\n\n```shell\numount var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm\n```\n\n为运行方便,编写为`shell`脚本\n\n```shell\n#!/bin/bash\n# 停止docker服务\nservice docker stop\n# 查询并卸载处于挂载中的目录\numount $(cat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}')\n# 拷贝docker文件到指定目录\ncp -rf /var/lib/docker /data\n# 重命名docker原文件,备份防止出错\nmv /var/lib/docker /var/lib/dockerbak\n# 通过软连接指向原地址\nln -s /data/docker /var/lib/docker\n# 重启docker服务\nservice docker restart\n#可不删除,防止出现问题\n#rm -rf /var/lib/dockerbak\n```\n\n\n\n参考地址:\n\n[https://blog.51cto.com/forangela/1949947](https://blog.51cto.com/forangela/1949947)\n\n[https://blog.csdn.net/gulijiang2008/article/details/80591843](https://blog.csdn.net/gulijiang2008/article/details/80591843)","source":"_posts/docker-change-storage.md","raw":"---\ntitle: docker修改镜像文件存储位置\ndate: 2020-04-13 16:32:01\ntags: [docker,storage,'存储位置']\ncategories: [学习,docker]\n---\n\n#### 修改docker文件存储位置\n\n#### 问题\n\n因为服务器磁盘存储空间剩余不多,然后挂载了新的存储,需要迁移docker镜像文件。\n\n#### 解决方法\n\nDocker默认的存放位置为:`/var/lib/docker`\n\n以下命令可查看具体位置:\n\n```shell\n docker info | grep \"Docker Root Dir\"\n```\n\n先将docker服务停止:\n\n```shell\nservice docker stop\n```\n\n将数据转移到新挂载的磁盘:\n\n```shell\nmv /var/lib/docker /data/docker\n```\n\n移动时出现`device or resource busy`问题,原因是因为`docker`运行的某些容器挂载的目录没有被卸载。\n\n使用以下命令查找为卸载的目录(`/var/lib/docker`为`docker`目录):\n\n```shell\ncat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}'\n```\n\n结果为:\n\n```shell\n/var/lib/docker/overlay2/5d89f720aaca052486928e57fb8a86568e8991b0ca327518f4704ba61718beb9/merged\n/var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm\n/var/lib/docker/overlay2/a27aaef652a6d9edeaa9d8672ae0b79feef3cf58e28ac34c6f56d6d777af8c02/merged\n/var/lib/docker/containers/89483898e50f02171486bfa86708e530aa7bd257f717c8a336fba4a79e2e0b2c/mounts/shm\n/var/lib/docker/overlay2/94bc54b30dcc128d258a8ec94293071fddd053bc40ebf4692d2fbb719fb596e4/merged\n\n```\n\n然后使用以下命令卸载对应目录:\n\n```shell\numount var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm\n```\n\n为运行方便,编写为`shell`脚本\n\n```shell\n#!/bin/bash\n# 停止docker服务\nservice docker stop\n# 查询并卸载处于挂载中的目录\numount $(cat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}')\n# 拷贝docker文件到指定目录\ncp -rf /var/lib/docker /data\n# 重命名docker原文件,备份防止出错\nmv /var/lib/docker /var/lib/dockerbak\n# 通过软连接指向原地址\nln -s /data/docker /var/lib/docker\n# 重启docker服务\nservice docker restart\n#可不删除,防止出现问题\n#rm -rf /var/lib/dockerbak\n```\n\n\n\n参考地址:\n\n[https://blog.51cto.com/forangela/1949947](https://blog.51cto.com/forangela/1949947)\n\n[https://blog.csdn.net/gulijiang2008/article/details/80591843](https://blog.csdn.net/gulijiang2008/article/details/80591843)","slug":"docker-change-storage","published":1,"updated":"2020-09-13T06:54:52.669Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gl000758sy1qvlmyde","content":"<h4 id=\"修改docker文件存储位置\"><a href=\"#修改docker文件存储位置\" class=\"headerlink\" title=\"修改docker文件存储位置\"></a>修改docker文件存储位置</h4><h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>因为服务器磁盘存储空间剩余不多,然后挂载了新的存储,需要迁移docker镜像文件。</p>\n<h4 id=\"解决方法\"><a href=\"#解决方法\" class=\"headerlink\" title=\"解决方法\"></a>解决方法</h4><p>Docker默认的存放位置为:<code>/var/lib/docker</code></p>\n<p>以下命令可查看具体位置:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker info | grep \"Docker Root Dir\"</span><br></pre></td></tr></table></figure>\n\n<p>先将docker服务停止:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">service docker stop</span><br></pre></td></tr></table></figure>\n\n<p>将数据转移到新挂载的磁盘:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mv /var/lib/docker /data/docker</span><br></pre></td></tr></table></figure>\n\n<p>移动时出现<code>device or resource busy</code>问题,原因是因为<code>docker</code>运行的某些容器挂载的目录没有被卸载。</p>\n<p>使用以下命令查找为卸载的目录(<code>/var/lib/docker</code>为<code>docker</code>目录):</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}'</span><br></pre></td></tr></table></figure>\n\n<p>结果为:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">/var/lib/docker/overlay2/5d89f720aaca052486928e57fb8a86568e8991b0ca327518f4704ba61718beb9/merged</span><br><span class=\"line\">/var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm</span><br><span class=\"line\">/var/lib/docker/overlay2/a27aaef652a6d9edeaa9d8672ae0b79feef3cf58e28ac34c6f56d6d777af8c02/merged</span><br><span class=\"line\">/var/lib/docker/containers/89483898e50f02171486bfa86708e530aa7bd257f717c8a336fba4a79e2e0b2c/mounts/shm</span><br><span class=\"line\">/var/lib/docker/overlay2/94bc54b30dcc128d258a8ec94293071fddd053bc40ebf4692d2fbb719fb596e4/merged</span><br></pre></td></tr></table></figure>\n\n<p>然后使用以下命令卸载对应目录:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">umount var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm</span><br></pre></td></tr></table></figure>\n\n<p>为运行方便,编写为<code>shell</code>脚本</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">!/bin/bash</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 停止docker服务</span></span><br><span class=\"line\">service docker stop</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 查询并卸载处于挂载中的目录</span></span><br><span class=\"line\">umount $(cat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}')</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 拷贝docker文件到指定目录</span></span><br><span class=\"line\">cp -rf /var/lib/docker /data</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 重命名docker原文件,备份防止出错</span></span><br><span class=\"line\">mv /var/lib/docker /var/lib/dockerbak</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 通过软连接指向原地址</span></span><br><span class=\"line\">ln -s /data/docker /var/lib/docker</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 重启docker服务</span></span><br><span class=\"line\">service docker restart</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">可不删除,防止出现问题</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">rm -rf /var/lib/dockerbak</span></span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://blog.51cto.com/forangela/1949947\" target=\"_blank\" rel=\"noopener\">https://blog.51cto.com/forangela/1949947</a></p>\n<p><a href=\"https://blog.csdn.net/gulijiang2008/article/details/80591843\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/gulijiang2008/article/details/80591843</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"修改docker文件存储位置\"><a href=\"#修改docker文件存储位置\" class=\"headerlink\" title=\"修改docker文件存储位置\"></a>修改docker文件存储位置</h4><h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>因为服务器磁盘存储空间剩余不多,然后挂载了新的存储,需要迁移docker镜像文件。</p>\n<h4 id=\"解决方法\"><a href=\"#解决方法\" class=\"headerlink\" title=\"解决方法\"></a>解决方法</h4><p>Docker默认的存放位置为:<code>/var/lib/docker</code></p>\n<p>以下命令可查看具体位置:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker info | grep \"Docker Root Dir\"</span><br></pre></td></tr></table></figure>\n\n<p>先将docker服务停止:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">service docker stop</span><br></pre></td></tr></table></figure>\n\n<p>将数据转移到新挂载的磁盘:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mv /var/lib/docker /data/docker</span><br></pre></td></tr></table></figure>\n\n<p>移动时出现<code>device or resource busy</code>问题,原因是因为<code>docker</code>运行的某些容器挂载的目录没有被卸载。</p>\n<p>使用以下命令查找为卸载的目录(<code>/var/lib/docker</code>为<code>docker</code>目录):</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}'</span><br></pre></td></tr></table></figure>\n\n<p>结果为:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">/var/lib/docker/overlay2/5d89f720aaca052486928e57fb8a86568e8991b0ca327518f4704ba61718beb9/merged</span><br><span class=\"line\">/var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm</span><br><span class=\"line\">/var/lib/docker/overlay2/a27aaef652a6d9edeaa9d8672ae0b79feef3cf58e28ac34c6f56d6d777af8c02/merged</span><br><span class=\"line\">/var/lib/docker/containers/89483898e50f02171486bfa86708e530aa7bd257f717c8a336fba4a79e2e0b2c/mounts/shm</span><br><span class=\"line\">/var/lib/docker/overlay2/94bc54b30dcc128d258a8ec94293071fddd053bc40ebf4692d2fbb719fb596e4/merged</span><br></pre></td></tr></table></figure>\n\n<p>然后使用以下命令卸载对应目录:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">umount var/lib/docker/containers/73a873a188f3c7402e45805e5e47ff99346b016a8e9977bd609a4f242a499a25/mounts/shm</span><br></pre></td></tr></table></figure>\n\n<p>为运行方便,编写为<code>shell</code>脚本</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">!/bin/bash</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 停止docker服务</span></span><br><span class=\"line\">service docker stop</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 查询并卸载处于挂载中的目录</span></span><br><span class=\"line\">umount $(cat /proc/mounts | grep \"/var/lib/docker\" | awk '{print $2}')</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 拷贝docker文件到指定目录</span></span><br><span class=\"line\">cp -rf /var/lib/docker /data</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 重命名docker原文件,备份防止出错</span></span><br><span class=\"line\">mv /var/lib/docker /var/lib/dockerbak</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 通过软连接指向原地址</span></span><br><span class=\"line\">ln -s /data/docker /var/lib/docker</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 重启docker服务</span></span><br><span class=\"line\">service docker restart</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">可不删除,防止出现问题</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">rm -rf /var/lib/dockerbak</span></span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://blog.51cto.com/forangela/1949947\" target=\"_blank\" rel=\"noopener\">https://blog.51cto.com/forangela/1949947</a></p>\n<p><a href=\"https://blog.csdn.net/gulijiang2008/article/details/80591843\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/gulijiang2008/article/details/80591843</a></p>\n"},{"title":"docker以及docker-compose安装","date":"2020-03-30T00:31:06.000Z","_content":"\n#### 基本信息\n\ncentos 7 阿里云\n\n#### 安装Docker\n\n##### 使用官方脚本自动安装\n\n```shell\ncurl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun\n```\n\n##### 手动安装帮助(阿里云ecs可通过内网安装)\n\ncentos7\n\n```shell\n# step 1: 安装必要的一些系统工具\nsudo yum install -y yum-utils device-mapper-persistent-data lvm2\n# Step 2: 添加软件源信息\nsudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo\n# Step 3: 更新并安装 Docker-CE\nsudo yum makecache fast\nsudo yum -y install docker-ce\n# Step 4: 开启Docker服务\nsudo service docker start\n\n注意:其他注意事项在下面的注释中\n# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。\n# vim /etc/yum.repos.d/docker-ce.repo\n# 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1\n#\n# 安装指定版本的Docker-CE:\n# Step 1: 查找Docker-CE的版本:\n# yum list docker-ce.x86_64 --showduplicates | sort -r\n# Loading mirror speeds from cached hostfile\n# Loaded plugins: branch, fastestmirror, langpacks\n# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable\n# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable\n# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable\n# Available Packages\n# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)\n# sudo yum -y install docker-ce-[VERSION]\n# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。\n# yum list docker-ce-selinux- --showduplicates | sort -r\n# sudo yum -y install docker-ce-selinux-[VERSION]\n\n# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令\n# 经典网络:\n# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo\n# VPC网络:\n# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo\n```\n\n\n\n##### 镜像加速\n\n新建或修改`/etc/docker/daemon.json`,加入:\n\n```json\n{\n \"registry-mirrors\": [\n \"https://dockerhub.azk8s.cn\",\n \"https://reg-mirror.qiniu.com\"\n ]\n}\n```\n\n一定要确保格式没有问题,否则 docker 无法启动,修改完成后执行以下命令:\n\n```shell\n#重新加载配置\nsudo systemctl daemon-reload\n#启动Docker\nsudo systemctl restart docker\n```\n\n##### 关闭 selinux\n\n1、临时关闭(不用重启机器)\n\n```shell\nsetenforce 0 #设置SELinux 成为permissive模式\n#setenforce 1 设置SELinux 成为enforcing模式\n```\n\n2、修改配置文件(重启机器)\n\n修改`/etc/selinux/config` 文件\n\n将`SELINUX=enforcing`改为`SELINUX=disabled`\n\n重启机器即可\n\n#### 安装Docker-compose\n\n```shell\nsudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n```\n\n使用github进行安装可能会下载失败,可先下载`docker-compose`安装文件后上传到服务进行安装。上传到服务器后移动到`/usr/local/bin`目录,使用`chmod +x /usr/local/bin/docker-compose`命令修改`docker-compose`为可执行权限。\n\n\n\n参考地址:\n\n[https://yq.aliyun.com/articles/110806](https://yq.aliyun.com/articles/110806)\n\n[https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/)","source":"_posts/docker-install-docker-compose-install.md","raw":"---\ntitle: docker以及docker-compose安装\ndate: 2020-03-30 08:31:06\ntags: [docker,docker-compose]\ncategories: [学习,docker]\n---\n\n#### 基本信息\n\ncentos 7 阿里云\n\n#### 安装Docker\n\n##### 使用官方脚本自动安装\n\n```shell\ncurl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun\n```\n\n##### 手动安装帮助(阿里云ecs可通过内网安装)\n\ncentos7\n\n```shell\n# step 1: 安装必要的一些系统工具\nsudo yum install -y yum-utils device-mapper-persistent-data lvm2\n# Step 2: 添加软件源信息\nsudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo\n# Step 3: 更新并安装 Docker-CE\nsudo yum makecache fast\nsudo yum -y install docker-ce\n# Step 4: 开启Docker服务\nsudo service docker start\n\n注意:其他注意事项在下面的注释中\n# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。\n# vim /etc/yum.repos.d/docker-ce.repo\n# 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1\n#\n# 安装指定版本的Docker-CE:\n# Step 1: 查找Docker-CE的版本:\n# yum list docker-ce.x86_64 --showduplicates | sort -r\n# Loading mirror speeds from cached hostfile\n# Loaded plugins: branch, fastestmirror, langpacks\n# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable\n# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable\n# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable\n# Available Packages\n# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)\n# sudo yum -y install docker-ce-[VERSION]\n# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。\n# yum list docker-ce-selinux- --showduplicates | sort -r\n# sudo yum -y install docker-ce-selinux-[VERSION]\n\n# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令\n# 经典网络:\n# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo\n# VPC网络:\n# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo\n```\n\n\n\n##### 镜像加速\n\n新建或修改`/etc/docker/daemon.json`,加入:\n\n```json\n{\n \"registry-mirrors\": [\n \"https://dockerhub.azk8s.cn\",\n \"https://reg-mirror.qiniu.com\"\n ]\n}\n```\n\n一定要确保格式没有问题,否则 docker 无法启动,修改完成后执行以下命令:\n\n```shell\n#重新加载配置\nsudo systemctl daemon-reload\n#启动Docker\nsudo systemctl restart docker\n```\n\n##### 关闭 selinux\n\n1、临时关闭(不用重启机器)\n\n```shell\nsetenforce 0 #设置SELinux 成为permissive模式\n#setenforce 1 设置SELinux 成为enforcing模式\n```\n\n2、修改配置文件(重启机器)\n\n修改`/etc/selinux/config` 文件\n\n将`SELINUX=enforcing`改为`SELINUX=disabled`\n\n重启机器即可\n\n#### 安装Docker-compose\n\n```shell\nsudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n```\n\n使用github进行安装可能会下载失败,可先下载`docker-compose`安装文件后上传到服务进行安装。上传到服务器后移动到`/usr/local/bin`目录,使用`chmod +x /usr/local/bin/docker-compose`命令修改`docker-compose`为可执行权限。\n\n\n\n参考地址:\n\n[https://yq.aliyun.com/articles/110806](https://yq.aliyun.com/articles/110806)\n\n[https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/)","slug":"docker-install-docker-compose-install","published":1,"updated":"2020-09-13T06:54:59.874Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gm000958sykhbed2ta","content":"<h4 id=\"基本信息\"><a href=\"#基本信息\" class=\"headerlink\" title=\"基本信息\"></a>基本信息</h4><p>centos 7 阿里云</p>\n<h4 id=\"安装Docker\"><a href=\"#安装Docker\" class=\"headerlink\" title=\"安装Docker\"></a>安装Docker</h4><h5 id=\"使用官方脚本自动安装\"><a href=\"#使用官方脚本自动安装\" class=\"headerlink\" title=\"使用官方脚本自动安装\"></a>使用官方脚本自动安装</h5><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"手动安装帮助(阿里云ecs可通过内网安装)\"><a href=\"#手动安装帮助(阿里云ecs可通过内网安装)\" class=\"headerlink\" title=\"手动安装帮助(阿里云ecs可通过内网安装)\"></a>手动安装帮助(阿里云ecs可通过内网安装)</h5><p>centos7</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> step 1: 安装必要的一些系统工具</span></span><br><span class=\"line\">sudo yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 2: 添加软件源信息</span></span><br><span class=\"line\">sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 3: 更新并安装 Docker-CE</span></span><br><span class=\"line\">sudo yum makecache fast</span><br><span class=\"line\">sudo yum -y install docker-ce</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 4: 开启Docker服务</span></span><br><span class=\"line\">sudo service docker start</span><br><span class=\"line\"></span><br><span class=\"line\">注意:其他注意事项在下面的注释中</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> vim /etc/yum.repos.d/docker-ce.repo</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1</span></span><br><span class=\"line\"><span class=\"meta\">#</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 安装指定版本的Docker-CE:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 1: 查找Docker-CE的版本:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> yum list docker-ce.x86_64 --showduplicates | sort -r</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Loading mirror speeds from cached hostfile</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Loaded plugins: branch, fastestmirror, langpacks</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Available Packages</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum -y install docker-ce-[VERSION]</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> yum list docker-ce-selinux- --showduplicates | sort -r</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum -y install docker-ce-selinux-[VERSION]</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 经典网络:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> VPC网络:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo</span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"镜像加速\"><a href=\"#镜像加速\" class=\"headerlink\" title=\"镜像加速\"></a>镜像加速</h5><p>新建或修改<code>/etc/docker/daemon.json</code>,加入:</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"attr\">\"registry-mirrors\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"https://dockerhub.azk8s.cn\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"https://reg-mirror.qiniu.com\"</span></span><br><span class=\"line\"> ]</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>一定要确保格式没有问题,否则 docker 无法启动,修改完成后执行以下命令:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">重新加载配置</span></span><br><span class=\"line\">sudo systemctl daemon-reload</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">启动Docker</span></span><br><span class=\"line\">sudo systemctl restart docker</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"关闭-selinux\"><a href=\"#关闭-selinux\" class=\"headerlink\" title=\"关闭 selinux\"></a>关闭 selinux</h5><p>1、临时关闭(不用重启机器)</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">setenforce 0 #设置SELinux 成为permissive模式</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">setenforce 1 设置SELinux 成为enforcing模式</span></span><br></pre></td></tr></table></figure>\n\n<p>2、修改配置文件(重启机器)</p>\n<p>修改<code>/etc/selinux/config</code> 文件</p>\n<p>将<code>SELINUX=enforcing</code>改为<code>SELINUX=disabled</code></p>\n<p>重启机器即可</p>\n<h4 id=\"安装Docker-compose\"><a href=\"#安装Docker-compose\" class=\"headerlink\" title=\"安装Docker-compose\"></a>安装Docker-compose</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose</span><br></pre></td></tr></table></figure>\n\n<p>使用github进行安装可能会下载失败,可先下载<code>docker-compose</code>安装文件后上传到服务进行安装。上传到服务器后移动到<code>/usr/local/bin</code>目录,使用<code>chmod +x /usr/local/bin/docker-compose</code>命令修改<code>docker-compose</code>为可执行权限。</p>\n<p>参考地址:</p>\n<p><a href=\"https://yq.aliyun.com/articles/110806\" target=\"_blank\" rel=\"noopener\">https://yq.aliyun.com/articles/110806</a></p>\n<p><a href=\"https://docs.docker.com/compose/install/\" target=\"_blank\" rel=\"noopener\">https://docs.docker.com/compose/install/</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"基本信息\"><a href=\"#基本信息\" class=\"headerlink\" title=\"基本信息\"></a>基本信息</h4><p>centos 7 阿里云</p>\n<h4 id=\"安装Docker\"><a href=\"#安装Docker\" class=\"headerlink\" title=\"安装Docker\"></a>安装Docker</h4><h5 id=\"使用官方脚本自动安装\"><a href=\"#使用官方脚本自动安装\" class=\"headerlink\" title=\"使用官方脚本自动安装\"></a>使用官方脚本自动安装</h5><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"手动安装帮助(阿里云ecs可通过内网安装)\"><a href=\"#手动安装帮助(阿里云ecs可通过内网安装)\" class=\"headerlink\" title=\"手动安装帮助(阿里云ecs可通过内网安装)\"></a>手动安装帮助(阿里云ecs可通过内网安装)</h5><p>centos7</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> step 1: 安装必要的一些系统工具</span></span><br><span class=\"line\">sudo yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 2: 添加软件源信息</span></span><br><span class=\"line\">sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 3: 更新并安装 Docker-CE</span></span><br><span class=\"line\">sudo yum makecache fast</span><br><span class=\"line\">sudo yum -y install docker-ce</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 4: 开启Docker服务</span></span><br><span class=\"line\">sudo service docker start</span><br><span class=\"line\"></span><br><span class=\"line\">注意:其他注意事项在下面的注释中</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> vim /etc/yum.repos.d/docker-ce.repo</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1</span></span><br><span class=\"line\"><span class=\"meta\">#</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 安装指定版本的Docker-CE:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step 1: 查找Docker-CE的版本:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> yum list docker-ce.x86_64 --showduplicates | sort -r</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Loading mirror speeds from cached hostfile</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Loaded plugins: branch, fastestmirror, langpacks</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Available Packages</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum -y install docker-ce-[VERSION]</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> yum list docker-ce-selinux- --showduplicates | sort -r</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum -y install docker-ce-selinux-[VERSION]</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 经典网络:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> VPC网络:</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo</span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"镜像加速\"><a href=\"#镜像加速\" class=\"headerlink\" title=\"镜像加速\"></a>镜像加速</h5><p>新建或修改<code>/etc/docker/daemon.json</code>,加入:</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"attr\">\"registry-mirrors\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"https://dockerhub.azk8s.cn\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"https://reg-mirror.qiniu.com\"</span></span><br><span class=\"line\"> ]</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>一定要确保格式没有问题,否则 docker 无法启动,修改完成后执行以下命令:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">重新加载配置</span></span><br><span class=\"line\">sudo systemctl daemon-reload</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">启动Docker</span></span><br><span class=\"line\">sudo systemctl restart docker</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"关闭-selinux\"><a href=\"#关闭-selinux\" class=\"headerlink\" title=\"关闭 selinux\"></a>关闭 selinux</h5><p>1、临时关闭(不用重启机器)</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">setenforce 0 #设置SELinux 成为permissive模式</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">setenforce 1 设置SELinux 成为enforcing模式</span></span><br></pre></td></tr></table></figure>\n\n<p>2、修改配置文件(重启机器)</p>\n<p>修改<code>/etc/selinux/config</code> 文件</p>\n<p>将<code>SELINUX=enforcing</code>改为<code>SELINUX=disabled</code></p>\n<p>重启机器即可</p>\n<h4 id=\"安装Docker-compose\"><a href=\"#安装Docker-compose\" class=\"headerlink\" title=\"安装Docker-compose\"></a>安装Docker-compose</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose</span><br></pre></td></tr></table></figure>\n\n<p>使用github进行安装可能会下载失败,可先下载<code>docker-compose</code>安装文件后上传到服务进行安装。上传到服务器后移动到<code>/usr/local/bin</code>目录,使用<code>chmod +x /usr/local/bin/docker-compose</code>命令修改<code>docker-compose</code>为可执行权限。</p>\n<p>参考地址:</p>\n<p><a href=\"https://yq.aliyun.com/articles/110806\" target=\"_blank\" rel=\"noopener\">https://yq.aliyun.com/articles/110806</a></p>\n<p><a href=\"https://docs.docker.com/compose/install/\" target=\"_blank\" rel=\"noopener\">https://docs.docker.com/compose/install/</a></p>\n"},{"title":"更换Hexo主题","date":"2019-09-11T05:38:30.000Z","type":"search","_content":"\n### 原主题Next的Mist \n\n根目录下的`_config.yml`文件配置\n\n```yml\nthemes: next\n```\n\n`themes/next`目录下`_config.yml`文件配置\n\n```yaml\n# Schemes\nscheme: Mist\n```\n\n### 更为主题cactus\n\n主题地址:[https://github.com/probberechts/hexo-theme-cactus](https://github.com/probberechts/hexo-theme-cactus)\n\n#### 修改根目录下的`_config.yml`文件配置\n\n```yaml\ntheme: cactus\ntheme_config:\n colorscheme: white \n```\n\n#### 修改`themes/cactus`目录下`_config.yml`文件配置\n\n```yaml\nprojects_url: http://github.com/akapril\n\nnav:\n home: /\n # About: /about\n search: /search/\n\nsocial_links:\n github: http://github.com/akapril\n \nposts_overview:\n show_all_posts: true\n```\n\n#### 配置搜索\n\n安装`hexo-generator-search`插件\n\n````shell\nnpm install hexo-generator-search --save\n````\n\n创建搜索页面\n\n```shell\n hexo new page search\n```\n\n创建后内容修改成\n\n```markdown\ntitle: Search\ntype: search\n---\n```\n\n最后在`themes/cactus`目录下`_config.yml`文件配置\n\n```yaml\nnav:\n search: /search/\n```\n\n`nav`下导航菜单可随意命名配置\n\n```yaml\nnav:\n 主页: /\n 搜索: /search/\n```\n\n","source":"_posts/change-themes.md","raw":"---\ntitle: 更换Hexo主题\ndate: 2019-09-11 13:38:30\ntype: search\ntags: [themes,cactus,hexo]\ncategories: [学习,hexo,themes]\n---\n\n### 原主题Next的Mist \n\n根目录下的`_config.yml`文件配置\n\n```yml\nthemes: next\n```\n\n`themes/next`目录下`_config.yml`文件配置\n\n```yaml\n# Schemes\nscheme: Mist\n```\n\n### 更为主题cactus\n\n主题地址:[https://github.com/probberechts/hexo-theme-cactus](https://github.com/probberechts/hexo-theme-cactus)\n\n#### 修改根目录下的`_config.yml`文件配置\n\n```yaml\ntheme: cactus\ntheme_config:\n colorscheme: white \n```\n\n#### 修改`themes/cactus`目录下`_config.yml`文件配置\n\n```yaml\nprojects_url: http://github.com/akapril\n\nnav:\n home: /\n # About: /about\n search: /search/\n\nsocial_links:\n github: http://github.com/akapril\n \nposts_overview:\n show_all_posts: true\n```\n\n#### 配置搜索\n\n安装`hexo-generator-search`插件\n\n````shell\nnpm install hexo-generator-search --save\n````\n\n创建搜索页面\n\n```shell\n hexo new page search\n```\n\n创建后内容修改成\n\n```markdown\ntitle: Search\ntype: search\n---\n```\n\n最后在`themes/cactus`目录下`_config.yml`文件配置\n\n```yaml\nnav:\n search: /search/\n```\n\n`nav`下导航菜单可随意命名配置\n\n```yaml\nnav:\n 主页: /\n 搜索: /search/\n```\n\n","slug":"change-themes","published":1,"updated":"2020-09-13T06:54:36.559Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gp000b58syd6unbt8w","content":"<h3 id=\"原主题Next的Mist\"><a href=\"#原主题Next的Mist\" class=\"headerlink\" title=\"原主题Next的Mist\"></a>原主题Next的Mist</h3><p>根目录下的<code>_config.yml</code>文件配置</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">themes:</span> <span class=\"string\">next</span></span><br></pre></td></tr></table></figure>\n\n<p><code>themes/next</code>目录下<code>_config.yml</code>文件配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># Schemes</span></span><br><span class=\"line\"><span class=\"attr\">scheme:</span> <span class=\"string\">Mist</span></span><br></pre></td></tr></table></figure>\n\n<h3 id=\"更为主题cactus\"><a href=\"#更为主题cactus\" class=\"headerlink\" title=\"更为主题cactus\"></a>更为主题cactus</h3><p>主题地址:<a href=\"https://github.com/probberechts/hexo-theme-cactus\" target=\"_blank\" rel=\"noopener\">https://github.com/probberechts/hexo-theme-cactus</a></p>\n<h4 id=\"修改根目录下的-config-yml文件配置\"><a href=\"#修改根目录下的-config-yml文件配置\" class=\"headerlink\" title=\"修改根目录下的_config.yml文件配置\"></a>修改根目录下的<code>_config.yml</code>文件配置</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">theme:</span> <span class=\"string\">cactus</span></span><br><span class=\"line\"><span class=\"attr\">theme_config:</span></span><br><span class=\"line\"> <span class=\"attr\">colorscheme:</span> <span class=\"string\">white</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"修改themes-cactus目录下-config-yml文件配置\"><a href=\"#修改themes-cactus目录下-config-yml文件配置\" class=\"headerlink\" title=\"修改themes/cactus目录下_config.yml文件配置\"></a>修改<code>themes/cactus</code>目录下<code>_config.yml</code>文件配置</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">projects_url:</span> <span class=\"string\">http://github.com/akapril</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">nav:</span></span><br><span class=\"line\"> <span class=\"attr\">home:</span> <span class=\"string\">/</span></span><br><span class=\"line\"> <span class=\"comment\"># About: /about</span></span><br><span class=\"line\"> <span class=\"attr\">search:</span> <span class=\"string\">/search/</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">social_links:</span></span><br><span class=\"line\"> <span class=\"attr\">github:</span> <span class=\"string\">http://github.com/akapril</span></span><br><span class=\"line\"> </span><br><span class=\"line\"><span class=\"attr\">posts_overview:</span></span><br><span class=\"line\"> <span class=\"attr\">show_all_posts:</span> <span class=\"literal\">true</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"配置搜索\"><a href=\"#配置搜索\" class=\"headerlink\" title=\"配置搜索\"></a>配置搜索</h4><p>安装<code>hexo-generator-search</code>插件</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install hexo-generator-search --save</span><br></pre></td></tr></table></figure>\n\n<p>创建搜索页面</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page search</span><br></pre></td></tr></table></figure>\n\n<p>创建后内容修改成</p>\n<figure class=\"highlight markdown\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">title: Search</span><br><span class=\"line\">type: search</span><br><span class=\"line\">---</span><br></pre></td></tr></table></figure>\n\n<p>最后在<code>themes/cactus</code>目录下<code>_config.yml</code>文件配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">nav:</span></span><br><span class=\"line\"> <span class=\"attr\">search:</span> <span class=\"string\">/search/</span></span><br></pre></td></tr></table></figure>\n\n<p><code>nav</code>下导航菜单可随意命名配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">nav:</span></span><br><span class=\"line\"> <span class=\"string\">主页:</span> <span class=\"string\">/</span></span><br><span class=\"line\"> <span class=\"string\">搜索:</span> <span class=\"string\">/search/</span></span><br></pre></td></tr></table></figure>\n\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"原主题Next的Mist\"><a href=\"#原主题Next的Mist\" class=\"headerlink\" title=\"原主题Next的Mist\"></a>原主题Next的Mist</h3><p>根目录下的<code>_config.yml</code>文件配置</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">themes:</span> <span class=\"string\">next</span></span><br></pre></td></tr></table></figure>\n\n<p><code>themes/next</code>目录下<code>_config.yml</code>文件配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># Schemes</span></span><br><span class=\"line\"><span class=\"attr\">scheme:</span> <span class=\"string\">Mist</span></span><br></pre></td></tr></table></figure>\n\n<h3 id=\"更为主题cactus\"><a href=\"#更为主题cactus\" class=\"headerlink\" title=\"更为主题cactus\"></a>更为主题cactus</h3><p>主题地址:<a href=\"https://github.com/probberechts/hexo-theme-cactus\" target=\"_blank\" rel=\"noopener\">https://github.com/probberechts/hexo-theme-cactus</a></p>\n<h4 id=\"修改根目录下的-config-yml文件配置\"><a href=\"#修改根目录下的-config-yml文件配置\" class=\"headerlink\" title=\"修改根目录下的_config.yml文件配置\"></a>修改根目录下的<code>_config.yml</code>文件配置</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">theme:</span> <span class=\"string\">cactus</span></span><br><span class=\"line\"><span class=\"attr\">theme_config:</span></span><br><span class=\"line\"> <span class=\"attr\">colorscheme:</span> <span class=\"string\">white</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"修改themes-cactus目录下-config-yml文件配置\"><a href=\"#修改themes-cactus目录下-config-yml文件配置\" class=\"headerlink\" title=\"修改themes/cactus目录下_config.yml文件配置\"></a>修改<code>themes/cactus</code>目录下<code>_config.yml</code>文件配置</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">projects_url:</span> <span class=\"string\">http://github.com/akapril</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">nav:</span></span><br><span class=\"line\"> <span class=\"attr\">home:</span> <span class=\"string\">/</span></span><br><span class=\"line\"> <span class=\"comment\"># About: /about</span></span><br><span class=\"line\"> <span class=\"attr\">search:</span> <span class=\"string\">/search/</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">social_links:</span></span><br><span class=\"line\"> <span class=\"attr\">github:</span> <span class=\"string\">http://github.com/akapril</span></span><br><span class=\"line\"> </span><br><span class=\"line\"><span class=\"attr\">posts_overview:</span></span><br><span class=\"line\"> <span class=\"attr\">show_all_posts:</span> <span class=\"literal\">true</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"配置搜索\"><a href=\"#配置搜索\" class=\"headerlink\" title=\"配置搜索\"></a>配置搜索</h4><p>安装<code>hexo-generator-search</code>插件</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install hexo-generator-search --save</span><br></pre></td></tr></table></figure>\n\n<p>创建搜索页面</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo new page search</span><br></pre></td></tr></table></figure>\n\n<p>创建后内容修改成</p>\n<figure class=\"highlight markdown\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">title: Search</span><br><span class=\"line\">type: search</span><br><span class=\"line\">---</span><br></pre></td></tr></table></figure>\n\n<p>最后在<code>themes/cactus</code>目录下<code>_config.yml</code>文件配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">nav:</span></span><br><span class=\"line\"> <span class=\"attr\">search:</span> <span class=\"string\">/search/</span></span><br></pre></td></tr></table></figure>\n\n<p><code>nav</code>下导航菜单可随意命名配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">nav:</span></span><br><span class=\"line\"> <span class=\"string\">主页:</span> <span class=\"string\">/</span></span><br><span class=\"line\"> <span class=\"string\">搜索:</span> <span class=\"string\">/search/</span></span><br></pre></td></tr></table></figure>\n\n"},{"title":"cordova插件开发","date":"2020-04-23T08:12:24.000Z","_content":"\n#### 原因\n\n蓝牙打印机型号:`汉印A300(HM-A300-6624)`\n\nApp接入调用蓝牙打印机进行二维码的打印,使用普通`cordova`蓝牙链接库发送指令,无法打印条形码。\n\n#### 解决方案\n\n##### 安装`plugman`\n\n```bash\nnpm install -g plugman\n```\n\n##### 创建插件项目\n\n```bash\n# 去掉<>\nplugman create --name <插件名> --plugin_id <插件id(插件调用名)> --plugin_version <插件版本号(1.0.0)>\n```\n\n##### 添加需要开发的平台\n\n```bash\n # 添加android平台\n plugman platform add --platform_name android \n```\n\n##### 规范项目\n\n修改生成的`java`代码包位置。\n\n```bash\n| .gitignore\n| package.json\n| plugin.xml\n|\n|\n+---src\n| \\---android\n| \\---cn\n| \\---akapril\n| \\---ble\n| BlePrintPlugin.java\n|\n\\---www\n BlePrintPlugin.js\n```\n\n修改完目录后需要修改`plugin.xml`(添加本地`jar`包处解释)\n\n##### 添加本地`jar`包\n\n在根目录新建目录`libs`,将需要的`jar`包放入目录中。\n\n修改`plugin.xml`配置\n\n```xml\n<?xml version='1.0' encoding='utf-8'?>\n<plugin id=\"BlePrintPlugin\" version=\"1.0.0\" \n xmlns=\"http://apache.org/cordova/ns/plugins/1.0\" \n xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <name>BlePrintPlugin</name>\n <js-module name=\"BlePrintPlugin\" src=\"www/BlePrintPlugin.js\">\n <clobbers target=\"cordova.plugins.BlePrintPlugin\" />\n </js-module>\n <platform name=\"android\">\n <config-file parent=\"/*\" target=\"res/xml/config.xml\">\n <feature name=\"BlePrintPlugin\">\n <!-- 修改java代码目录时候对应包 -->\n <param name=\"android-package\" value=\"cn.akapril.ble.BlePrintPlugin\" />\n </feature>\n </config-file>\n <config-file parent=\"/*\" target=\"AndroidManifest.xml\"></config-file>\n <!-- 对应文件 -->\n <source-file src=\"libs/CPCL_V1.07.jar\" target-dir=\"libs\"/>\n <source-file src=\"src/android/cn/akapril/ble/BlePrintPlugin.java\" target-dir=\"src/cn/akapril/ble\" />\n </platform>\n</plugin>\n```\n\n##### 生成`package.json`\n\n```bash\n#插件目录下生成\nplugman createpackagejson .\n```\n\n```bash\nname: (BlePrintPlugin)\nversion: (1.0.0)\ndescription:\ngit repository: (https://github.com/akapril/BlePrintPlugin.git)\nauthor: akapril\nlicense: (ISC)\nAbout to write to E:\\workspace\\BlePrintPlugin\\package.json: \n\n{\n \"name\": \"BlePrintPlugin\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"cordova\": {\n \"id\": \"BlePrintPlugin\",\n \"platforms\": [\n \"android\"\n ]\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/akapril/BlePrintPlugin.git\" \n },\n \"keywords\": [\n \"ecosystem:cordova\",\n \"cordova-android\"\n ],\n \"author\": \"akapril\",\n \"license\": \"ISC\",\n \"bugs\": {\n \"url\": \"https://github.com/akapril/BlePrintPlugin/issues\" \n },\n \"homepage\": \"https://github.com/akapril/BlePrintPlugin#readme\"\n}\n\n\nIs this OK? (yes) yes\n```\n\n##### 添加到`cordova`项目中\n\n```bash\n#去掉<>\n# 添加插件\ncordova plugin add <插件项目目录> \n# 去除插件\ncordova plugin remove <插件名称>\n# 获取github上的插件\ncordova plugin add https://github.com/akapril/BlePrintPlugin.git\n```\n\n\n\n参考文档:\n\n[https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html](https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html)\n\n[https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html](https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html)\n\n[https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command](https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command)","source":"_posts/cordova-plugin.md","raw":"---\ntitle: cordova插件开发\ndate: 2020-04-23 16:12:24\ntags: [cordova,插件,plugin,cordova-plugin,开发]\ncategories: [学习,cordova,plugin]\n---\n\n#### 原因\n\n蓝牙打印机型号:`汉印A300(HM-A300-6624)`\n\nApp接入调用蓝牙打印机进行二维码的打印,使用普通`cordova`蓝牙链接库发送指令,无法打印条形码。\n\n#### 解决方案\n\n##### 安装`plugman`\n\n```bash\nnpm install -g plugman\n```\n\n##### 创建插件项目\n\n```bash\n# 去掉<>\nplugman create --name <插件名> --plugin_id <插件id(插件调用名)> --plugin_version <插件版本号(1.0.0)>\n```\n\n##### 添加需要开发的平台\n\n```bash\n # 添加android平台\n plugman platform add --platform_name android \n```\n\n##### 规范项目\n\n修改生成的`java`代码包位置。\n\n```bash\n| .gitignore\n| package.json\n| plugin.xml\n|\n|\n+---src\n| \\---android\n| \\---cn\n| \\---akapril\n| \\---ble\n| BlePrintPlugin.java\n|\n\\---www\n BlePrintPlugin.js\n```\n\n修改完目录后需要修改`plugin.xml`(添加本地`jar`包处解释)\n\n##### 添加本地`jar`包\n\n在根目录新建目录`libs`,将需要的`jar`包放入目录中。\n\n修改`plugin.xml`配置\n\n```xml\n<?xml version='1.0' encoding='utf-8'?>\n<plugin id=\"BlePrintPlugin\" version=\"1.0.0\" \n xmlns=\"http://apache.org/cordova/ns/plugins/1.0\" \n xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <name>BlePrintPlugin</name>\n <js-module name=\"BlePrintPlugin\" src=\"www/BlePrintPlugin.js\">\n <clobbers target=\"cordova.plugins.BlePrintPlugin\" />\n </js-module>\n <platform name=\"android\">\n <config-file parent=\"/*\" target=\"res/xml/config.xml\">\n <feature name=\"BlePrintPlugin\">\n <!-- 修改java代码目录时候对应包 -->\n <param name=\"android-package\" value=\"cn.akapril.ble.BlePrintPlugin\" />\n </feature>\n </config-file>\n <config-file parent=\"/*\" target=\"AndroidManifest.xml\"></config-file>\n <!-- 对应文件 -->\n <source-file src=\"libs/CPCL_V1.07.jar\" target-dir=\"libs\"/>\n <source-file src=\"src/android/cn/akapril/ble/BlePrintPlugin.java\" target-dir=\"src/cn/akapril/ble\" />\n </platform>\n</plugin>\n```\n\n##### 生成`package.json`\n\n```bash\n#插件目录下生成\nplugman createpackagejson .\n```\n\n```bash\nname: (BlePrintPlugin)\nversion: (1.0.0)\ndescription:\ngit repository: (https://github.com/akapril/BlePrintPlugin.git)\nauthor: akapril\nlicense: (ISC)\nAbout to write to E:\\workspace\\BlePrintPlugin\\package.json: \n\n{\n \"name\": \"BlePrintPlugin\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"cordova\": {\n \"id\": \"BlePrintPlugin\",\n \"platforms\": [\n \"android\"\n ]\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/akapril/BlePrintPlugin.git\" \n },\n \"keywords\": [\n \"ecosystem:cordova\",\n \"cordova-android\"\n ],\n \"author\": \"akapril\",\n \"license\": \"ISC\",\n \"bugs\": {\n \"url\": \"https://github.com/akapril/BlePrintPlugin/issues\" \n },\n \"homepage\": \"https://github.com/akapril/BlePrintPlugin#readme\"\n}\n\n\nIs this OK? (yes) yes\n```\n\n##### 添加到`cordova`项目中\n\n```bash\n#去掉<>\n# 添加插件\ncordova plugin add <插件项目目录> \n# 去除插件\ncordova plugin remove <插件名称>\n# 获取github上的插件\ncordova plugin add https://github.com/akapril/BlePrintPlugin.git\n```\n\n\n\n参考文档:\n\n[https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html](https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html)\n\n[https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html](https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html)\n\n[https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command](https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command)","slug":"cordova-plugin","published":1,"updated":"2020-09-13T06:54:45.235Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gs000f58syi5n5mxtj","content":"<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>蓝牙打印机型号:<code>汉印A300(HM-A300-6624)</code></p>\n<p>App接入调用蓝牙打印机进行二维码的打印,使用普通<code>cordova</code>蓝牙链接库发送指令,无法打印条形码。</p>\n<h4 id=\"解决方案\"><a href=\"#解决方案\" class=\"headerlink\" title=\"解决方案\"></a>解决方案</h4><h5 id=\"安装plugman\"><a href=\"#安装plugman\" class=\"headerlink\" title=\"安装plugman\"></a>安装<code>plugman</code></h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install -g plugman</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"创建插件项目\"><a href=\"#创建插件项目\" class=\"headerlink\" title=\"创建插件项目\"></a>创建插件项目</h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># 去掉<></span></span><br><span class=\"line\">plugman create --name <插件名> --plugin_id <插件id(插件调用名)> --plugin_version <插件版本号(1.0.0)></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"添加需要开发的平台\"><a href=\"#添加需要开发的平台\" class=\"headerlink\" title=\"添加需要开发的平台\"></a>添加需要开发的平台</h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># 添加android平台</span></span><br><span class=\"line\">plugman platform add --platform_name android</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"规范项目\"><a href=\"#规范项目\" class=\"headerlink\" title=\"规范项目\"></a>规范项目</h5><p>修改生成的<code>java</code>代码包位置。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">| .gitignore</span><br><span class=\"line\">| package.json</span><br><span class=\"line\">| plugin.xml</span><br><span class=\"line\">|</span><br><span class=\"line\">|</span><br><span class=\"line\">+---src</span><br><span class=\"line\">| \\---android</span><br><span class=\"line\">| \\---cn</span><br><span class=\"line\">| \\---akapril</span><br><span class=\"line\">| \\---ble</span><br><span class=\"line\">| BlePrintPlugin.java</span><br><span class=\"line\">|</span><br><span class=\"line\">\\---www</span><br><span class=\"line\"> BlePrintPlugin.js</span><br></pre></td></tr></table></figure>\n\n<p>修改完目录后需要修改<code>plugin.xml</code>(添加本地<code>jar</code>包处解释)</p>\n<h5 id=\"添加本地jar包\"><a href=\"#添加本地jar包\" class=\"headerlink\" title=\"添加本地jar包\"></a>添加本地<code>jar</code>包</h5><p>在根目录新建目录<code>libs</code>,将需要的<code>jar</code>包放入目录中。</p>\n<p>修改<code>plugin.xml</code>配置</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\"><?xml version='1.0' encoding='utf-8'?></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">plugin</span> <span class=\"attr\">id</span>=<span class=\"string\">\"BlePrintPlugin\"</span> <span class=\"attr\">version</span>=<span class=\"string\">\"1.0.0\"</span> </span></span><br><span class=\"line\"><span class=\"tag\"> <span class=\"attr\">xmlns</span>=<span class=\"string\">\"http://apache.org/cordova/ns/plugins/1.0\"</span> </span></span><br><span class=\"line\"><span class=\"tag\"> <span class=\"attr\">xmlns:android</span>=<span class=\"string\">\"http://schemas.android.com/apk/res/android\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">name</span>></span>BlePrintPlugin<span class=\"tag\"></<span class=\"name\">name</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">js-module</span> <span class=\"attr\">name</span>=<span class=\"string\">\"BlePrintPlugin\"</span> <span class=\"attr\">src</span>=<span class=\"string\">\"www/BlePrintPlugin.js\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">clobbers</span> <span class=\"attr\">target</span>=<span class=\"string\">\"cordova.plugins.BlePrintPlugin\"</span> /></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">js-module</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">platform</span> <span class=\"attr\">name</span>=<span class=\"string\">\"android\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">config-file</span> <span class=\"attr\">parent</span>=<span class=\"string\">\"/*\"</span> <span class=\"attr\">target</span>=<span class=\"string\">\"res/xml/config.xml\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">feature</span> <span class=\"attr\">name</span>=<span class=\"string\">\"BlePrintPlugin\"</span>></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- 修改java代码目录时候对应包 --></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">param</span> <span class=\"attr\">name</span>=<span class=\"string\">\"android-package\"</span> <span class=\"attr\">value</span>=<span class=\"string\">\"cn.akapril.ble.BlePrintPlugin\"</span> /></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">feature</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">config-file</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">config-file</span> <span class=\"attr\">parent</span>=<span class=\"string\">\"/*\"</span> <span class=\"attr\">target</span>=<span class=\"string\">\"AndroidManifest.xml\"</span>></span><span class=\"tag\"></<span class=\"name\">config-file</span>></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- 对应文件 --></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">source-file</span> <span class=\"attr\">src</span>=<span class=\"string\">\"libs/CPCL_V1.07.jar\"</span> <span class=\"attr\">target-dir</span>=<span class=\"string\">\"libs\"</span>/></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">source-file</span> <span class=\"attr\">src</span>=<span class=\"string\">\"src/android/cn/akapril/ble/BlePrintPlugin.java\"</span> <span class=\"attr\">target-dir</span>=<span class=\"string\">\"src/cn/akapril/ble\"</span> /></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">platform</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">plugin</span>></span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"生成package-json\"><a href=\"#生成package-json\" class=\"headerlink\" title=\"生成package.json\"></a>生成<code>package.json</code></h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#插件目录下生成</span></span><br><span class=\"line\">plugman createpackagejson .</span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">name: (BlePrintPlugin)</span><br><span class=\"line\">version: (1.0.0)</span><br><span class=\"line\">description:</span><br><span class=\"line\">git repository: (https://github.com/akapril/BlePrintPlugin.git)</span><br><span class=\"line\">author: akapril</span><br><span class=\"line\">license: (ISC)</span><br><span class=\"line\">About to write to E:\\workspace\\BlePrintPlugin\\package.json: </span><br><span class=\"line\"></span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"string\">\"name\"</span>: <span class=\"string\">\"BlePrintPlugin\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"version\"</span>: <span class=\"string\">\"1.0.0\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"description\"</span>: <span class=\"string\">\"\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"cordova\"</span>: {</span><br><span class=\"line\"> <span class=\"string\">\"id\"</span>: <span class=\"string\">\"BlePrintPlugin\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"platforms\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"android\"</span></span><br><span class=\"line\"> ]</span><br><span class=\"line\"> },</span><br><span class=\"line\"> <span class=\"string\">\"repository\"</span>: {</span><br><span class=\"line\"> <span class=\"string\">\"type\"</span>: <span class=\"string\">\"git\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"url\"</span>: <span class=\"string\">\"git+https://github.com/akapril/BlePrintPlugin.git\"</span> </span><br><span class=\"line\"> },</span><br><span class=\"line\"> <span class=\"string\">\"keywords\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"ecosystem:cordova\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"cordova-android\"</span></span><br><span class=\"line\"> ],</span><br><span class=\"line\"> <span class=\"string\">\"author\"</span>: <span class=\"string\">\"akapril\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"license\"</span>: <span class=\"string\">\"ISC\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"bugs\"</span>: {</span><br><span class=\"line\"> <span class=\"string\">\"url\"</span>: <span class=\"string\">\"https://github.com/akapril/BlePrintPlugin/issues\"</span> </span><br><span class=\"line\"> },</span><br><span class=\"line\"> <span class=\"string\">\"homepage\"</span>: <span class=\"string\">\"https://github.com/akapril/BlePrintPlugin#readme\"</span></span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\">Is this OK? (yes) yes</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"添加到cordova项目中\"><a href=\"#添加到cordova项目中\" class=\"headerlink\" title=\"添加到cordova项目中\"></a>添加到<code>cordova</code>项目中</h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#去掉<></span></span><br><span class=\"line\"><span class=\"comment\"># 添加插件</span></span><br><span class=\"line\">cordova plugin add <插件项目目录> </span><br><span class=\"line\"><span class=\"comment\"># 去除插件</span></span><br><span class=\"line\">cordova plugin remove <插件名称></span><br><span class=\"line\"><span class=\"comment\"># 获取github上的插件</span></span><br><span class=\"line\">cordova plugin add https://github.com/akapril/BlePrintPlugin.git</span><br></pre></td></tr></table></figure>\n\n<p>参考文档:</p>\n<p><a href=\"https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html\" target=\"_blank\" rel=\"noopener\">https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html</a></p>\n<p><a href=\"https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html\" target=\"_blank\" rel=\"noopener\">https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html</a></p>\n<p><a href=\"https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command\" target=\"_blank\" rel=\"noopener\">https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>蓝牙打印机型号:<code>汉印A300(HM-A300-6624)</code></p>\n<p>App接入调用蓝牙打印机进行二维码的打印,使用普通<code>cordova</code>蓝牙链接库发送指令,无法打印条形码。</p>\n<h4 id=\"解决方案\"><a href=\"#解决方案\" class=\"headerlink\" title=\"解决方案\"></a>解决方案</h4><h5 id=\"安装plugman\"><a href=\"#安装plugman\" class=\"headerlink\" title=\"安装plugman\"></a>安装<code>plugman</code></h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install -g plugman</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"创建插件项目\"><a href=\"#创建插件项目\" class=\"headerlink\" title=\"创建插件项目\"></a>创建插件项目</h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># 去掉<></span></span><br><span class=\"line\">plugman create --name <插件名> --plugin_id <插件id(插件调用名)> --plugin_version <插件版本号(1.0.0)></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"添加需要开发的平台\"><a href=\"#添加需要开发的平台\" class=\"headerlink\" title=\"添加需要开发的平台\"></a>添加需要开发的平台</h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># 添加android平台</span></span><br><span class=\"line\">plugman platform add --platform_name android</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"规范项目\"><a href=\"#规范项目\" class=\"headerlink\" title=\"规范项目\"></a>规范项目</h5><p>修改生成的<code>java</code>代码包位置。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">| .gitignore</span><br><span class=\"line\">| package.json</span><br><span class=\"line\">| plugin.xml</span><br><span class=\"line\">|</span><br><span class=\"line\">|</span><br><span class=\"line\">+---src</span><br><span class=\"line\">| \\---android</span><br><span class=\"line\">| \\---cn</span><br><span class=\"line\">| \\---akapril</span><br><span class=\"line\">| \\---ble</span><br><span class=\"line\">| BlePrintPlugin.java</span><br><span class=\"line\">|</span><br><span class=\"line\">\\---www</span><br><span class=\"line\"> BlePrintPlugin.js</span><br></pre></td></tr></table></figure>\n\n<p>修改完目录后需要修改<code>plugin.xml</code>(添加本地<code>jar</code>包处解释)</p>\n<h5 id=\"添加本地jar包\"><a href=\"#添加本地jar包\" class=\"headerlink\" title=\"添加本地jar包\"></a>添加本地<code>jar</code>包</h5><p>在根目录新建目录<code>libs</code>,将需要的<code>jar</code>包放入目录中。</p>\n<p>修改<code>plugin.xml</code>配置</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\"><?xml version='1.0' encoding='utf-8'?></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">plugin</span> <span class=\"attr\">id</span>=<span class=\"string\">\"BlePrintPlugin\"</span> <span class=\"attr\">version</span>=<span class=\"string\">\"1.0.0\"</span> </span></span><br><span class=\"line\"><span class=\"tag\"> <span class=\"attr\">xmlns</span>=<span class=\"string\">\"http://apache.org/cordova/ns/plugins/1.0\"</span> </span></span><br><span class=\"line\"><span class=\"tag\"> <span class=\"attr\">xmlns:android</span>=<span class=\"string\">\"http://schemas.android.com/apk/res/android\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">name</span>></span>BlePrintPlugin<span class=\"tag\"></<span class=\"name\">name</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">js-module</span> <span class=\"attr\">name</span>=<span class=\"string\">\"BlePrintPlugin\"</span> <span class=\"attr\">src</span>=<span class=\"string\">\"www/BlePrintPlugin.js\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">clobbers</span> <span class=\"attr\">target</span>=<span class=\"string\">\"cordova.plugins.BlePrintPlugin\"</span> /></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">js-module</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">platform</span> <span class=\"attr\">name</span>=<span class=\"string\">\"android\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">config-file</span> <span class=\"attr\">parent</span>=<span class=\"string\">\"/*\"</span> <span class=\"attr\">target</span>=<span class=\"string\">\"res/xml/config.xml\"</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">feature</span> <span class=\"attr\">name</span>=<span class=\"string\">\"BlePrintPlugin\"</span>></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- 修改java代码目录时候对应包 --></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">param</span> <span class=\"attr\">name</span>=<span class=\"string\">\"android-package\"</span> <span class=\"attr\">value</span>=<span class=\"string\">\"cn.akapril.ble.BlePrintPlugin\"</span> /></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">feature</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">config-file</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">config-file</span> <span class=\"attr\">parent</span>=<span class=\"string\">\"/*\"</span> <span class=\"attr\">target</span>=<span class=\"string\">\"AndroidManifest.xml\"</span>></span><span class=\"tag\"></<span class=\"name\">config-file</span>></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- 对应文件 --></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">source-file</span> <span class=\"attr\">src</span>=<span class=\"string\">\"libs/CPCL_V1.07.jar\"</span> <span class=\"attr\">target-dir</span>=<span class=\"string\">\"libs\"</span>/></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">source-file</span> <span class=\"attr\">src</span>=<span class=\"string\">\"src/android/cn/akapril/ble/BlePrintPlugin.java\"</span> <span class=\"attr\">target-dir</span>=<span class=\"string\">\"src/cn/akapril/ble\"</span> /></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">platform</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">plugin</span>></span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"生成package-json\"><a href=\"#生成package-json\" class=\"headerlink\" title=\"生成package.json\"></a>生成<code>package.json</code></h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#插件目录下生成</span></span><br><span class=\"line\">plugman createpackagejson .</span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">name: (BlePrintPlugin)</span><br><span class=\"line\">version: (1.0.0)</span><br><span class=\"line\">description:</span><br><span class=\"line\">git repository: (https://github.com/akapril/BlePrintPlugin.git)</span><br><span class=\"line\">author: akapril</span><br><span class=\"line\">license: (ISC)</span><br><span class=\"line\">About to write to E:\\workspace\\BlePrintPlugin\\package.json: </span><br><span class=\"line\"></span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"string\">\"name\"</span>: <span class=\"string\">\"BlePrintPlugin\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"version\"</span>: <span class=\"string\">\"1.0.0\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"description\"</span>: <span class=\"string\">\"\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"cordova\"</span>: {</span><br><span class=\"line\"> <span class=\"string\">\"id\"</span>: <span class=\"string\">\"BlePrintPlugin\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"platforms\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"android\"</span></span><br><span class=\"line\"> ]</span><br><span class=\"line\"> },</span><br><span class=\"line\"> <span class=\"string\">\"repository\"</span>: {</span><br><span class=\"line\"> <span class=\"string\">\"type\"</span>: <span class=\"string\">\"git\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"url\"</span>: <span class=\"string\">\"git+https://github.com/akapril/BlePrintPlugin.git\"</span> </span><br><span class=\"line\"> },</span><br><span class=\"line\"> <span class=\"string\">\"keywords\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"ecosystem:cordova\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"cordova-android\"</span></span><br><span class=\"line\"> ],</span><br><span class=\"line\"> <span class=\"string\">\"author\"</span>: <span class=\"string\">\"akapril\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"license\"</span>: <span class=\"string\">\"ISC\"</span>,</span><br><span class=\"line\"> <span class=\"string\">\"bugs\"</span>: {</span><br><span class=\"line\"> <span class=\"string\">\"url\"</span>: <span class=\"string\">\"https://github.com/akapril/BlePrintPlugin/issues\"</span> </span><br><span class=\"line\"> },</span><br><span class=\"line\"> <span class=\"string\">\"homepage\"</span>: <span class=\"string\">\"https://github.com/akapril/BlePrintPlugin#readme\"</span></span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\">Is this OK? (yes) yes</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"添加到cordova项目中\"><a href=\"#添加到cordova项目中\" class=\"headerlink\" title=\"添加到cordova项目中\"></a>添加到<code>cordova</code>项目中</h5><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#去掉<></span></span><br><span class=\"line\"><span class=\"comment\"># 添加插件</span></span><br><span class=\"line\">cordova plugin add <插件项目目录> </span><br><span class=\"line\"><span class=\"comment\"># 去除插件</span></span><br><span class=\"line\">cordova plugin remove <插件名称></span><br><span class=\"line\"><span class=\"comment\"># 获取github上的插件</span></span><br><span class=\"line\">cordova plugin add https://github.com/akapril/BlePrintPlugin.git</span><br></pre></td></tr></table></figure>\n\n<p>参考文档:</p>\n<p><a href=\"https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html\" target=\"_blank\" rel=\"noopener\">https://cordova.apache.org/docs/en/6.x/guide/hybrid/plugins/index.html</a></p>\n<p><a href=\"https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html\" target=\"_blank\" rel=\"noopener\">https://cordova.apache.org/docs/en/6.x/guide/platforms/android/plugin.html</a></p>\n<p><a href=\"https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command\" target=\"_blank\" rel=\"noopener\">https://cordova.apache.org/docs/en/6.x/reference/cordova-cli/index.html#cordova-plugin-command</a></p>\n"},{"title":"使用drone实现自动化部署安装配置以及踩坑","date":"2020-02-18T06:55:16.000Z","_content":"\n#### 基本信息\n\ncentos 7 阿里云\n\n#### 安装docker\n\n参考[docker以及docker-compose安装](/2020/03/30/docker-install-docker-compose-install/)\n\n#### 安装Rancher1.x\n\n```shell\nsudo docker run -d -v /var/lib/mysql:/var/lib/mysql --restart=unless-stopped -p 8236:8080 rancher/server\n```\n\n运行成功后访问`ip:8236`\n\n\n\n进行配置,先设置`系统管理>访问控制`\n\n\n\n`基础框架>添加主机`根据提示添加主机\n\n\n\n`API>密钥`生成账号API Keys\n\n\n\n`基础架构>镜像库`添加私有镜像库\n\n\n\n#### 安装Gitea\n\n使用`docker-compose`运行。\n\n```shell\nsudo docker-compose -f gitea-docker-compose.yml up -d\n```\n\n`gitea-docker-compose.yml`文件内容:\n\n```yml\nversion: '2'\nservices:\n gitea:\n image: gitea/gitea:latest\n container_name: gitea\n ports:\n - \"10022:22\"\n - \"10080:3000\"\n volumes:\n - /var/lib/gitea:/data\n restart: always\n\n```\n\n访问`ip:10080`进入安装界面进行配置。\n\n#### 安装Drone\n\n在Gitea新建OAuth Application,参考官方文档。\n\n\n\n将生成的客户端ID和客户端密钥保存。\n\n`docker-compose.yml`文件内容:\n\n```yml\nversion: '2'\n\nservices:\n drone-server:\n image: drone/drone:1.2.1\n container_name: drone-server\n networks:\n - dronenet # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信\n ports:\n - '8099:80' # Web管理面板的入口 PROTO=http 时使用该端口\n - '8999:443' # Web管理面板的入口 PROTO=https 时使用该端口\n - '9000:9000' # RPC服务端口\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock # docker.sock [1]\n - /var/lib/drone/:/var/lib/drone # drone数据存放路径\n environment:\n - DRONE_AGENTS_ENABLED=false # 使用Runner\n #- DRONE_GITLAB_SERVER=${DRONE_GITLAB_SERVER}\n #- DRONE_GITLAB_CLIENT_ID=${DRONE_GITLAB_CLIENT_ID}\n #- DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITLAB_CLIENT_SECRET}\n #- DRONE_GITHUB_SERVER=${DRONE_GITHUB_SERVER}\n # - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}\n # - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}\n - DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER} # github的地址\n - DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID} # gitea获得的ClientID\n - DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET} # gitea获得的ClientSecret\n - DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # RPC秘钥 [2]\n - DRONE_SERVER_HOST=${DRONE_SERVER_HOST} # RPC域名(在一个实例上可以不用)\n - DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} # git webhook使用的协议(我建议http)\n - DRONE_OPEN=true # 开发drone\n - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite # 数据库文件\n - DRONE_DATABASE_DRIVER=sqlite3 # 数据库驱动,我这里选的sqlite\n #- DRONE_DATABASE_DRIVER=mysql\n - DRONE_DEBUG=true # 调试相关,部署的时候建议先打开\n - DRONE_LOGS_DEBUG=true # 调试相关,部署的时候建议先打开\n - DRONE_LOGS_TRACE=true # 调试相关,部署的时候建议先打开\n - DRONE_USER_CREATE=username:***,admin:true # 初始管理员用户 gitea用户名\n - TZ=Asia/Shanghai # 时区\n restart: always\n drone-agent:\n image: drone/agent:1.2.1\n container_name: drone-agent\n networks:\n - dronenet # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信\n depends_on:\n - drone-server\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock # docker.sock [1]\n environment:\n - DRONE_RPC_SERVER=http://drone-server # RPC服务地址\n - DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # RPC秘钥 \n - DRONE_RPC_PROTO=${DRONE_RPC_PROTO} # RPC协议(http || https)\n - DRONE_RUNNER_CAPACITY=2 # 最大并发执行的 pipeline 数\n - DRONE_DEBUG=true # 调试相关,部署的时候建议先打开\n - DRONE_LOGS_TRACE=true # 调试相关,部署的时候建议先打开\n - TZ=Asia/Shanghai\n restart: always\nnetworks:\n dronenet: # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信\n\n```\n\n**[1]** 因为插件本身也是一个容器,要在容器中(docker-server、drone-runnere)中运行容器。将docker.sock挂载到容器中,可以让容器通过docker unix socket API得到管理容器的能力。\n\n**[2]** `openssl rand -hex 16` 这个命令随机生成秘钥\n\n.env\n\n```properties\n#DRONE_GITHUB_CLIENT_ID=****\n#DRONE_GITHUB_CLIENT_SECRET=****\nDRONE_GITEA_SERVER=http://git****com\nDRONE_GITEA_CLIENT_ID=****\nDRONE_GITEA_CLIENT_SECRET=****\n#DRONE_GITLAB_SERVER=http://git.****.com\n#DRONE_GITLAB_CLIENT_ID=****\n#DRONE_GITLAB_CLIENT_SECRET=****\nDRONE_RPC_SECRET=*****\nDRONE_SERVER_HOST=drone.****.com\nDRONE_SERVER_PROTO=https\nDRONE_RPC_SERVER=****:9000\nDRONE_RPC_PROTO=http\n\n```\n\n将`docker-compose.yml`和`.env`放在同一目录,然后运行以下命令:\n\n```shell\nsudo docker-compose up -d\n```\n\n\n\n\n\n参考地址:\n\nhttps://juejin.im/post/5d97489ee51d457824771d47\n\nhttps://docs.drone.io/server/provider/gitea/","source":"_posts/docker-rancher-drone-gitea.md","raw":"---\ntitle: 使用drone实现自动化部署安装配置以及踩坑\ndate: 2020-02-18 14:55:16\ntags: [docker,rancher,drone,gitea]\ncategories: [学习,docker,rancher]\n---\n\n#### 基本信息\n\ncentos 7 阿里云\n\n#### 安装docker\n\n参考[docker以及docker-compose安装](/2020/03/30/docker-install-docker-compose-install/)\n\n#### 安装Rancher1.x\n\n```shell\nsudo docker run -d -v /var/lib/mysql:/var/lib/mysql --restart=unless-stopped -p 8236:8080 rancher/server\n```\n\n运行成功后访问`ip:8236`\n\n\n\n进行配置,先设置`系统管理>访问控制`\n\n\n\n`基础框架>添加主机`根据提示添加主机\n\n\n\n`API>密钥`生成账号API Keys\n\n\n\n`基础架构>镜像库`添加私有镜像库\n\n\n\n#### 安装Gitea\n\n使用`docker-compose`运行。\n\n```shell\nsudo docker-compose -f gitea-docker-compose.yml up -d\n```\n\n`gitea-docker-compose.yml`文件内容:\n\n```yml\nversion: '2'\nservices:\n gitea:\n image: gitea/gitea:latest\n container_name: gitea\n ports:\n - \"10022:22\"\n - \"10080:3000\"\n volumes:\n - /var/lib/gitea:/data\n restart: always\n\n```\n\n访问`ip:10080`进入安装界面进行配置。\n\n#### 安装Drone\n\n在Gitea新建OAuth Application,参考官方文档。\n\n\n\n将生成的客户端ID和客户端密钥保存。\n\n`docker-compose.yml`文件内容:\n\n```yml\nversion: '2'\n\nservices:\n drone-server:\n image: drone/drone:1.2.1\n container_name: drone-server\n networks:\n - dronenet # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信\n ports:\n - '8099:80' # Web管理面板的入口 PROTO=http 时使用该端口\n - '8999:443' # Web管理面板的入口 PROTO=https 时使用该端口\n - '9000:9000' # RPC服务端口\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock # docker.sock [1]\n - /var/lib/drone/:/var/lib/drone # drone数据存放路径\n environment:\n - DRONE_AGENTS_ENABLED=false # 使用Runner\n #- DRONE_GITLAB_SERVER=${DRONE_GITLAB_SERVER}\n #- DRONE_GITLAB_CLIENT_ID=${DRONE_GITLAB_CLIENT_ID}\n #- DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITLAB_CLIENT_SECRET}\n #- DRONE_GITHUB_SERVER=${DRONE_GITHUB_SERVER}\n # - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}\n # - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}\n - DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER} # github的地址\n - DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID} # gitea获得的ClientID\n - DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET} # gitea获得的ClientSecret\n - DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # RPC秘钥 [2]\n - DRONE_SERVER_HOST=${DRONE_SERVER_HOST} # RPC域名(在一个实例上可以不用)\n - DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} # git webhook使用的协议(我建议http)\n - DRONE_OPEN=true # 开发drone\n - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite # 数据库文件\n - DRONE_DATABASE_DRIVER=sqlite3 # 数据库驱动,我这里选的sqlite\n #- DRONE_DATABASE_DRIVER=mysql\n - DRONE_DEBUG=true # 调试相关,部署的时候建议先打开\n - DRONE_LOGS_DEBUG=true # 调试相关,部署的时候建议先打开\n - DRONE_LOGS_TRACE=true # 调试相关,部署的时候建议先打开\n - DRONE_USER_CREATE=username:***,admin:true # 初始管理员用户 gitea用户名\n - TZ=Asia/Shanghai # 时区\n restart: always\n drone-agent:\n image: drone/agent:1.2.1\n container_name: drone-agent\n networks:\n - dronenet # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信\n depends_on:\n - drone-server\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock # docker.sock [1]\n environment:\n - DRONE_RPC_SERVER=http://drone-server # RPC服务地址\n - DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # RPC秘钥 \n - DRONE_RPC_PROTO=${DRONE_RPC_PROTO} # RPC协议(http || https)\n - DRONE_RUNNER_CAPACITY=2 # 最大并发执行的 pipeline 数\n - DRONE_DEBUG=true # 调试相关,部署的时候建议先打开\n - DRONE_LOGS_TRACE=true # 调试相关,部署的时候建议先打开\n - TZ=Asia/Shanghai\n restart: always\nnetworks:\n dronenet: # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信\n\n```\n\n**[1]** 因为插件本身也是一个容器,要在容器中(docker-server、drone-runnere)中运行容器。将docker.sock挂载到容器中,可以让容器通过docker unix socket API得到管理容器的能力。\n\n**[2]** `openssl rand -hex 16` 这个命令随机生成秘钥\n\n.env\n\n```properties\n#DRONE_GITHUB_CLIENT_ID=****\n#DRONE_GITHUB_CLIENT_SECRET=****\nDRONE_GITEA_SERVER=http://git****com\nDRONE_GITEA_CLIENT_ID=****\nDRONE_GITEA_CLIENT_SECRET=****\n#DRONE_GITLAB_SERVER=http://git.****.com\n#DRONE_GITLAB_CLIENT_ID=****\n#DRONE_GITLAB_CLIENT_SECRET=****\nDRONE_RPC_SECRET=*****\nDRONE_SERVER_HOST=drone.****.com\nDRONE_SERVER_PROTO=https\nDRONE_RPC_SERVER=****:9000\nDRONE_RPC_PROTO=http\n\n```\n\n将`docker-compose.yml`和`.env`放在同一目录,然后运行以下命令:\n\n```shell\nsudo docker-compose up -d\n```\n\n\n\n\n\n参考地址:\n\nhttps://juejin.im/post/5d97489ee51d457824771d47\n\nhttps://docs.drone.io/server/provider/gitea/","slug":"docker-rancher-drone-gitea","published":1,"updated":"2020-09-13T06:56:12.778Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gt000g58sydgd1a38k","content":"<h4 id=\"基本信息\"><a href=\"#基本信息\" class=\"headerlink\" title=\"基本信息\"></a>基本信息</h4><p>centos 7 阿里云</p>\n<h4 id=\"安装docker\"><a href=\"#安装docker\" class=\"headerlink\" title=\"安装docker\"></a>安装docker</h4><p>参考<a href=\"/2020/03/30/docker-install-docker-compose-install/\">docker以及docker-compose安装</a></p>\n<h4 id=\"安装Rancher1-x\"><a href=\"#安装Rancher1-x\" class=\"headerlink\" title=\"安装Rancher1.x\"></a>安装Rancher1.x</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo docker run -d -v /var/lib/mysql:/var/lib/mysql --restart=unless-stopped -p 8236:8080 rancher/server</span><br></pre></td></tr></table></figure>\n\n<p>运行成功后访问<code>ip:8236</code></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/index.jpg\" alt=\"rancher\"></p>\n<p>进行配置,先设置<code>系统管理>访问控制</code></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/control.jpg\" alt=\"rancher\"></p>\n<p><code>基础框架>添加主机</code>根据提示添加主机</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/addhost.jpg\" alt=\"rancher\"></p>\n<p><code>API>密钥</code>生成账号API Keys</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/addkeys.jpg\" alt=\"rancher\"></p>\n<p><code>基础架构>镜像库</code>添加私有镜像库</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/addrepo.jpg\" alt=\"rancher\"></p>\n<h4 id=\"安装Gitea\"><a href=\"#安装Gitea\" class=\"headerlink\" title=\"安装Gitea\"></a>安装Gitea</h4><p>使用<code>docker-compose</code>运行。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo docker-compose -f gitea-docker-compose.yml up -d</span><br></pre></td></tr></table></figure>\n\n<p><code>gitea-docker-compose.yml</code>文件内容:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">version:</span> <span class=\"string\">'2'</span></span><br><span class=\"line\"><span class=\"attr\">services:</span></span><br><span class=\"line\"> <span class=\"attr\">gitea:</span></span><br><span class=\"line\"> <span class=\"attr\">image:</span> <span class=\"string\">gitea/gitea:latest</span></span><br><span class=\"line\"> <span class=\"attr\">container_name:</span> <span class=\"string\">gitea</span></span><br><span class=\"line\"> <span class=\"attr\">ports:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">\"10022:22\"</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">\"10080:3000\"</span></span><br><span class=\"line\"> <span class=\"attr\">volumes:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/lib/gitea:/data</span></span><br><span class=\"line\"> <span class=\"attr\">restart:</span> <span class=\"string\">always</span></span><br></pre></td></tr></table></figure>\n\n<p>访问<code>ip:10080</code>进入安装界面进行配置。</p>\n<h4 id=\"安装Drone\"><a href=\"#安装Drone\" class=\"headerlink\" title=\"安装Drone\"></a>安装Drone</h4><p>在Gitea新建OAuth Application,参考官方文档。</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/adddrone.jpg\" alt=\"rancher\"></p>\n<p>将生成的客户端ID和客户端密钥保存。</p>\n<p><code>docker-compose.yml</code>文件内容:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">version:</span> <span class=\"string\">'2'</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">services:</span></span><br><span class=\"line\"> <span class=\"attr\">drone-server:</span></span><br><span class=\"line\"> <span class=\"attr\">image:</span> <span class=\"string\">drone/drone:1.2.1</span></span><br><span class=\"line\"> <span class=\"attr\">container_name:</span> <span class=\"string\">drone-server</span></span><br><span class=\"line\"> <span class=\"attr\">networks:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">dronenet</span> <span class=\"comment\"># 让drone-server和drone-agent处于一个网络中,方便进行RPC通信</span></span><br><span class=\"line\"> <span class=\"attr\">ports:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">'8099:80'</span> <span class=\"comment\"># Web管理面板的入口 PROTO=http 时使用该端口</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">'8999:443'</span> <span class=\"comment\"># Web管理面板的入口 PROTO=https 时使用该端口</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">'9000:9000'</span> <span class=\"comment\"># RPC服务端口</span></span><br><span class=\"line\"> <span class=\"attr\">volumes:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/run/docker.sock:/var/run/docker.sock</span> <span class=\"comment\"># docker.sock [1]</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/lib/drone/:/var/lib/drone</span> <span class=\"comment\"># drone数据存放路径</span></span><br><span class=\"line\"> <span class=\"attr\">environment:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_AGENTS_ENABLED=false</span> <span class=\"comment\"># 使用Runner</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITLAB_SERVER=${DRONE_GITLAB_SERVER}</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITLAB_CLIENT_ID=${DRONE_GITLAB_CLIENT_ID}</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITLAB_CLIENT_SECRET}</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITHUB_SERVER=${DRONE_GITHUB_SERVER}</span></span><br><span class=\"line\"> <span class=\"comment\"># - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}</span></span><br><span class=\"line\"> <span class=\"comment\"># - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER}</span> <span class=\"comment\"># github的地址</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}</span> <span class=\"comment\"># gitea获得的ClientID</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}</span> <span class=\"comment\"># gitea获得的ClientSecret</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_SECRET=${DRONE_RPC_SECRET}</span> <span class=\"comment\"># RPC秘钥 [2]</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_SERVER_HOST=${DRONE_SERVER_HOST}</span> <span class=\"comment\"># RPC域名(在一个实例上可以不用)</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}</span> <span class=\"comment\"># git webhook使用的协议(我建议http)</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_OPEN=true</span> <span class=\"comment\"># 开发drone</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite</span> <span class=\"comment\"># 数据库文件</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DATABASE_DRIVER=sqlite3</span> <span class=\"comment\"># 数据库驱动,我这里选的sqlite</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_DATABASE_DRIVER=mysql</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DEBUG=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_LOGS_DEBUG=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_LOGS_TRACE=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_USER_CREATE=username:***,admin:true</span> <span class=\"comment\"># 初始管理员用户 gitea用户名</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">TZ=Asia/Shanghai</span> <span class=\"comment\"># 时区</span></span><br><span class=\"line\"> <span class=\"attr\">restart:</span> <span class=\"string\">always</span></span><br><span class=\"line\"> <span class=\"attr\">drone-agent:</span></span><br><span class=\"line\"> <span class=\"attr\">image:</span> <span class=\"string\">drone/agent:1.2.1</span></span><br><span class=\"line\"> <span class=\"attr\">container_name:</span> <span class=\"string\">drone-agent</span></span><br><span class=\"line\"> <span class=\"attr\">networks:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">dronenet</span> <span class=\"comment\"># 让drone-server和drone-agent处于一个网络中,方便进行RPC通信</span></span><br><span class=\"line\"> <span class=\"attr\">depends_on:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">drone-server</span></span><br><span class=\"line\"> <span class=\"attr\">volumes:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/run/docker.sock:/var/run/docker.sock</span> <span class=\"comment\"># docker.sock [1]</span></span><br><span class=\"line\"> <span class=\"attr\">environment:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_SERVER=http://drone-server</span> <span class=\"comment\"># RPC服务地址</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_SECRET=${DRONE_RPC_SECRET}</span> <span class=\"comment\"># RPC秘钥 </span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_PROTO=${DRONE_RPC_PROTO}</span> <span class=\"comment\"># RPC协议(http || https)</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RUNNER_CAPACITY=2</span> <span class=\"comment\"># 最大并发执行的 pipeline 数</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DEBUG=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_LOGS_TRACE=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">TZ=Asia/Shanghai</span></span><br><span class=\"line\"> <span class=\"attr\">restart:</span> <span class=\"string\">always</span></span><br><span class=\"line\"><span class=\"attr\">networks:</span></span><br><span class=\"line\"> <span class=\"attr\">dronenet:</span> <span class=\"comment\"># 让drone-server和drone-agent处于一个网络中,方便进行RPC通信</span></span><br></pre></td></tr></table></figure>\n\n<p><strong>[1]</strong> 因为插件本身也是一个容器,要在容器中(docker-server、drone-runnere)中运行容器。将docker.sock挂载到容器中,可以让容器通过docker unix socket API得到管理容器的能力。</p>\n<p><strong>[2]</strong> <code>openssl rand -hex 16</code> 这个命令随机生成秘钥</p>\n<p>.env</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">#DRONE_GITHUB_CLIENT_ID=****</span><br><span class=\"line\">#DRONE_GITHUB_CLIENT_SECRET=****</span><br><span class=\"line\">DRONE_GITEA_SERVER=http://git****com</span><br><span class=\"line\">DRONE_GITEA_CLIENT_ID=****</span><br><span class=\"line\">DRONE_GITEA_CLIENT_SECRET=****</span><br><span class=\"line\">#DRONE_GITLAB_SERVER=http://git.****.com</span><br><span class=\"line\">#DRONE_GITLAB_CLIENT_ID=****</span><br><span class=\"line\">#DRONE_GITLAB_CLIENT_SECRET=****</span><br><span class=\"line\">DRONE_RPC_SECRET=*****</span><br><span class=\"line\">DRONE_SERVER_HOST=drone.****.com</span><br><span class=\"line\">DRONE_SERVER_PROTO=https</span><br><span class=\"line\">DRONE_RPC_SERVER=****:9000</span><br><span class=\"line\">DRONE_RPC_PROTO=http</span><br></pre></td></tr></table></figure>\n\n<p>将<code>docker-compose.yml</code>和<code>.env</code>放在同一目录,然后运行以下命令:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo docker-compose up -d</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://juejin.im/post/5d97489ee51d457824771d47\" target=\"_blank\" rel=\"noopener\">https://juejin.im/post/5d97489ee51d457824771d47</a></p>\n<p><a href=\"https://docs.drone.io/server/provider/gitea/\" target=\"_blank\" rel=\"noopener\">https://docs.drone.io/server/provider/gitea/</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"基本信息\"><a href=\"#基本信息\" class=\"headerlink\" title=\"基本信息\"></a>基本信息</h4><p>centos 7 阿里云</p>\n<h4 id=\"安装docker\"><a href=\"#安装docker\" class=\"headerlink\" title=\"安装docker\"></a>安装docker</h4><p>参考<a href=\"/2020/03/30/docker-install-docker-compose-install/\">docker以及docker-compose安装</a></p>\n<h4 id=\"安装Rancher1-x\"><a href=\"#安装Rancher1-x\" class=\"headerlink\" title=\"安装Rancher1.x\"></a>安装Rancher1.x</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo docker run -d -v /var/lib/mysql:/var/lib/mysql --restart=unless-stopped -p 8236:8080 rancher/server</span><br></pre></td></tr></table></figure>\n\n<p>运行成功后访问<code>ip:8236</code></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/index.jpg\" alt=\"rancher\"></p>\n<p>进行配置,先设置<code>系统管理>访问控制</code></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/control.jpg\" alt=\"rancher\"></p>\n<p><code>基础框架>添加主机</code>根据提示添加主机</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/addhost.jpg\" alt=\"rancher\"></p>\n<p><code>API>密钥</code>生成账号API Keys</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/addkeys.jpg\" alt=\"rancher\"></p>\n<p><code>基础架构>镜像库</code>添加私有镜像库</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/addrepo.jpg\" alt=\"rancher\"></p>\n<h4 id=\"安装Gitea\"><a href=\"#安装Gitea\" class=\"headerlink\" title=\"安装Gitea\"></a>安装Gitea</h4><p>使用<code>docker-compose</code>运行。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo docker-compose -f gitea-docker-compose.yml up -d</span><br></pre></td></tr></table></figure>\n\n<p><code>gitea-docker-compose.yml</code>文件内容:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">version:</span> <span class=\"string\">'2'</span></span><br><span class=\"line\"><span class=\"attr\">services:</span></span><br><span class=\"line\"> <span class=\"attr\">gitea:</span></span><br><span class=\"line\"> <span class=\"attr\">image:</span> <span class=\"string\">gitea/gitea:latest</span></span><br><span class=\"line\"> <span class=\"attr\">container_name:</span> <span class=\"string\">gitea</span></span><br><span class=\"line\"> <span class=\"attr\">ports:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">\"10022:22\"</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">\"10080:3000\"</span></span><br><span class=\"line\"> <span class=\"attr\">volumes:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/lib/gitea:/data</span></span><br><span class=\"line\"> <span class=\"attr\">restart:</span> <span class=\"string\">always</span></span><br></pre></td></tr></table></figure>\n\n<p>访问<code>ip:10080</code>进入安装界面进行配置。</p>\n<h4 id=\"安装Drone\"><a href=\"#安装Drone\" class=\"headerlink\" title=\"安装Drone\"></a>安装Drone</h4><p>在Gitea新建OAuth Application,参考官方文档。</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200218/adddrone.jpg\" alt=\"rancher\"></p>\n<p>将生成的客户端ID和客户端密钥保存。</p>\n<p><code>docker-compose.yml</code>文件内容:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">version:</span> <span class=\"string\">'2'</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">services:</span></span><br><span class=\"line\"> <span class=\"attr\">drone-server:</span></span><br><span class=\"line\"> <span class=\"attr\">image:</span> <span class=\"string\">drone/drone:1.2.1</span></span><br><span class=\"line\"> <span class=\"attr\">container_name:</span> <span class=\"string\">drone-server</span></span><br><span class=\"line\"> <span class=\"attr\">networks:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">dronenet</span> <span class=\"comment\"># 让drone-server和drone-agent处于一个网络中,方便进行RPC通信</span></span><br><span class=\"line\"> <span class=\"attr\">ports:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">'8099:80'</span> <span class=\"comment\"># Web管理面板的入口 PROTO=http 时使用该端口</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">'8999:443'</span> <span class=\"comment\"># Web管理面板的入口 PROTO=https 时使用该端口</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">'9000:9000'</span> <span class=\"comment\"># RPC服务端口</span></span><br><span class=\"line\"> <span class=\"attr\">volumes:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/run/docker.sock:/var/run/docker.sock</span> <span class=\"comment\"># docker.sock [1]</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/lib/drone/:/var/lib/drone</span> <span class=\"comment\"># drone数据存放路径</span></span><br><span class=\"line\"> <span class=\"attr\">environment:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_AGENTS_ENABLED=false</span> <span class=\"comment\"># 使用Runner</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITLAB_SERVER=${DRONE_GITLAB_SERVER}</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITLAB_CLIENT_ID=${DRONE_GITLAB_CLIENT_ID}</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITLAB_CLIENT_SECRET}</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_GITHUB_SERVER=${DRONE_GITHUB_SERVER}</span></span><br><span class=\"line\"> <span class=\"comment\"># - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}</span></span><br><span class=\"line\"> <span class=\"comment\"># - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER}</span> <span class=\"comment\"># github的地址</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}</span> <span class=\"comment\"># gitea获得的ClientID</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}</span> <span class=\"comment\"># gitea获得的ClientSecret</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_SECRET=${DRONE_RPC_SECRET}</span> <span class=\"comment\"># RPC秘钥 [2]</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_SERVER_HOST=${DRONE_SERVER_HOST}</span> <span class=\"comment\"># RPC域名(在一个实例上可以不用)</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}</span> <span class=\"comment\"># git webhook使用的协议(我建议http)</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_OPEN=true</span> <span class=\"comment\"># 开发drone</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite</span> <span class=\"comment\"># 数据库文件</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DATABASE_DRIVER=sqlite3</span> <span class=\"comment\"># 数据库驱动,我这里选的sqlite</span></span><br><span class=\"line\"> <span class=\"comment\">#- DRONE_DATABASE_DRIVER=mysql</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DEBUG=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_LOGS_DEBUG=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_LOGS_TRACE=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_USER_CREATE=username:***,admin:true</span> <span class=\"comment\"># 初始管理员用户 gitea用户名</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">TZ=Asia/Shanghai</span> <span class=\"comment\"># 时区</span></span><br><span class=\"line\"> <span class=\"attr\">restart:</span> <span class=\"string\">always</span></span><br><span class=\"line\"> <span class=\"attr\">drone-agent:</span></span><br><span class=\"line\"> <span class=\"attr\">image:</span> <span class=\"string\">drone/agent:1.2.1</span></span><br><span class=\"line\"> <span class=\"attr\">container_name:</span> <span class=\"string\">drone-agent</span></span><br><span class=\"line\"> <span class=\"attr\">networks:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">dronenet</span> <span class=\"comment\"># 让drone-server和drone-agent处于一个网络中,方便进行RPC通信</span></span><br><span class=\"line\"> <span class=\"attr\">depends_on:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">drone-server</span></span><br><span class=\"line\"> <span class=\"attr\">volumes:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">/var/run/docker.sock:/var/run/docker.sock</span> <span class=\"comment\"># docker.sock [1]</span></span><br><span class=\"line\"> <span class=\"attr\">environment:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_SERVER=http://drone-server</span> <span class=\"comment\"># RPC服务地址</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_SECRET=${DRONE_RPC_SECRET}</span> <span class=\"comment\"># RPC秘钥 </span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RPC_PROTO=${DRONE_RPC_PROTO}</span> <span class=\"comment\"># RPC协议(http || https)</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_RUNNER_CAPACITY=2</span> <span class=\"comment\"># 最大并发执行的 pipeline 数</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_DEBUG=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">DRONE_LOGS_TRACE=true</span> <span class=\"comment\"># 调试相关,部署的时候建议先打开</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">TZ=Asia/Shanghai</span></span><br><span class=\"line\"> <span class=\"attr\">restart:</span> <span class=\"string\">always</span></span><br><span class=\"line\"><span class=\"attr\">networks:</span></span><br><span class=\"line\"> <span class=\"attr\">dronenet:</span> <span class=\"comment\"># 让drone-server和drone-agent处于一个网络中,方便进行RPC通信</span></span><br></pre></td></tr></table></figure>\n\n<p><strong>[1]</strong> 因为插件本身也是一个容器,要在容器中(docker-server、drone-runnere)中运行容器。将docker.sock挂载到容器中,可以让容器通过docker unix socket API得到管理容器的能力。</p>\n<p><strong>[2]</strong> <code>openssl rand -hex 16</code> 这个命令随机生成秘钥</p>\n<p>.env</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">#DRONE_GITHUB_CLIENT_ID=****</span><br><span class=\"line\">#DRONE_GITHUB_CLIENT_SECRET=****</span><br><span class=\"line\">DRONE_GITEA_SERVER=http://git****com</span><br><span class=\"line\">DRONE_GITEA_CLIENT_ID=****</span><br><span class=\"line\">DRONE_GITEA_CLIENT_SECRET=****</span><br><span class=\"line\">#DRONE_GITLAB_SERVER=http://git.****.com</span><br><span class=\"line\">#DRONE_GITLAB_CLIENT_ID=****</span><br><span class=\"line\">#DRONE_GITLAB_CLIENT_SECRET=****</span><br><span class=\"line\">DRONE_RPC_SECRET=*****</span><br><span class=\"line\">DRONE_SERVER_HOST=drone.****.com</span><br><span class=\"line\">DRONE_SERVER_PROTO=https</span><br><span class=\"line\">DRONE_RPC_SERVER=****:9000</span><br><span class=\"line\">DRONE_RPC_PROTO=http</span><br></pre></td></tr></table></figure>\n\n<p>将<code>docker-compose.yml</code>和<code>.env</code>放在同一目录,然后运行以下命令:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">sudo docker-compose up -d</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://juejin.im/post/5d97489ee51d457824771d47\" target=\"_blank\" rel=\"noopener\">https://juejin.im/post/5d97489ee51d457824771d47</a></p>\n<p><a href=\"https://docs.drone.io/server/provider/gitea/\" target=\"_blank\" rel=\"noopener\">https://docs.drone.io/server/provider/gitea/</a></p>\n"},{"title":"docker安装elasticsearch集群","date":"2020-07-20T05:58:19.000Z","_content":"\n#### 准备\n\n准备三个`elasticsearch`节点的配置,放在`/etc/elasticsearch/`目录下。\n\n```yaml\n#elasticsearch1.yml\n# 集群名,三份配置相同\ncluster.name: es-cluster-cen\n# 节点名,同一个集群的节点名字不能相同\nnode.name: node-1\n# 该节点是否有资格竞选成为主节点\nnode.master: true\n# 该节点是否作为数据节点\nnode.data: true\n# 一台服务器能运行的节点数,根据需要调整\nnode.max_local_storage_nodes: 3\n# 索引数据存储的位置\npath.data: /usr/share/elasticsearch/data\n# 日志路径\npath.logs: /usr/share/elasticsearch/log\n# 网关地址\nnetwork.host: 0.0.0.0\n# 和其他节点通信的地址,如果不设置的话会自动获取\nnetwork.publish_host: x.x.x.x\n# 定义http传输监听的端口\nhttp.port: 9200\n# 设置节点之间通信的端口\ntransport.tcp.port: 9300\n# 7.x新配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点\ndiscovery.seed_hosts: [\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]\n# 与上一个配置类似,这里用节点名\ncluster.initial_master_nodes: [\"node-1\",\"node-2\",\"node-3\"]\n# 集群启动后,复活2个及以上的节点,这个服务才能被使用\ngateway.recover_after_nodes: 2\n# 允许跨域,可选\nhttp.cors.enabled: true\nhttp.cors.allow-origin: \"*\"\n```\n\n```yaml\n# elasticsearch2.yml\ncluster.name: es-cluster-cen\nnode.name: node-2\nnode.master: true\nnode.data: true\nnode.max_local_storage_nodes: 3\npath.data: /usr/share/elasticsearch/data\npath.logs: /usr/share/elasticsearch/log\nnetwork.host: 0.0.0.0\nnetwork.publish_host: y.y.y.y\nhttp.port: 9201\ntransport.tcp.port: 9301\ndiscovery.seed_hosts: [\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]\ncluster.initial_master_nodes: [\"node-1\",\"node-2\",\"node-3\"]\ngateway.recover_after_nodes: 2\nhttp.cors.enabled: true\nhttp.cors.allow-origin: \"*\"\n```\n\n```yaml\n#elasticsearch3.yml\ncluster.name: es-cluster-cen\nnode.name: node-3\nnode.master: true\nnode.data: true\nnode.max_local_storage_nodes: 3\npath.data: /usr/share/elasticsearch/data\npath.logs: /usr/share/elasticsearch/log\nnetwork.host: 0.0.0.0\nnetwork.publish_host: z.z.z.z\nhttp.port: 9202\ntransport.tcp.port: 9302\ndiscovery.seed_hosts: [\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]\ncluster.initial_master_nodes: [\"node-1\",\"node-2\",\"node-3\"]\ngateway.recover_after_nodes: 2\nhttp.cors.enabled: true\nhttp.cors.allow-origin: \"*\"\n```\n\n拉取镜像\n\n```shell\ndocker pull elasticsearch:7.7.0\n```\n\n#### 启动\n\n```shell\ndocker run \\\n-p 9200:9200 \\\n-p 9300:9300 \\\n-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\\n-v /etc/elasticsearch/elasticsearch1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\\ndocker.elastic.co/elasticsearch/elasticsearch:7.7.0 \n```\n\n```shell\ndocker run \\\n-p 9201:9201 \\\n-p 9301:9301 \\\n-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\\n-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\\ndocker.elastic.co/elasticsearch/elasticsearch:7.7.0 \n```\n\n```shell\ndocker run \\\n-p 9202:9202 \\\n-p 9302:9302 \\\n-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\\n-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\\ndocker.elastic.co/elasticsearch/elasticsearch:7.7.0 \n```\n\n启动完成后,任意访问一个节点查看集群状态:\n\n```shell\ncurl http://127.0.0.1:9200/_cluster/health\n```\n\n返回\n\n```json\n{\n \"cluster_name\":\"es-cluster-cen\",\n \"status\":\"green\",\n \"timed_out\":false,\n \"number_of_nodes\":3,\n \"number_of_data_nodes\":3,\n \"active_primary_shards\":62,\n \"active_shards\":93,\n \"relocating_shards\":0,\n \"initializing_shards\":0,\n \"unassigned_shards\":31,\n \"delayed_unassigned_shards\":0,\n \"number_of_pending_tasks\":0,\n \"number_of_in_flight_fetch\":0,\n \"task_max_waiting_in_queue_millis\":0,\n \"active_shards_percent_as_number\":75\n}\n```\n\n返回结果为集群的基本信息。\n\n\n\n参考文档:\n\n[https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/](https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/)\n\n","source":"_posts/elasticsearch-cluster-install.md","raw":"---\ntitle: docker安装elasticsearch集群\ndate: 2020-07-20 13:58:19\ntags: [elasticsearch,cluster,elasticsearch集群安装,elasticsearch集群安装配置,docker]\ncategories: [学习,docker,elasticsearch]\n---\n\n#### 准备\n\n准备三个`elasticsearch`节点的配置,放在`/etc/elasticsearch/`目录下。\n\n```yaml\n#elasticsearch1.yml\n# 集群名,三份配置相同\ncluster.name: es-cluster-cen\n# 节点名,同一个集群的节点名字不能相同\nnode.name: node-1\n# 该节点是否有资格竞选成为主节点\nnode.master: true\n# 该节点是否作为数据节点\nnode.data: true\n# 一台服务器能运行的节点数,根据需要调整\nnode.max_local_storage_nodes: 3\n# 索引数据存储的位置\npath.data: /usr/share/elasticsearch/data\n# 日志路径\npath.logs: /usr/share/elasticsearch/log\n# 网关地址\nnetwork.host: 0.0.0.0\n# 和其他节点通信的地址,如果不设置的话会自动获取\nnetwork.publish_host: x.x.x.x\n# 定义http传输监听的端口\nhttp.port: 9200\n# 设置节点之间通信的端口\ntransport.tcp.port: 9300\n# 7.x新配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点\ndiscovery.seed_hosts: [\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]\n# 与上一个配置类似,这里用节点名\ncluster.initial_master_nodes: [\"node-1\",\"node-2\",\"node-3\"]\n# 集群启动后,复活2个及以上的节点,这个服务才能被使用\ngateway.recover_after_nodes: 2\n# 允许跨域,可选\nhttp.cors.enabled: true\nhttp.cors.allow-origin: \"*\"\n```\n\n```yaml\n# elasticsearch2.yml\ncluster.name: es-cluster-cen\nnode.name: node-2\nnode.master: true\nnode.data: true\nnode.max_local_storage_nodes: 3\npath.data: /usr/share/elasticsearch/data\npath.logs: /usr/share/elasticsearch/log\nnetwork.host: 0.0.0.0\nnetwork.publish_host: y.y.y.y\nhttp.port: 9201\ntransport.tcp.port: 9301\ndiscovery.seed_hosts: [\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]\ncluster.initial_master_nodes: [\"node-1\",\"node-2\",\"node-3\"]\ngateway.recover_after_nodes: 2\nhttp.cors.enabled: true\nhttp.cors.allow-origin: \"*\"\n```\n\n```yaml\n#elasticsearch3.yml\ncluster.name: es-cluster-cen\nnode.name: node-3\nnode.master: true\nnode.data: true\nnode.max_local_storage_nodes: 3\npath.data: /usr/share/elasticsearch/data\npath.logs: /usr/share/elasticsearch/log\nnetwork.host: 0.0.0.0\nnetwork.publish_host: z.z.z.z\nhttp.port: 9202\ntransport.tcp.port: 9302\ndiscovery.seed_hosts: [\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]\ncluster.initial_master_nodes: [\"node-1\",\"node-2\",\"node-3\"]\ngateway.recover_after_nodes: 2\nhttp.cors.enabled: true\nhttp.cors.allow-origin: \"*\"\n```\n\n拉取镜像\n\n```shell\ndocker pull elasticsearch:7.7.0\n```\n\n#### 启动\n\n```shell\ndocker run \\\n-p 9200:9200 \\\n-p 9300:9300 \\\n-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\\n-v /etc/elasticsearch/elasticsearch1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\\ndocker.elastic.co/elasticsearch/elasticsearch:7.7.0 \n```\n\n```shell\ndocker run \\\n-p 9201:9201 \\\n-p 9301:9301 \\\n-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\\n-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\\ndocker.elastic.co/elasticsearch/elasticsearch:7.7.0 \n```\n\n```shell\ndocker run \\\n-p 9202:9202 \\\n-p 9302:9302 \\\n-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\\n-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\\ndocker.elastic.co/elasticsearch/elasticsearch:7.7.0 \n```\n\n启动完成后,任意访问一个节点查看集群状态:\n\n```shell\ncurl http://127.0.0.1:9200/_cluster/health\n```\n\n返回\n\n```json\n{\n \"cluster_name\":\"es-cluster-cen\",\n \"status\":\"green\",\n \"timed_out\":false,\n \"number_of_nodes\":3,\n \"number_of_data_nodes\":3,\n \"active_primary_shards\":62,\n \"active_shards\":93,\n \"relocating_shards\":0,\n \"initializing_shards\":0,\n \"unassigned_shards\":31,\n \"delayed_unassigned_shards\":0,\n \"number_of_pending_tasks\":0,\n \"number_of_in_flight_fetch\":0,\n \"task_max_waiting_in_queue_millis\":0,\n \"active_shards_percent_as_number\":75\n}\n```\n\n返回结果为集群的基本信息。\n\n\n\n参考文档:\n\n[https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/](https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/)\n\n","slug":"elasticsearch-cluster-install","published":1,"updated":"2020-09-13T06:56:22.347Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gv000k58syq8wvswt5","content":"<h4 id=\"准备\"><a href=\"#准备\" class=\"headerlink\" title=\"准备\"></a>准备</h4><p>准备三个<code>elasticsearch</code>节点的配置,放在<code>/etc/elasticsearch/</code>目录下。</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#elasticsearch1.yml</span></span><br><span class=\"line\"><span class=\"comment\"># 集群名,三份配置相同</span></span><br><span class=\"line\"><span class=\"attr\">cluster.name:</span> <span class=\"string\">es-cluster-cen</span></span><br><span class=\"line\"><span class=\"comment\"># 节点名,同一个集群的节点名字不能相同</span></span><br><span class=\"line\"><span class=\"attr\">node.name:</span> <span class=\"string\">node-1</span></span><br><span class=\"line\"><span class=\"comment\"># 该节点是否有资格竞选成为主节点</span></span><br><span class=\"line\"><span class=\"attr\">node.master:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"comment\"># 该节点是否作为数据节点</span></span><br><span class=\"line\"><span class=\"attr\">node.data:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"comment\"># 一台服务器能运行的节点数,根据需要调整</span></span><br><span class=\"line\"><span class=\"attr\">node.max_local_storage_nodes:</span> <span class=\"number\">3</span></span><br><span class=\"line\"><span class=\"comment\"># 索引数据存储的位置</span></span><br><span class=\"line\"><span class=\"attr\">path.data:</span> <span class=\"string\">/usr/share/elasticsearch/data</span></span><br><span class=\"line\"><span class=\"comment\"># 日志路径</span></span><br><span class=\"line\"><span class=\"attr\">path.logs:</span> <span class=\"string\">/usr/share/elasticsearch/log</span></span><br><span class=\"line\"><span class=\"comment\"># 网关地址</span></span><br><span class=\"line\"><span class=\"attr\">network.host:</span> <span class=\"number\">0.0</span><span class=\"number\">.0</span><span class=\"number\">.0</span></span><br><span class=\"line\"><span class=\"comment\"># 和其他节点通信的地址,如果不设置的话会自动获取</span></span><br><span class=\"line\"><span class=\"attr\">network.publish_host:</span> <span class=\"string\">x.x.x.x</span></span><br><span class=\"line\"><span class=\"comment\"># 定义http传输监听的端口</span></span><br><span class=\"line\"><span class=\"attr\">http.port:</span> <span class=\"number\">9200</span></span><br><span class=\"line\"><span class=\"comment\"># 设置节点之间通信的端口</span></span><br><span class=\"line\"><span class=\"attr\">transport.tcp.port:</span> <span class=\"number\">9300</span></span><br><span class=\"line\"><span class=\"comment\"># 7.x新配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点</span></span><br><span class=\"line\"><span class=\"attr\">discovery.seed_hosts:</span> <span class=\"string\">[\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]</span></span><br><span class=\"line\"><span class=\"comment\"># 与上一个配置类似,这里用节点名</span></span><br><span class=\"line\"><span class=\"attr\">cluster.initial_master_nodes:</span> <span class=\"string\">[\"node-1\",\"node-2\",\"node-3\"]</span></span><br><span class=\"line\"><span class=\"comment\"># 集群启动后,复活2个及以上的节点,这个服务才能被使用</span></span><br><span class=\"line\"><span class=\"attr\">gateway.recover_after_nodes:</span> <span class=\"number\">2</span></span><br><span class=\"line\"><span class=\"comment\"># 允许跨域,可选</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.enabled:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.allow-origin:</span> <span class=\"string\">\"*\"</span></span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># elasticsearch2.yml</span></span><br><span class=\"line\"><span class=\"attr\">cluster.name:</span> <span class=\"string\">es-cluster-cen</span></span><br><span class=\"line\"><span class=\"attr\">node.name:</span> <span class=\"string\">node-2</span></span><br><span class=\"line\"><span class=\"attr\">node.master:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.data:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.max_local_storage_nodes:</span> <span class=\"number\">3</span></span><br><span class=\"line\"><span class=\"attr\">path.data:</span> <span class=\"string\">/usr/share/elasticsearch/data</span></span><br><span class=\"line\"><span class=\"attr\">path.logs:</span> <span class=\"string\">/usr/share/elasticsearch/log</span></span><br><span class=\"line\"><span class=\"attr\">network.host:</span> <span class=\"number\">0.0</span><span class=\"number\">.0</span><span class=\"number\">.0</span></span><br><span class=\"line\"><span class=\"attr\">network.publish_host:</span> <span class=\"string\">y.y.y.y</span></span><br><span class=\"line\"><span class=\"attr\">http.port:</span> <span class=\"number\">9201</span></span><br><span class=\"line\"><span class=\"attr\">transport.tcp.port:</span> <span class=\"number\">9301</span></span><br><span class=\"line\"><span class=\"attr\">discovery.seed_hosts:</span> <span class=\"string\">[\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]</span></span><br><span class=\"line\"><span class=\"attr\">cluster.initial_master_nodes:</span> <span class=\"string\">[\"node-1\",\"node-2\",\"node-3\"]</span></span><br><span class=\"line\"><span class=\"attr\">gateway.recover_after_nodes:</span> <span class=\"number\">2</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.enabled:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.allow-origin:</span> <span class=\"string\">\"*\"</span></span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#elasticsearch3.yml</span></span><br><span class=\"line\"><span class=\"attr\">cluster.name:</span> <span class=\"string\">es-cluster-cen</span></span><br><span class=\"line\"><span class=\"attr\">node.name:</span> <span class=\"string\">node-3</span></span><br><span class=\"line\"><span class=\"attr\">node.master:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.data:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.max_local_storage_nodes:</span> <span class=\"number\">3</span></span><br><span class=\"line\"><span class=\"attr\">path.data:</span> <span class=\"string\">/usr/share/elasticsearch/data</span></span><br><span class=\"line\"><span class=\"attr\">path.logs:</span> <span class=\"string\">/usr/share/elasticsearch/log</span></span><br><span class=\"line\"><span class=\"attr\">network.host:</span> <span class=\"number\">0.0</span><span class=\"number\">.0</span><span class=\"number\">.0</span></span><br><span class=\"line\"><span class=\"attr\">network.publish_host:</span> <span class=\"string\">z.z.z.z</span></span><br><span class=\"line\"><span class=\"attr\">http.port:</span> <span class=\"number\">9202</span></span><br><span class=\"line\"><span class=\"attr\">transport.tcp.port:</span> <span class=\"number\">9302</span></span><br><span class=\"line\"><span class=\"attr\">discovery.seed_hosts:</span> <span class=\"string\">[\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]</span></span><br><span class=\"line\"><span class=\"attr\">cluster.initial_master_nodes:</span> <span class=\"string\">[\"node-1\",\"node-2\",\"node-3\"]</span></span><br><span class=\"line\"><span class=\"attr\">gateway.recover_after_nodes:</span> <span class=\"number\">2</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.enabled:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.allow-origin:</span> <span class=\"string\">\"*\"</span></span><br></pre></td></tr></table></figure>\n\n<p>拉取镜像</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker pull elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"启动\"><a href=\"#启动\" class=\"headerlink\" title=\"启动\"></a>启动</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run \\</span><br><span class=\"line\">-p 9200:9200 \\</span><br><span class=\"line\">-p 9300:9300 \\</span><br><span class=\"line\">-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\</span><br><span class=\"line\">-v /etc/elasticsearch/elasticsearch1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\</span><br><span class=\"line\">docker.elastic.co/elasticsearch/elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run \\</span><br><span class=\"line\">-p 9201:9201 \\</span><br><span class=\"line\">-p 9301:9301 \\</span><br><span class=\"line\">-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\</span><br><span class=\"line\">-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\</span><br><span class=\"line\">docker.elastic.co/elasticsearch/elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run \\</span><br><span class=\"line\">-p 9202:9202 \\</span><br><span class=\"line\">-p 9302:9302 \\</span><br><span class=\"line\">-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\</span><br><span class=\"line\">-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\</span><br><span class=\"line\">docker.elastic.co/elasticsearch/elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<p>启动完成后,任意访问一个节点查看集群状态:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:9200/_cluster/health</span><br></pre></td></tr></table></figure>\n\n<p>返回</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"attr\">\"cluster_name\"</span>:<span class=\"string\">\"es-cluster-cen\"</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"status\"</span>:<span class=\"string\">\"green\"</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"timed_out\"</span>:<span class=\"literal\">false</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_nodes\"</span>:<span class=\"number\">3</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_data_nodes\"</span>:<span class=\"number\">3</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"active_primary_shards\"</span>:<span class=\"number\">62</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"active_shards\"</span>:<span class=\"number\">93</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"relocating_shards\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"initializing_shards\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"unassigned_shards\"</span>:<span class=\"number\">31</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"delayed_unassigned_shards\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_pending_tasks\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_in_flight_fetch\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"task_max_waiting_in_queue_millis\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"active_shards_percent_as_number\"</span>:<span class=\"number\">75</span></span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>返回结果为集群的基本信息。</p>\n<p>参考文档:</p>\n<p><a href=\"https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/\" target=\"_blank\" rel=\"noopener\">https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"准备\"><a href=\"#准备\" class=\"headerlink\" title=\"准备\"></a>准备</h4><p>准备三个<code>elasticsearch</code>节点的配置,放在<code>/etc/elasticsearch/</code>目录下。</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#elasticsearch1.yml</span></span><br><span class=\"line\"><span class=\"comment\"># 集群名,三份配置相同</span></span><br><span class=\"line\"><span class=\"attr\">cluster.name:</span> <span class=\"string\">es-cluster-cen</span></span><br><span class=\"line\"><span class=\"comment\"># 节点名,同一个集群的节点名字不能相同</span></span><br><span class=\"line\"><span class=\"attr\">node.name:</span> <span class=\"string\">node-1</span></span><br><span class=\"line\"><span class=\"comment\"># 该节点是否有资格竞选成为主节点</span></span><br><span class=\"line\"><span class=\"attr\">node.master:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"comment\"># 该节点是否作为数据节点</span></span><br><span class=\"line\"><span class=\"attr\">node.data:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"comment\"># 一台服务器能运行的节点数,根据需要调整</span></span><br><span class=\"line\"><span class=\"attr\">node.max_local_storage_nodes:</span> <span class=\"number\">3</span></span><br><span class=\"line\"><span class=\"comment\"># 索引数据存储的位置</span></span><br><span class=\"line\"><span class=\"attr\">path.data:</span> <span class=\"string\">/usr/share/elasticsearch/data</span></span><br><span class=\"line\"><span class=\"comment\"># 日志路径</span></span><br><span class=\"line\"><span class=\"attr\">path.logs:</span> <span class=\"string\">/usr/share/elasticsearch/log</span></span><br><span class=\"line\"><span class=\"comment\"># 网关地址</span></span><br><span class=\"line\"><span class=\"attr\">network.host:</span> <span class=\"number\">0.0</span><span class=\"number\">.0</span><span class=\"number\">.0</span></span><br><span class=\"line\"><span class=\"comment\"># 和其他节点通信的地址,如果不设置的话会自动获取</span></span><br><span class=\"line\"><span class=\"attr\">network.publish_host:</span> <span class=\"string\">x.x.x.x</span></span><br><span class=\"line\"><span class=\"comment\"># 定义http传输监听的端口</span></span><br><span class=\"line\"><span class=\"attr\">http.port:</span> <span class=\"number\">9200</span></span><br><span class=\"line\"><span class=\"comment\"># 设置节点之间通信的端口</span></span><br><span class=\"line\"><span class=\"attr\">transport.tcp.port:</span> <span class=\"number\">9300</span></span><br><span class=\"line\"><span class=\"comment\"># 7.x新配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点</span></span><br><span class=\"line\"><span class=\"attr\">discovery.seed_hosts:</span> <span class=\"string\">[\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]</span></span><br><span class=\"line\"><span class=\"comment\"># 与上一个配置类似,这里用节点名</span></span><br><span class=\"line\"><span class=\"attr\">cluster.initial_master_nodes:</span> <span class=\"string\">[\"node-1\",\"node-2\",\"node-3\"]</span></span><br><span class=\"line\"><span class=\"comment\"># 集群启动后,复活2个及以上的节点,这个服务才能被使用</span></span><br><span class=\"line\"><span class=\"attr\">gateway.recover_after_nodes:</span> <span class=\"number\">2</span></span><br><span class=\"line\"><span class=\"comment\"># 允许跨域,可选</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.enabled:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.allow-origin:</span> <span class=\"string\">\"*\"</span></span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># elasticsearch2.yml</span></span><br><span class=\"line\"><span class=\"attr\">cluster.name:</span> <span class=\"string\">es-cluster-cen</span></span><br><span class=\"line\"><span class=\"attr\">node.name:</span> <span class=\"string\">node-2</span></span><br><span class=\"line\"><span class=\"attr\">node.master:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.data:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.max_local_storage_nodes:</span> <span class=\"number\">3</span></span><br><span class=\"line\"><span class=\"attr\">path.data:</span> <span class=\"string\">/usr/share/elasticsearch/data</span></span><br><span class=\"line\"><span class=\"attr\">path.logs:</span> <span class=\"string\">/usr/share/elasticsearch/log</span></span><br><span class=\"line\"><span class=\"attr\">network.host:</span> <span class=\"number\">0.0</span><span class=\"number\">.0</span><span class=\"number\">.0</span></span><br><span class=\"line\"><span class=\"attr\">network.publish_host:</span> <span class=\"string\">y.y.y.y</span></span><br><span class=\"line\"><span class=\"attr\">http.port:</span> <span class=\"number\">9201</span></span><br><span class=\"line\"><span class=\"attr\">transport.tcp.port:</span> <span class=\"number\">9301</span></span><br><span class=\"line\"><span class=\"attr\">discovery.seed_hosts:</span> <span class=\"string\">[\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]</span></span><br><span class=\"line\"><span class=\"attr\">cluster.initial_master_nodes:</span> <span class=\"string\">[\"node-1\",\"node-2\",\"node-3\"]</span></span><br><span class=\"line\"><span class=\"attr\">gateway.recover_after_nodes:</span> <span class=\"number\">2</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.enabled:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.allow-origin:</span> <span class=\"string\">\"*\"</span></span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#elasticsearch3.yml</span></span><br><span class=\"line\"><span class=\"attr\">cluster.name:</span> <span class=\"string\">es-cluster-cen</span></span><br><span class=\"line\"><span class=\"attr\">node.name:</span> <span class=\"string\">node-3</span></span><br><span class=\"line\"><span class=\"attr\">node.master:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.data:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">node.max_local_storage_nodes:</span> <span class=\"number\">3</span></span><br><span class=\"line\"><span class=\"attr\">path.data:</span> <span class=\"string\">/usr/share/elasticsearch/data</span></span><br><span class=\"line\"><span class=\"attr\">path.logs:</span> <span class=\"string\">/usr/share/elasticsearch/log</span></span><br><span class=\"line\"><span class=\"attr\">network.host:</span> <span class=\"number\">0.0</span><span class=\"number\">.0</span><span class=\"number\">.0</span></span><br><span class=\"line\"><span class=\"attr\">network.publish_host:</span> <span class=\"string\">z.z.z.z</span></span><br><span class=\"line\"><span class=\"attr\">http.port:</span> <span class=\"number\">9202</span></span><br><span class=\"line\"><span class=\"attr\">transport.tcp.port:</span> <span class=\"number\">9302</span></span><br><span class=\"line\"><span class=\"attr\">discovery.seed_hosts:</span> <span class=\"string\">[\"x.x.x.x:9300\",\"y.y.y.y:9301\",\"z.z.z.z:9302\"]</span></span><br><span class=\"line\"><span class=\"attr\">cluster.initial_master_nodes:</span> <span class=\"string\">[\"node-1\",\"node-2\",\"node-3\"]</span></span><br><span class=\"line\"><span class=\"attr\">gateway.recover_after_nodes:</span> <span class=\"number\">2</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.enabled:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">http.cors.allow-origin:</span> <span class=\"string\">\"*\"</span></span><br></pre></td></tr></table></figure>\n\n<p>拉取镜像</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker pull elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"启动\"><a href=\"#启动\" class=\"headerlink\" title=\"启动\"></a>启动</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run \\</span><br><span class=\"line\">-p 9200:9200 \\</span><br><span class=\"line\">-p 9300:9300 \\</span><br><span class=\"line\">-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\</span><br><span class=\"line\">-v /etc/elasticsearch/elasticsearch1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\</span><br><span class=\"line\">docker.elastic.co/elasticsearch/elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run \\</span><br><span class=\"line\">-p 9201:9201 \\</span><br><span class=\"line\">-p 9301:9301 \\</span><br><span class=\"line\">-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\</span><br><span class=\"line\">-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\</span><br><span class=\"line\">docker.elastic.co/elasticsearch/elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run \\</span><br><span class=\"line\">-p 9202:9202 \\</span><br><span class=\"line\">-p 9302:9302 \\</span><br><span class=\"line\">-e ES_JAVA_OPTS=\"-Xms256m -Xmx256m\" \\</span><br><span class=\"line\">-v /etc/elasticsearch/elasticsearch2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\</span><br><span class=\"line\">docker.elastic.co/elasticsearch/elasticsearch:7.7.0</span><br></pre></td></tr></table></figure>\n\n<p>启动完成后,任意访问一个节点查看集群状态:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:9200/_cluster/health</span><br></pre></td></tr></table></figure>\n\n<p>返回</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"attr\">\"cluster_name\"</span>:<span class=\"string\">\"es-cluster-cen\"</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"status\"</span>:<span class=\"string\">\"green\"</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"timed_out\"</span>:<span class=\"literal\">false</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_nodes\"</span>:<span class=\"number\">3</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_data_nodes\"</span>:<span class=\"number\">3</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"active_primary_shards\"</span>:<span class=\"number\">62</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"active_shards\"</span>:<span class=\"number\">93</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"relocating_shards\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"initializing_shards\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"unassigned_shards\"</span>:<span class=\"number\">31</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"delayed_unassigned_shards\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_pending_tasks\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"number_of_in_flight_fetch\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"task_max_waiting_in_queue_millis\"</span>:<span class=\"number\">0</span>,</span><br><span class=\"line\"> <span class=\"attr\">\"active_shards_percent_as_number\"</span>:<span class=\"number\">75</span></span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>返回结果为集群的基本信息。</p>\n<p>参考文档:</p>\n<p><a href=\"https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/\" target=\"_blank\" rel=\"noopener\">https://blog.andycen.com/2020/05/24/Elasticsearch%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/</a></p>\n"},{"title":"elasticsearch异常 Data too large","date":"2020-08-13T05:35:44.000Z","_content":"\n#### 问题\n\n使用`canal`向`elasticsearch`同步数据时,出现:\n\n```\n Data too large, data for [<transport_request>] would be [256669646/244.7mb], which is larger than the limit of [255013683/243.1mb], real usage: [256666520/244.7mb], new bytes reserved: [3126/3kb], usages [request=0/0b, fielddata=4812/4.6kb, in_flight_requests=3126/3kb, accounting=6615462/6.3mb]\n```\n\n#### 原因\n\n堆内存不够当前查询加载数据所以会报错。\n\n#### 解决\n\n提高堆栈内存\n\n修改`elasticsearch`的`config`目录下的`jvm.options`:\n\n```properties\n################################################################\n## IMPORTANT: JVM heap size\n################################################################\n##\n## You should always set the min and max JVM heap\n## size to the same value. For example, to set\n## the heap to 4 GB, set:\n##\n## -Xms4g\n## -Xmx4g\n##\n## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html\n## for more information\n##\n################################################################\n\n# Xms represents the initial size of total heap space\n# Xmx represents the maximum size of total heap space\n\n-Xms4g\n-Xmx6g\n```\n\n然后重启`elasticsearch`。\n\n\n\n增加堆内存使用率,默认70%,修改为90%:\n\n```shell\ncurl -X PUT \"http://127.0.0.1:9200/_cluster/settings\" -H 'Content-Type: application/json' -d'\n {\n \"transient\" : {\n \"indices.breaker.total.limit\" : \"90%\"\n }\n }\n```\n\n\n\n参考文档:\n\n[https://github.com/docker-library/elasticsearch/issues/98](https://github.com/docker-library/elasticsearch/issues/98)\n\n[https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html](https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html)","source":"_posts/elasticsearch-error-2.md","raw":"---\ntitle: elasticsearch异常 Data too large\ndate: 2020-08-13 13:35:44\ntags: [elasticsearch,error,异常,Data too large]\ncategories: [学习,docker,elasticsearch,error]\n---\n\n#### 问题\n\n使用`canal`向`elasticsearch`同步数据时,出现:\n\n```\n Data too large, data for [<transport_request>] would be [256669646/244.7mb], which is larger than the limit of [255013683/243.1mb], real usage: [256666520/244.7mb], new bytes reserved: [3126/3kb], usages [request=0/0b, fielddata=4812/4.6kb, in_flight_requests=3126/3kb, accounting=6615462/6.3mb]\n```\n\n#### 原因\n\n堆内存不够当前查询加载数据所以会报错。\n\n#### 解决\n\n提高堆栈内存\n\n修改`elasticsearch`的`config`目录下的`jvm.options`:\n\n```properties\n################################################################\n## IMPORTANT: JVM heap size\n################################################################\n##\n## You should always set the min and max JVM heap\n## size to the same value. For example, to set\n## the heap to 4 GB, set:\n##\n## -Xms4g\n## -Xmx4g\n##\n## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html\n## for more information\n##\n################################################################\n\n# Xms represents the initial size of total heap space\n# Xmx represents the maximum size of total heap space\n\n-Xms4g\n-Xmx6g\n```\n\n然后重启`elasticsearch`。\n\n\n\n增加堆内存使用率,默认70%,修改为90%:\n\n```shell\ncurl -X PUT \"http://127.0.0.1:9200/_cluster/settings\" -H 'Content-Type: application/json' -d'\n {\n \"transient\" : {\n \"indices.breaker.total.limit\" : \"90%\"\n }\n }\n```\n\n\n\n参考文档:\n\n[https://github.com/docker-library/elasticsearch/issues/98](https://github.com/docker-library/elasticsearch/issues/98)\n\n[https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html](https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html)","slug":"elasticsearch-error-2","published":1,"updated":"2020-09-13T06:56:39.596Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2gz000l58sykz80vsc2","content":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>使用<code>canal</code>向<code>elasticsearch</code>同步数据时,出现:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">Data too large, data for [<transport_request>] would be [256669646/244.7mb], which is larger than the limit of [255013683/243.1mb], real usage: [256666520/244.7mb], new bytes reserved: [3126/3kb], usages [request=0/0b, fielddata=4812/4.6kb, in_flight_requests=3126/3kb, accounting=6615462/6.3mb]</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>堆内存不够当前查询加载数据所以会报错。</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>提高堆栈内存</p>\n<p>修改<code>elasticsearch</code>的<code>config</code>目录下的<code>jvm.options</code>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">################################################################</span><br><span class=\"line\">## IMPORTANT: JVM heap size</span><br><span class=\"line\">################################################################</span><br><span class=\"line\">##</span><br><span class=\"line\">## You should always set the min and max JVM heap</span><br><span class=\"line\">## size to the same value. For example, to set</span><br><span class=\"line\">## the heap to 4 GB, set:</span><br><span class=\"line\">##</span><br><span class=\"line\">## -Xms4g</span><br><span class=\"line\">## -Xmx4g</span><br><span class=\"line\">##</span><br><span class=\"line\">## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html</span><br><span class=\"line\">## for more information</span><br><span class=\"line\">##</span><br><span class=\"line\">################################################################</span><br><span class=\"line\"></span><br><span class=\"line\"># Xms represents the initial size of total heap space</span><br><span class=\"line\"># Xmx represents the maximum size of total heap space</span><br><span class=\"line\"></span><br><span class=\"line\">-Xms4g</span><br><span class=\"line\">-Xmx6g</span><br></pre></td></tr></table></figure>\n\n<p>然后重启<code>elasticsearch</code>。</p>\n<p>增加堆内存使用率,默认70%,修改为90%:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl -X PUT \"http://127.0.0.1:9200/_cluster/settings\" -H 'Content-Type: application/json' -d'</span><br><span class=\"line\"> {</span><br><span class=\"line\"> \"transient\" : {</span><br><span class=\"line\"> \"indices.breaker.total.limit\" : \"90%\"</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure>\n\n<p>参考文档:</p>\n<p><a href=\"https://github.com/docker-library/elasticsearch/issues/98\" target=\"_blank\" rel=\"noopener\">https://github.com/docker-library/elasticsearch/issues/98</a></p>\n<p><a href=\"https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html\" target=\"_blank\" rel=\"noopener\">https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>使用<code>canal</code>向<code>elasticsearch</code>同步数据时,出现:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">Data too large, data for [<transport_request>] would be [256669646/244.7mb], which is larger than the limit of [255013683/243.1mb], real usage: [256666520/244.7mb], new bytes reserved: [3126/3kb], usages [request=0/0b, fielddata=4812/4.6kb, in_flight_requests=3126/3kb, accounting=6615462/6.3mb]</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>堆内存不够当前查询加载数据所以会报错。</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>提高堆栈内存</p>\n<p>修改<code>elasticsearch</code>的<code>config</code>目录下的<code>jvm.options</code>:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">################################################################</span><br><span class=\"line\">## IMPORTANT: JVM heap size</span><br><span class=\"line\">################################################################</span><br><span class=\"line\">##</span><br><span class=\"line\">## You should always set the min and max JVM heap</span><br><span class=\"line\">## size to the same value. For example, to set</span><br><span class=\"line\">## the heap to 4 GB, set:</span><br><span class=\"line\">##</span><br><span class=\"line\">## -Xms4g</span><br><span class=\"line\">## -Xmx4g</span><br><span class=\"line\">##</span><br><span class=\"line\">## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html</span><br><span class=\"line\">## for more information</span><br><span class=\"line\">##</span><br><span class=\"line\">################################################################</span><br><span class=\"line\"></span><br><span class=\"line\"># Xms represents the initial size of total heap space</span><br><span class=\"line\"># Xmx represents the maximum size of total heap space</span><br><span class=\"line\"></span><br><span class=\"line\">-Xms4g</span><br><span class=\"line\">-Xmx6g</span><br></pre></td></tr></table></figure>\n\n<p>然后重启<code>elasticsearch</code>。</p>\n<p>增加堆内存使用率,默认70%,修改为90%:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl -X PUT \"http://127.0.0.1:9200/_cluster/settings\" -H 'Content-Type: application/json' -d'</span><br><span class=\"line\"> {</span><br><span class=\"line\"> \"transient\" : {</span><br><span class=\"line\"> \"indices.breaker.total.limit\" : \"90%\"</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure>\n\n<p>参考文档:</p>\n<p><a href=\"https://github.com/docker-library/elasticsearch/issues/98\" target=\"_blank\" rel=\"noopener\">https://github.com/docker-library/elasticsearch/issues/98</a></p>\n<p><a href=\"https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html\" target=\"_blank\" rel=\"noopener\">https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html</a></p>\n"},{"title":"elasticsearch异常maximum allowed to be analyzed for highlighting解决","date":"2020-09-13T05:25:29.000Z","_content":"\n#### 问题\n\n根据指定字段进行模糊查询,进行查询后报错:\n\n```json\n{\"type\":\"illegal_argument_exception\",\"reason\":\"The length of [message] field of [SY_yKc9yQj6HAx8MKMt1pQ] doc of [syslog] index has exceeded [1000000] - maximum allowed to be analyzed for highlighting. This maximum can be set by changing the [index.highlight.max_analyzed_offset] index level setting. For large texts, indexing with offsets or term vectors is recommended!”}}\n```\n\n#### 原因\n\n索引偏移量默认是`100000`,当前索引偏移量超过默认值。\n\n#### 解决\n\n修改索引偏移量\n\n```shell\ncurl -XPUT \"http://127.0.0.1:9200/_settings\" -H 'Content-Type: application/json' -d' {\n \"index\" : {\n \"highlight.max_analyzed_offset\" : 100000000\n }\n}\n```\n\n参考文档:\n\n[https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html](https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html)\n\n\n\n","source":"_posts/elasticsearch-error-1.md","raw":"---\ntitle: elasticsearch异常maximum allowed to be analyzed for highlighting解决\ndate: 2020-09-13 13:25:29\ntags: [elasticsearch,error,异常,maximum allowed to be analyzed for highlighting]\ncategories: [学习,docker,elasticsearch,error]\n---\n\n#### 问题\n\n根据指定字段进行模糊查询,进行查询后报错:\n\n```json\n{\"type\":\"illegal_argument_exception\",\"reason\":\"The length of [message] field of [SY_yKc9yQj6HAx8MKMt1pQ] doc of [syslog] index has exceeded [1000000] - maximum allowed to be analyzed for highlighting. This maximum can be set by changing the [index.highlight.max_analyzed_offset] index level setting. For large texts, indexing with offsets or term vectors is recommended!”}}\n```\n\n#### 原因\n\n索引偏移量默认是`100000`,当前索引偏移量超过默认值。\n\n#### 解决\n\n修改索引偏移量\n\n```shell\ncurl -XPUT \"http://127.0.0.1:9200/_settings\" -H 'Content-Type: application/json' -d' {\n \"index\" : {\n \"highlight.max_analyzed_offset\" : 100000000\n }\n}\n```\n\n参考文档:\n\n[https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html](https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html)\n\n\n\n","slug":"elasticsearch-error-1","published":1,"updated":"2020-09-13T06:56:32.760Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h0000o58syiot10b2y","content":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>根据指定字段进行模糊查询,进行查询后报错:</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">{<span class=\"attr\">\"type\"</span>:<span class=\"string\">\"illegal_argument_exception\"</span>,<span class=\"attr\">\"reason\"</span>:<span class=\"string\">\"The length of [message] field of [SY_yKc9yQj6HAx8MKMt1pQ] doc of [syslog] index has exceeded [1000000] - maximum allowed to be analyzed for highlighting. This maximum can be set by changing the [index.highlight.max_analyzed_offset] index level setting. For large texts, indexing with offsets or term vectors is recommended!”}}</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>索引偏移量默认是<code>100000</code>,当前索引偏移量超过默认值。</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>修改索引偏移量</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl -XPUT \"http://127.0.0.1:9200/_settings\" -H 'Content-Type: application/json' -d' {</span><br><span class=\"line\"> \"index\" : {</span><br><span class=\"line\"> \"highlight.max_analyzed_offset\" : 100000000</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>参考文档:</p>\n<p><a href=\"https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html\" target=\"_blank\" rel=\"noopener\">https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>根据指定字段进行模糊查询,进行查询后报错:</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">{<span class=\"attr\">\"type\"</span>:<span class=\"string\">\"illegal_argument_exception\"</span>,<span class=\"attr\">\"reason\"</span>:<span class=\"string\">\"The length of [message] field of [SY_yKc9yQj6HAx8MKMt1pQ] doc of [syslog] index has exceeded [1000000] - maximum allowed to be analyzed for highlighting. This maximum can be set by changing the [index.highlight.max_analyzed_offset] index level setting. For large texts, indexing with offsets or term vectors is recommended!”}}</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>索引偏移量默认是<code>100000</code>,当前索引偏移量超过默认值。</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>修改索引偏移量</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl -XPUT \"http://127.0.0.1:9200/_settings\" -H 'Content-Type: application/json' -d' {</span><br><span class=\"line\"> \"index\" : {</span><br><span class=\"line\"> \"highlight.max_analyzed_offset\" : 100000000</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>参考文档:</p>\n<p><a href=\"https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html\" target=\"_blank\" rel=\"noopener\">https://www.cnblogs.com/zhanchenjin/archive/2019/10/14/11672900.html</a></p>\n"},{"title":"Golang安装","date":"2020-02-19T03:25:24.000Z","_content":"\n基本信息\n\ncentos 7\n\n下载安装包\n\n地址:[https://studygolang.com/dl](https://studygolang.com/dl)\n\n下载对应最新安装包\n\n```shell\n#version为对应的版本号 plantfrom为平台\nwget https://studygolang.com/dl/golang/go{version}.{plantfrom}-amd64.tar.gz\n```\n\n\n\n解压安装\n\n解包放在/usr/local/目录下,会生成go文件夹。\n\n```shell\ntar zxvf go{version}.{plantfrom}-amd64.tar.gz -C /usr/local\n```\n\n配置Go环境变量\n\n```shell\n# 编辑profile文件\n# vi /etc/profile\n# 在文件末尾添加如下内容\n#go setting\nexport GOROOT=/usr/local/go\nexport GOPATH=/usr/local/gopath\nexport PATH=$PATH:$GOROOT/bin\n```\n\n执行source /etc/profile指令,配置文件的环境变量立刻生效\n\n```shell\nsource /etc/profile\n```\n\n验证生效\n\n```shell\n#查看go版本信息\ngo version\n#查看go环境变量配置\ngo env\n```\n\n\n\n配置代理\n\n```shell\n# 编辑profile文件\n# vi /etc/profile\n# 在文件末尾添加如下内容\n# 启用 Go Modules 功能\nexport GO111MODULE=on\n# 配置 GOPROXY 环境变量\nexport GOPROXY=https://goproxy.io\n```\n\n执行以下命令生效:\n\n```\nsource /etc/profile\n```\n\n\n\n参考地址:\n\n[https://yq.aliyun.com/articles/645569](https://yq.aliyun.com/articles/645569)\n\n[https://goproxy.io/zh/](https://goproxy.io/zh/)","source":"_posts/golang-install.md","raw":"---\ntitle: Golang安装\ndate: 2020-02-19 11:25:24\ntags: [golang,go,goproxy]\ncategories: [学习,golang]\n---\n\n基本信息\n\ncentos 7\n\n下载安装包\n\n地址:[https://studygolang.com/dl](https://studygolang.com/dl)\n\n下载对应最新安装包\n\n```shell\n#version为对应的版本号 plantfrom为平台\nwget https://studygolang.com/dl/golang/go{version}.{plantfrom}-amd64.tar.gz\n```\n\n\n\n解压安装\n\n解包放在/usr/local/目录下,会生成go文件夹。\n\n```shell\ntar zxvf go{version}.{plantfrom}-amd64.tar.gz -C /usr/local\n```\n\n配置Go环境变量\n\n```shell\n# 编辑profile文件\n# vi /etc/profile\n# 在文件末尾添加如下内容\n#go setting\nexport GOROOT=/usr/local/go\nexport GOPATH=/usr/local/gopath\nexport PATH=$PATH:$GOROOT/bin\n```\n\n执行source /etc/profile指令,配置文件的环境变量立刻生效\n\n```shell\nsource /etc/profile\n```\n\n验证生效\n\n```shell\n#查看go版本信息\ngo version\n#查看go环境变量配置\ngo env\n```\n\n\n\n配置代理\n\n```shell\n# 编辑profile文件\n# vi /etc/profile\n# 在文件末尾添加如下内容\n# 启用 Go Modules 功能\nexport GO111MODULE=on\n# 配置 GOPROXY 环境变量\nexport GOPROXY=https://goproxy.io\n```\n\n执行以下命令生效:\n\n```\nsource /etc/profile\n```\n\n\n\n参考地址:\n\n[https://yq.aliyun.com/articles/645569](https://yq.aliyun.com/articles/645569)\n\n[https://goproxy.io/zh/](https://goproxy.io/zh/)","slug":"golang-install","published":1,"updated":"2020-09-13T07:03:30.003Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h1000q58syd7ech2qc","content":"<p>基本信息</p>\n<p>centos 7</p>\n<p>下载安装包</p>\n<p>地址:<a href=\"https://studygolang.com/dl\" target=\"_blank\" rel=\"noopener\">https://studygolang.com/dl</a></p>\n<p>下载对应最新安装包</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">version为对应的版本号 plantfrom为平台</span></span><br><span class=\"line\">wget https://studygolang.com/dl/golang/go{version}.{plantfrom}-amd64.tar.gz</span><br></pre></td></tr></table></figure>\n\n<p>解压安装</p>\n<p>解包放在/usr/local/目录下,会生成go文件夹。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">tar zxvf go{version}.{plantfrom}-amd64.tar.gz -C /usr/local</span><br></pre></td></tr></table></figure>\n\n<p>配置Go环境变量</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 编辑profile文件</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> vi /etc/profile</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 在文件末尾添加如下内容</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">go setting</span></span><br><span class=\"line\">export GOROOT=/usr/local/go</span><br><span class=\"line\">export GOPATH=/usr/local/gopath</span><br><span class=\"line\">export PATH=$PATH:$GOROOT/bin</span><br></pre></td></tr></table></figure>\n\n<p>执行source /etc/profile指令,配置文件的环境变量立刻生效</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">source /etc/profile</span><br></pre></td></tr></table></figure>\n\n<p>验证生效</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">查看go版本信息</span></span><br><span class=\"line\">go version</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">查看go环境变量配置</span></span><br><span class=\"line\">go env</span><br></pre></td></tr></table></figure>\n\n<p>配置代理</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 编辑profile文件</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> vi /etc/profile</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 在文件末尾添加如下内容</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 启用 Go Modules 功能</span></span><br><span class=\"line\">export GO111MODULE=on</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 配置 GOPROXY 环境变量</span></span><br><span class=\"line\">export GOPROXY=https://goproxy.io</span><br></pre></td></tr></table></figure>\n\n<p>执行以下命令生效:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">source /etc/profile</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://yq.aliyun.com/articles/645569\" target=\"_blank\" rel=\"noopener\">https://yq.aliyun.com/articles/645569</a></p>\n<p><a href=\"https://goproxy.io/zh/\" target=\"_blank\" rel=\"noopener\">https://goproxy.io/zh/</a></p>\n","site":{"data":{}},"excerpt":"","more":"<p>基本信息</p>\n<p>centos 7</p>\n<p>下载安装包</p>\n<p>地址:<a href=\"https://studygolang.com/dl\" target=\"_blank\" rel=\"noopener\">https://studygolang.com/dl</a></p>\n<p>下载对应最新安装包</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">version为对应的版本号 plantfrom为平台</span></span><br><span class=\"line\">wget https://studygolang.com/dl/golang/go{version}.{plantfrom}-amd64.tar.gz</span><br></pre></td></tr></table></figure>\n\n<p>解压安装</p>\n<p>解包放在/usr/local/目录下,会生成go文件夹。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">tar zxvf go{version}.{plantfrom}-amd64.tar.gz -C /usr/local</span><br></pre></td></tr></table></figure>\n\n<p>配置Go环境变量</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 编辑profile文件</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> vi /etc/profile</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 在文件末尾添加如下内容</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">go setting</span></span><br><span class=\"line\">export GOROOT=/usr/local/go</span><br><span class=\"line\">export GOPATH=/usr/local/gopath</span><br><span class=\"line\">export PATH=$PATH:$GOROOT/bin</span><br></pre></td></tr></table></figure>\n\n<p>执行source /etc/profile指令,配置文件的环境变量立刻生效</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">source /etc/profile</span><br></pre></td></tr></table></figure>\n\n<p>验证生效</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">查看go版本信息</span></span><br><span class=\"line\">go version</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">查看go环境变量配置</span></span><br><span class=\"line\">go env</span><br></pre></td></tr></table></figure>\n\n<p>配置代理</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 编辑profile文件</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> vi /etc/profile</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 在文件末尾添加如下内容</span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 启用 Go Modules 功能</span></span><br><span class=\"line\">export GO111MODULE=on</span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 配置 GOPROXY 环境变量</span></span><br><span class=\"line\">export GOPROXY=https://goproxy.io</span><br></pre></td></tr></table></figure>\n\n<p>执行以下命令生效:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">source /etc/profile</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://yq.aliyun.com/articles/645569\" target=\"_blank\" rel=\"noopener\">https://yq.aliyun.com/articles/645569</a></p>\n<p><a href=\"https://goproxy.io/zh/\" target=\"_blank\" rel=\"noopener\">https://goproxy.io/zh/</a></p>\n"},{"title":"2018久石让与新日本爱乐世界梦幻交响乐团深圳音乐会","date":"2018-09-20T03:23:55.000Z","_content":"\n## 深圳之旅\n\n### 济南遥墙机场安检中\n\n\n\n<!--more-->\n\n### 出发\n\n\n\n\n### 春茧体育馆\n\n\n### 送给久石让的花\n\n\n### 非官方周边\n\n\n### 非官方周边:徽章\n\n\n### 意外收获:面基下限大佬的意外惊喜\n\n\n### 手册\n\n\n### 渣像素1\n\n\n### 渣像素2\n\n\n### 渣像素3\n\n\n### 渣像素4\n\n\n### 渣像素5\n\n\n\n\n### 返程\n\n\n\n\n### 久石让同好群中群友拍摄\n<video id=\"video\" controls=\"\" preload=\"none\" width=\"100%\" >\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/B898A2B47A936E08D34EAB8984CD341E.mp4\" type=\"video/mp4\">\n</video>\n\n<video id=\"video\" controls=\"\" preload=\"none\" width=\"100%\" >\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/F6C92BC62415ACFB515F59675F721C3A.mp4\" type=\"video/mp4\">\n</video>\n","source":"_posts/joehisaishi-wdo-2018-ch.md","raw":"---\ntitle: 2018久石让与新日本爱乐世界梦幻交响乐团深圳音乐会\ndate: 2018-09-20 11:23:55\ntags: [2018, joehisaishi, wdo, 久石让]\ncategories: [音乐会, 久石让]\n---\n\n## 深圳之旅\n\n### 济南遥墙机场安检中\n\n\n\n<!--more-->\n\n### 出发\n\n\n\n\n### 春茧体育馆\n\n\n### 送给久石让的花\n\n\n### 非官方周边\n\n\n### 非官方周边:徽章\n\n\n### 意外收获:面基下限大佬的意外惊喜\n\n\n### 手册\n\n\n### 渣像素1\n\n\n### 渣像素2\n\n\n### 渣像素3\n\n\n### 渣像素4\n\n\n### 渣像素5\n\n\n\n\n### 返程\n\n\n\n\n### 久石让同好群中群友拍摄\n<video id=\"video\" controls=\"\" preload=\"none\" width=\"100%\" >\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/B898A2B47A936E08D34EAB8984CD341E.mp4\" type=\"video/mp4\">\n</video>\n\n<video id=\"video\" controls=\"\" preload=\"none\" width=\"100%\" >\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/F6C92BC62415ACFB515F59675F721C3A.mp4\" type=\"video/mp4\">\n</video>\n","slug":"joehisaishi-wdo-2018-ch","published":1,"updated":"2019-09-11T02:00:25.240Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h3000u58syoolh0s2h","content":"<h2 id=\"深圳之旅\"><a href=\"#深圳之旅\" class=\"headerlink\" title=\"深圳之旅\"></a>深圳之旅</h2><h3 id=\"济南遥墙机场安检中\"><a href=\"#济南遥墙机场安检中\" class=\"headerlink\" title=\"济南遥墙机场安检中\"></a>济南遥墙机场安检中</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180908_173437.jpg\" alt=\"安检\"></p>\n<a id=\"more\"></a>\n\n<h3 id=\"出发\"><a href=\"#出发\" class=\"headerlink\" title=\"出发\"></a>出发</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180908_185913.jpg\" alt=\"出发\"></p>\n<h3 id=\"春茧体育馆\"><a href=\"#春茧体育馆\" class=\"headerlink\" title=\"春茧体育馆\"></a>春茧体育馆</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_140508.jpg\" alt=\"春茧体育馆\"></p>\n<h3 id=\"送给久石让的花\"><a href=\"#送给久石让的花\" class=\"headerlink\" title=\"送给久石让的花\"></a>送给久石让的花</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_161748.jpg\" alt=\"送给久石让的花\"></p>\n<h3 id=\"非官方周边\"><a href=\"#非官方周边\" class=\"headerlink\" title=\"非官方周边\"></a>非官方周边</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_165110.jpg\" alt=\"非官方周边\"></p>\n<h3 id=\"非官方周边:徽章\"><a href=\"#非官方周边:徽章\" class=\"headerlink\" title=\"非官方周边:徽章\"></a>非官方周边:徽章</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_165235.jpg\" alt=\"非官方周边:徽章\"></p>\n<h3 id=\"意外收获:面基下限大佬的意外惊喜\"><a href=\"#意外收获:面基下限大佬的意外惊喜\" class=\"headerlink\" title=\"意外收获:面基下限大佬的意外惊喜\"></a>意外收获:面基下限大佬的意外惊喜</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_233413.jpg\" alt=\"意外收获\"></p>\n<h3 id=\"手册\"><a href=\"#手册\" class=\"headerlink\" title=\"手册\"></a>手册</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_192941.jpg\" alt=\"手册\"></p>\n<h3 id=\"渣像素1\"><a href=\"#渣像素1\" class=\"headerlink\" title=\"渣像素1\"></a>渣像素1</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_193037.jpg\" alt=\"渣渣像素1\"></p>\n<h3 id=\"渣像素2\"><a href=\"#渣像素2\" class=\"headerlink\" title=\"渣像素2\"></a>渣像素2</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_193041.jpg\" alt=\"渣渣像素2\"></p>\n<h3 id=\"渣像素3\"><a href=\"#渣像素3\" class=\"headerlink\" title=\"渣像素3\"></a>渣像素3</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_193043.jpg\" alt=\"渣渣像素3\"></p>\n<h3 id=\"渣像素4\"><a href=\"#渣像素4\" class=\"headerlink\" title=\"渣像素4\"></a>渣像素4</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_201025.jpg\" alt=\"渣渣像素4\"></p>\n<h3 id=\"渣像素5\"><a href=\"#渣像素5\" class=\"headerlink\" title=\"渣像素5\"></a>渣像素5</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_202211.jpg\" alt=\"渣渣像素5\"></p>\n<h3 id=\"返程\"><a href=\"#返程\" class=\"headerlink\" title=\"返程\"></a>返程</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180910_062945.jpg\" alt=\"返程\"></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180910_063356.jpg\" alt=\"返程\"></p>\n<h3 id=\"久石让同好群中群友拍摄\"><a href=\"#久石让同好群中群友拍摄\" class=\"headerlink\" title=\"久石让同好群中群友拍摄\"></a>久石让同好群中群友拍摄</h3><video id=\"video\" controls preload=\"none\" width=\"100%\">\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/B898A2B47A936E08D34EAB8984CD341E.mp4\" type=\"video/mp4\">\n</video>\n\n<video id=\"video\" controls preload=\"none\" width=\"100%\">\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/F6C92BC62415ACFB515F59675F721C3A.mp4\" type=\"video/mp4\">\n</video>\n","site":{"data":{}},"excerpt":"<h2 id=\"深圳之旅\"><a href=\"#深圳之旅\" class=\"headerlink\" title=\"深圳之旅\"></a>深圳之旅</h2><h3 id=\"济南遥墙机场安检中\"><a href=\"#济南遥墙机场安检中\" class=\"headerlink\" title=\"济南遥墙机场安检中\"></a>济南遥墙机场安检中</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180908_173437.jpg\" alt=\"安检\"></p>","more":"<h3 id=\"出发\"><a href=\"#出发\" class=\"headerlink\" title=\"出发\"></a>出发</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180908_185913.jpg\" alt=\"出发\"></p>\n<h3 id=\"春茧体育馆\"><a href=\"#春茧体育馆\" class=\"headerlink\" title=\"春茧体育馆\"></a>春茧体育馆</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_140508.jpg\" alt=\"春茧体育馆\"></p>\n<h3 id=\"送给久石让的花\"><a href=\"#送给久石让的花\" class=\"headerlink\" title=\"送给久石让的花\"></a>送给久石让的花</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_161748.jpg\" alt=\"送给久石让的花\"></p>\n<h3 id=\"非官方周边\"><a href=\"#非官方周边\" class=\"headerlink\" title=\"非官方周边\"></a>非官方周边</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_165110.jpg\" alt=\"非官方周边\"></p>\n<h3 id=\"非官方周边:徽章\"><a href=\"#非官方周边:徽章\" class=\"headerlink\" title=\"非官方周边:徽章\"></a>非官方周边:徽章</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_165235.jpg\" alt=\"非官方周边:徽章\"></p>\n<h3 id=\"意外收获:面基下限大佬的意外惊喜\"><a href=\"#意外收获:面基下限大佬的意外惊喜\" class=\"headerlink\" title=\"意外收获:面基下限大佬的意外惊喜\"></a>意外收获:面基下限大佬的意外惊喜</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_233413.jpg\" alt=\"意外收获\"></p>\n<h3 id=\"手册\"><a href=\"#手册\" class=\"headerlink\" title=\"手册\"></a>手册</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_192941.jpg\" alt=\"手册\"></p>\n<h3 id=\"渣像素1\"><a href=\"#渣像素1\" class=\"headerlink\" title=\"渣像素1\"></a>渣像素1</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_193037.jpg\" alt=\"渣渣像素1\"></p>\n<h3 id=\"渣像素2\"><a href=\"#渣像素2\" class=\"headerlink\" title=\"渣像素2\"></a>渣像素2</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_193041.jpg\" alt=\"渣渣像素2\"></p>\n<h3 id=\"渣像素3\"><a href=\"#渣像素3\" class=\"headerlink\" title=\"渣像素3\"></a>渣像素3</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_193043.jpg\" alt=\"渣渣像素3\"></p>\n<h3 id=\"渣像素4\"><a href=\"#渣像素4\" class=\"headerlink\" title=\"渣像素4\"></a>渣像素4</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_201025.jpg\" alt=\"渣渣像素4\"></p>\n<h3 id=\"渣像素5\"><a href=\"#渣像素5\" class=\"headerlink\" title=\"渣像素5\"></a>渣像素5</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180909_202211.jpg\" alt=\"渣渣像素5\"></p>\n<h3 id=\"返程\"><a href=\"#返程\" class=\"headerlink\" title=\"返程\"></a>返程</h3><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180910_062945.jpg\" alt=\"返程\"></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/IMG_20180910_063356.jpg\" alt=\"返程\"></p>\n<h3 id=\"久石让同好群中群友拍摄\"><a href=\"#久石让同好群中群友拍摄\" class=\"headerlink\" title=\"久石让同好群中群友拍摄\"></a>久石让同好群中群友拍摄</h3><video id=\"video\" controls preload=\"none\" width=\"100%\">\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/B898A2B47A936E08D34EAB8984CD341E.mp4\" type=\"video/mp4\">\n</video>\n\n<video id=\"video\" controls preload=\"none\" width=\"100%\">\n<source id=\"mp4\" src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/joehisaishi/F6C92BC62415ACFB515F59675F721C3A.mp4\" type=\"video/mp4\">\n</video>"},{"title":"maven安装jar到本地仓库后jenkins编译项目引用不到问题","date":"2019-10-19T05:30:31.000Z","_content":"\n\n\n#### 问题\n\n##### maven安装jar到本地仓库后jenkins编译项目报错\n\n##### 使用将jar安装到本地仓库的方法.\n\n安装jar到本地仓库命令\n\n```shell\n mvn install:install-file -DgroupId=com.taobao.api -DartifactId=taobao-sdk -Dversion=1.0 -Dpackaging=jar -Dfile=taobao-sdk-java-auto_1565853390086-20190917.jar\n```\n\n然后在`pom.xml`文件中引入\n\n```xml\n <dependency>\n <groupId>com.taobao.api</groupId>\n <artifactId>taobao-sdk</artifactId>\n <version>1.0</version>\n </dependency>\n```\n\n安装后还是无法引用到jar包.\n\n#### 原因\n\n因maven本地仓库的目录是在运行用户目录的`.m2/reopsitory`下,`settings.xml`文件中有说明.\n\n```xml\n <!-- localRepository\n | The path to the local repository maven will use to store artifacts.\n |\n | Default: ${user.home}/.m2/repository\n <localRepository>/path/to/local/repo</localRepository>\n -->\n```\n\n执行jar包安装的命令是在root用户下运行的,安装后jar包被安装到了`/root/.m2/repository`目录下.\n\njenkins是使用rpm文件进行的安装,安装后jenkins运行在自建的用户下.\n\n所以在jenkins的用户下引用不到安装后的jar包.\n\n#### 解决\n\n修改maven本地仓库的配置`settings.xml`\n\n在`<settings>`标签内新增\n\n```xml\n<!-- jenkins 用户的目录 -->\n<localRepository>/var/lib/jenkins/.m2/repository</localRepository>\n```\n\n再重新执行jar包安装命令后解决.","source":"_posts/jenkins-maven.md","raw":"---\ntitle: maven安装jar到本地仓库后jenkins编译项目引用不到问题\ndate: 2019-10-19 13:30:31\ntags: [jenkins,maven]\ncategories: [学习,jenkins,error]\n---\n\n\n\n#### 问题\n\n##### maven安装jar到本地仓库后jenkins编译项目报错\n\n##### 使用将jar安装到本地仓库的方法.\n\n安装jar到本地仓库命令\n\n```shell\n mvn install:install-file -DgroupId=com.taobao.api -DartifactId=taobao-sdk -Dversion=1.0 -Dpackaging=jar -Dfile=taobao-sdk-java-auto_1565853390086-20190917.jar\n```\n\n然后在`pom.xml`文件中引入\n\n```xml\n <dependency>\n <groupId>com.taobao.api</groupId>\n <artifactId>taobao-sdk</artifactId>\n <version>1.0</version>\n </dependency>\n```\n\n安装后还是无法引用到jar包.\n\n#### 原因\n\n因maven本地仓库的目录是在运行用户目录的`.m2/reopsitory`下,`settings.xml`文件中有说明.\n\n```xml\n <!-- localRepository\n | The path to the local repository maven will use to store artifacts.\n |\n | Default: ${user.home}/.m2/repository\n <localRepository>/path/to/local/repo</localRepository>\n -->\n```\n\n执行jar包安装的命令是在root用户下运行的,安装后jar包被安装到了`/root/.m2/repository`目录下.\n\njenkins是使用rpm文件进行的安装,安装后jenkins运行在自建的用户下.\n\n所以在jenkins的用户下引用不到安装后的jar包.\n\n#### 解决\n\n修改maven本地仓库的配置`settings.xml`\n\n在`<settings>`标签内新增\n\n```xml\n<!-- jenkins 用户的目录 -->\n<localRepository>/var/lib/jenkins/.m2/repository</localRepository>\n```\n\n再重新执行jar包安装命令后解决.","slug":"jenkins-maven","published":1,"updated":"2020-09-13T06:59:29.131Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h4000w58sy41ea02th","content":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><h5 id=\"maven安装jar到本地仓库后jenkins编译项目报错\"><a href=\"#maven安装jar到本地仓库后jenkins编译项目报错\" class=\"headerlink\" title=\"maven安装jar到本地仓库后jenkins编译项目报错\"></a>maven安装jar到本地仓库后jenkins编译项目报错</h5><h5 id=\"使用将jar安装到本地仓库的方法\"><a href=\"#使用将jar安装到本地仓库的方法\" class=\"headerlink\" title=\"使用将jar安装到本地仓库的方法.\"></a>使用将jar安装到本地仓库的方法.</h5><p>安装jar到本地仓库命令</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mvn install:install-file -DgroupId=com.taobao.api -DartifactId=taobao-sdk -Dversion=1.0 -Dpackaging=jar -Dfile=taobao-sdk-java-auto_1565853390086-20190917.jar</span><br></pre></td></tr></table></figure>\n\n<p>然后在<code>pom.xml</code>文件中引入</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.taobao.api<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>taobao-sdk<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>1.0<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<p>安装后还是无法引用到jar包.</p>\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>因maven本地仓库的目录是在运行用户目录的<code>.m2/reopsitory</code>下,<code>settings.xml</code>文件中有说明.</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"><!-- localRepository</span></span><br><span class=\"line\"><span class=\"comment\"> | The path to the local repository maven will use to store artifacts.</span></span><br><span class=\"line\"><span class=\"comment\"> |</span></span><br><span class=\"line\"><span class=\"comment\"> | Default: ${user.home}/.m2/repository</span></span><br><span class=\"line\"><span class=\"comment\"> <localRepository>/path/to/local/repo</localRepository></span></span><br><span class=\"line\"><span class=\"comment\"> --></span></span><br></pre></td></tr></table></figure>\n\n<p>执行jar包安装的命令是在root用户下运行的,安装后jar包被安装到了<code>/root/.m2/repository</code>目录下.</p>\n<p>jenkins是使用rpm文件进行的安装,安装后jenkins运行在自建的用户下.</p>\n<p>所以在jenkins的用户下引用不到安装后的jar包.</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>修改maven本地仓库的配置<code>settings.xml</code></p>\n<p>在<code><settings></code>标签内新增</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"><!-- jenkins 用户的目录 --></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">localRepository</span>></span>/var/lib/jenkins/.m2/repository<span class=\"tag\"></<span class=\"name\">localRepository</span>></span></span><br></pre></td></tr></table></figure>\n\n<p>再重新执行jar包安装命令后解决.</p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><h5 id=\"maven安装jar到本地仓库后jenkins编译项目报错\"><a href=\"#maven安装jar到本地仓库后jenkins编译项目报错\" class=\"headerlink\" title=\"maven安装jar到本地仓库后jenkins编译项目报错\"></a>maven安装jar到本地仓库后jenkins编译项目报错</h5><h5 id=\"使用将jar安装到本地仓库的方法\"><a href=\"#使用将jar安装到本地仓库的方法\" class=\"headerlink\" title=\"使用将jar安装到本地仓库的方法.\"></a>使用将jar安装到本地仓库的方法.</h5><p>安装jar到本地仓库命令</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mvn install:install-file -DgroupId=com.taobao.api -DartifactId=taobao-sdk -Dversion=1.0 -Dpackaging=jar -Dfile=taobao-sdk-java-auto_1565853390086-20190917.jar</span><br></pre></td></tr></table></figure>\n\n<p>然后在<code>pom.xml</code>文件中引入</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.taobao.api<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>taobao-sdk<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>1.0<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<p>安装后还是无法引用到jar包.</p>\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>因maven本地仓库的目录是在运行用户目录的<code>.m2/reopsitory</code>下,<code>settings.xml</code>文件中有说明.</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"><!-- localRepository</span></span><br><span class=\"line\"><span class=\"comment\"> | The path to the local repository maven will use to store artifacts.</span></span><br><span class=\"line\"><span class=\"comment\"> |</span></span><br><span class=\"line\"><span class=\"comment\"> | Default: ${user.home}/.m2/repository</span></span><br><span class=\"line\"><span class=\"comment\"> <localRepository>/path/to/local/repo</localRepository></span></span><br><span class=\"line\"><span class=\"comment\"> --></span></span><br></pre></td></tr></table></figure>\n\n<p>执行jar包安装的命令是在root用户下运行的,安装后jar包被安装到了<code>/root/.m2/repository</code>目录下.</p>\n<p>jenkins是使用rpm文件进行的安装,安装后jenkins运行在自建的用户下.</p>\n<p>所以在jenkins的用户下引用不到安装后的jar包.</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>修改maven本地仓库的配置<code>settings.xml</code></p>\n<p>在<code><settings></code>标签内新增</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"><!-- jenkins 用户的目录 --></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">localRepository</span>></span>/var/lib/jenkins/.m2/repository<span class=\"tag\"></<span class=\"name\">localRepository</span>></span></span><br></pre></td></tr></table></figure>\n\n<p>再重新执行jar包安装命令后解决.</p>\n"},{"title":"Nacos+Seata+Spring boot+Mybatis plus多数据源事务控制","date":"2019-12-12T01:42:16.000Z","_content":"\n### 问题\n\n使用Mybatis plus多数据源无法控制事务.\n\n### 解决\n\n使用Nacos为配置中心,Seata分布式事务管理.\n\n#### Nacos配置\n\n单机模式下运行Nacos\n\n> Linux/Unix/Mac\n>\n> Standalone means it is non-cluster Mode. * sh startup.sh -m standalone\n\n> Windows\n>\n> cmd startup.cmd 或者双击 startup.cmd 文件\n\n 使用mysql\n\n1.安装数据库,版本要求:5.6.5+\n\n2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql\n\n3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。\n\n`conf\\application.properties`\n\n```properties\nspring.datasource.platform=mysql\ndb.num=1\ndb.url.0=jdbc:mysql://****:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true\ndb.user=****\ndb.password=****\n```\n\n#### Nacos项目中的配置\n\n`pom.xml`\n\n```xml\n <dependency>\n <groupId>com.alibaba.boot</groupId>\n <artifactId>nacos-config-spring-boot-starter</artifactId>\n <version>${nacos-config-spring-boot.version}</version>\n </dependency>\n <dependency>\n <groupId>com.alibaba.boot</groupId>\n <artifactId>nacos-discovery-spring-boot-starter</artifactId>\n <version>${nacos-config-spring-boot.version}</version>\n </dependency>\n```\n\n\n\n`application.yml`\n\n```yaml\nnacos:\n discovery:\n server-addr: 127.0.0.1:8848 #根据实际情况配置\n config:\n server-addr: 127.0.0.1:8848\n```\n\n\n\n#### Seata配置\n\n建表\n\n全局事务会话信息由3块内容构成,全局事务-->分支事务-->全局锁,对应表global_table、branch_table、lock_table,\n\nmysql建表脚本存放于module seata-server-->conf-->db_store.sql\n\n修改store.mode\n\n打开seata-server-->conf-->file.conf,修改store.mode=\"db\";也可以在启动时加命令参数-m db指定。\n\n```properties\n## transaction log store\nstore {\n ## store mode: file、db\n mode = \"db\" #修改为db\n\n ## file store\n file {\n dir = \"sessionStore\"\n # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions\n max-branch-session-size = 16384\n # globe session size , if exceeded throws exceptions\n max-global-session-size = 512\n # file buffer size , if exceeded allocate new buffer\n file-write-buffer-cache-size = 16384\n # when recover batch read size\n session.reload.read_size = 100\n # async, sync\n flush-disk-mode = async\n }\n\n ## database store\n db {\n ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.\n datasource = \"dbcp\"\n ## mysql/oracle/h2/oceanbase etc.\n db-type = \"mysql\" #修改为mysql\n driver-class-name = \"com.mysql.jdbc.Driver\"\n url = \"jdbc:mysql://******:3306/seata\" #配置数据库地址\n user = \"****\"\t\t\t\t\t\t\t#用户名\n password = \"******\"\t\t\t\t\t\t#密码\n min-conn = 1\n max-conn = 3\n global.table = \"global_table\"\n branch.table = \"branch_table\"\n lock-table = \"lock_table\"\n query-limit = 100\n }\n}\n```\n\n\n\n提交配置到nacos\n\n运行`conf/nacos-config.sh`将`nacos-config.txt`的内容发送到nacos中\n\n```properties\ntransport.type=TCP\ntransport.server=NIO\ntransport.heartbeat=true\ntransport.thread-factory.boss-thread-prefix=NettyBoss\ntransport.thread-factory.worker-thread-prefix=NettyServerNIOWorker\ntransport.thread-factory.server-executor-thread-prefix=NettyServerBizHandler\ntransport.thread-factory.share-boss-worker=false\ntransport.thread-factory.client-selector-thread-prefix=NettyClientSelector\ntransport.thread-factory.client-selector-thread-size=1\ntransport.thread-factory.client-worker-thread-prefix=NettyClientWorkerThread\ntransport.thread-factory.boss-thread-size=1\ntransport.thread-factory.worker-thread-size=8\ntransport.shutdown.wait=3\nservice.vgroup_mapping.my_test_tx_groyp=default #分组\nservice.enableDegrade=false\nservice.disable=false\nservice.max.commit.retry.timeout=-1\nservice.max.rollback.retry.timeout=-1\nclient.async.commit.buffer.limit=10000\nclient.lock.retry.internal=10\nclient.lock.retry.times=30\nstore.mode=db\nstore.file.dir=file_store/data\nstore.file.max-branch-session-size=16384\nstore.file.max-global-session-size=512\nstore.file.file-write-buffer-cache-size=16384\nstore.file.flush-disk-mode=async\nstore.file.session.reload.read_size=100\nstore.db.driver-class-name=com.mysql.jdbc.Driver\nstore.db.datasource=dbcp\nstore.db.db-type=mysql\nstore.db.url=jdbc:mysql://*********:3306/seata?useUnicode=true #数据库地址\nstore.db.user=******** #用户名\nstore.db.password=******** #密码\nstore.db.min-conn=1\nstore.db.max-conn=3\nstore.db.global.table=global_table\nstore.db.branch.table=branch_table\nstore.db.query-limit=100\nstore.db.lock-table=lock_table\nrecovery.committing-retry-period=1000\nrecovery.asyn-committing-retry-period=1000\nrecovery.rollbacking-retry-period=1000\nrecovery.timeout-retry-period=1000\ntransaction.undo.data.validation=true\ntransaction.undo.log.serialization=jackson\ntransaction.undo.log.save.days=7\ntransaction.undo.log.delete.period=86400000\ntransaction.undo.log.table=undo_log\ntransport.serialization=seata\ntransport.compressor=none\nmetrics.enabled=false\nmetrics.registry-type=compact\nmetrics.exporter-list=prometheus\nmetrics.exporter-prometheus-port=9898\n```\n\n\n\n启动\n\n- 源码启动: 执行Server.java的main方法\n- 命令启动: [seata-server.sh](http://seata-server.sh/) -h 127.0.0.1 -p 8091 -m db -n 1 -DSEATA_ENV=test\n\n```sh\n -h: 注册到注册中心的ip\n -p: Server rpc 监听端口\n -m: 全局事务会话信息存储模式,file、db,优先读取启动参数\n -n: Server node,多个Server时,需区分各自节点,用于生成不同的transactionId范围,以免冲突\n SEATA_ENV: 多环境配置参考 https://github.com/seata/seata/wiki/Multi-configuration-Isolation\n```\n\n\n\n#### Seata项目中的配置\n\n`pom.xml`\n\n```xml\n\t\t<dependency>\n <groupId>io.seata</groupId>\n <artifactId>seata-spring</artifactId>\n <version>${seata.version}</version>\n </dependency>\n <dependency>\n <groupId>io.seata</groupId>\n <artifactId>seata-all</artifactId>\n <version>${seata.version}</version>\n </dependency>\n <!-- seata 依赖jar包 -->\n\t\t<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-actuator</artifactId>\n </dependency>\n <dependency>\n <groupId>com.alibaba</groupId>\n <artifactId>druid-spring-boot-starter</artifactId>\n <version>${druid.version}</version>\n </dependency>\n <dependency>\n <groupId>com.google.protobuf</groupId>\n <artifactId>protobuf-java</artifactId>\n <version>${protobuf.version}</version>\n </dependency>\n <dependency>\n <groupId>io.netty</groupId>\n <artifactId>netty-all</artifactId>\n <version>${netty4.version}</version>\n </dependency>\n <dependencyManagement>\n <dependencies>\n <dependency>\n <groupId>com.alibaba.cloud</groupId>\n <artifactId>spring-cloud-alibaba-dependencies</artifactId>\n <version>2.1.0.RELEASE</version>\n <scope>import</scope>\n <type>pom</type>\n </dependency>\n </dependencies>\n </dependencyManagement>\n```\n\n\n\n`resource/registry.conf`对应nacos的IP端口\n\n```\nregistry {\n # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa\n type = \"nacos\"\n nacos {\n serverAddr = \"localhost\"\n namespace = \"public\"\n cluster = \"default\"\n }\n}\nconfig {\n # file、nacos 、apollo、zk\n type = \"nacos\"\n nacos {\n serverAddr = \"localhost\"\n namespace = \"public\"\n cluster = \"default\"\n }\n}\n```\n\n`application.yml`\n\n```yml\n spring:\n cloud:\n alibaba:\n seata:\n tx-service-group: my_test_tx_group\n```\n\n\n\n##### 参考地址:\n\n[https://nacos.io/zh-cn/docs/deployment.html](https://nacos.io/zh-cn/docs/deployment.html)\n\n[https://seata.io/zh-cn/](https://seata.io/zh-cn/)\n\n[https://seata.io/zh-cn/docs/user/configurations.html](https://seata.io/zh-cn/docs/user/configurations.html)\n\n[https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata](https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata)\n\n[https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus](https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus)\n\n[http://seata.io/zh-cn/blog/seata-nacos-analysis.html](http://seata.io/zh-cn/blog/seata-nacos-analysis.html)\n\n[http://seata.io/zh-cn/docs/user/configurations.html](http://seata.io/zh-cn/docs/user/configurations.html)","source":"_posts/springboot-seate-multiple-datasource-mybatis-plus.md","raw":"---\ntitle: Nacos+Seata+Spring boot+Mybatis plus多数据源事务控制\ndate: 2019-12-12 09:42:16\ntags: [seata,spring boot,mybatis plus,多数据源,事务,nacos]\ncategories: [学习,java,事务]\n---\n\n### 问题\n\n使用Mybatis plus多数据源无法控制事务.\n\n### 解决\n\n使用Nacos为配置中心,Seata分布式事务管理.\n\n#### Nacos配置\n\n单机模式下运行Nacos\n\n> Linux/Unix/Mac\n>\n> Standalone means it is non-cluster Mode. * sh startup.sh -m standalone\n\n> Windows\n>\n> cmd startup.cmd 或者双击 startup.cmd 文件\n\n 使用mysql\n\n1.安装数据库,版本要求:5.6.5+\n\n2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql\n\n3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。\n\n`conf\\application.properties`\n\n```properties\nspring.datasource.platform=mysql\ndb.num=1\ndb.url.0=jdbc:mysql://****:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true\ndb.user=****\ndb.password=****\n```\n\n#### Nacos项目中的配置\n\n`pom.xml`\n\n```xml\n <dependency>\n <groupId>com.alibaba.boot</groupId>\n <artifactId>nacos-config-spring-boot-starter</artifactId>\n <version>${nacos-config-spring-boot.version}</version>\n </dependency>\n <dependency>\n <groupId>com.alibaba.boot</groupId>\n <artifactId>nacos-discovery-spring-boot-starter</artifactId>\n <version>${nacos-config-spring-boot.version}</version>\n </dependency>\n```\n\n\n\n`application.yml`\n\n```yaml\nnacos:\n discovery:\n server-addr: 127.0.0.1:8848 #根据实际情况配置\n config:\n server-addr: 127.0.0.1:8848\n```\n\n\n\n#### Seata配置\n\n建表\n\n全局事务会话信息由3块内容构成,全局事务-->分支事务-->全局锁,对应表global_table、branch_table、lock_table,\n\nmysql建表脚本存放于module seata-server-->conf-->db_store.sql\n\n修改store.mode\n\n打开seata-server-->conf-->file.conf,修改store.mode=\"db\";也可以在启动时加命令参数-m db指定。\n\n```properties\n## transaction log store\nstore {\n ## store mode: file、db\n mode = \"db\" #修改为db\n\n ## file store\n file {\n dir = \"sessionStore\"\n # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions\n max-branch-session-size = 16384\n # globe session size , if exceeded throws exceptions\n max-global-session-size = 512\n # file buffer size , if exceeded allocate new buffer\n file-write-buffer-cache-size = 16384\n # when recover batch read size\n session.reload.read_size = 100\n # async, sync\n flush-disk-mode = async\n }\n\n ## database store\n db {\n ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.\n datasource = \"dbcp\"\n ## mysql/oracle/h2/oceanbase etc.\n db-type = \"mysql\" #修改为mysql\n driver-class-name = \"com.mysql.jdbc.Driver\"\n url = \"jdbc:mysql://******:3306/seata\" #配置数据库地址\n user = \"****\"\t\t\t\t\t\t\t#用户名\n password = \"******\"\t\t\t\t\t\t#密码\n min-conn = 1\n max-conn = 3\n global.table = \"global_table\"\n branch.table = \"branch_table\"\n lock-table = \"lock_table\"\n query-limit = 100\n }\n}\n```\n\n\n\n提交配置到nacos\n\n运行`conf/nacos-config.sh`将`nacos-config.txt`的内容发送到nacos中\n\n```properties\ntransport.type=TCP\ntransport.server=NIO\ntransport.heartbeat=true\ntransport.thread-factory.boss-thread-prefix=NettyBoss\ntransport.thread-factory.worker-thread-prefix=NettyServerNIOWorker\ntransport.thread-factory.server-executor-thread-prefix=NettyServerBizHandler\ntransport.thread-factory.share-boss-worker=false\ntransport.thread-factory.client-selector-thread-prefix=NettyClientSelector\ntransport.thread-factory.client-selector-thread-size=1\ntransport.thread-factory.client-worker-thread-prefix=NettyClientWorkerThread\ntransport.thread-factory.boss-thread-size=1\ntransport.thread-factory.worker-thread-size=8\ntransport.shutdown.wait=3\nservice.vgroup_mapping.my_test_tx_groyp=default #分组\nservice.enableDegrade=false\nservice.disable=false\nservice.max.commit.retry.timeout=-1\nservice.max.rollback.retry.timeout=-1\nclient.async.commit.buffer.limit=10000\nclient.lock.retry.internal=10\nclient.lock.retry.times=30\nstore.mode=db\nstore.file.dir=file_store/data\nstore.file.max-branch-session-size=16384\nstore.file.max-global-session-size=512\nstore.file.file-write-buffer-cache-size=16384\nstore.file.flush-disk-mode=async\nstore.file.session.reload.read_size=100\nstore.db.driver-class-name=com.mysql.jdbc.Driver\nstore.db.datasource=dbcp\nstore.db.db-type=mysql\nstore.db.url=jdbc:mysql://*********:3306/seata?useUnicode=true #数据库地址\nstore.db.user=******** #用户名\nstore.db.password=******** #密码\nstore.db.min-conn=1\nstore.db.max-conn=3\nstore.db.global.table=global_table\nstore.db.branch.table=branch_table\nstore.db.query-limit=100\nstore.db.lock-table=lock_table\nrecovery.committing-retry-period=1000\nrecovery.asyn-committing-retry-period=1000\nrecovery.rollbacking-retry-period=1000\nrecovery.timeout-retry-period=1000\ntransaction.undo.data.validation=true\ntransaction.undo.log.serialization=jackson\ntransaction.undo.log.save.days=7\ntransaction.undo.log.delete.period=86400000\ntransaction.undo.log.table=undo_log\ntransport.serialization=seata\ntransport.compressor=none\nmetrics.enabled=false\nmetrics.registry-type=compact\nmetrics.exporter-list=prometheus\nmetrics.exporter-prometheus-port=9898\n```\n\n\n\n启动\n\n- 源码启动: 执行Server.java的main方法\n- 命令启动: [seata-server.sh](http://seata-server.sh/) -h 127.0.0.1 -p 8091 -m db -n 1 -DSEATA_ENV=test\n\n```sh\n -h: 注册到注册中心的ip\n -p: Server rpc 监听端口\n -m: 全局事务会话信息存储模式,file、db,优先读取启动参数\n -n: Server node,多个Server时,需区分各自节点,用于生成不同的transactionId范围,以免冲突\n SEATA_ENV: 多环境配置参考 https://github.com/seata/seata/wiki/Multi-configuration-Isolation\n```\n\n\n\n#### Seata项目中的配置\n\n`pom.xml`\n\n```xml\n\t\t<dependency>\n <groupId>io.seata</groupId>\n <artifactId>seata-spring</artifactId>\n <version>${seata.version}</version>\n </dependency>\n <dependency>\n <groupId>io.seata</groupId>\n <artifactId>seata-all</artifactId>\n <version>${seata.version}</version>\n </dependency>\n <!-- seata 依赖jar包 -->\n\t\t<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-actuator</artifactId>\n </dependency>\n <dependency>\n <groupId>com.alibaba</groupId>\n <artifactId>druid-spring-boot-starter</artifactId>\n <version>${druid.version}</version>\n </dependency>\n <dependency>\n <groupId>com.google.protobuf</groupId>\n <artifactId>protobuf-java</artifactId>\n <version>${protobuf.version}</version>\n </dependency>\n <dependency>\n <groupId>io.netty</groupId>\n <artifactId>netty-all</artifactId>\n <version>${netty4.version}</version>\n </dependency>\n <dependencyManagement>\n <dependencies>\n <dependency>\n <groupId>com.alibaba.cloud</groupId>\n <artifactId>spring-cloud-alibaba-dependencies</artifactId>\n <version>2.1.0.RELEASE</version>\n <scope>import</scope>\n <type>pom</type>\n </dependency>\n </dependencies>\n </dependencyManagement>\n```\n\n\n\n`resource/registry.conf`对应nacos的IP端口\n\n```\nregistry {\n # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa\n type = \"nacos\"\n nacos {\n serverAddr = \"localhost\"\n namespace = \"public\"\n cluster = \"default\"\n }\n}\nconfig {\n # file、nacos 、apollo、zk\n type = \"nacos\"\n nacos {\n serverAddr = \"localhost\"\n namespace = \"public\"\n cluster = \"default\"\n }\n}\n```\n\n`application.yml`\n\n```yml\n spring:\n cloud:\n alibaba:\n seata:\n tx-service-group: my_test_tx_group\n```\n\n\n\n##### 参考地址:\n\n[https://nacos.io/zh-cn/docs/deployment.html](https://nacos.io/zh-cn/docs/deployment.html)\n\n[https://seata.io/zh-cn/](https://seata.io/zh-cn/)\n\n[https://seata.io/zh-cn/docs/user/configurations.html](https://seata.io/zh-cn/docs/user/configurations.html)\n\n[https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata](https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata)\n\n[https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus](https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus)\n\n[http://seata.io/zh-cn/blog/seata-nacos-analysis.html](http://seata.io/zh-cn/blog/seata-nacos-analysis.html)\n\n[http://seata.io/zh-cn/docs/user/configurations.html](http://seata.io/zh-cn/docs/user/configurations.html)","slug":"springboot-seate-multiple-datasource-mybatis-plus","published":1,"updated":"2020-09-13T06:59:00.992Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h5000z58sytseqbcvk","content":"<h3 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h3><p>使用Mybatis plus多数据源无法控制事务.</p>\n<h3 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h3><p>使用Nacos为配置中心,Seata分布式事务管理.</p>\n<h4 id=\"Nacos配置\"><a href=\"#Nacos配置\" class=\"headerlink\" title=\"Nacos配置\"></a>Nacos配置</h4><p>单机模式下运行Nacos</p>\n<blockquote>\n<p>Linux/Unix/Mac</p>\n<p>Standalone means it is non-cluster Mode. * sh startup.sh -m standalone</p>\n</blockquote>\n<blockquote>\n<p>Windows</p>\n<p>cmd startup.cmd 或者双击 startup.cmd 文件</p>\n</blockquote>\n<p> 使用mysql</p>\n<p>1.安装数据库,版本要求:5.6.5+</p>\n<p>2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql</p>\n<p>3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。</p>\n<p><code>conf\\application.properties</code></p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">spring.datasource.platform=mysql</span><br><span class=\"line\">db.num=1</span><br><span class=\"line\">db.url.0=jdbc:mysql://****:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true</span><br><span class=\"line\">db.user=****</span><br><span class=\"line\">db.password=****</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"Nacos项目中的配置\"><a href=\"#Nacos项目中的配置\" class=\"headerlink\" title=\"Nacos项目中的配置\"></a>Nacos项目中的配置</h4><p><code>pom.xml</code></p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>nacos-config-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${nacos-config-spring-boot.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>nacos-discovery-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${nacos-config-spring-boot.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<p><code>application.yml</code></p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">nacos:</span></span><br><span class=\"line\"> <span class=\"attr\">discovery:</span></span><br><span class=\"line\"> <span class=\"attr\">server-addr:</span> <span class=\"number\">127.0</span><span class=\"number\">.0</span><span class=\"number\">.1</span><span class=\"string\">:8848</span> <span class=\"comment\">#根据实际情况配置</span></span><br><span class=\"line\"> <span class=\"attr\">config:</span></span><br><span class=\"line\"> <span class=\"attr\">server-addr:</span> <span class=\"number\">127.0</span><span class=\"number\">.0</span><span class=\"number\">.1</span><span class=\"string\">:8848</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"Seata配置\"><a href=\"#Seata配置\" class=\"headerlink\" title=\"Seata配置\"></a>Seata配置</h4><p>建表</p>\n<p>全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table,</p>\n<p>mysql建表脚本存放于module seata-server–>conf–>db_store.sql</p>\n<p>修改store.mode</p>\n<p>打开seata-server–>conf–>file.conf,修改store.mode=”db”;也可以在启动时加命令参数-m db指定。</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">## transaction log store</span><br><span class=\"line\">store {</span><br><span class=\"line\"> ## store mode: file、db</span><br><span class=\"line\"> mode = "db" #修改为db</span><br><span class=\"line\"></span><br><span class=\"line\"> ## file store</span><br><span class=\"line\"> file {</span><br><span class=\"line\"> dir = "sessionStore"</span><br><span class=\"line\"> # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions</span><br><span class=\"line\"> max-branch-session-size = 16384</span><br><span class=\"line\"> # globe session size , if exceeded throws exceptions</span><br><span class=\"line\"> max-global-session-size = 512</span><br><span class=\"line\"> # file buffer size , if exceeded allocate new buffer</span><br><span class=\"line\"> file-write-buffer-cache-size = 16384</span><br><span class=\"line\"> # when recover batch read size</span><br><span class=\"line\"> session.reload.read_size = 100</span><br><span class=\"line\"> # async, sync</span><br><span class=\"line\"> flush-disk-mode = async</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> ## database store</span><br><span class=\"line\"> db {</span><br><span class=\"line\"> ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.</span><br><span class=\"line\"> datasource = "dbcp"</span><br><span class=\"line\"> ## mysql/oracle/h2/oceanbase etc.</span><br><span class=\"line\"> db-type = "mysql" #修改为mysql</span><br><span class=\"line\"> driver-class-name = "com.mysql.jdbc.Driver"</span><br><span class=\"line\"> url = "jdbc:mysql://******:3306/seata" #配置数据库地址</span><br><span class=\"line\"> user = "****"\t\t\t\t\t\t\t#用户名</span><br><span class=\"line\"> password = "******"\t\t\t\t\t\t#密码</span><br><span class=\"line\"> min-conn = 1</span><br><span class=\"line\"> max-conn = 3</span><br><span class=\"line\"> global.table = "global_table"</span><br><span class=\"line\"> branch.table = "branch_table"</span><br><span class=\"line\"> lock-table = "lock_table"</span><br><span class=\"line\"> query-limit = 100</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>提交配置到nacos</p>\n<p>运行<code>conf/nacos-config.sh</code>将<code>nacos-config.txt</code>的内容发送到nacos中</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">transport.type=TCP</span><br><span class=\"line\">transport.server=NIO</span><br><span class=\"line\">transport.heartbeat=true</span><br><span class=\"line\">transport.thread-factory.boss-thread-prefix=NettyBoss</span><br><span class=\"line\">transport.thread-factory.worker-thread-prefix=NettyServerNIOWorker</span><br><span class=\"line\">transport.thread-factory.server-executor-thread-prefix=NettyServerBizHandler</span><br><span class=\"line\">transport.thread-factory.share-boss-worker=false</span><br><span class=\"line\">transport.thread-factory.client-selector-thread-prefix=NettyClientSelector</span><br><span class=\"line\">transport.thread-factory.client-selector-thread-size=1</span><br><span class=\"line\">transport.thread-factory.client-worker-thread-prefix=NettyClientWorkerThread</span><br><span class=\"line\">transport.thread-factory.boss-thread-size=1</span><br><span class=\"line\">transport.thread-factory.worker-thread-size=8</span><br><span class=\"line\">transport.shutdown.wait=3</span><br><span class=\"line\">service.vgroup_mapping.my_test_tx_groyp=default #分组</span><br><span class=\"line\">service.enableDegrade=false</span><br><span class=\"line\">service.disable=false</span><br><span class=\"line\">service.max.commit.retry.timeout=-1</span><br><span class=\"line\">service.max.rollback.retry.timeout=-1</span><br><span class=\"line\">client.async.commit.buffer.limit=10000</span><br><span class=\"line\">client.lock.retry.internal=10</span><br><span class=\"line\">client.lock.retry.times=30</span><br><span class=\"line\">store.mode=db</span><br><span class=\"line\">store.file.dir=file_store/data</span><br><span class=\"line\">store.file.max-branch-session-size=16384</span><br><span class=\"line\">store.file.max-global-session-size=512</span><br><span class=\"line\">store.file.file-write-buffer-cache-size=16384</span><br><span class=\"line\">store.file.flush-disk-mode=async</span><br><span class=\"line\">store.file.session.reload.read_size=100</span><br><span class=\"line\">store.db.driver-class-name=com.mysql.jdbc.Driver</span><br><span class=\"line\">store.db.datasource=dbcp</span><br><span class=\"line\">store.db.db-type=mysql</span><br><span class=\"line\">store.db.url=jdbc:mysql://*********:3306/seata?useUnicode=true #数据库地址</span><br><span class=\"line\">store.db.user=******** #用户名</span><br><span class=\"line\">store.db.password=******** #密码</span><br><span class=\"line\">store.db.min-conn=1</span><br><span class=\"line\">store.db.max-conn=3</span><br><span class=\"line\">store.db.global.table=global_table</span><br><span class=\"line\">store.db.branch.table=branch_table</span><br><span class=\"line\">store.db.query-limit=100</span><br><span class=\"line\">store.db.lock-table=lock_table</span><br><span class=\"line\">recovery.committing-retry-period=1000</span><br><span class=\"line\">recovery.asyn-committing-retry-period=1000</span><br><span class=\"line\">recovery.rollbacking-retry-period=1000</span><br><span class=\"line\">recovery.timeout-retry-period=1000</span><br><span class=\"line\">transaction.undo.data.validation=true</span><br><span class=\"line\">transaction.undo.log.serialization=jackson</span><br><span class=\"line\">transaction.undo.log.save.days=7</span><br><span class=\"line\">transaction.undo.log.delete.period=86400000</span><br><span class=\"line\">transaction.undo.log.table=undo_log</span><br><span class=\"line\">transport.serialization=seata</span><br><span class=\"line\">transport.compressor=none</span><br><span class=\"line\">metrics.enabled=false</span><br><span class=\"line\">metrics.registry-type=compact</span><br><span class=\"line\">metrics.exporter-list=prometheus</span><br><span class=\"line\">metrics.exporter-prometheus-port=9898</span><br></pre></td></tr></table></figure>\n\n<p>启动</p>\n<ul>\n<li>源码启动: 执行Server.java的main方法</li>\n<li>命令启动: <a href=\"http://seata-server.sh/\" target=\"_blank\" rel=\"noopener\">seata-server.sh</a> -h 127.0.0.1 -p 8091 -m db -n 1 -DSEATA_ENV=test</li>\n</ul>\n<figure class=\"highlight sh\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">-h: 注册到注册中心的ip</span><br><span class=\"line\">-p: Server rpc 监听端口</span><br><span class=\"line\">-m: 全局事务会话信息存储模式,file、db,优先读取启动参数</span><br><span class=\"line\">-n: Server node,多个Server时,需区分各自节点,用于生成不同的transactionId范围,以免冲突</span><br><span class=\"line\">SEATA_ENV: 多环境配置参考 https://github.com/seata/seata/wiki/Multi-configuration-Isolation</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"Seata项目中的配置\"><a href=\"#Seata项目中的配置\" class=\"headerlink\" title=\"Seata项目中的配置\"></a>Seata项目中的配置</h4><p><code>pom.xml</code></p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.seata<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>seata-spring<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${seata.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.seata<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>seata-all<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${seata.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- seata 依赖jar包 --></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>org.springframework.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>spring-boot-starter-actuator<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>druid-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${druid.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.google.protobuf<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>protobuf-java<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${protobuf.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.netty<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>netty-all<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${netty4.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependencyManagement</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependencies</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba.cloud<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>spring-cloud-alibaba-dependencies<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>2.1.0.RELEASE<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">scope</span>></span>import<span class=\"tag\"></<span class=\"name\">scope</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">type</span>></span>pom<span class=\"tag\"></<span class=\"name\">type</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependencies</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependencyManagement</span>></span></span><br></pre></td></tr></table></figure>\n\n<p><code>resource/registry.conf</code>对应nacos的IP端口</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">registry {</span><br><span class=\"line\"> # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa</span><br><span class=\"line\"> type = "nacos"</span><br><span class=\"line\"> nacos {</span><br><span class=\"line\"> serverAddr = "localhost"</span><br><span class=\"line\"> namespace = "public"</span><br><span class=\"line\"> cluster = "default"</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\">config {</span><br><span class=\"line\"> # file、nacos 、apollo、zk</span><br><span class=\"line\"> type = "nacos"</span><br><span class=\"line\"> nacos {</span><br><span class=\"line\"> serverAddr = "localhost"</span><br><span class=\"line\"> namespace = "public"</span><br><span class=\"line\"> cluster = "default"</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p><code>application.yml</code></p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">spring:</span></span><br><span class=\"line\"> <span class=\"attr\">cloud:</span></span><br><span class=\"line\"> <span class=\"attr\">alibaba:</span></span><br><span class=\"line\"> <span class=\"attr\">seata:</span></span><br><span class=\"line\"> <span class=\"attr\">tx-service-group:</span> <span class=\"string\">my_test_tx_group</span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"参考地址:\"><a href=\"#参考地址:\" class=\"headerlink\" title=\"参考地址:\"></a>参考地址:</h5><p><a href=\"https://nacos.io/zh-cn/docs/deployment.html\" target=\"_blank\" rel=\"noopener\">https://nacos.io/zh-cn/docs/deployment.html</a></p>\n<p><a href=\"https://seata.io/zh-cn/\" target=\"_blank\" rel=\"noopener\">https://seata.io/zh-cn/</a></p>\n<p><a href=\"https://seata.io/zh-cn/docs/user/configurations.html\" target=\"_blank\" rel=\"noopener\">https://seata.io/zh-cn/docs/user/configurations.html</a></p>\n<p><a href=\"https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata\" target=\"_blank\" rel=\"noopener\">https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata</a></p>\n<p><a href=\"https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus\" target=\"_blank\" rel=\"noopener\">https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus</a></p>\n<p><a href=\"http://seata.io/zh-cn/blog/seata-nacos-analysis.html\" target=\"_blank\" rel=\"noopener\">http://seata.io/zh-cn/blog/seata-nacos-analysis.html</a></p>\n<p><a href=\"http://seata.io/zh-cn/docs/user/configurations.html\" target=\"_blank\" rel=\"noopener\">http://seata.io/zh-cn/docs/user/configurations.html</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h3><p>使用Mybatis plus多数据源无法控制事务.</p>\n<h3 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h3><p>使用Nacos为配置中心,Seata分布式事务管理.</p>\n<h4 id=\"Nacos配置\"><a href=\"#Nacos配置\" class=\"headerlink\" title=\"Nacos配置\"></a>Nacos配置</h4><p>单机模式下运行Nacos</p>\n<blockquote>\n<p>Linux/Unix/Mac</p>\n<p>Standalone means it is non-cluster Mode. * sh startup.sh -m standalone</p>\n</blockquote>\n<blockquote>\n<p>Windows</p>\n<p>cmd startup.cmd 或者双击 startup.cmd 文件</p>\n</blockquote>\n<p> 使用mysql</p>\n<p>1.安装数据库,版本要求:5.6.5+</p>\n<p>2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql</p>\n<p>3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。</p>\n<p><code>conf\\application.properties</code></p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">spring.datasource.platform=mysql</span><br><span class=\"line\">db.num=1</span><br><span class=\"line\">db.url.0=jdbc:mysql://****:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true</span><br><span class=\"line\">db.user=****</span><br><span class=\"line\">db.password=****</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"Nacos项目中的配置\"><a href=\"#Nacos项目中的配置\" class=\"headerlink\" title=\"Nacos项目中的配置\"></a>Nacos项目中的配置</h4><p><code>pom.xml</code></p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>nacos-config-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${nacos-config-spring-boot.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>nacos-discovery-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${nacos-config-spring-boot.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<p><code>application.yml</code></p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">nacos:</span></span><br><span class=\"line\"> <span class=\"attr\">discovery:</span></span><br><span class=\"line\"> <span class=\"attr\">server-addr:</span> <span class=\"number\">127.0</span><span class=\"number\">.0</span><span class=\"number\">.1</span><span class=\"string\">:8848</span> <span class=\"comment\">#根据实际情况配置</span></span><br><span class=\"line\"> <span class=\"attr\">config:</span></span><br><span class=\"line\"> <span class=\"attr\">server-addr:</span> <span class=\"number\">127.0</span><span class=\"number\">.0</span><span class=\"number\">.1</span><span class=\"string\">:8848</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"Seata配置\"><a href=\"#Seata配置\" class=\"headerlink\" title=\"Seata配置\"></a>Seata配置</h4><p>建表</p>\n<p>全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table,</p>\n<p>mysql建表脚本存放于module seata-server–>conf–>db_store.sql</p>\n<p>修改store.mode</p>\n<p>打开seata-server–>conf–>file.conf,修改store.mode=”db”;也可以在启动时加命令参数-m db指定。</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">## transaction log store</span><br><span class=\"line\">store {</span><br><span class=\"line\"> ## store mode: file、db</span><br><span class=\"line\"> mode = "db" #修改为db</span><br><span class=\"line\"></span><br><span class=\"line\"> ## file store</span><br><span class=\"line\"> file {</span><br><span class=\"line\"> dir = "sessionStore"</span><br><span class=\"line\"> # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions</span><br><span class=\"line\"> max-branch-session-size = 16384</span><br><span class=\"line\"> # globe session size , if exceeded throws exceptions</span><br><span class=\"line\"> max-global-session-size = 512</span><br><span class=\"line\"> # file buffer size , if exceeded allocate new buffer</span><br><span class=\"line\"> file-write-buffer-cache-size = 16384</span><br><span class=\"line\"> # when recover batch read size</span><br><span class=\"line\"> session.reload.read_size = 100</span><br><span class=\"line\"> # async, sync</span><br><span class=\"line\"> flush-disk-mode = async</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> ## database store</span><br><span class=\"line\"> db {</span><br><span class=\"line\"> ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.</span><br><span class=\"line\"> datasource = "dbcp"</span><br><span class=\"line\"> ## mysql/oracle/h2/oceanbase etc.</span><br><span class=\"line\"> db-type = "mysql" #修改为mysql</span><br><span class=\"line\"> driver-class-name = "com.mysql.jdbc.Driver"</span><br><span class=\"line\"> url = "jdbc:mysql://******:3306/seata" #配置数据库地址</span><br><span class=\"line\"> user = "****"\t\t\t\t\t\t\t#用户名</span><br><span class=\"line\"> password = "******"\t\t\t\t\t\t#密码</span><br><span class=\"line\"> min-conn = 1</span><br><span class=\"line\"> max-conn = 3</span><br><span class=\"line\"> global.table = "global_table"</span><br><span class=\"line\"> branch.table = "branch_table"</span><br><span class=\"line\"> lock-table = "lock_table"</span><br><span class=\"line\"> query-limit = 100</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>提交配置到nacos</p>\n<p>运行<code>conf/nacos-config.sh</code>将<code>nacos-config.txt</code>的内容发送到nacos中</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">transport.type=TCP</span><br><span class=\"line\">transport.server=NIO</span><br><span class=\"line\">transport.heartbeat=true</span><br><span class=\"line\">transport.thread-factory.boss-thread-prefix=NettyBoss</span><br><span class=\"line\">transport.thread-factory.worker-thread-prefix=NettyServerNIOWorker</span><br><span class=\"line\">transport.thread-factory.server-executor-thread-prefix=NettyServerBizHandler</span><br><span class=\"line\">transport.thread-factory.share-boss-worker=false</span><br><span class=\"line\">transport.thread-factory.client-selector-thread-prefix=NettyClientSelector</span><br><span class=\"line\">transport.thread-factory.client-selector-thread-size=1</span><br><span class=\"line\">transport.thread-factory.client-worker-thread-prefix=NettyClientWorkerThread</span><br><span class=\"line\">transport.thread-factory.boss-thread-size=1</span><br><span class=\"line\">transport.thread-factory.worker-thread-size=8</span><br><span class=\"line\">transport.shutdown.wait=3</span><br><span class=\"line\">service.vgroup_mapping.my_test_tx_groyp=default #分组</span><br><span class=\"line\">service.enableDegrade=false</span><br><span class=\"line\">service.disable=false</span><br><span class=\"line\">service.max.commit.retry.timeout=-1</span><br><span class=\"line\">service.max.rollback.retry.timeout=-1</span><br><span class=\"line\">client.async.commit.buffer.limit=10000</span><br><span class=\"line\">client.lock.retry.internal=10</span><br><span class=\"line\">client.lock.retry.times=30</span><br><span class=\"line\">store.mode=db</span><br><span class=\"line\">store.file.dir=file_store/data</span><br><span class=\"line\">store.file.max-branch-session-size=16384</span><br><span class=\"line\">store.file.max-global-session-size=512</span><br><span class=\"line\">store.file.file-write-buffer-cache-size=16384</span><br><span class=\"line\">store.file.flush-disk-mode=async</span><br><span class=\"line\">store.file.session.reload.read_size=100</span><br><span class=\"line\">store.db.driver-class-name=com.mysql.jdbc.Driver</span><br><span class=\"line\">store.db.datasource=dbcp</span><br><span class=\"line\">store.db.db-type=mysql</span><br><span class=\"line\">store.db.url=jdbc:mysql://*********:3306/seata?useUnicode=true #数据库地址</span><br><span class=\"line\">store.db.user=******** #用户名</span><br><span class=\"line\">store.db.password=******** #密码</span><br><span class=\"line\">store.db.min-conn=1</span><br><span class=\"line\">store.db.max-conn=3</span><br><span class=\"line\">store.db.global.table=global_table</span><br><span class=\"line\">store.db.branch.table=branch_table</span><br><span class=\"line\">store.db.query-limit=100</span><br><span class=\"line\">store.db.lock-table=lock_table</span><br><span class=\"line\">recovery.committing-retry-period=1000</span><br><span class=\"line\">recovery.asyn-committing-retry-period=1000</span><br><span class=\"line\">recovery.rollbacking-retry-period=1000</span><br><span class=\"line\">recovery.timeout-retry-period=1000</span><br><span class=\"line\">transaction.undo.data.validation=true</span><br><span class=\"line\">transaction.undo.log.serialization=jackson</span><br><span class=\"line\">transaction.undo.log.save.days=7</span><br><span class=\"line\">transaction.undo.log.delete.period=86400000</span><br><span class=\"line\">transaction.undo.log.table=undo_log</span><br><span class=\"line\">transport.serialization=seata</span><br><span class=\"line\">transport.compressor=none</span><br><span class=\"line\">metrics.enabled=false</span><br><span class=\"line\">metrics.registry-type=compact</span><br><span class=\"line\">metrics.exporter-list=prometheus</span><br><span class=\"line\">metrics.exporter-prometheus-port=9898</span><br></pre></td></tr></table></figure>\n\n<p>启动</p>\n<ul>\n<li>源码启动: 执行Server.java的main方法</li>\n<li>命令启动: <a href=\"http://seata-server.sh/\" target=\"_blank\" rel=\"noopener\">seata-server.sh</a> -h 127.0.0.1 -p 8091 -m db -n 1 -DSEATA_ENV=test</li>\n</ul>\n<figure class=\"highlight sh\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">-h: 注册到注册中心的ip</span><br><span class=\"line\">-p: Server rpc 监听端口</span><br><span class=\"line\">-m: 全局事务会话信息存储模式,file、db,优先读取启动参数</span><br><span class=\"line\">-n: Server node,多个Server时,需区分各自节点,用于生成不同的transactionId范围,以免冲突</span><br><span class=\"line\">SEATA_ENV: 多环境配置参考 https://github.com/seata/seata/wiki/Multi-configuration-Isolation</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"Seata项目中的配置\"><a href=\"#Seata项目中的配置\" class=\"headerlink\" title=\"Seata项目中的配置\"></a>Seata项目中的配置</h4><p><code>pom.xml</code></p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.seata<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>seata-spring<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${seata.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.seata<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>seata-all<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${seata.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- seata 依赖jar包 --></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>org.springframework.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>spring-boot-starter-actuator<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>druid-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${druid.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.google.protobuf<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>protobuf-java<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${protobuf.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.netty<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>netty-all<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${netty4.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependencyManagement</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependencies</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.alibaba.cloud<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>spring-cloud-alibaba-dependencies<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>2.1.0.RELEASE<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">scope</span>></span>import<span class=\"tag\"></<span class=\"name\">scope</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">type</span>></span>pom<span class=\"tag\"></<span class=\"name\">type</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependencies</span>></span></span><br><span class=\"line\"> <span class=\"tag\"></<span class=\"name\">dependencyManagement</span>></span></span><br></pre></td></tr></table></figure>\n\n<p><code>resource/registry.conf</code>对应nacos的IP端口</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">registry {</span><br><span class=\"line\"> # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa</span><br><span class=\"line\"> type = "nacos"</span><br><span class=\"line\"> nacos {</span><br><span class=\"line\"> serverAddr = "localhost"</span><br><span class=\"line\"> namespace = "public"</span><br><span class=\"line\"> cluster = "default"</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\">config {</span><br><span class=\"line\"> # file、nacos 、apollo、zk</span><br><span class=\"line\"> type = "nacos"</span><br><span class=\"line\"> nacos {</span><br><span class=\"line\"> serverAddr = "localhost"</span><br><span class=\"line\"> namespace = "public"</span><br><span class=\"line\"> cluster = "default"</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p><code>application.yml</code></p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">spring:</span></span><br><span class=\"line\"> <span class=\"attr\">cloud:</span></span><br><span class=\"line\"> <span class=\"attr\">alibaba:</span></span><br><span class=\"line\"> <span class=\"attr\">seata:</span></span><br><span class=\"line\"> <span class=\"attr\">tx-service-group:</span> <span class=\"string\">my_test_tx_group</span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"参考地址:\"><a href=\"#参考地址:\" class=\"headerlink\" title=\"参考地址:\"></a>参考地址:</h5><p><a href=\"https://nacos.io/zh-cn/docs/deployment.html\" target=\"_blank\" rel=\"noopener\">https://nacos.io/zh-cn/docs/deployment.html</a></p>\n<p><a href=\"https://seata.io/zh-cn/\" target=\"_blank\" rel=\"noopener\">https://seata.io/zh-cn/</a></p>\n<p><a href=\"https://seata.io/zh-cn/docs/user/configurations.html\" target=\"_blank\" rel=\"noopener\">https://seata.io/zh-cn/docs/user/configurations.html</a></p>\n<p><a href=\"https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata\" target=\"_blank\" rel=\"noopener\">https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata</a></p>\n<p><a href=\"https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus\" target=\"_blank\" rel=\"noopener\">https://github.com/seata/seata-samples/tree/master/multiple-datasource-mybatis-plus</a></p>\n<p><a href=\"http://seata.io/zh-cn/blog/seata-nacos-analysis.html\" target=\"_blank\" rel=\"noopener\">http://seata.io/zh-cn/blog/seata-nacos-analysis.html</a></p>\n<p><a href=\"http://seata.io/zh-cn/docs/user/configurations.html\" target=\"_blank\" rel=\"noopener\">http://seata.io/zh-cn/docs/user/configurations.html</a></p>\n"},{"title":"Prometheus、Grafana安装和配置监控Java应用","date":"2020-03-07T02:32:11.000Z","_content":"\n## Prometheus安装\n\n使用`docker`安装\n\n`docker`已经安装好之后,正式安装`prometheus`。\n\n```shell\ndocker run -d -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/localtime:/etc/localtime prom/prometheus\n\n```\n\n如果启动成功,访问`http://服务器地址:9090`\n\n## node export 安装\n\n```shell\ndocker run -d -p 9100:9100 quay.io/prometheus/node-exporter\n```\n\n安装完之后,需要修改`prometheus.yml`配置文件,增加要监听的job,需要指定job的名称,以及暴露的`metrics`的访问路径\n\n```yml\n - job_name: \"node\"\n # metrics_path defaults to '/metrics'\n # scheme defaults to 'http'.\n static_configs:\n - targets: [\"localhost:9001\"] #使用宿主机内网ip\n```\n\n重启`prometheus`容器生效\n\n## Grafana安装\n\n可以使用`grafana`展示监控视图。\n\n```shell\ndocker run -d --name=grafana -p 3001:3000 -v /var/lib/grafana:/var/lib/grafana -v /etc/grafana/grafana.ini:/etc/grafana/grafana.ini -v /etc/localtime:/etc/localtime grafana/grafana \n```\n\n访问`http://ip地址:指定的端口`,`grafana`安装成功,第一次访问需要修改密码,初始密码是`admin/admin`,修改密码之后,需要按照新密码登录。\n\n### grafana配置\n\n##### 添加数据源\n\n\n\n\n\n\n\n`Name`为数据源名,`URL`为`prometheus`地址\n\n##### 导入模板\n\n\n\n\n\n填入`8919`导入模板\n\n\n\n`Prometheus Data Source`为`grafana`添加的数据源\n\n## 监控jvm\n\nweb项目中增加依赖\n\n```xml\n<dependency>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t</dependency>\n\t<dependency>\n\t\t<groupId>io.micrometer</groupId>\n\t\t<artifactId>micrometer-registry-prometheus</artifactId>\n\t\t<version>1.1.4</version>\n\t</dependency>\n```\n\n在`application.yml`中添加配置\n\n```yaml\nmanagement:\n endpoints:\n web:\n exposure:\n include: '*' #开启 Actuator 服务\n metrics:\t\t\t#将该工程应用名称添加到计量器注册表的 tag 中\n tags:\n application: ${spring.application.name} #应用名称比如:app\n\n```\n\n在工程启动主类中增加`监控 JVM 性能指标注释下的`内容:\n\n```java\n@SpringBootApplication\npublic class WebsiteApplication {\n\n public static void main(String[] args) {\n SpringApplication.run(WebsiteApplication.class, args);\n }\n //监控 JVM 性能指标\n @Bean\n MeterRegistryCustomizer<MeterRegistry> configurer(@Value(\"${spring.application.name}\") String applicationName){\n return registry -> registry.config().commonTags(\"application\", applicationName);\n }\n}\n```\n\n启动动服务,浏览器访问 `http://127.0.0.1:8088/actuator/prometheus` 就可以看到应用的 一系列不同类型 `metrics` 信息\n\n#### Prometheus配置新增\n\n在`prometheus.yml`文件新增如下配置:\n\n```yaml\n- job_name: 'application'\n scrape_interval: 5s\n metrics_path: '/actuator/prometheus'\n file_sd_configs:\n - files: ['/etc/prometheus/*.json']\n```\n\n新建`json`文件`app.json`,内容如下:\n\n```json\n[\n {\n \"targets\": [\n \"ip:port\"\t//项目访问地址\n ],\n \"labels\": {\n \"instance\": \"app\",\t//可使用应用名称\n \"service\": \"app-service\"\n }\n }\n //可增加多个项目的配置\n]\n```\n\n重启 `Prometheus` 服务,查看 `Prometheu `界面 `Target` 中确认是否添加成功。\n\n\n\n\n\n#### 配置 Grafana JVM Dashboard 监控项\n\n参考grafana配置中导入模板的操作,导入`4701`模板\n\n效果如下:\n\n\n\n\n\n\n\n参考地址:\n\nhttps://blog.csdn.net/aixiaoyang168/article/details/100866159\n\nhttps://cloud.tencent.com/developer/article/1442143\n\nhttps://www.jianshu.com/p/12df755f2c66","source":"_posts/prometheus-grafana.md","raw":"---\ntitle: Prometheus、Grafana安装和配置监控Java应用\ndate: 2020-03-07 10:32:11\ntags: [Prometheus,Grafana,Java,spring boot]\ncategories: [学习,docker,Grafana]\n---\n\n## Prometheus安装\n\n使用`docker`安装\n\n`docker`已经安装好之后,正式安装`prometheus`。\n\n```shell\ndocker run -d -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/localtime:/etc/localtime prom/prometheus\n\n```\n\n如果启动成功,访问`http://服务器地址:9090`\n\n## node export 安装\n\n```shell\ndocker run -d -p 9100:9100 quay.io/prometheus/node-exporter\n```\n\n安装完之后,需要修改`prometheus.yml`配置文件,增加要监听的job,需要指定job的名称,以及暴露的`metrics`的访问路径\n\n```yml\n - job_name: \"node\"\n # metrics_path defaults to '/metrics'\n # scheme defaults to 'http'.\n static_configs:\n - targets: [\"localhost:9001\"] #使用宿主机内网ip\n```\n\n重启`prometheus`容器生效\n\n## Grafana安装\n\n可以使用`grafana`展示监控视图。\n\n```shell\ndocker run -d --name=grafana -p 3001:3000 -v /var/lib/grafana:/var/lib/grafana -v /etc/grafana/grafana.ini:/etc/grafana/grafana.ini -v /etc/localtime:/etc/localtime grafana/grafana \n```\n\n访问`http://ip地址:指定的端口`,`grafana`安装成功,第一次访问需要修改密码,初始密码是`admin/admin`,修改密码之后,需要按照新密码登录。\n\n### grafana配置\n\n##### 添加数据源\n\n\n\n\n\n\n\n`Name`为数据源名,`URL`为`prometheus`地址\n\n##### 导入模板\n\n\n\n\n\n填入`8919`导入模板\n\n\n\n`Prometheus Data Source`为`grafana`添加的数据源\n\n## 监控jvm\n\nweb项目中增加依赖\n\n```xml\n<dependency>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t</dependency>\n\t<dependency>\n\t\t<groupId>io.micrometer</groupId>\n\t\t<artifactId>micrometer-registry-prometheus</artifactId>\n\t\t<version>1.1.4</version>\n\t</dependency>\n```\n\n在`application.yml`中添加配置\n\n```yaml\nmanagement:\n endpoints:\n web:\n exposure:\n include: '*' #开启 Actuator 服务\n metrics:\t\t\t#将该工程应用名称添加到计量器注册表的 tag 中\n tags:\n application: ${spring.application.name} #应用名称比如:app\n\n```\n\n在工程启动主类中增加`监控 JVM 性能指标注释下的`内容:\n\n```java\n@SpringBootApplication\npublic class WebsiteApplication {\n\n public static void main(String[] args) {\n SpringApplication.run(WebsiteApplication.class, args);\n }\n //监控 JVM 性能指标\n @Bean\n MeterRegistryCustomizer<MeterRegistry> configurer(@Value(\"${spring.application.name}\") String applicationName){\n return registry -> registry.config().commonTags(\"application\", applicationName);\n }\n}\n```\n\n启动动服务,浏览器访问 `http://127.0.0.1:8088/actuator/prometheus` 就可以看到应用的 一系列不同类型 `metrics` 信息\n\n#### Prometheus配置新增\n\n在`prometheus.yml`文件新增如下配置:\n\n```yaml\n- job_name: 'application'\n scrape_interval: 5s\n metrics_path: '/actuator/prometheus'\n file_sd_configs:\n - files: ['/etc/prometheus/*.json']\n```\n\n新建`json`文件`app.json`,内容如下:\n\n```json\n[\n {\n \"targets\": [\n \"ip:port\"\t//项目访问地址\n ],\n \"labels\": {\n \"instance\": \"app\",\t//可使用应用名称\n \"service\": \"app-service\"\n }\n }\n //可增加多个项目的配置\n]\n```\n\n重启 `Prometheus` 服务,查看 `Prometheu `界面 `Target` 中确认是否添加成功。\n\n\n\n\n\n#### 配置 Grafana JVM Dashboard 监控项\n\n参考grafana配置中导入模板的操作,导入`4701`模板\n\n效果如下:\n\n\n\n\n\n\n\n参考地址:\n\nhttps://blog.csdn.net/aixiaoyang168/article/details/100866159\n\nhttps://cloud.tencent.com/developer/article/1442143\n\nhttps://www.jianshu.com/p/12df755f2c66","slug":"prometheus-grafana","published":1,"updated":"2020-09-13T06:58:15.352Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h6001258sy9x57hkdx","content":"<h2 id=\"Prometheus安装\"><a href=\"#Prometheus安装\" class=\"headerlink\" title=\"Prometheus安装\"></a>Prometheus安装</h2><p>使用<code>docker</code>安装</p>\n<p><code>docker</code>已经安装好之后,正式安装<code>prometheus</code>。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/localtime:/etc/localtime prom/prometheus</span><br></pre></td></tr></table></figure>\n\n<p>如果启动成功,访问<code>http://服务器地址:9090</code></p>\n<h2 id=\"node-export-安装\"><a href=\"#node-export-安装\" class=\"headerlink\" title=\"node export 安装\"></a>node export 安装</h2><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d -p 9100:9100 quay.io/prometheus/node-exporter</span><br></pre></td></tr></table></figure>\n\n<p>安装完之后,需要修改<code>prometheus.yml</code>配置文件,增加要监听的job,需要指定job的名称,以及暴露的<code>metrics</code>的访问路径</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"bullet\">-</span> <span class=\"attr\">job_name:</span> <span class=\"string\">\"node\"</span></span><br><span class=\"line\"> <span class=\"comment\"># metrics_path defaults to '/metrics'</span></span><br><span class=\"line\"> <span class=\"comment\"># scheme defaults to 'http'.</span></span><br><span class=\"line\"> <span class=\"attr\">static_configs:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">targets:</span> <span class=\"string\">[\"localhost:9001\"]</span> <span class=\"comment\">#使用宿主机内网ip</span></span><br></pre></td></tr></table></figure>\n\n<p>重启<code>prometheus</code>容器生效</p>\n<h2 id=\"Grafana安装\"><a href=\"#Grafana安装\" class=\"headerlink\" title=\"Grafana安装\"></a>Grafana安装</h2><p>可以使用<code>grafana</code>展示监控视图。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d --name=grafana -p 3001:3000 -v /var/lib/grafana:/var/lib/grafana -v /etc/grafana/grafana.ini:/etc/grafana/grafana.ini -v /etc/localtime:/etc/localtime grafana/grafana</span><br></pre></td></tr></table></figure>\n\n<p>访问<code>http://ip地址:指定的端口</code>,<code>grafana</code>安装成功,第一次访问需要修改密码,初始密码是<code>admin/admin</code>,修改密码之后,需要按照新密码登录。</p>\n<h3 id=\"grafana配置\"><a href=\"#grafana配置\" class=\"headerlink\" title=\"grafana配置\"></a>grafana配置</h3><h5 id=\"添加数据源\"><a href=\"#添加数据源\" class=\"headerlink\" title=\"添加数据源\"></a>添加数据源</h5><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307104004.png\" alt=\"添加数据源\"></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307104106.png\" alt></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113107.png\" alt></p>\n<p><code>Name</code>为数据源名,<code>URL</code>为<code>prometheus</code>地址</p>\n<h5 id=\"导入模板\"><a href=\"#导入模板\" class=\"headerlink\" title=\"导入模板\"></a>导入模板</h5><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113316.png\" alt=\"导入模板\"></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113537.png\" alt></p>\n<p>填入<code>8919</code>导入模板</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113623.png\" alt></p>\n<p><code>Prometheus Data Source</code>为<code>grafana</code>添加的数据源</p>\n<h2 id=\"监控jvm\"><a href=\"#监控jvm\" class=\"headerlink\" title=\"监控jvm\"></a>监控jvm</h2><p>web项目中增加依赖</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">groupId</span>></span>org.springframework.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">artifactId</span>></span>spring-boot-starter-actuator<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.micrometer<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">artifactId</span>></span>micrometer-registry-prometheus<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">version</span>></span>1.1.4<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<p>在<code>application.yml</code>中添加配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">management:</span></span><br><span class=\"line\"> <span class=\"attr\">endpoints:</span></span><br><span class=\"line\"> <span class=\"attr\">web:</span></span><br><span class=\"line\"> <span class=\"attr\">exposure:</span></span><br><span class=\"line\"> <span class=\"attr\">include:</span> <span class=\"string\">'*'</span> <span class=\"comment\">#开启 Actuator 服务</span></span><br><span class=\"line\"> <span class=\"attr\">metrics:</span>\t\t\t<span class=\"comment\">#将该工程应用名称添加到计量器注册表的 tag 中</span></span><br><span class=\"line\"> <span class=\"attr\">tags:</span></span><br><span class=\"line\"> <span class=\"attr\">application:</span> <span class=\"string\">${spring.application.name}</span> <span class=\"comment\">#应用名称比如:app</span></span><br></pre></td></tr></table></figure>\n\n<p>在工程启动主类中增加<code>监控 JVM 性能指标注释下的</code>内容:</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@SpringBootApplication</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">WebsiteApplication</span> </span>{</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"title\">main</span><span class=\"params\">(String[] args)</span> </span>{</span><br><span class=\"line\"> SpringApplication.run(WebsiteApplication<span class=\"class\">.<span class=\"keyword\">class</span>, <span class=\"title\">args</span>)</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"comment\">//监控 JVM 性能指标</span></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"function\">MeterRegistryCustomizer<MeterRegistry> <span class=\"title\">configurer</span><span class=\"params\">(@Value(<span class=\"string\">\"${spring.application.name}\"</span>)</span> String applicationName)</span>{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> registry -> registry.config().commonTags(<span class=\"string\">\"application\"</span>, applicationName);</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>启动动服务,浏览器访问 <code>http://127.0.0.1:8088/actuator/prometheus</code> 就可以看到应用的 一系列不同类型 <code>metrics</code> 信息</p>\n<h4 id=\"Prometheus配置新增\"><a href=\"#Prometheus配置新增\" class=\"headerlink\" title=\"Prometheus配置新增\"></a>Prometheus配置新增</h4><p>在<code>prometheus.yml</code>文件新增如下配置:</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"bullet\">-</span> <span class=\"attr\">job_name:</span> <span class=\"string\">'application'</span></span><br><span class=\"line\"> <span class=\"attr\">scrape_interval:</span> <span class=\"string\">5s</span></span><br><span class=\"line\"> <span class=\"attr\">metrics_path:</span> <span class=\"string\">'/actuator/prometheus'</span></span><br><span class=\"line\"> <span class=\"attr\">file_sd_configs:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">files:</span> <span class=\"string\">['/etc/prometheus/*.json']</span></span><br></pre></td></tr></table></figure>\n\n<p>新建<code>json</code>文件<code>app.json</code>,内容如下:</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"attr\">\"targets\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"ip:port\"</span>\t<span class=\"comment\">//项目访问地址</span></span><br><span class=\"line\"> ],</span><br><span class=\"line\"> <span class=\"attr\">\"labels\"</span>: {</span><br><span class=\"line\"> <span class=\"attr\">\"instance\"</span>: <span class=\"string\">\"app\"</span>,\t<span class=\"comment\">//可使用应用名称</span></span><br><span class=\"line\"> <span class=\"attr\">\"service\"</span>: <span class=\"string\">\"app-service\"</span></span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"comment\">//可增加多个项目的配置</span></span><br><span class=\"line\">]</span><br></pre></td></tr></table></figure>\n\n<p>重启 <code>Prometheus</code> 服务,查看 <code>Prometheu</code>界面 <code>Target</code> 中确认是否添加成功。</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307135140.png\" alt></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307135341.png\" alt></p>\n<h4 id=\"配置-Grafana-JVM-Dashboard-监控项\"><a href=\"#配置-Grafana-JVM-Dashboard-监控项\" class=\"headerlink\" title=\"配置 Grafana JVM Dashboard 监控项\"></a>配置 Grafana JVM Dashboard 监控项</h4><p>参考grafana配置中导入模板的操作,导入<code>4701</code>模板</p>\n<p>效果如下:</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307134443.png\" alt></p>\n<p>参考地址:</p>\n<p><a href=\"https://blog.csdn.net/aixiaoyang168/article/details/100866159\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/aixiaoyang168/article/details/100866159</a></p>\n<p><a href=\"https://cloud.tencent.com/developer/article/1442143\" target=\"_blank\" rel=\"noopener\">https://cloud.tencent.com/developer/article/1442143</a></p>\n<p><a href=\"https://www.jianshu.com/p/12df755f2c66\" target=\"_blank\" rel=\"noopener\">https://www.jianshu.com/p/12df755f2c66</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h2 id=\"Prometheus安装\"><a href=\"#Prometheus安装\" class=\"headerlink\" title=\"Prometheus安装\"></a>Prometheus安装</h2><p>使用<code>docker</code>安装</p>\n<p><code>docker</code>已经安装好之后,正式安装<code>prometheus</code>。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/localtime:/etc/localtime prom/prometheus</span><br></pre></td></tr></table></figure>\n\n<p>如果启动成功,访问<code>http://服务器地址:9090</code></p>\n<h2 id=\"node-export-安装\"><a href=\"#node-export-安装\" class=\"headerlink\" title=\"node export 安装\"></a>node export 安装</h2><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d -p 9100:9100 quay.io/prometheus/node-exporter</span><br></pre></td></tr></table></figure>\n\n<p>安装完之后,需要修改<code>prometheus.yml</code>配置文件,增加要监听的job,需要指定job的名称,以及暴露的<code>metrics</code>的访问路径</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"bullet\">-</span> <span class=\"attr\">job_name:</span> <span class=\"string\">\"node\"</span></span><br><span class=\"line\"> <span class=\"comment\"># metrics_path defaults to '/metrics'</span></span><br><span class=\"line\"> <span class=\"comment\"># scheme defaults to 'http'.</span></span><br><span class=\"line\"> <span class=\"attr\">static_configs:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">targets:</span> <span class=\"string\">[\"localhost:9001\"]</span> <span class=\"comment\">#使用宿主机内网ip</span></span><br></pre></td></tr></table></figure>\n\n<p>重启<code>prometheus</code>容器生效</p>\n<h2 id=\"Grafana安装\"><a href=\"#Grafana安装\" class=\"headerlink\" title=\"Grafana安装\"></a>Grafana安装</h2><p>可以使用<code>grafana</code>展示监控视图。</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d --name=grafana -p 3001:3000 -v /var/lib/grafana:/var/lib/grafana -v /etc/grafana/grafana.ini:/etc/grafana/grafana.ini -v /etc/localtime:/etc/localtime grafana/grafana</span><br></pre></td></tr></table></figure>\n\n<p>访问<code>http://ip地址:指定的端口</code>,<code>grafana</code>安装成功,第一次访问需要修改密码,初始密码是<code>admin/admin</code>,修改密码之后,需要按照新密码登录。</p>\n<h3 id=\"grafana配置\"><a href=\"#grafana配置\" class=\"headerlink\" title=\"grafana配置\"></a>grafana配置</h3><h5 id=\"添加数据源\"><a href=\"#添加数据源\" class=\"headerlink\" title=\"添加数据源\"></a>添加数据源</h5><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307104004.png\" alt=\"添加数据源\"></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307104106.png\" alt></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113107.png\" alt></p>\n<p><code>Name</code>为数据源名,<code>URL</code>为<code>prometheus</code>地址</p>\n<h5 id=\"导入模板\"><a href=\"#导入模板\" class=\"headerlink\" title=\"导入模板\"></a>导入模板</h5><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113316.png\" alt=\"导入模板\"></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113537.png\" alt></p>\n<p>填入<code>8919</code>导入模板</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307113623.png\" alt></p>\n<p><code>Prometheus Data Source</code>为<code>grafana</code>添加的数据源</p>\n<h2 id=\"监控jvm\"><a href=\"#监控jvm\" class=\"headerlink\" title=\"监控jvm\"></a>监控jvm</h2><p>web项目中增加依赖</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">groupId</span>></span>org.springframework.boot<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">artifactId</span>></span>spring-boot-starter-actuator<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.micrometer<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">artifactId</span>></span>micrometer-registry-prometheus<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">version</span>></span>1.1.4<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<p>在<code>application.yml</code>中添加配置</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">management:</span></span><br><span class=\"line\"> <span class=\"attr\">endpoints:</span></span><br><span class=\"line\"> <span class=\"attr\">web:</span></span><br><span class=\"line\"> <span class=\"attr\">exposure:</span></span><br><span class=\"line\"> <span class=\"attr\">include:</span> <span class=\"string\">'*'</span> <span class=\"comment\">#开启 Actuator 服务</span></span><br><span class=\"line\"> <span class=\"attr\">metrics:</span>\t\t\t<span class=\"comment\">#将该工程应用名称添加到计量器注册表的 tag 中</span></span><br><span class=\"line\"> <span class=\"attr\">tags:</span></span><br><span class=\"line\"> <span class=\"attr\">application:</span> <span class=\"string\">${spring.application.name}</span> <span class=\"comment\">#应用名称比如:app</span></span><br></pre></td></tr></table></figure>\n\n<p>在工程启动主类中增加<code>监控 JVM 性能指标注释下的</code>内容:</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@SpringBootApplication</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">WebsiteApplication</span> </span>{</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"title\">main</span><span class=\"params\">(String[] args)</span> </span>{</span><br><span class=\"line\"> SpringApplication.run(WebsiteApplication<span class=\"class\">.<span class=\"keyword\">class</span>, <span class=\"title\">args</span>)</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"comment\">//监控 JVM 性能指标</span></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"function\">MeterRegistryCustomizer<MeterRegistry> <span class=\"title\">configurer</span><span class=\"params\">(@Value(<span class=\"string\">\"${spring.application.name}\"</span>)</span> String applicationName)</span>{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> registry -> registry.config().commonTags(<span class=\"string\">\"application\"</span>, applicationName);</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<p>启动动服务,浏览器访问 <code>http://127.0.0.1:8088/actuator/prometheus</code> 就可以看到应用的 一系列不同类型 <code>metrics</code> 信息</p>\n<h4 id=\"Prometheus配置新增\"><a href=\"#Prometheus配置新增\" class=\"headerlink\" title=\"Prometheus配置新增\"></a>Prometheus配置新增</h4><p>在<code>prometheus.yml</code>文件新增如下配置:</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"bullet\">-</span> <span class=\"attr\">job_name:</span> <span class=\"string\">'application'</span></span><br><span class=\"line\"> <span class=\"attr\">scrape_interval:</span> <span class=\"string\">5s</span></span><br><span class=\"line\"> <span class=\"attr\">metrics_path:</span> <span class=\"string\">'/actuator/prometheus'</span></span><br><span class=\"line\"> <span class=\"attr\">file_sd_configs:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">files:</span> <span class=\"string\">['/etc/prometheus/*.json']</span></span><br></pre></td></tr></table></figure>\n\n<p>新建<code>json</code>文件<code>app.json</code>,内容如下:</p>\n<figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"attr\">\"targets\"</span>: [</span><br><span class=\"line\"> <span class=\"string\">\"ip:port\"</span>\t<span class=\"comment\">//项目访问地址</span></span><br><span class=\"line\"> ],</span><br><span class=\"line\"> <span class=\"attr\">\"labels\"</span>: {</span><br><span class=\"line\"> <span class=\"attr\">\"instance\"</span>: <span class=\"string\">\"app\"</span>,\t<span class=\"comment\">//可使用应用名称</span></span><br><span class=\"line\"> <span class=\"attr\">\"service\"</span>: <span class=\"string\">\"app-service\"</span></span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"comment\">//可增加多个项目的配置</span></span><br><span class=\"line\">]</span><br></pre></td></tr></table></figure>\n\n<p>重启 <code>Prometheus</code> 服务,查看 <code>Prometheu</code>界面 <code>Target</code> 中确认是否添加成功。</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307135140.png\" alt></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307135341.png\" alt></p>\n<h4 id=\"配置-Grafana-JVM-Dashboard-监控项\"><a href=\"#配置-Grafana-JVM-Dashboard-监控项\" class=\"headerlink\" title=\"配置 Grafana JVM Dashboard 监控项\"></a>配置 Grafana JVM Dashboard 监控项</h4><p>参考grafana配置中导入模板的操作,导入<code>4701</code>模板</p>\n<p>效果如下:</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307134443.png\" alt></p>\n<p>参考地址:</p>\n<p><a href=\"https://blog.csdn.net/aixiaoyang168/article/details/100866159\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/aixiaoyang168/article/details/100866159</a></p>\n<p><a href=\"https://cloud.tencent.com/developer/article/1442143\" target=\"_blank\" rel=\"noopener\">https://cloud.tencent.com/developer/article/1442143</a></p>\n<p><a href=\"https://www.jianshu.com/p/12df755f2c66\" target=\"_blank\" rel=\"noopener\">https://www.jianshu.com/p/12df755f2c66</a></p>\n"},{"title":"mysql保存日期mybatis查询后多8小时问题","date":"2019-10-19T03:11:10.000Z","_content":"\n\n\n#### 问题\n\n发现查询出的日期数据与mysql数据库中的日期不符.\n\nmysql查询出的数据是 2019-10-15 13:31:10 mybatis查询出的数据是 2019-10-15 05:31:10.\n\n #### 原因\n\n因mysql设置时区与 Tomcat java 使用的时区不同.\n\n#### 解决\n\n在数据库链接配置设置时区.\n\n增加`serverTimezone=Asia/Shanghai`\n\n```\njdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai\n```\n\n\n\n\n\n参考地址:\n\n [https://blog.csdn.net/babybabyup/article/details/97802707](https://blog.csdn.net/babybabyup/article/details/97802707 )\n\n [https://blog.csdn.net/saroll57/article/details/51837551](https://blog.csdn.net/saroll57/article/details/51837551)\n\n [https://blog.csdn.net/a549654065/article/details/88664077 ](https://blog.csdn.net/a549654065/article/details/88664077)\n\n","source":"_posts/mysql-timezone.md","raw":"---\ntitle: mysql保存日期mybatis查询后多8小时问题\ndate: 2019-10-19 11:11:10\ntags: [mysql,mybaits,java]\ncategories: [学习,mybatis,error]\n---\n\n\n\n#### 问题\n\n发现查询出的日期数据与mysql数据库中的日期不符.\n\nmysql查询出的数据是 2019-10-15 13:31:10 mybatis查询出的数据是 2019-10-15 05:31:10.\n\n #### 原因\n\n因mysql设置时区与 Tomcat java 使用的时区不同.\n\n#### 解决\n\n在数据库链接配置设置时区.\n\n增加`serverTimezone=Asia/Shanghai`\n\n```\njdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai\n```\n\n\n\n\n\n参考地址:\n\n [https://blog.csdn.net/babybabyup/article/details/97802707](https://blog.csdn.net/babybabyup/article/details/97802707 )\n\n [https://blog.csdn.net/saroll57/article/details/51837551](https://blog.csdn.net/saroll57/article/details/51837551)\n\n [https://blog.csdn.net/a549654065/article/details/88664077 ](https://blog.csdn.net/a549654065/article/details/88664077)\n\n","slug":"mysql-timezone","published":1,"updated":"2020-09-13T06:57:10.891Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h7001458sy1kamcuhy","content":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>发现查询出的日期数据与mysql数据库中的日期不符.</p>\n<p>mysql查询出的数据是 2019-10-15 13:31:10 mybatis查询出的数据是 2019-10-15 05:31:10.</p>\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>因mysql设置时区与 Tomcat java 使用的时区不同.</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>在数据库链接配置设置时区.</p>\n<p>增加<code>serverTimezone=Asia/Shanghai</code></p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p> <a href=\"https://blog.csdn.net/babybabyup/article/details/97802707\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/babybabyup/article/details/97802707</a></p>\n<p> <a href=\"https://blog.csdn.net/saroll57/article/details/51837551\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/saroll57/article/details/51837551</a></p>\n<p> <a href=\"https://blog.csdn.net/a549654065/article/details/88664077\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/a549654065/article/details/88664077 </a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>发现查询出的日期数据与mysql数据库中的日期不符.</p>\n<p>mysql查询出的数据是 2019-10-15 13:31:10 mybatis查询出的数据是 2019-10-15 05:31:10.</p>\n<h4 id=\"原因\"><a href=\"#原因\" class=\"headerlink\" title=\"原因\"></a>原因</h4><p>因mysql设置时区与 Tomcat java 使用的时区不同.</p>\n<h4 id=\"解决\"><a href=\"#解决\" class=\"headerlink\" title=\"解决\"></a>解决</h4><p>在数据库链接配置设置时区.</p>\n<p>增加<code>serverTimezone=Asia/Shanghai</code></p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p> <a href=\"https://blog.csdn.net/babybabyup/article/details/97802707\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/babybabyup/article/details/97802707</a></p>\n<p> <a href=\"https://blog.csdn.net/saroll57/article/details/51837551\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/saroll57/article/details/51837551</a></p>\n<p> <a href=\"https://blog.csdn.net/a549654065/article/details/88664077\" target=\"_blank\" rel=\"noopener\">https://blog.csdn.net/a549654065/article/details/88664077 </a></p>\n"},{"title":"ssh免密登录","date":"2020-04-13T07:59:54.000Z","_content":"\n#### 添加hosts\n\n在`/etc/hosts`文件中添加对应主机地址已经名称:\n\n```shell\n10.5.16.1 node1 \n10.5.16.2 node2\n10.5.16.3 node3 \n10.5.16.4 node4 \n10.5.16.5 node5 \n10.5.16.6 node6 \n```\n\n\n\n#### 生成key\n\n在node1服务器执行:\n\n```shell\nssh-keygen -t rsa\n```\n\n提示输入一些信息,默认即可:\n\n```shell\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/root/.ssh/id_rsa): \nCreated directory '/root/.ssh'.\nEnter passphrase (empty for no passphrase): \nEnter same passphrase again: \nYour identification has been saved in /root/.ssh/id_rsa.\nYour public key has been saved in /root/.ssh/id_rsa.pub.\nThe key fingerprint is:\nSHA256:xOkgW2P4IcB4epLE2H8UZywgtm/xoLUHaroqVJuoeXY root@sugon51601\nThe key's randomart image is:\n+---[RSA 2048]----+\n|o++ ...oo |\n|o+++ .o+.. |\n|.+..O.*.+ |\n|+ .*.&.* |\n| o* B.+ S |\n| = + . |\n|+. |\n|+.o E |\n|=o . |\n+----[SHA256]-----+\n\n```\n\n\n\n然后使用以下命令将公钥拷贝到其他服务器:\n\n```shell\nssh-copy-id node2\n```\n\n提示输入`node2`服务器的密码:\n\n```shell\n/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: \"/root/.ssh/id_rsa.pub\"\nThe authenticity of host 'node2 (10.5.16.2)' can't be established.\nECDSA key fingerprint is SHA256:b3KWX6G6H7ANx8tNzhobL9su6YnmT55aGSpg3xlO4xY.\nECDSA key fingerprint is MD5:25:03:35:34:e0:e7:70:2b:0b:65:87:71:c6:50:36:60.\nAre you sure you want to continue connecting (yes/no)? yes\n/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed\n/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys\nroot@node2's password: \n\nNumber of key(s) added: 1\n\nNow try logging into the machine, with: \"ssh 'node2'\"\nand check to make sure that only the key(s) you wanted were added\n```\n\n#### 问题\n\n\n\n如生成密钥时提示权限不足可修改`/etc/ssh/ssh_config`文件的配置(centos系统):\n\n```shell\nPermitRootLogin yes\nPubkeyAuthentication yes\nPasswordAuthentication yes\n```\n\n\n\n参考地址:\n\n[https://yq.aliyun.com/articles/701548](https://yq.aliyun.com/articles/701548)","source":"_posts/ssh-key-login.md","raw":"---\ntitle: ssh免密登录\ndate: 2020-04-13 15:59:54\ntags: [ssh]\ncategories: [学习,linux]\n---\n\n#### 添加hosts\n\n在`/etc/hosts`文件中添加对应主机地址已经名称:\n\n```shell\n10.5.16.1 node1 \n10.5.16.2 node2\n10.5.16.3 node3 \n10.5.16.4 node4 \n10.5.16.5 node5 \n10.5.16.6 node6 \n```\n\n\n\n#### 生成key\n\n在node1服务器执行:\n\n```shell\nssh-keygen -t rsa\n```\n\n提示输入一些信息,默认即可:\n\n```shell\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/root/.ssh/id_rsa): \nCreated directory '/root/.ssh'.\nEnter passphrase (empty for no passphrase): \nEnter same passphrase again: \nYour identification has been saved in /root/.ssh/id_rsa.\nYour public key has been saved in /root/.ssh/id_rsa.pub.\nThe key fingerprint is:\nSHA256:xOkgW2P4IcB4epLE2H8UZywgtm/xoLUHaroqVJuoeXY root@sugon51601\nThe key's randomart image is:\n+---[RSA 2048]----+\n|o++ ...oo |\n|o+++ .o+.. |\n|.+..O.*.+ |\n|+ .*.&.* |\n| o* B.+ S |\n| = + . |\n|+. |\n|+.o E |\n|=o . |\n+----[SHA256]-----+\n\n```\n\n\n\n然后使用以下命令将公钥拷贝到其他服务器:\n\n```shell\nssh-copy-id node2\n```\n\n提示输入`node2`服务器的密码:\n\n```shell\n/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: \"/root/.ssh/id_rsa.pub\"\nThe authenticity of host 'node2 (10.5.16.2)' can't be established.\nECDSA key fingerprint is SHA256:b3KWX6G6H7ANx8tNzhobL9su6YnmT55aGSpg3xlO4xY.\nECDSA key fingerprint is MD5:25:03:35:34:e0:e7:70:2b:0b:65:87:71:c6:50:36:60.\nAre you sure you want to continue connecting (yes/no)? yes\n/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed\n/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys\nroot@node2's password: \n\nNumber of key(s) added: 1\n\nNow try logging into the machine, with: \"ssh 'node2'\"\nand check to make sure that only the key(s) you wanted were added\n```\n\n#### 问题\n\n\n\n如生成密钥时提示权限不足可修改`/etc/ssh/ssh_config`文件的配置(centos系统):\n\n```shell\nPermitRootLogin yes\nPubkeyAuthentication yes\nPasswordAuthentication yes\n```\n\n\n\n参考地址:\n\n[https://yq.aliyun.com/articles/701548](https://yq.aliyun.com/articles/701548)","slug":"ssh-key-login","published":1,"updated":"2020-09-13T06:59:14.649Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h8001658syakx6isjf","content":"<h4 id=\"添加hosts\"><a href=\"#添加hosts\" class=\"headerlink\" title=\"添加hosts\"></a>添加hosts</h4><p>在<code>/etc/hosts</code>文件中添加对应主机地址已经名称:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">10.5.16.1 node1 </span><br><span class=\"line\">10.5.16.2 node2</span><br><span class=\"line\">10.5.16.3 node3 </span><br><span class=\"line\">10.5.16.4 node4 </span><br><span class=\"line\">10.5.16.5 node5 </span><br><span class=\"line\">10.5.16.6 node6</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"生成key\"><a href=\"#生成key\" class=\"headerlink\" title=\"生成key\"></a>生成key</h4><p>在node1服务器执行:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure>\n\n<p>提示输入一些信息,默认即可:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">Generating public/private rsa key pair.</span><br><span class=\"line\">Enter file in which to save the key (/root/.ssh/id_rsa): </span><br><span class=\"line\">Created directory '/root/.ssh'.</span><br><span class=\"line\">Enter passphrase (empty for no passphrase): </span><br><span class=\"line\">Enter same passphrase again: </span><br><span class=\"line\">Your identification has been saved in /root/.ssh/id_rsa.</span><br><span class=\"line\">Your public key has been saved in /root/.ssh/id_rsa.pub.</span><br><span class=\"line\">The key fingerprint is:</span><br><span class=\"line\">SHA256:xOkgW2P4IcB4epLE2H8UZywgtm/xoLUHaroqVJuoeXY root@sugon51601</span><br><span class=\"line\">The key's randomart image is:</span><br><span class=\"line\">+---[RSA 2048]----+</span><br><span class=\"line\">|o++ ...oo |</span><br><span class=\"line\">|o+++ .o+.. |</span><br><span class=\"line\">|.+..O.*.+ |</span><br><span class=\"line\">|+ .*.&.* |</span><br><span class=\"line\">| o* B.+ S |</span><br><span class=\"line\">| = + . |</span><br><span class=\"line\">|+. |</span><br><span class=\"line\">|+.o E |</span><br><span class=\"line\">|=o . |</span><br><span class=\"line\">+----[SHA256]-----+</span><br></pre></td></tr></table></figure>\n\n<p>然后使用以下命令将公钥拷贝到其他服务器:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">ssh-copy-id node2</span><br></pre></td></tr></table></figure>\n\n<p>提示输入<code>node2</code>服务器的密码:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: \"/root/.ssh/id_rsa.pub\"</span><br><span class=\"line\">The authenticity of host 'node2 (10.5.16.2)' can't be established.</span><br><span class=\"line\">ECDSA key fingerprint is SHA256:b3KWX6G6H7ANx8tNzhobL9su6YnmT55aGSpg3xlO4xY.</span><br><span class=\"line\">ECDSA key fingerprint is MD5:25:03:35:34:e0:e7:70:2b:0b:65:87:71:c6:50:36:60.</span><br><span class=\"line\">Are you sure you want to continue connecting (yes/no)? yes</span><br><span class=\"line\">/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed</span><br><span class=\"line\">/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys</span><br><span class=\"line\">root@node2's password: </span><br><span class=\"line\"></span><br><span class=\"line\">Number of key(s) added: 1</span><br><span class=\"line\"></span><br><span class=\"line\">Now try logging into the machine, with: \"ssh 'node2'\"</span><br><span class=\"line\">and check to make sure that only the key(s) you wanted were added</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>如生成密钥时提示权限不足可修改<code>/etc/ssh/ssh_config</code>文件的配置(centos系统):</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">PermitRootLogin yes</span><br><span class=\"line\">PubkeyAuthentication yes</span><br><span class=\"line\">PasswordAuthentication yes</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://yq.aliyun.com/articles/701548\" target=\"_blank\" rel=\"noopener\">https://yq.aliyun.com/articles/701548</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"添加hosts\"><a href=\"#添加hosts\" class=\"headerlink\" title=\"添加hosts\"></a>添加hosts</h4><p>在<code>/etc/hosts</code>文件中添加对应主机地址已经名称:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">10.5.16.1 node1 </span><br><span class=\"line\">10.5.16.2 node2</span><br><span class=\"line\">10.5.16.3 node3 </span><br><span class=\"line\">10.5.16.4 node4 </span><br><span class=\"line\">10.5.16.5 node5 </span><br><span class=\"line\">10.5.16.6 node6</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"生成key\"><a href=\"#生成key\" class=\"headerlink\" title=\"生成key\"></a>生成key</h4><p>在node1服务器执行:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure>\n\n<p>提示输入一些信息,默认即可:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">Generating public/private rsa key pair.</span><br><span class=\"line\">Enter file in which to save the key (/root/.ssh/id_rsa): </span><br><span class=\"line\">Created directory '/root/.ssh'.</span><br><span class=\"line\">Enter passphrase (empty for no passphrase): </span><br><span class=\"line\">Enter same passphrase again: </span><br><span class=\"line\">Your identification has been saved in /root/.ssh/id_rsa.</span><br><span class=\"line\">Your public key has been saved in /root/.ssh/id_rsa.pub.</span><br><span class=\"line\">The key fingerprint is:</span><br><span class=\"line\">SHA256:xOkgW2P4IcB4epLE2H8UZywgtm/xoLUHaroqVJuoeXY root@sugon51601</span><br><span class=\"line\">The key's randomart image is:</span><br><span class=\"line\">+---[RSA 2048]----+</span><br><span class=\"line\">|o++ ...oo |</span><br><span class=\"line\">|o+++ .o+.. |</span><br><span class=\"line\">|.+..O.*.+ |</span><br><span class=\"line\">|+ .*.&.* |</span><br><span class=\"line\">| o* B.+ S |</span><br><span class=\"line\">| = + . |</span><br><span class=\"line\">|+. |</span><br><span class=\"line\">|+.o E |</span><br><span class=\"line\">|=o . |</span><br><span class=\"line\">+----[SHA256]-----+</span><br></pre></td></tr></table></figure>\n\n<p>然后使用以下命令将公钥拷贝到其他服务器:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">ssh-copy-id node2</span><br></pre></td></tr></table></figure>\n\n<p>提示输入<code>node2</code>服务器的密码:</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: \"/root/.ssh/id_rsa.pub\"</span><br><span class=\"line\">The authenticity of host 'node2 (10.5.16.2)' can't be established.</span><br><span class=\"line\">ECDSA key fingerprint is SHA256:b3KWX6G6H7ANx8tNzhobL9su6YnmT55aGSpg3xlO4xY.</span><br><span class=\"line\">ECDSA key fingerprint is MD5:25:03:35:34:e0:e7:70:2b:0b:65:87:71:c6:50:36:60.</span><br><span class=\"line\">Are you sure you want to continue connecting (yes/no)? yes</span><br><span class=\"line\">/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed</span><br><span class=\"line\">/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys</span><br><span class=\"line\">root@node2's password: </span><br><span class=\"line\"></span><br><span class=\"line\">Number of key(s) added: 1</span><br><span class=\"line\"></span><br><span class=\"line\">Now try logging into the machine, with: \"ssh 'node2'\"</span><br><span class=\"line\">and check to make sure that only the key(s) you wanted were added</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h4><p>如生成密钥时提示权限不足可修改<code>/etc/ssh/ssh_config</code>文件的配置(centos系统):</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">PermitRootLogin yes</span><br><span class=\"line\">PubkeyAuthentication yes</span><br><span class=\"line\">PasswordAuthentication yes</span><br></pre></td></tr></table></figure>\n\n<p>参考地址:</p>\n<p><a href=\"https://yq.aliyun.com/articles/701548\" target=\"_blank\" rel=\"noopener\">https://yq.aliyun.com/articles/701548</a></p>\n"},{"title":"使用jenkins记录","date":"2019-09-12T00:04:39.000Z","_content":"\n### Jenkins\n\n#### 资料\n\njenkins官网:[https://jenkins.io/zh/](https://jenkins.io/zh/)\n\njenkins下载地址:[https://jenkins.io/zh/download/](https://jenkins.io/zh/download/)\n\n安装步骤参考:[https://jenkins.io/zh/doc/book/installing/](https://jenkins.io/zh/doc/book/installing/)\n\n#### jenkins配置Gitee(码云)持续集成\n\n参考:[https://gitee.com/help/articles/4193](https://gitee.com/help/articles/4193)\n\n","source":"_posts/use-jenkins.md","raw":"---\ntitle: 使用jenkins记录\ndate: 2019-09-12 08:04:39\ntags: [jenkins,自动化构建,自动部署,CI/CD,持续集成,持续部署]\ncategories: [学习,jenkins]\n---\n\n### Jenkins\n\n#### 资料\n\njenkins官网:[https://jenkins.io/zh/](https://jenkins.io/zh/)\n\njenkins下载地址:[https://jenkins.io/zh/download/](https://jenkins.io/zh/download/)\n\n安装步骤参考:[https://jenkins.io/zh/doc/book/installing/](https://jenkins.io/zh/doc/book/installing/)\n\n#### jenkins配置Gitee(码云)持续集成\n\n参考:[https://gitee.com/help/articles/4193](https://gitee.com/help/articles/4193)\n\n","slug":"use-jenkins","published":1,"updated":"2020-09-13T06:59:44.163Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2h9001758syktakddre","content":"<h3 id=\"Jenkins\"><a href=\"#Jenkins\" class=\"headerlink\" title=\"Jenkins\"></a>Jenkins</h3><h4 id=\"资料\"><a href=\"#资料\" class=\"headerlink\" title=\"资料\"></a>资料</h4><p>jenkins官网:<a href=\"https://jenkins.io/zh/\" target=\"_blank\" rel=\"noopener\">https://jenkins.io/zh/</a></p>\n<p>jenkins下载地址:<a href=\"https://jenkins.io/zh/download/\" target=\"_blank\" rel=\"noopener\">https://jenkins.io/zh/download/</a></p>\n<p>安装步骤参考:<a href=\"https://jenkins.io/zh/doc/book/installing/\" target=\"_blank\" rel=\"noopener\">https://jenkins.io/zh/doc/book/installing/</a></p>\n<h4 id=\"jenkins配置Gitee-码云-持续集成\"><a href=\"#jenkins配置Gitee-码云-持续集成\" class=\"headerlink\" title=\"jenkins配置Gitee(码云)持续集成\"></a>jenkins配置Gitee(码云)持续集成</h4><p>参考:<a href=\"https://gitee.com/help/articles/4193\" target=\"_blank\" rel=\"noopener\">https://gitee.com/help/articles/4193</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"Jenkins\"><a href=\"#Jenkins\" class=\"headerlink\" title=\"Jenkins\"></a>Jenkins</h3><h4 id=\"资料\"><a href=\"#资料\" class=\"headerlink\" title=\"资料\"></a>资料</h4><p>jenkins官网:<a href=\"https://jenkins.io/zh/\" target=\"_blank\" rel=\"noopener\">https://jenkins.io/zh/</a></p>\n<p>jenkins下载地址:<a href=\"https://jenkins.io/zh/download/\" target=\"_blank\" rel=\"noopener\">https://jenkins.io/zh/download/</a></p>\n<p>安装步骤参考:<a href=\"https://jenkins.io/zh/doc/book/installing/\" target=\"_blank\" rel=\"noopener\">https://jenkins.io/zh/doc/book/installing/</a></p>\n<h4 id=\"jenkins配置Gitee-码云-持续集成\"><a href=\"#jenkins配置Gitee-码云-持续集成\" class=\"headerlink\" title=\"jenkins配置Gitee(码云)持续集成\"></a>jenkins配置Gitee(码云)持续集成</h4><p>参考:<a href=\"https://gitee.com/help/articles/4193\" target=\"_blank\" rel=\"noopener\">https://gitee.com/help/articles/4193</a></p>\n"},{"title":"使用canal进行mysql数据实时同步","date":"2020-03-07T06:00:42.000Z","_content":"\n## 场景\n\n对数据库进行实时增量备份。\n\n## 安装配置\n\n#### 准备\n\n`mysql`数据库需要先开启 `Binlog `写入功能,配置` binlog-format` 为 `ROW `模式,`my.cnf `中配置如下\n\n```properties\n[mysqld]\nlog-bin=mysql-bin # 开启 binlog\nbinlog-format=ROW # 选择 ROW 模式\nserver_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复\n```\n\n#### 拉取Docker镜像\n\n使用`docker`启动`canal-server`\n\n1. 访问`docker hub`获取最新的版本 访问:https://hub.docker.com/r/canal/canal-server/tags/\n2. 下载对应的版本\n\n```shell\ndocker pull canal/canal-server:lastet\n```\n\n#### 启动(单机模式)\n\n使用`canal`提供的`run.sh`脚本:\n\n https://github.com/alibaba/canal/blob/master/docker/run.sh\n\n```shell\n# 下载脚本\nwget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh \n# 构建一个destination name为sys_info的队列,命令中mysql的链接地址为需要备份的数据库\nsh run.sh -e canal.auto.scan=false \\\n\t\t -e canal.destinations=sys_info \\\n\t\t -e canal.instance.master.address=***.mysql.***.rds.aliyuncs.com:3306 \\\n\t\t -e canal.instance.dbUsername=**** \\\n\t\t -e canal.instance.dbPassword=**** \\\n\t\t -e canal.instance.connectionCharset=UTF-8 \\\n\t\t -e canal.instance.tsdb.enable=true \\\n\t\t -e canal.instance.gtidon=false \n```\n\n`docker`模式下,单`docker`实例只能运行一个`instance`,主要为配置问题。\n\n#### 运行效果\n\n\n\nsuccessful代表`canal-server`启动成功。\n\n### 启动canal-adapter\n\n#### 配置\n\n`canal-adapter`下载地址:https://github.com/alibaba/canal/releases\n\n获取对应`canal-server(canal.deployer)`版本的`canal-adapter`\n\n\n\n最好使用稳定版本\n\n```shell\n#下载canal-adapter \n#${version} 为对应版本 如 1.1.4\nwget https://github.com/alibaba/canal/releases/download/canal-${version}/canal.adapter-${version}.tar.gz \n#下载后解压到指定目录\ntar -zxvf canal.adapter-${version}.tar.gz -C canal-adapter\n```\n\n修改配置文件` conf/application.yml`为:\n\n```yaml\nserver:\n port: 8081\nspring:\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n default-property-inclusion: non_null\n\ncanal.conf:\n mode: tcp # kafka rocketMQ\n canalServerHost: 127.0.0.1:11111\n batchSize: 500\n syncBatchSize: 1000\n retries: 0\n timeout:\n canalAdapters:\n - instance: sys_info # canal instance Name or mq topic name \n groups:\n - groupId: g1\n outerAdapters:\n #- name: logger\n - name: rdb # 指定为rdb类型同步 # 接收数据的新数据库\n key: mysql1 # 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应\n properties:\n jdbc.driverClassName: com.mysql.jdbc.Driver # jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下\n jdbc.url: jdbc:mysql://***.***.rds.aliyuncs.com:3306/sys_info?useUnicode=true # jdbc url\n jdbc.username: **** # jdbc username\n jdbc.password: **** # jdbc password\n threads: 5 # 并行执行的线程数, 默认为1\n\n```\n\n1. 其中 `outAdapter` 的配置: `name`统一为`rdb`,` key`为对应的数据源的唯一标识需和下面的表映射文件中的`outerAdapterKey`对应,` properties`为目标库`jdb`的相关参数\n2. adapter将会自动加载` conf/rdb `下的所有`.yml`结尾的表映射配置文件\n\n#### 适配器列表\n\n```yaml\n#最简单的处理, 将受到的变更事件通过日志打印的方式进行输出, 如配置所示, 只需要定义name: logger即可\n...\n outerAdapters: \n - name: logger \n```\n\n#### RDB表映射文件\n\n修改 `conf/rdb/mytest_user.yml`文件:\n\n```yml\ndataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值\ndestination: sys_info # cannal的instance或者MQ的topic\ngroupId: # 对应MQ模式下的groupId, 只会同步对应groupId的数据\nouterAdapterKey: mysql1 # adapter key, 对应上面配置outAdapters中的key\nconcurrent: true # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!\ndbMapping:\n database: sys_info # 源数据源的database/shcema\n table: user # 源数据源表名\n targetTable: sys_info.tb_user # 目标数据源的库名.表名\n targetPk: # 主键映射\n id: id # 如果是复合主键可以换行映射多个\n# mapAll: true # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射,则以targetColumns配置为准)\n targetColumns: # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填\n id:\n name:\n role_id:\n```\n\n如果两个库之间表、字段都相同可直接进行镜像备份,`Mysql` 库间镜像`schema DDL DML`同步\n\n```yml\n## Mirror schema synchronize config\ndataSourceKey: defaultDS\ndestination: sys_info\ngroupId: g1\nouterAdapterKey: mysql1\nconcurrent: true\ndbMapping:\n mirrorDb: true\n database: sys_info\n```\n\n其中`dbMapping.database`的值代表源库和目标库的`schema`名称,即两库的`schema`要一模一样\n\n#### 启动\n\n将目标库的`jdbc jar`包放入`lib`文件夹 (其他数据库放入对应的驱动)\n\n启动`canal-adapter`启动器\n\n```bash\nbin/startup.sh\n```\n\n验证 修改`mysql sys_info.user`表的数据, 将会自动同步到新`mysql`数据库的`sys_info.user`表下面, 并会打出`DML`的`log`\n\n#### adapter管理REST接口\n\n- 查询所有订阅同步的`canal instance`或`MQ topic`\n\n```shell\ncurl http://127.0.0.1:8081/destinations\n```\n\n- 数据同步开关\n\n```shell\ncurl http://127.0.0.1:8081/syncSwitch/sys_info/off -X PUT\n```\n\n针对 `sys_info`这个`canal instance/MQ topic` 进行开关操作. `off`代表关闭,` instance/topic`下的同步将阻塞或者断开连接不再接收数据, on代表开启\n\n注: 如果在配置文件中配置了 `zookeeperHosts `项, 则会使用分布式锁来控制`HA`中的数据同步开关, 如果是单机模式则使用本地锁来控制开关\n\n- 数据同步开关状态\n\n```shell\ncurl http://127.0.0.1:8081/syncSwitch/sys_info\n```\n\n查看指定 canal instance/MQ topic 的数据同步开关状态\n\n## 增加Prometheus监控\n\n安装并部署对应平台的`prometheus`,参见[这里](prometheus-grafana)\n\n配置`prometheus.yml`,添加`canal`的`job`,示例:\n\n```yml\n - job_name: 'canal'\n static_configs:\n - targets: ['localhost:11112'] //端口配置即为canal.properties中的canal.metrics.pull.port\n```\n\n导入模板([Canal_instances_tmpl.json](https://raw.githubusercontent.com/alibaba/canal/master/deployer/src/main/resources/metrics/Canal_instances_tmpl.json)),参考[这里](http://docs.grafana.org/reference/export_import/#importing-a-dashboard)\n\n\n\n导入后效果:\n\n\n\n参考地址:\n\nhttps://github.com/alibaba/canal/wiki/QuickStart\n\nhttps://github.com/alibaba/canal/wiki/Docker-QuickStart\n\nhttps://github.com/alibaba/canal/wiki/ClientAdapter\n\nhttps://github.com/alibaba/canal/wiki/Sync-RDB\n\nhttps://github.com/alibaba/canal/wiki/Prometheus-QuickStart","source":"_posts/use-canal.md","raw":"---\n\ntitle: 使用canal进行mysql数据实时同步\ndate: 2020-03-07 14:00:42\ntags: [canal,mysql,canal-server,canal-adapter]\ncategories: [学习,data]\n---\n\n## 场景\n\n对数据库进行实时增量备份。\n\n## 安装配置\n\n#### 准备\n\n`mysql`数据库需要先开启 `Binlog `写入功能,配置` binlog-format` 为 `ROW `模式,`my.cnf `中配置如下\n\n```properties\n[mysqld]\nlog-bin=mysql-bin # 开启 binlog\nbinlog-format=ROW # 选择 ROW 模式\nserver_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复\n```\n\n#### 拉取Docker镜像\n\n使用`docker`启动`canal-server`\n\n1. 访问`docker hub`获取最新的版本 访问:https://hub.docker.com/r/canal/canal-server/tags/\n2. 下载对应的版本\n\n```shell\ndocker pull canal/canal-server:lastet\n```\n\n#### 启动(单机模式)\n\n使用`canal`提供的`run.sh`脚本:\n\n https://github.com/alibaba/canal/blob/master/docker/run.sh\n\n```shell\n# 下载脚本\nwget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh \n# 构建一个destination name为sys_info的队列,命令中mysql的链接地址为需要备份的数据库\nsh run.sh -e canal.auto.scan=false \\\n\t\t -e canal.destinations=sys_info \\\n\t\t -e canal.instance.master.address=***.mysql.***.rds.aliyuncs.com:3306 \\\n\t\t -e canal.instance.dbUsername=**** \\\n\t\t -e canal.instance.dbPassword=**** \\\n\t\t -e canal.instance.connectionCharset=UTF-8 \\\n\t\t -e canal.instance.tsdb.enable=true \\\n\t\t -e canal.instance.gtidon=false \n```\n\n`docker`模式下,单`docker`实例只能运行一个`instance`,主要为配置问题。\n\n#### 运行效果\n\n\n\nsuccessful代表`canal-server`启动成功。\n\n### 启动canal-adapter\n\n#### 配置\n\n`canal-adapter`下载地址:https://github.com/alibaba/canal/releases\n\n获取对应`canal-server(canal.deployer)`版本的`canal-adapter`\n\n\n\n最好使用稳定版本\n\n```shell\n#下载canal-adapter \n#${version} 为对应版本 如 1.1.4\nwget https://github.com/alibaba/canal/releases/download/canal-${version}/canal.adapter-${version}.tar.gz \n#下载后解压到指定目录\ntar -zxvf canal.adapter-${version}.tar.gz -C canal-adapter\n```\n\n修改配置文件` conf/application.yml`为:\n\n```yaml\nserver:\n port: 8081\nspring:\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n default-property-inclusion: non_null\n\ncanal.conf:\n mode: tcp # kafka rocketMQ\n canalServerHost: 127.0.0.1:11111\n batchSize: 500\n syncBatchSize: 1000\n retries: 0\n timeout:\n canalAdapters:\n - instance: sys_info # canal instance Name or mq topic name \n groups:\n - groupId: g1\n outerAdapters:\n #- name: logger\n - name: rdb # 指定为rdb类型同步 # 接收数据的新数据库\n key: mysql1 # 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应\n properties:\n jdbc.driverClassName: com.mysql.jdbc.Driver # jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下\n jdbc.url: jdbc:mysql://***.***.rds.aliyuncs.com:3306/sys_info?useUnicode=true # jdbc url\n jdbc.username: **** # jdbc username\n jdbc.password: **** # jdbc password\n threads: 5 # 并行执行的线程数, 默认为1\n\n```\n\n1. 其中 `outAdapter` 的配置: `name`统一为`rdb`,` key`为对应的数据源的唯一标识需和下面的表映射文件中的`outerAdapterKey`对应,` properties`为目标库`jdb`的相关参数\n2. adapter将会自动加载` conf/rdb `下的所有`.yml`结尾的表映射配置文件\n\n#### 适配器列表\n\n```yaml\n#最简单的处理, 将受到的变更事件通过日志打印的方式进行输出, 如配置所示, 只需要定义name: logger即可\n...\n outerAdapters: \n - name: logger \n```\n\n#### RDB表映射文件\n\n修改 `conf/rdb/mytest_user.yml`文件:\n\n```yml\ndataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值\ndestination: sys_info # cannal的instance或者MQ的topic\ngroupId: # 对应MQ模式下的groupId, 只会同步对应groupId的数据\nouterAdapterKey: mysql1 # adapter key, 对应上面配置outAdapters中的key\nconcurrent: true # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!\ndbMapping:\n database: sys_info # 源数据源的database/shcema\n table: user # 源数据源表名\n targetTable: sys_info.tb_user # 目标数据源的库名.表名\n targetPk: # 主键映射\n id: id # 如果是复合主键可以换行映射多个\n# mapAll: true # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射,则以targetColumns配置为准)\n targetColumns: # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填\n id:\n name:\n role_id:\n```\n\n如果两个库之间表、字段都相同可直接进行镜像备份,`Mysql` 库间镜像`schema DDL DML`同步\n\n```yml\n## Mirror schema synchronize config\ndataSourceKey: defaultDS\ndestination: sys_info\ngroupId: g1\nouterAdapterKey: mysql1\nconcurrent: true\ndbMapping:\n mirrorDb: true\n database: sys_info\n```\n\n其中`dbMapping.database`的值代表源库和目标库的`schema`名称,即两库的`schema`要一模一样\n\n#### 启动\n\n将目标库的`jdbc jar`包放入`lib`文件夹 (其他数据库放入对应的驱动)\n\n启动`canal-adapter`启动器\n\n```bash\nbin/startup.sh\n```\n\n验证 修改`mysql sys_info.user`表的数据, 将会自动同步到新`mysql`数据库的`sys_info.user`表下面, 并会打出`DML`的`log`\n\n#### adapter管理REST接口\n\n- 查询所有订阅同步的`canal instance`或`MQ topic`\n\n```shell\ncurl http://127.0.0.1:8081/destinations\n```\n\n- 数据同步开关\n\n```shell\ncurl http://127.0.0.1:8081/syncSwitch/sys_info/off -X PUT\n```\n\n针对 `sys_info`这个`canal instance/MQ topic` 进行开关操作. `off`代表关闭,` instance/topic`下的同步将阻塞或者断开连接不再接收数据, on代表开启\n\n注: 如果在配置文件中配置了 `zookeeperHosts `项, 则会使用分布式锁来控制`HA`中的数据同步开关, 如果是单机模式则使用本地锁来控制开关\n\n- 数据同步开关状态\n\n```shell\ncurl http://127.0.0.1:8081/syncSwitch/sys_info\n```\n\n查看指定 canal instance/MQ topic 的数据同步开关状态\n\n## 增加Prometheus监控\n\n安装并部署对应平台的`prometheus`,参见[这里](prometheus-grafana)\n\n配置`prometheus.yml`,添加`canal`的`job`,示例:\n\n```yml\n - job_name: 'canal'\n static_configs:\n - targets: ['localhost:11112'] //端口配置即为canal.properties中的canal.metrics.pull.port\n```\n\n导入模板([Canal_instances_tmpl.json](https://raw.githubusercontent.com/alibaba/canal/master/deployer/src/main/resources/metrics/Canal_instances_tmpl.json)),参考[这里](http://docs.grafana.org/reference/export_import/#importing-a-dashboard)\n\n\n\n导入后效果:\n\n\n\n参考地址:\n\nhttps://github.com/alibaba/canal/wiki/QuickStart\n\nhttps://github.com/alibaba/canal/wiki/Docker-QuickStart\n\nhttps://github.com/alibaba/canal/wiki/ClientAdapter\n\nhttps://github.com/alibaba/canal/wiki/Sync-RDB\n\nhttps://github.com/alibaba/canal/wiki/Prometheus-QuickStart","slug":"use-canal","published":1,"updated":"2020-09-13T06:59:24.587Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2hb001a58sy0ph5cedm","content":"<h2 id=\"场景\"><a href=\"#场景\" class=\"headerlink\" title=\"场景\"></a>场景</h2><p>对数据库进行实时增量备份。</p>\n<h2 id=\"安装配置\"><a href=\"#安装配置\" class=\"headerlink\" title=\"安装配置\"></a>安装配置</h2><h4 id=\"准备\"><a href=\"#准备\" class=\"headerlink\" title=\"准备\"></a>准备</h4><p><code>mysql</code>数据库需要先开启 <code>Binlog</code>写入功能,配置<code>binlog-format</code> 为 <code>ROW</code>模式,<code>my.cnf</code>中配置如下</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[mysqld]</span><br><span class=\"line\">log-bin=mysql-bin # 开启 binlog</span><br><span class=\"line\">binlog-format=ROW # 选择 ROW 模式</span><br><span class=\"line\">server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"拉取Docker镜像\"><a href=\"#拉取Docker镜像\" class=\"headerlink\" title=\"拉取Docker镜像\"></a>拉取Docker镜像</h4><p>使用<code>docker</code>启动<code>canal-server</code></p>\n<ol>\n<li>访问<code>docker hub</code>获取最新的版本 访问:<a href=\"https://hub.docker.com/r/canal/canal-server/tags/\" target=\"_blank\" rel=\"noopener\">https://hub.docker.com/r/canal/canal-server/tags/</a></li>\n<li>下载对应的版本</li>\n</ol>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker pull canal/canal-server:lastet</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"启动(单机模式)\"><a href=\"#启动(单机模式)\" class=\"headerlink\" title=\"启动(单机模式)\"></a>启动(单机模式)</h4><p>使用<code>canal</code>提供的<code>run.sh</code>脚本:</p>\n<p> <a href=\"https://github.com/alibaba/canal/blob/master/docker/run.sh\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/blob/master/docker/run.sh</a></p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 下载脚本</span></span><br><span class=\"line\">wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh </span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 构建一个destination name为sys_info的队列,命令中mysql的链接地址为需要备份的数据库</span></span><br><span class=\"line\">sh run.sh -e canal.auto.scan=false \\</span><br><span class=\"line\">\t\t -e canal.destinations=sys_info \\</span><br><span class=\"line\">\t\t -e canal.instance.master.address=***.mysql.***.rds.aliyuncs.com:3306 \\</span><br><span class=\"line\">\t\t -e canal.instance.dbUsername=**** \\</span><br><span class=\"line\">\t\t -e canal.instance.dbPassword=**** \\</span><br><span class=\"line\">\t\t -e canal.instance.connectionCharset=UTF-8 \\</span><br><span class=\"line\">\t\t -e canal.instance.tsdb.enable=true \\</span><br><span class=\"line\">\t\t -e canal.instance.gtidon=false</span><br></pre></td></tr></table></figure>\n\n<p><code>docker</code>模式下,单<code>docker</code>实例只能运行一个<code>instance</code>,主要为配置问题。</p>\n<h4 id=\"运行效果\"><a href=\"#运行效果\" class=\"headerlink\" title=\"运行效果\"></a>运行效果</h4><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307141300.png\" alt></p>\n<p>successful代表<code>canal-server</code>启动成功。</p>\n<h3 id=\"启动canal-adapter\"><a href=\"#启动canal-adapter\" class=\"headerlink\" title=\"启动canal-adapter\"></a>启动canal-adapter</h3><h4 id=\"配置\"><a href=\"#配置\" class=\"headerlink\" title=\"配置\"></a>配置</h4><p><code>canal-adapter</code>下载地址:<a href=\"https://github.com/alibaba/canal/releases\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/releases</a></p>\n<p>获取对应<code>canal-server(canal.deployer)</code>版本的<code>canal-adapter</code></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307142325.png\" alt></p>\n<p>最好使用稳定版本</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">下载canal-adapter </span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"><span class=\"variable\">${version}</span> 为对应版本 如 1.1.4</span></span><br><span class=\"line\">wget https://github.com/alibaba/canal/releases/download/canal-${version}/canal.adapter-${version}.tar.gz </span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">下载后解压到指定目录</span></span><br><span class=\"line\">tar -zxvf canal.adapter-${version}.tar.gz -C canal-adapter</span><br></pre></td></tr></table></figure>\n\n<p>修改配置文件<code>conf/application.yml</code>为:</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">server:</span></span><br><span class=\"line\"> <span class=\"attr\">port:</span> <span class=\"number\">8081</span></span><br><span class=\"line\"><span class=\"attr\">spring:</span></span><br><span class=\"line\"> <span class=\"attr\">jackson:</span></span><br><span class=\"line\"> <span class=\"attr\">date-format:</span> <span class=\"string\">yyyy-MM-dd</span> <span class=\"string\">HH:mm:ss</span></span><br><span class=\"line\"> <span class=\"attr\">time-zone:</span> <span class=\"string\">GMT+8</span></span><br><span class=\"line\"> <span class=\"attr\">default-property-inclusion:</span> <span class=\"string\">non_null</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">canal.conf:</span></span><br><span class=\"line\"> <span class=\"attr\">mode:</span> <span class=\"string\">tcp</span> <span class=\"comment\"># kafka rocketMQ</span></span><br><span class=\"line\"> <span class=\"attr\">canalServerHost:</span> <span class=\"number\">127.0</span><span class=\"number\">.0</span><span class=\"number\">.1</span><span class=\"string\">:11111</span></span><br><span class=\"line\"> <span class=\"attr\">batchSize:</span> <span class=\"number\">500</span></span><br><span class=\"line\"> <span class=\"attr\">syncBatchSize:</span> <span class=\"number\">1000</span></span><br><span class=\"line\"> <span class=\"attr\">retries:</span> <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"attr\">timeout:</span></span><br><span class=\"line\"> <span class=\"attr\">canalAdapters:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">instance:</span> <span class=\"string\">sys_info</span> <span class=\"comment\"># canal instance Name or mq topic name </span></span><br><span class=\"line\"> <span class=\"attr\">groups:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">groupId:</span> <span class=\"string\">g1</span></span><br><span class=\"line\"> <span class=\"attr\">outerAdapters:</span></span><br><span class=\"line\"> <span class=\"comment\">#- name: logger</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">name:</span> <span class=\"string\">rdb</span> <span class=\"comment\"># 指定为rdb类型同步 # 接收数据的新数据库</span></span><br><span class=\"line\"> <span class=\"attr\">key:</span> <span class=\"string\">mysql1</span> <span class=\"comment\"># 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应</span></span><br><span class=\"line\"> <span class=\"attr\">properties:</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.driverClassName:</span> <span class=\"string\">com.mysql.jdbc.Driver</span> <span class=\"comment\"># jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.url:</span> <span class=\"string\">jdbc:mysql://***.***.rds.aliyuncs.com:3306/sys_info?useUnicode=true</span> <span class=\"comment\"># jdbc url</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.username:</span> <span class=\"string\">****</span> <span class=\"comment\"># jdbc username</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.password:</span> <span class=\"string\">****</span> <span class=\"comment\"># jdbc password</span></span><br><span class=\"line\"> <span class=\"attr\">threads:</span> <span class=\"number\">5</span> <span class=\"comment\"># 并行执行的线程数, 默认为1</span></span><br></pre></td></tr></table></figure>\n\n<ol>\n<li>其中 <code>outAdapter</code> 的配置: <code>name</code>统一为<code>rdb</code>,<code>key</code>为对应的数据源的唯一标识需和下面的表映射文件中的<code>outerAdapterKey</code>对应,<code>properties</code>为目标库<code>jdb</code>的相关参数</li>\n<li>adapter将会自动加载<code>conf/rdb</code>下的所有<code>.yml</code>结尾的表映射配置文件</li>\n</ol>\n<h4 id=\"适配器列表\"><a href=\"#适配器列表\" class=\"headerlink\" title=\"适配器列表\"></a>适配器列表</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#最简单的处理, 将受到的变更事件通过日志打印的方式进行输出, 如配置所示, 只需要定义name: logger即可</span></span><br><span class=\"line\"><span class=\"string\">...</span></span><br><span class=\"line\"> <span class=\"attr\">outerAdapters:</span> </span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">name:</span> <span class=\"string\">logger</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"RDB表映射文件\"><a href=\"#RDB表映射文件\" class=\"headerlink\" title=\"RDB表映射文件\"></a>RDB表映射文件</h4><p>修改 <code>conf/rdb/mytest_user.yml</code>文件:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">dataSourceKey:</span> <span class=\"string\">defaultDS</span> <span class=\"comment\"># 源数据源的key, 对应上面配置的srcDataSources中的值</span></span><br><span class=\"line\"><span class=\"attr\">destination:</span> <span class=\"string\">sys_info</span> <span class=\"comment\"># cannal的instance或者MQ的topic</span></span><br><span class=\"line\"><span class=\"attr\">groupId:</span> <span class=\"comment\"># 对应MQ模式下的groupId, 只会同步对应groupId的数据</span></span><br><span class=\"line\"><span class=\"attr\">outerAdapterKey:</span> <span class=\"string\">mysql1</span> <span class=\"comment\"># adapter key, 对应上面配置outAdapters中的key</span></span><br><span class=\"line\"><span class=\"attr\">concurrent:</span> <span class=\"literal\">true</span> <span class=\"comment\"># 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!</span></span><br><span class=\"line\"><span class=\"attr\">dbMapping:</span></span><br><span class=\"line\"> <span class=\"attr\">database:</span> <span class=\"string\">sys_info</span> <span class=\"comment\"># 源数据源的database/shcema</span></span><br><span class=\"line\"> <span class=\"attr\">table:</span> <span class=\"string\">user</span> <span class=\"comment\"># 源数据源表名</span></span><br><span class=\"line\"> <span class=\"attr\">targetTable:</span> <span class=\"string\">sys_info.tb_user</span> <span class=\"comment\"># 目标数据源的库名.表名</span></span><br><span class=\"line\"> <span class=\"attr\">targetPk:</span> <span class=\"comment\"># 主键映射</span></span><br><span class=\"line\"> <span class=\"attr\">id:</span> <span class=\"string\">id</span> <span class=\"comment\"># 如果是复合主键可以换行映射多个</span></span><br><span class=\"line\"><span class=\"comment\"># mapAll: true # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射,则以targetColumns配置为准)</span></span><br><span class=\"line\"> <span class=\"attr\">targetColumns:</span> <span class=\"comment\"># 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填</span></span><br><span class=\"line\"> <span class=\"attr\">id:</span></span><br><span class=\"line\"> <span class=\"attr\">name:</span></span><br><span class=\"line\"> <span class=\"attr\">role_id:</span></span><br></pre></td></tr></table></figure>\n\n<p>如果两个库之间表、字段都相同可直接进行镜像备份,<code>Mysql</code> 库间镜像<code>schema DDL DML</code>同步</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">## Mirror schema synchronize config</span></span><br><span class=\"line\"><span class=\"attr\">dataSourceKey:</span> <span class=\"string\">defaultDS</span></span><br><span class=\"line\"><span class=\"attr\">destination:</span> <span class=\"string\">sys_info</span></span><br><span class=\"line\"><span class=\"attr\">groupId:</span> <span class=\"string\">g1</span></span><br><span class=\"line\"><span class=\"attr\">outerAdapterKey:</span> <span class=\"string\">mysql1</span></span><br><span class=\"line\"><span class=\"attr\">concurrent:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">dbMapping:</span></span><br><span class=\"line\"> <span class=\"attr\">mirrorDb:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"> <span class=\"attr\">database:</span> <span class=\"string\">sys_info</span></span><br></pre></td></tr></table></figure>\n\n<p>其中<code>dbMapping.database</code>的值代表源库和目标库的<code>schema</code>名称,即两库的<code>schema</code>要一模一样</p>\n<h4 id=\"启动\"><a href=\"#启动\" class=\"headerlink\" title=\"启动\"></a>启动</h4><p>将目标库的<code>jdbc jar</code>包放入<code>lib</code>文件夹 (其他数据库放入对应的驱动)</p>\n<p>启动<code>canal-adapter</code>启动器</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">bin/startup.sh</span><br></pre></td></tr></table></figure>\n\n<p>验证 修改<code>mysql sys_info.user</code>表的数据, 将会自动同步到新<code>mysql</code>数据库的<code>sys_info.user</code>表下面, 并会打出<code>DML</code>的<code>log</code></p>\n<h4 id=\"adapter管理REST接口\"><a href=\"#adapter管理REST接口\" class=\"headerlink\" title=\"adapter管理REST接口\"></a>adapter管理REST接口</h4><ul>\n<li>查询所有订阅同步的<code>canal instance</code>或<code>MQ topic</code></li>\n</ul>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:8081/destinations</span><br></pre></td></tr></table></figure>\n\n<ul>\n<li>数据同步开关</li>\n</ul>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:8081/syncSwitch/sys_info/off -X PUT</span><br></pre></td></tr></table></figure>\n\n<p>针对 <code>sys_info</code>这个<code>canal instance/MQ topic</code> 进行开关操作. <code>off</code>代表关闭,<code>instance/topic</code>下的同步将阻塞或者断开连接不再接收数据, on代表开启</p>\n<p>注: 如果在配置文件中配置了 <code>zookeeperHosts</code>项, 则会使用分布式锁来控制<code>HA</code>中的数据同步开关, 如果是单机模式则使用本地锁来控制开关</p>\n<ul>\n<li>数据同步开关状态</li>\n</ul>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:8081/syncSwitch/sys_info</span><br></pre></td></tr></table></figure>\n\n<p>查看指定 canal instance/MQ topic 的数据同步开关状态</p>\n<h2 id=\"增加Prometheus监控\"><a href=\"#增加Prometheus监控\" class=\"headerlink\" title=\"增加Prometheus监控\"></a>增加Prometheus监控</h2><p>安装并部署对应平台的<code>prometheus</code>,参见<a href=\"prometheus-grafana\">这里</a></p>\n<p>配置<code>prometheus.yml</code>,添加<code>canal</code>的<code>job</code>,示例:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"bullet\">-</span> <span class=\"attr\">job_name:</span> <span class=\"string\">'canal'</span></span><br><span class=\"line\"> <span class=\"attr\">static_configs:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">targets:</span> <span class=\"string\">['localhost:11112']</span> <span class=\"string\">//端口配置即为canal.properties中的canal.metrics.pull.port</span></span><br></pre></td></tr></table></figure>\n\n<p>导入模板(<a href=\"https://raw.githubusercontent.com/alibaba/canal/master/deployer/src/main/resources/metrics/Canal_instances_tmpl.json\" target=\"_blank\" rel=\"noopener\">Canal_instances_tmpl.json</a>),参考<a href=\"http://docs.grafana.org/reference/export_import/#importing-a-dashboard\" target=\"_blank\" rel=\"noopener\">这里</a></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307150301.png\" alt></p>\n<p>导入后效果:</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307145939.png\" alt></p>\n<p>参考地址:</p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/QuickStart\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/QuickStart</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/Docker-QuickStart\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/Docker-QuickStart</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/ClientAdapter\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/ClientAdapter</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/Sync-RDB\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/Sync-RDB</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/Prometheus-QuickStart\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/Prometheus-QuickStart</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h2 id=\"场景\"><a href=\"#场景\" class=\"headerlink\" title=\"场景\"></a>场景</h2><p>对数据库进行实时增量备份。</p>\n<h2 id=\"安装配置\"><a href=\"#安装配置\" class=\"headerlink\" title=\"安装配置\"></a>安装配置</h2><h4 id=\"准备\"><a href=\"#准备\" class=\"headerlink\" title=\"准备\"></a>准备</h4><p><code>mysql</code>数据库需要先开启 <code>Binlog</code>写入功能,配置<code>binlog-format</code> 为 <code>ROW</code>模式,<code>my.cnf</code>中配置如下</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[mysqld]</span><br><span class=\"line\">log-bin=mysql-bin # 开启 binlog</span><br><span class=\"line\">binlog-format=ROW # 选择 ROW 模式</span><br><span class=\"line\">server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"拉取Docker镜像\"><a href=\"#拉取Docker镜像\" class=\"headerlink\" title=\"拉取Docker镜像\"></a>拉取Docker镜像</h4><p>使用<code>docker</code>启动<code>canal-server</code></p>\n<ol>\n<li>访问<code>docker hub</code>获取最新的版本 访问:<a href=\"https://hub.docker.com/r/canal/canal-server/tags/\" target=\"_blank\" rel=\"noopener\">https://hub.docker.com/r/canal/canal-server/tags/</a></li>\n<li>下载对应的版本</li>\n</ol>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker pull canal/canal-server:lastet</span><br></pre></td></tr></table></figure>\n\n<h4 id=\"启动(单机模式)\"><a href=\"#启动(单机模式)\" class=\"headerlink\" title=\"启动(单机模式)\"></a>启动(单机模式)</h4><p>使用<code>canal</code>提供的<code>run.sh</code>脚本:</p>\n<p> <a href=\"https://github.com/alibaba/canal/blob/master/docker/run.sh\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/blob/master/docker/run.sh</a></p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 下载脚本</span></span><br><span class=\"line\">wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh </span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"> 构建一个destination name为sys_info的队列,命令中mysql的链接地址为需要备份的数据库</span></span><br><span class=\"line\">sh run.sh -e canal.auto.scan=false \\</span><br><span class=\"line\">\t\t -e canal.destinations=sys_info \\</span><br><span class=\"line\">\t\t -e canal.instance.master.address=***.mysql.***.rds.aliyuncs.com:3306 \\</span><br><span class=\"line\">\t\t -e canal.instance.dbUsername=**** \\</span><br><span class=\"line\">\t\t -e canal.instance.dbPassword=**** \\</span><br><span class=\"line\">\t\t -e canal.instance.connectionCharset=UTF-8 \\</span><br><span class=\"line\">\t\t -e canal.instance.tsdb.enable=true \\</span><br><span class=\"line\">\t\t -e canal.instance.gtidon=false</span><br></pre></td></tr></table></figure>\n\n<p><code>docker</code>模式下,单<code>docker</code>实例只能运行一个<code>instance</code>,主要为配置问题。</p>\n<h4 id=\"运行效果\"><a href=\"#运行效果\" class=\"headerlink\" title=\"运行效果\"></a>运行效果</h4><p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307141300.png\" alt></p>\n<p>successful代表<code>canal-server</code>启动成功。</p>\n<h3 id=\"启动canal-adapter\"><a href=\"#启动canal-adapter\" class=\"headerlink\" title=\"启动canal-adapter\"></a>启动canal-adapter</h3><h4 id=\"配置\"><a href=\"#配置\" class=\"headerlink\" title=\"配置\"></a>配置</h4><p><code>canal-adapter</code>下载地址:<a href=\"https://github.com/alibaba/canal/releases\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/releases</a></p>\n<p>获取对应<code>canal-server(canal.deployer)</code>版本的<code>canal-adapter</code></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307142325.png\" alt></p>\n<p>最好使用稳定版本</p>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">下载canal-adapter </span></span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\"><span class=\"variable\">${version}</span> 为对应版本 如 1.1.4</span></span><br><span class=\"line\">wget https://github.com/alibaba/canal/releases/download/canal-${version}/canal.adapter-${version}.tar.gz </span><br><span class=\"line\"><span class=\"meta\">#</span><span class=\"bash\">下载后解压到指定目录</span></span><br><span class=\"line\">tar -zxvf canal.adapter-${version}.tar.gz -C canal-adapter</span><br></pre></td></tr></table></figure>\n\n<p>修改配置文件<code>conf/application.yml</code>为:</p>\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">server:</span></span><br><span class=\"line\"> <span class=\"attr\">port:</span> <span class=\"number\">8081</span></span><br><span class=\"line\"><span class=\"attr\">spring:</span></span><br><span class=\"line\"> <span class=\"attr\">jackson:</span></span><br><span class=\"line\"> <span class=\"attr\">date-format:</span> <span class=\"string\">yyyy-MM-dd</span> <span class=\"string\">HH:mm:ss</span></span><br><span class=\"line\"> <span class=\"attr\">time-zone:</span> <span class=\"string\">GMT+8</span></span><br><span class=\"line\"> <span class=\"attr\">default-property-inclusion:</span> <span class=\"string\">non_null</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">canal.conf:</span></span><br><span class=\"line\"> <span class=\"attr\">mode:</span> <span class=\"string\">tcp</span> <span class=\"comment\"># kafka rocketMQ</span></span><br><span class=\"line\"> <span class=\"attr\">canalServerHost:</span> <span class=\"number\">127.0</span><span class=\"number\">.0</span><span class=\"number\">.1</span><span class=\"string\">:11111</span></span><br><span class=\"line\"> <span class=\"attr\">batchSize:</span> <span class=\"number\">500</span></span><br><span class=\"line\"> <span class=\"attr\">syncBatchSize:</span> <span class=\"number\">1000</span></span><br><span class=\"line\"> <span class=\"attr\">retries:</span> <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"attr\">timeout:</span></span><br><span class=\"line\"> <span class=\"attr\">canalAdapters:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">instance:</span> <span class=\"string\">sys_info</span> <span class=\"comment\"># canal instance Name or mq topic name </span></span><br><span class=\"line\"> <span class=\"attr\">groups:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">groupId:</span> <span class=\"string\">g1</span></span><br><span class=\"line\"> <span class=\"attr\">outerAdapters:</span></span><br><span class=\"line\"> <span class=\"comment\">#- name: logger</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">name:</span> <span class=\"string\">rdb</span> <span class=\"comment\"># 指定为rdb类型同步 # 接收数据的新数据库</span></span><br><span class=\"line\"> <span class=\"attr\">key:</span> <span class=\"string\">mysql1</span> <span class=\"comment\"># 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应</span></span><br><span class=\"line\"> <span class=\"attr\">properties:</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.driverClassName:</span> <span class=\"string\">com.mysql.jdbc.Driver</span> <span class=\"comment\"># jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.url:</span> <span class=\"string\">jdbc:mysql://***.***.rds.aliyuncs.com:3306/sys_info?useUnicode=true</span> <span class=\"comment\"># jdbc url</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.username:</span> <span class=\"string\">****</span> <span class=\"comment\"># jdbc username</span></span><br><span class=\"line\"> <span class=\"attr\">jdbc.password:</span> <span class=\"string\">****</span> <span class=\"comment\"># jdbc password</span></span><br><span class=\"line\"> <span class=\"attr\">threads:</span> <span class=\"number\">5</span> <span class=\"comment\"># 并行执行的线程数, 默认为1</span></span><br></pre></td></tr></table></figure>\n\n<ol>\n<li>其中 <code>outAdapter</code> 的配置: <code>name</code>统一为<code>rdb</code>,<code>key</code>为对应的数据源的唯一标识需和下面的表映射文件中的<code>outerAdapterKey</code>对应,<code>properties</code>为目标库<code>jdb</code>的相关参数</li>\n<li>adapter将会自动加载<code>conf/rdb</code>下的所有<code>.yml</code>结尾的表映射配置文件</li>\n</ol>\n<h4 id=\"适配器列表\"><a href=\"#适配器列表\" class=\"headerlink\" title=\"适配器列表\"></a>适配器列表</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#最简单的处理, 将受到的变更事件通过日志打印的方式进行输出, 如配置所示, 只需要定义name: logger即可</span></span><br><span class=\"line\"><span class=\"string\">...</span></span><br><span class=\"line\"> <span class=\"attr\">outerAdapters:</span> </span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">name:</span> <span class=\"string\">logger</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"RDB表映射文件\"><a href=\"#RDB表映射文件\" class=\"headerlink\" title=\"RDB表映射文件\"></a>RDB表映射文件</h4><p>修改 <code>conf/rdb/mytest_user.yml</code>文件:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">dataSourceKey:</span> <span class=\"string\">defaultDS</span> <span class=\"comment\"># 源数据源的key, 对应上面配置的srcDataSources中的值</span></span><br><span class=\"line\"><span class=\"attr\">destination:</span> <span class=\"string\">sys_info</span> <span class=\"comment\"># cannal的instance或者MQ的topic</span></span><br><span class=\"line\"><span class=\"attr\">groupId:</span> <span class=\"comment\"># 对应MQ模式下的groupId, 只会同步对应groupId的数据</span></span><br><span class=\"line\"><span class=\"attr\">outerAdapterKey:</span> <span class=\"string\">mysql1</span> <span class=\"comment\"># adapter key, 对应上面配置outAdapters中的key</span></span><br><span class=\"line\"><span class=\"attr\">concurrent:</span> <span class=\"literal\">true</span> <span class=\"comment\"># 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!</span></span><br><span class=\"line\"><span class=\"attr\">dbMapping:</span></span><br><span class=\"line\"> <span class=\"attr\">database:</span> <span class=\"string\">sys_info</span> <span class=\"comment\"># 源数据源的database/shcema</span></span><br><span class=\"line\"> <span class=\"attr\">table:</span> <span class=\"string\">user</span> <span class=\"comment\"># 源数据源表名</span></span><br><span class=\"line\"> <span class=\"attr\">targetTable:</span> <span class=\"string\">sys_info.tb_user</span> <span class=\"comment\"># 目标数据源的库名.表名</span></span><br><span class=\"line\"> <span class=\"attr\">targetPk:</span> <span class=\"comment\"># 主键映射</span></span><br><span class=\"line\"> <span class=\"attr\">id:</span> <span class=\"string\">id</span> <span class=\"comment\"># 如果是复合主键可以换行映射多个</span></span><br><span class=\"line\"><span class=\"comment\"># mapAll: true # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射,则以targetColumns配置为准)</span></span><br><span class=\"line\"> <span class=\"attr\">targetColumns:</span> <span class=\"comment\"># 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填</span></span><br><span class=\"line\"> <span class=\"attr\">id:</span></span><br><span class=\"line\"> <span class=\"attr\">name:</span></span><br><span class=\"line\"> <span class=\"attr\">role_id:</span></span><br></pre></td></tr></table></figure>\n\n<p>如果两个库之间表、字段都相同可直接进行镜像备份,<code>Mysql</code> 库间镜像<code>schema DDL DML</code>同步</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">## Mirror schema synchronize config</span></span><br><span class=\"line\"><span class=\"attr\">dataSourceKey:</span> <span class=\"string\">defaultDS</span></span><br><span class=\"line\"><span class=\"attr\">destination:</span> <span class=\"string\">sys_info</span></span><br><span class=\"line\"><span class=\"attr\">groupId:</span> <span class=\"string\">g1</span></span><br><span class=\"line\"><span class=\"attr\">outerAdapterKey:</span> <span class=\"string\">mysql1</span></span><br><span class=\"line\"><span class=\"attr\">concurrent:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"><span class=\"attr\">dbMapping:</span></span><br><span class=\"line\"> <span class=\"attr\">mirrorDb:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"> <span class=\"attr\">database:</span> <span class=\"string\">sys_info</span></span><br></pre></td></tr></table></figure>\n\n<p>其中<code>dbMapping.database</code>的值代表源库和目标库的<code>schema</code>名称,即两库的<code>schema</code>要一模一样</p>\n<h4 id=\"启动\"><a href=\"#启动\" class=\"headerlink\" title=\"启动\"></a>启动</h4><p>将目标库的<code>jdbc jar</code>包放入<code>lib</code>文件夹 (其他数据库放入对应的驱动)</p>\n<p>启动<code>canal-adapter</code>启动器</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">bin/startup.sh</span><br></pre></td></tr></table></figure>\n\n<p>验证 修改<code>mysql sys_info.user</code>表的数据, 将会自动同步到新<code>mysql</code>数据库的<code>sys_info.user</code>表下面, 并会打出<code>DML</code>的<code>log</code></p>\n<h4 id=\"adapter管理REST接口\"><a href=\"#adapter管理REST接口\" class=\"headerlink\" title=\"adapter管理REST接口\"></a>adapter管理REST接口</h4><ul>\n<li>查询所有订阅同步的<code>canal instance</code>或<code>MQ topic</code></li>\n</ul>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:8081/destinations</span><br></pre></td></tr></table></figure>\n\n<ul>\n<li>数据同步开关</li>\n</ul>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:8081/syncSwitch/sys_info/off -X PUT</span><br></pre></td></tr></table></figure>\n\n<p>针对 <code>sys_info</code>这个<code>canal instance/MQ topic</code> 进行开关操作. <code>off</code>代表关闭,<code>instance/topic</code>下的同步将阻塞或者断开连接不再接收数据, on代表开启</p>\n<p>注: 如果在配置文件中配置了 <code>zookeeperHosts</code>项, 则会使用分布式锁来控制<code>HA</code>中的数据同步开关, 如果是单机模式则使用本地锁来控制开关</p>\n<ul>\n<li>数据同步开关状态</li>\n</ul>\n<figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">curl http://127.0.0.1:8081/syncSwitch/sys_info</span><br></pre></td></tr></table></figure>\n\n<p>查看指定 canal instance/MQ topic 的数据同步开关状态</p>\n<h2 id=\"增加Prometheus监控\"><a href=\"#增加Prometheus监控\" class=\"headerlink\" title=\"增加Prometheus监控\"></a>增加Prometheus监控</h2><p>安装并部署对应平台的<code>prometheus</code>,参见<a href=\"prometheus-grafana\">这里</a></p>\n<p>配置<code>prometheus.yml</code>,添加<code>canal</code>的<code>job</code>,示例:</p>\n<figure class=\"highlight yml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"bullet\">-</span> <span class=\"attr\">job_name:</span> <span class=\"string\">'canal'</span></span><br><span class=\"line\"> <span class=\"attr\">static_configs:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"attr\">targets:</span> <span class=\"string\">['localhost:11112']</span> <span class=\"string\">//端口配置即为canal.properties中的canal.metrics.pull.port</span></span><br></pre></td></tr></table></figure>\n\n<p>导入模板(<a href=\"https://raw.githubusercontent.com/alibaba/canal/master/deployer/src/main/resources/metrics/Canal_instances_tmpl.json\" target=\"_blank\" rel=\"noopener\">Canal_instances_tmpl.json</a>),参考<a href=\"http://docs.grafana.org/reference/export_import/#importing-a-dashboard\" target=\"_blank\" rel=\"noopener\">这里</a></p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307150301.png\" alt></p>\n<p>导入后效果:</p>\n<p><img src=\"https://azrael-1252339850.cos.ap-chengdu.myqcloud.com/20200307145939.png\" alt></p>\n<p>参考地址:</p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/QuickStart\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/QuickStart</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/Docker-QuickStart\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/Docker-QuickStart</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/ClientAdapter\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/ClientAdapter</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/Sync-RDB\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/Sync-RDB</a></p>\n<p><a href=\"https://github.com/alibaba/canal/wiki/Prometheus-QuickStart\" target=\"_blank\" rel=\"noopener\">https://github.com/alibaba/canal/wiki/Prometheus-QuickStart</a></p>\n"},{"title":"Spring boot分库分表方案","date":"2019-09-11T08:51:59.000Z","_content":"\n\n\n\n### 问题\n\n> 因业务原因需要实现查询多库操作,目前多个库中表结构相同。\n\n> 同时使用mysql数据库和sqlserver数据库。\n\n\n\n### Sharding-jdbc方案\n\n#### 项目配置\n\n依赖\n\n```xml\n <dependency>\n <groupId>io.shardingsphere</groupId>\n <artifactId>sharding-jdbc-core</artifactId>\n <version>${shardingsphere.version}</version>\n </dependency>\n```\n\n##### 配置sharding-jdbc参数\n\n\n```java\npackage com.jiahua.ddxdataserver.config;\n\nimport com.zaxxer.hikari.HikariDataSource;\nimport io.shardingsphere.api.config.rule.ShardingRuleConfiguration;\nimport io.shardingsphere.api.config.rule.TableRuleConfiguration;\nimport io.shardingsphere.api.config.strategy.NoneShardingStrategyConfiguration;\nimport io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\nimport java.sql.SQLException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Properties;\nimport java.util.concurrent.ConcurrentHashMap;\n\n@Configuration\npublic class DataSourceShardingConfig {\n\n /**\n * 需要手动配置事务管理器\n */\n @Bean\n public DataSourceTransactionManager transactionManager(@Qualifier(\"dataSource\") DataSource dataSource) {\n return new DataSourceTransactionManager(dataSource);\n }\n\n @Bean(name = \"dataSource\")\n @Primary\n public DataSource dataSource() throws SQLException {\n ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();\n // 设置分表策略\n shardingRuleConfig.getTableRuleConfigs().add(orderTableRule());\n shardingRuleConfig.setDefaultDataSourceName(\"ds0\");\n shardingRuleConfig.setDefaultTableShardingStrategyConfig(new NoneShardingStrategyConfiguration());\n\n Properties properties = new Properties();\n properties.setProperty(\"sql.show\", \"true\");\n\n return ShardingDataSourceFactory.createDataSource(dataSourceMap(), shardingRuleConfig, new ConcurrentHashMap<>(16), properties);\n }\n\n private TableRuleConfiguration orderTableRule() {\n TableRuleConfiguration tableRule = new TableRuleConfiguration();\n // 设置逻辑表名\n tableRule.setLogicTable(\"top_XXX\");\n // ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1}\n tableRule.setActualDataNodes(\"ds${0..2}.top_order\");\n return tableRule;\n }\n\n\n private Map<String, DataSource> dataSourceMap() {\n Map<String, DataSource> dataSourceMap = new HashMap<>(16);\n\n // 配置第一个数据源\n HikariDataSource ds0 = new HikariDataSource();\n ds0.setDriverClassName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\");\n ds0.setJdbcUrl(\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX1\");\n ds0.setUsername(\"XXXX\");\n ds0.setPassword(\"XXXX\");\n\n // 配置第二个数据源\n HikariDataSource ds1 = new HikariDataSource();\n ds1.setDriverClassName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\");\n ds1.setJdbcUrl(\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX2\");\n ds1.setUsername(\"XXXX\");\n ds1.setPassword(\"XXXX\");\n\n // 配置第三个数据源\n HikariDataSource ds2 = new HikariDataSource();\n ds2.setDriverClassName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\");\n ds2.setJdbcUrl(\"jdbc:sqlserver://192.168.XX.XX:1433; DatabaseName=XXXX3\");\n ds2.setUsername(\"XXXX\");\n ds2.setPassword(\"XXXX\");\n\n dataSourceMap.put(\"ds0\", ds0);\n dataSourceMap.put(\"ds1\", ds1);\n dataSourceMap.put(\"ds2\", ds2);\n return dataSourceMap;\n }\n\n\n\n}\n\n```\n\n##### 存在问题\n\n> 使用后发现,sqlserver数据库中nvarchar类型无法对应java中String类型,报错如下:\n\n```java\norg.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'top_sku_properties_name' from result set. Cause: java.sql.SQLFeatureNotSupportedException: getNString\n; getNString; nested exception is java.sql.SQLFeatureNotSupportedException: getNString\n```\n\n> 暂未找到解决办法,改用mycat.\n\n---\n\n\n\n### Mycat方案\n\nmycat官网 [http://mycat.io/](http://mycat.io/)\n\n#### mycat配置\n\n##### server.xml\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- - - Licensed under the Apache License, Version 2.0 (the \"License\"); \n\t- you may not use this file except in compliance with the License. - You \n\tmay obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 \n\t- - Unless required by applicable law or agreed to in writing, software - \n\tdistributed under the License is distributed on an \"AS IS\" BASIS, - WITHOUT \n\tWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the \n\tLicense for the specific language governing permissions and - limitations \n\tunder the License. -->\n<!DOCTYPE mycat:server SYSTEM \"server.dtd\">\n<mycat:server xmlns:mycat=\"http://io.mycat/\">\n\t<system>\n\t<property name=\"nonePasswordLogin\">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->\n\t<property name=\"useHandshakeV10\">1</property>\n\t<property name=\"useSqlStat\">0</property> <!-- 1为开启实时统计、0为关闭 -->\n\t<property name=\"useGlobleTableCheck\">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->\n\t\t<property name=\"sqlExecuteTimeout\">300</property> <!-- SQL 执行超时 单位:秒-->\n\t\t<property name=\"sequnceHandlerType\">2</property>\n\t\t<!--<property name=\"sequnceHandlerPattern\">(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+</property>-->\n\t\t<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->\n\t\t<property name=\"sequnceHandlerPattern\">(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+</property>\n\t<property name=\"subqueryRelationshipCheck\">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->\n <!-- <property name=\"useCompression\">1</property>--> <!--1为开启mysql压缩协议-->\n <!-- <property name=\"fakeMySQLVersion\">5.6.20</property>--> <!--设置模拟的MySQL版本号-->\n\t<!-- <property name=\"processorBufferChunk\">40960</property> -->\n\t<!-- \n\t<property name=\"processors\">1</property> \n\t<property name=\"processorExecutor\">32</property> \n\t -->\n <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->\n\t\t<property name=\"processorBufferPoolType\">0</property>\n\t\t<!--默认是65535 64K 用于sql解析时最大文本长度 -->\n\t\t<!--<property name=\"maxStringLiteralLength\">65535</property>-->\n\t\t<!--<property name=\"sequnceHandlerType\">0</property>-->\n\t\t<!--<property name=\"backSocketNoDelay\">1</property>-->\n\t\t<!--<property name=\"frontSocketNoDelay\">1</property>-->\n\t\t<!--<property name=\"processorExecutor\">16</property>-->\n\t\t<!--\n\t\t\t<property name=\"serverPort\">8066</property> <property name=\"managerPort\">9066</property> \n\t\t\t<property name=\"idleTimeout\">300000</property> <property name=\"bindIp\">0.0.0.0</property>\n\t\t\t<property name=\"dataNodeIdleCheckPeriod\">300000</property> 5 * 60 * 1000L; //连接空闲检查\n\t\t\t<property name=\"frontWriteQueueSize\">4096</property> <property name=\"processors\">32</property> -->\n\t\t<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->\n\t\t<property name=\"handleDistributedTransactions\">0</property>\n\t\t\n\t\t\t<!--\n\t\t\toff heap for merge/order/group/limit 1开启 0关闭\n\t\t-->\n\t\t<property name=\"useOffHeapForMerge\">1</property>\n\n\t\t<!--\n\t\t\t单位为m\n\t\t-->\n <property name=\"memoryPageSize\">64k</property>\n\n\t\t<!--\n\t\t\t单位为k\n\t\t-->\n\t\t<property name=\"spillsFileBufferSize\">1k</property>\n\n\t\t<property name=\"useStreamOutput\">0</property>\n\n\t\t<!--\n\t\t\t单位为m\n\t\t-->\n\t\t<property name=\"systemReserveMemorySize\">384m</property>\n\n\n\t\t<!--是否采用zookeeper协调切换 -->\n\t\t<property name=\"useZKSwitch\">false</property>\n\n\t\t<!-- XA Recovery Log日志路径 -->\n\t\t<!--<property name=\"XARecoveryLogBaseDir\">./</property>-->\n\n\t\t<!-- XA Recovery Log日志名称 -->\n\t\t<!--<property name=\"XARecoveryLogBaseName\">tmlog</property>-->\n\t\t<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->\n\t\t<property name=\"strictTxIsolation\">false</property>\n\t\t\n\t\t<property name=\"useZKSwitch\">true</property>\n\t\t\n\t</system>\n\n<user name=\"xxxx\">\n\t\t<property name=\"password\">xxxx</property>\n\t\t<property name=\"schemas\">box</property>\n\t</user>\n\n\n</mycat:server>\n\n```\n\n\n\n##### schema.xml\n\n```xml\n<?xml version=\"1.0\"?>\n<!DOCTYPE mycat:schema SYSTEM \"schema.dtd\">\n<mycat:schema xmlns:mycat=\"http://io.mycat/\">\n\n\t<schema name=\"box\" checkSQLschema=\"false\" sqlMaxLimit=\"100\">\n\t\t<!-- 需要查询的表 -->\n\t\t<table name=\"top_xxx\" dataNode=\"ds0,ds1,ds3\" needAddLimit=\"false\" />\n\t\t<table name=\"top_xxxx\" dataNode=\"ds0,ds1,ds3\" needAddLimit=\"false\" />\n\t</schema>\n\n <!-- 数据库节点 -->\n\t<dataNode name=\"ds0\" dataHost=\"sqlserver1\" database=\"xxx1\" />\n\t<dataNode name=\"ds1\" dataHost=\"sqlserver1\" database=\"xxx2\" />\n\t<dataNode name=\"ds3\" dataHost=\"sqlserver1\" database=\"xxx3\" />\n \n\t<!-- sqlserver数据库配置 以jdbc方式链接 -->\n\t<dataHost name=\"sqlserver1\" maxCon=\"1000\" minCon=\"10\" balance=\"0\"\n\t\t\t writeType=\"0\" dbType=\"sqlserver\" dbDriver=\"jdbc\" >\n\t\t<heartbeat></heartbeat>\n\t\t<connectionInitSql></connectionInitSql>\n\t\t<writeHost host=\"hostM1\" url=\"jdbc:sqlserver://192.168.xx.xx:1433\" user=\"xxxx\"\n\t\t\t\t password=\"xxxx\" >\n\t\t\t\t</writeHost>\n\n\t</dataHost>\n\t\n</mycat:schema>\n```\n\n> `server.xml`中`user`标签对应`schema.xml`中`writeHost`标签的`user`.\n\n\n\n##### rule.xml\n\n不使用规则可不配置rule.xml (待研究.\n\n#### 启动mycat\n\n```shell\nmycat start\n```\n\n> mycat启动后默认端口为8066,用户名、密码、数据库为`server.xml`中`user`的配置.\n>\n> 例:\n\n```xml\n<user name=\"xxxx\">\n\t<property name=\"password\">xxxx</property>\n\t<property name=\"schemas\">box</property>\n</user>\n```\n\n\n> mycat启动后,项目中配置数据源后即可使用.\n\n#### 使用多数据源\n\n同时链接mysql和mycat。\n\n参考 [多数据源配置](/2019/09/11/use-multi-datasource/)\n\n\n\n##### 参考:\n\n[https://github.com/xkcoding/spring-boot-demo](https://github.com/xkcoding/spring-boot-demo)\n\n[http://www.mycat.io/document/mycat-definitive-guide.pdf](http://www.mycat.io/document/mycat-definitive-guide.pdf)","source":"_posts/use-mycat.md","raw":"---\ntitle: Spring boot分库分表方案\ndate: 2019-09-11 16:51:59\ntags: [mycat,database,sharding-jdbc,分库分表,sqlserver]\ncategories: [学习]\n---\n\n\n\n\n### 问题\n\n> 因业务原因需要实现查询多库操作,目前多个库中表结构相同。\n\n> 同时使用mysql数据库和sqlserver数据库。\n\n\n\n### Sharding-jdbc方案\n\n#### 项目配置\n\n依赖\n\n```xml\n <dependency>\n <groupId>io.shardingsphere</groupId>\n <artifactId>sharding-jdbc-core</artifactId>\n <version>${shardingsphere.version}</version>\n </dependency>\n```\n\n##### 配置sharding-jdbc参数\n\n\n```java\npackage com.jiahua.ddxdataserver.config;\n\nimport com.zaxxer.hikari.HikariDataSource;\nimport io.shardingsphere.api.config.rule.ShardingRuleConfiguration;\nimport io.shardingsphere.api.config.rule.TableRuleConfiguration;\nimport io.shardingsphere.api.config.strategy.NoneShardingStrategyConfiguration;\nimport io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\nimport java.sql.SQLException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Properties;\nimport java.util.concurrent.ConcurrentHashMap;\n\n@Configuration\npublic class DataSourceShardingConfig {\n\n /**\n * 需要手动配置事务管理器\n */\n @Bean\n public DataSourceTransactionManager transactionManager(@Qualifier(\"dataSource\") DataSource dataSource) {\n return new DataSourceTransactionManager(dataSource);\n }\n\n @Bean(name = \"dataSource\")\n @Primary\n public DataSource dataSource() throws SQLException {\n ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();\n // 设置分表策略\n shardingRuleConfig.getTableRuleConfigs().add(orderTableRule());\n shardingRuleConfig.setDefaultDataSourceName(\"ds0\");\n shardingRuleConfig.setDefaultTableShardingStrategyConfig(new NoneShardingStrategyConfiguration());\n\n Properties properties = new Properties();\n properties.setProperty(\"sql.show\", \"true\");\n\n return ShardingDataSourceFactory.createDataSource(dataSourceMap(), shardingRuleConfig, new ConcurrentHashMap<>(16), properties);\n }\n\n private TableRuleConfiguration orderTableRule() {\n TableRuleConfiguration tableRule = new TableRuleConfiguration();\n // 设置逻辑表名\n tableRule.setLogicTable(\"top_XXX\");\n // ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1}\n tableRule.setActualDataNodes(\"ds${0..2}.top_order\");\n return tableRule;\n }\n\n\n private Map<String, DataSource> dataSourceMap() {\n Map<String, DataSource> dataSourceMap = new HashMap<>(16);\n\n // 配置第一个数据源\n HikariDataSource ds0 = new HikariDataSource();\n ds0.setDriverClassName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\");\n ds0.setJdbcUrl(\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX1\");\n ds0.setUsername(\"XXXX\");\n ds0.setPassword(\"XXXX\");\n\n // 配置第二个数据源\n HikariDataSource ds1 = new HikariDataSource();\n ds1.setDriverClassName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\");\n ds1.setJdbcUrl(\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX2\");\n ds1.setUsername(\"XXXX\");\n ds1.setPassword(\"XXXX\");\n\n // 配置第三个数据源\n HikariDataSource ds2 = new HikariDataSource();\n ds2.setDriverClassName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\");\n ds2.setJdbcUrl(\"jdbc:sqlserver://192.168.XX.XX:1433; DatabaseName=XXXX3\");\n ds2.setUsername(\"XXXX\");\n ds2.setPassword(\"XXXX\");\n\n dataSourceMap.put(\"ds0\", ds0);\n dataSourceMap.put(\"ds1\", ds1);\n dataSourceMap.put(\"ds2\", ds2);\n return dataSourceMap;\n }\n\n\n\n}\n\n```\n\n##### 存在问题\n\n> 使用后发现,sqlserver数据库中nvarchar类型无法对应java中String类型,报错如下:\n\n```java\norg.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'top_sku_properties_name' from result set. Cause: java.sql.SQLFeatureNotSupportedException: getNString\n; getNString; nested exception is java.sql.SQLFeatureNotSupportedException: getNString\n```\n\n> 暂未找到解决办法,改用mycat.\n\n---\n\n\n\n### Mycat方案\n\nmycat官网 [http://mycat.io/](http://mycat.io/)\n\n#### mycat配置\n\n##### server.xml\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- - - Licensed under the Apache License, Version 2.0 (the \"License\"); \n\t- you may not use this file except in compliance with the License. - You \n\tmay obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 \n\t- - Unless required by applicable law or agreed to in writing, software - \n\tdistributed under the License is distributed on an \"AS IS\" BASIS, - WITHOUT \n\tWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the \n\tLicense for the specific language governing permissions and - limitations \n\tunder the License. -->\n<!DOCTYPE mycat:server SYSTEM \"server.dtd\">\n<mycat:server xmlns:mycat=\"http://io.mycat/\">\n\t<system>\n\t<property name=\"nonePasswordLogin\">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->\n\t<property name=\"useHandshakeV10\">1</property>\n\t<property name=\"useSqlStat\">0</property> <!-- 1为开启实时统计、0为关闭 -->\n\t<property name=\"useGlobleTableCheck\">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->\n\t\t<property name=\"sqlExecuteTimeout\">300</property> <!-- SQL 执行超时 单位:秒-->\n\t\t<property name=\"sequnceHandlerType\">2</property>\n\t\t<!--<property name=\"sequnceHandlerPattern\">(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+</property>-->\n\t\t<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->\n\t\t<property name=\"sequnceHandlerPattern\">(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+</property>\n\t<property name=\"subqueryRelationshipCheck\">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->\n <!-- <property name=\"useCompression\">1</property>--> <!--1为开启mysql压缩协议-->\n <!-- <property name=\"fakeMySQLVersion\">5.6.20</property>--> <!--设置模拟的MySQL版本号-->\n\t<!-- <property name=\"processorBufferChunk\">40960</property> -->\n\t<!-- \n\t<property name=\"processors\">1</property> \n\t<property name=\"processorExecutor\">32</property> \n\t -->\n <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->\n\t\t<property name=\"processorBufferPoolType\">0</property>\n\t\t<!--默认是65535 64K 用于sql解析时最大文本长度 -->\n\t\t<!--<property name=\"maxStringLiteralLength\">65535</property>-->\n\t\t<!--<property name=\"sequnceHandlerType\">0</property>-->\n\t\t<!--<property name=\"backSocketNoDelay\">1</property>-->\n\t\t<!--<property name=\"frontSocketNoDelay\">1</property>-->\n\t\t<!--<property name=\"processorExecutor\">16</property>-->\n\t\t<!--\n\t\t\t<property name=\"serverPort\">8066</property> <property name=\"managerPort\">9066</property> \n\t\t\t<property name=\"idleTimeout\">300000</property> <property name=\"bindIp\">0.0.0.0</property>\n\t\t\t<property name=\"dataNodeIdleCheckPeriod\">300000</property> 5 * 60 * 1000L; //连接空闲检查\n\t\t\t<property name=\"frontWriteQueueSize\">4096</property> <property name=\"processors\">32</property> -->\n\t\t<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->\n\t\t<property name=\"handleDistributedTransactions\">0</property>\n\t\t\n\t\t\t<!--\n\t\t\toff heap for merge/order/group/limit 1开启 0关闭\n\t\t-->\n\t\t<property name=\"useOffHeapForMerge\">1</property>\n\n\t\t<!--\n\t\t\t单位为m\n\t\t-->\n <property name=\"memoryPageSize\">64k</property>\n\n\t\t<!--\n\t\t\t单位为k\n\t\t-->\n\t\t<property name=\"spillsFileBufferSize\">1k</property>\n\n\t\t<property name=\"useStreamOutput\">0</property>\n\n\t\t<!--\n\t\t\t单位为m\n\t\t-->\n\t\t<property name=\"systemReserveMemorySize\">384m</property>\n\n\n\t\t<!--是否采用zookeeper协调切换 -->\n\t\t<property name=\"useZKSwitch\">false</property>\n\n\t\t<!-- XA Recovery Log日志路径 -->\n\t\t<!--<property name=\"XARecoveryLogBaseDir\">./</property>-->\n\n\t\t<!-- XA Recovery Log日志名称 -->\n\t\t<!--<property name=\"XARecoveryLogBaseName\">tmlog</property>-->\n\t\t<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->\n\t\t<property name=\"strictTxIsolation\">false</property>\n\t\t\n\t\t<property name=\"useZKSwitch\">true</property>\n\t\t\n\t</system>\n\n<user name=\"xxxx\">\n\t\t<property name=\"password\">xxxx</property>\n\t\t<property name=\"schemas\">box</property>\n\t</user>\n\n\n</mycat:server>\n\n```\n\n\n\n##### schema.xml\n\n```xml\n<?xml version=\"1.0\"?>\n<!DOCTYPE mycat:schema SYSTEM \"schema.dtd\">\n<mycat:schema xmlns:mycat=\"http://io.mycat/\">\n\n\t<schema name=\"box\" checkSQLschema=\"false\" sqlMaxLimit=\"100\">\n\t\t<!-- 需要查询的表 -->\n\t\t<table name=\"top_xxx\" dataNode=\"ds0,ds1,ds3\" needAddLimit=\"false\" />\n\t\t<table name=\"top_xxxx\" dataNode=\"ds0,ds1,ds3\" needAddLimit=\"false\" />\n\t</schema>\n\n <!-- 数据库节点 -->\n\t<dataNode name=\"ds0\" dataHost=\"sqlserver1\" database=\"xxx1\" />\n\t<dataNode name=\"ds1\" dataHost=\"sqlserver1\" database=\"xxx2\" />\n\t<dataNode name=\"ds3\" dataHost=\"sqlserver1\" database=\"xxx3\" />\n \n\t<!-- sqlserver数据库配置 以jdbc方式链接 -->\n\t<dataHost name=\"sqlserver1\" maxCon=\"1000\" minCon=\"10\" balance=\"0\"\n\t\t\t writeType=\"0\" dbType=\"sqlserver\" dbDriver=\"jdbc\" >\n\t\t<heartbeat></heartbeat>\n\t\t<connectionInitSql></connectionInitSql>\n\t\t<writeHost host=\"hostM1\" url=\"jdbc:sqlserver://192.168.xx.xx:1433\" user=\"xxxx\"\n\t\t\t\t password=\"xxxx\" >\n\t\t\t\t</writeHost>\n\n\t</dataHost>\n\t\n</mycat:schema>\n```\n\n> `server.xml`中`user`标签对应`schema.xml`中`writeHost`标签的`user`.\n\n\n\n##### rule.xml\n\n不使用规则可不配置rule.xml (待研究.\n\n#### 启动mycat\n\n```shell\nmycat start\n```\n\n> mycat启动后默认端口为8066,用户名、密码、数据库为`server.xml`中`user`的配置.\n>\n> 例:\n\n```xml\n<user name=\"xxxx\">\n\t<property name=\"password\">xxxx</property>\n\t<property name=\"schemas\">box</property>\n</user>\n```\n\n\n> mycat启动后,项目中配置数据源后即可使用.\n\n#### 使用多数据源\n\n同时链接mysql和mycat。\n\n参考 [多数据源配置](/2019/09/11/use-multi-datasource/)\n\n\n\n##### 参考:\n\n[https://github.com/xkcoding/spring-boot-demo](https://github.com/xkcoding/spring-boot-demo)\n\n[http://www.mycat.io/document/mycat-definitive-guide.pdf](http://www.mycat.io/document/mycat-definitive-guide.pdf)","slug":"use-mycat","published":1,"updated":"2020-09-13T06:53:54.178Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2hc001c58syughiqcve","content":"<h3 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h3><blockquote>\n<p>因业务原因需要实现查询多库操作,目前多个库中表结构相同。</p>\n</blockquote>\n<blockquote>\n<p>同时使用mysql数据库和sqlserver数据库。</p>\n</blockquote>\n<h3 id=\"Sharding-jdbc方案\"><a href=\"#Sharding-jdbc方案\" class=\"headerlink\" title=\"Sharding-jdbc方案\"></a>Sharding-jdbc方案</h3><h4 id=\"项目配置\"><a href=\"#项目配置\" class=\"headerlink\" title=\"项目配置\"></a>项目配置</h4><p>依赖</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.shardingsphere<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>sharding-jdbc-core<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${shardingsphere.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"配置sharding-jdbc参数\"><a href=\"#配置sharding-jdbc参数\" class=\"headerlink\" title=\"配置sharding-jdbc参数\"></a>配置sharding-jdbc参数</h5><figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br><span class=\"line\">60</span><br><span class=\"line\">61</span><br><span class=\"line\">62</span><br><span class=\"line\">63</span><br><span class=\"line\">64</span><br><span class=\"line\">65</span><br><span class=\"line\">66</span><br><span class=\"line\">67</span><br><span class=\"line\">68</span><br><span class=\"line\">69</span><br><span class=\"line\">70</span><br><span class=\"line\">71</span><br><span class=\"line\">72</span><br><span class=\"line\">73</span><br><span class=\"line\">74</span><br><span class=\"line\">75</span><br><span class=\"line\">76</span><br><span class=\"line\">77</span><br><span class=\"line\">78</span><br><span class=\"line\">79</span><br><span class=\"line\">80</span><br><span class=\"line\">81</span><br><span class=\"line\">82</span><br><span class=\"line\">83</span><br><span class=\"line\">84</span><br><span class=\"line\">85</span><br><span class=\"line\">86</span><br><span class=\"line\">87</span><br><span class=\"line\">88</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">package</span> com.jiahua.ddxdataserver.config;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">import</span> com.zaxxer.hikari.HikariDataSource;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.api.config.rule.ShardingRuleConfiguration;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.api.config.rule.TableRuleConfiguration;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.api.config.strategy.NoneShardingStrategyConfiguration;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.beans.factory.annotation.Qualifier;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.context.annotation.Bean;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.context.annotation.Primary;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.jdbc.datasource.DataSourceTransactionManager;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">import</span> javax.sql.DataSource;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.sql.SQLException;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.HashMap;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.Map;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.Properties;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.concurrent.ConcurrentHashMap;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">@Configuration</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">DataSourceShardingConfig</span> </span>{</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * 需要手动配置事务管理器</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> DataSourceTransactionManager <span class=\"title\">transactionManager</span><span class=\"params\">(@Qualifier(<span class=\"string\">\"dataSource\"</span>)</span> DataSource dataSource) </span>{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">new</span> DataSourceTransactionManager(dataSource);</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span>(name = <span class=\"string\">\"dataSource\"</span>)</span><br><span class=\"line\"> <span class=\"meta\">@Primary</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> DataSource <span class=\"title\">dataSource</span><span class=\"params\">()</span> <span class=\"keyword\">throws</span> SQLException </span>{</span><br><span class=\"line\"> ShardingRuleConfiguration shardingRuleConfig = <span class=\"keyword\">new</span> ShardingRuleConfiguration();</span><br><span class=\"line\"> <span class=\"comment\">// 设置分表策略</span></span><br><span class=\"line\"> shardingRuleConfig.getTableRuleConfigs().add(orderTableRule());</span><br><span class=\"line\"> shardingRuleConfig.setDefaultDataSourceName(<span class=\"string\">\"ds0\"</span>);</span><br><span class=\"line\"> shardingRuleConfig.setDefaultTableShardingStrategyConfig(<span class=\"keyword\">new</span> NoneShardingStrategyConfiguration());</span><br><span class=\"line\"></span><br><span class=\"line\"> Properties properties = <span class=\"keyword\">new</span> Properties();</span><br><span class=\"line\"> properties.setProperty(<span class=\"string\">\"sql.show\"</span>, <span class=\"string\">\"true\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> ShardingDataSourceFactory.createDataSource(dataSourceMap(), shardingRuleConfig, <span class=\"keyword\">new</span> ConcurrentHashMap<>(<span class=\"number\">16</span>), properties);</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">private</span> TableRuleConfiguration <span class=\"title\">orderTableRule</span><span class=\"params\">()</span> </span>{</span><br><span class=\"line\"> TableRuleConfiguration tableRule = <span class=\"keyword\">new</span> TableRuleConfiguration();</span><br><span class=\"line\"> <span class=\"comment\">// 设置逻辑表名</span></span><br><span class=\"line\"> tableRule.setLogicTable(<span class=\"string\">\"top_XXX\"</span>);</span><br><span class=\"line\"> <span class=\"comment\">// ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1}</span></span><br><span class=\"line\"> tableRule.setActualDataNodes(<span class=\"string\">\"ds${0..2}.top_order\"</span>);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> tableRule;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">private</span> Map<String, DataSource> <span class=\"title\">dataSourceMap</span><span class=\"params\">()</span> </span>{</span><br><span class=\"line\"> Map<String, DataSource> dataSourceMap = <span class=\"keyword\">new</span> HashMap<>(<span class=\"number\">16</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">// 配置第一个数据源</span></span><br><span class=\"line\"> HikariDataSource ds0 = <span class=\"keyword\">new</span> HikariDataSource();</span><br><span class=\"line\"> ds0.setDriverClassName(<span class=\"string\">\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"</span>);</span><br><span class=\"line\"> ds0.setJdbcUrl(<span class=\"string\">\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX1\"</span>);</span><br><span class=\"line\"> ds0.setUsername(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"> ds0.setPassword(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">// 配置第二个数据源</span></span><br><span class=\"line\"> HikariDataSource ds1 = <span class=\"keyword\">new</span> HikariDataSource();</span><br><span class=\"line\"> ds1.setDriverClassName(<span class=\"string\">\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"</span>);</span><br><span class=\"line\"> ds1.setJdbcUrl(<span class=\"string\">\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX2\"</span>);</span><br><span class=\"line\"> ds1.setUsername(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"> ds1.setPassword(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">// 配置第三个数据源</span></span><br><span class=\"line\"> HikariDataSource ds2 = <span class=\"keyword\">new</span> HikariDataSource();</span><br><span class=\"line\"> ds2.setDriverClassName(<span class=\"string\">\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"</span>);</span><br><span class=\"line\"> ds2.setJdbcUrl(<span class=\"string\">\"jdbc:sqlserver://192.168.XX.XX:1433; DatabaseName=XXXX3\"</span>);</span><br><span class=\"line\"> ds2.setUsername(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"> ds2.setPassword(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> dataSourceMap.put(<span class=\"string\">\"ds0\"</span>, ds0);</span><br><span class=\"line\"> dataSourceMap.put(<span class=\"string\">\"ds1\"</span>, ds1);</span><br><span class=\"line\"> dataSourceMap.put(<span class=\"string\">\"ds2\"</span>, ds2);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> dataSourceMap;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"存在问题\"><a href=\"#存在问题\" class=\"headerlink\" title=\"存在问题\"></a>存在问题</h5><blockquote>\n<p>使用后发现,sqlserver数据库中nvarchar类型无法对应java中String类型,报错如下:</p>\n</blockquote>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column <span class=\"string\">'top_sku_properties_name'</span> from result set. Cause: java.sql.SQLFeatureNotSupportedException: getNString</span><br><span class=\"line\">; getNString; nested exception is java.sql.SQLFeatureNotSupportedException: getNString</span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p>暂未找到解决办法,改用mycat.</p>\n</blockquote>\n<hr>\n<h3 id=\"Mycat方案\"><a href=\"#Mycat方案\" class=\"headerlink\" title=\"Mycat方案\"></a>Mycat方案</h3><p>mycat官网 <a href=\"http://mycat.io/\" target=\"_blank\" rel=\"noopener\">http://mycat.io/</a></p>\n<h4 id=\"mycat配置\"><a href=\"#mycat配置\" class=\"headerlink\" title=\"mycat配置\"></a>mycat配置</h4><h5 id=\"server-xml\"><a href=\"#server-xml\" class=\"headerlink\" title=\"server.xml\"></a>server.xml</h5><figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br><span class=\"line\">60</span><br><span class=\"line\">61</span><br><span class=\"line\">62</span><br><span class=\"line\">63</span><br><span class=\"line\">64</span><br><span class=\"line\">65</span><br><span class=\"line\">66</span><br><span class=\"line\">67</span><br><span class=\"line\">68</span><br><span class=\"line\">69</span><br><span class=\"line\">70</span><br><span class=\"line\">71</span><br><span class=\"line\">72</span><br><span class=\"line\">73</span><br><span class=\"line\">74</span><br><span class=\"line\">75</span><br><span class=\"line\">76</span><br><span class=\"line\">77</span><br><span class=\"line\">78</span><br><span class=\"line\">79</span><br><span class=\"line\">80</span><br><span class=\"line\">81</span><br><span class=\"line\">82</span><br><span class=\"line\">83</span><br><span class=\"line\">84</span><br><span class=\"line\">85</span><br><span class=\"line\">86</span><br><span class=\"line\">87</span><br><span class=\"line\">88</span><br><span class=\"line\">89</span><br><span class=\"line\">90</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\"><?xml version=\"1.0\" encoding=\"UTF-8\"?></span></span><br><span class=\"line\"><span class=\"comment\"><!-- - - Licensed under the Apache License, Version 2.0 (the \"License\"); </span></span><br><span class=\"line\"><span class=\"comment\">\t- you may not use this file except in compliance with the License. - You </span></span><br><span class=\"line\"><span class=\"comment\">\tmay obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 </span></span><br><span class=\"line\"><span class=\"comment\">\t- - Unless required by applicable law or agreed to in writing, software - </span></span><br><span class=\"line\"><span class=\"comment\">\tdistributed under the License is distributed on an \"AS IS\" BASIS, - WITHOUT </span></span><br><span class=\"line\"><span class=\"comment\">\tWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the </span></span><br><span class=\"line\"><span class=\"comment\">\tLicense for the specific language governing permissions and - limitations </span></span><br><span class=\"line\"><span class=\"comment\">\tunder the License. --></span></span><br><span class=\"line\"><span class=\"meta\"><!DOCTYPE <span class=\"meta-keyword\">mycat</span>:server <span class=\"meta-keyword\">SYSTEM</span> <span class=\"meta-string\">\"server.dtd\"</span>></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">mycat:server</span> <span class=\"attr\">xmlns:mycat</span>=<span class=\"string\">\"http://io.mycat/\"</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">system</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"nonePasswordLogin\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户--></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useHandshakeV10\"</span>></span>1<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useSqlStat\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 1为开启实时统计、0为关闭 --></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useGlobleTableCheck\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 1为开启全加班一致性检测、0为关闭 --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sqlExecuteTimeout\"</span>></span>300<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- SQL 执行超时 单位:秒--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sequnceHandlerType\"</span>></span>2<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"sequnceHandlerPattern\">(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sequnceHandlerPattern\"</span>></span>(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"subqueryRelationshipCheck\"</span>></span>false<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false --></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- <property name=\"useCompression\">1</property>--></span> <span class=\"comment\"><!--1为开启mysql压缩协议--></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- <property name=\"fakeMySQLVersion\">5.6.20</property>--></span> <span class=\"comment\"><!--设置模拟的MySQL版本号--></span></span><br><span class=\"line\">\t<span class=\"comment\"><!-- <property name=\"processorBufferChunk\">40960</property> --></span></span><br><span class=\"line\">\t<span class=\"comment\"><!-- </span></span><br><span class=\"line\"><span class=\"comment\">\t<property name=\"processors\">1</property> </span></span><br><span class=\"line\"><span class=\"comment\">\t<property name=\"processorExecutor\">32</property> </span></span><br><span class=\"line\"><span class=\"comment\">\t --></span></span><br><span class=\"line\"> <span class=\"comment\"><!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"processorBufferPoolType\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--默认是65535 64K 用于sql解析时最大文本长度 --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"maxStringLiteralLength\">65535</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"sequnceHandlerType\">0</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"backSocketNoDelay\">1</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"frontSocketNoDelay\">1</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"processorExecutor\">16</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"serverPort\">8066</property> <property name=\"managerPort\">9066</property> </span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"idleTimeout\">300000</property> <property name=\"bindIp\">0.0.0.0</property></span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"dataNodeIdleCheckPeriod\">300000</property> 5 * 60 * 1000L; //连接空闲检查</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"frontWriteQueueSize\">4096</property> <property name=\"processors\">32</property> --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"handleDistributedTransactions\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t</span><br><span class=\"line\">\t\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\toff heap for merge/order/group/limit 1开启 0关闭</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useOffHeapForMerge\"</span>></span>1<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t单位为m</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"memoryPageSize\"</span>></span>64k<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t单位为k</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"spillsFileBufferSize\"</span>></span>1k<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useStreamOutput\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t单位为m</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"systemReserveMemorySize\"</span>></span>384m<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--是否采用zookeeper协调切换 --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useZKSwitch\"</span>></span>false<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!-- XA Recovery Log日志路径 --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"XARecoveryLogBaseDir\">./</property>--></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!-- XA Recovery Log日志名称 --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"XARecoveryLogBaseName\">tmlog</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"strictTxIsolation\"</span>></span>false<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t</span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useZKSwitch\"</span>></span>true<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t</span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">system</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">user</span> <span class=\"attr\">name</span>=<span class=\"string\">\"xxxx\"</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"password\"</span>></span>xxxx<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"schemas\"</span>></span>box<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">user</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">mycat:server</span>></span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"schema-xml\"><a href=\"#schema-xml\" class=\"headerlink\" title=\"schema.xml\"></a>schema.xml</h5><figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\"><?xml version=\"1.0\"?></span></span><br><span class=\"line\"><span class=\"meta\"><!DOCTYPE <span class=\"meta-keyword\">mycat</span>:schema <span class=\"meta-keyword\">SYSTEM</span> <span class=\"meta-string\">\"schema.dtd\"</span>></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">mycat:schema</span> <span class=\"attr\">xmlns:mycat</span>=<span class=\"string\">\"http://io.mycat/\"</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">schema</span> <span class=\"attr\">name</span>=<span class=\"string\">\"box\"</span> <span class=\"attr\">checkSQLschema</span>=<span class=\"string\">\"false\"</span> <span class=\"attr\">sqlMaxLimit</span>=<span class=\"string\">\"100\"</span>></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!-- 需要查询的表 --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">table</span> <span class=\"attr\">name</span>=<span class=\"string\">\"top_xxx\"</span> <span class=\"attr\">dataNode</span>=<span class=\"string\">\"ds0,ds1,ds3\"</span> <span class=\"attr\">needAddLimit</span>=<span class=\"string\">\"false\"</span> /></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">table</span> <span class=\"attr\">name</span>=<span class=\"string\">\"top_xxxx\"</span> <span class=\"attr\">dataNode</span>=<span class=\"string\">\"ds0,ds1,ds3\"</span> <span class=\"attr\">needAddLimit</span>=<span class=\"string\">\"false\"</span> /></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">schema</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\"><!-- 数据库节点 --></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataNode</span> <span class=\"attr\">name</span>=<span class=\"string\">\"ds0\"</span> <span class=\"attr\">dataHost</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">database</span>=<span class=\"string\">\"xxx1\"</span> /></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataNode</span> <span class=\"attr\">name</span>=<span class=\"string\">\"ds1\"</span> <span class=\"attr\">dataHost</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">database</span>=<span class=\"string\">\"xxx2\"</span> /></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataNode</span> <span class=\"attr\">name</span>=<span class=\"string\">\"ds3\"</span> <span class=\"attr\">dataHost</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">database</span>=<span class=\"string\">\"xxx3\"</span> /></span></span><br><span class=\"line\"> </span><br><span class=\"line\">\t<span class=\"comment\"><!-- sqlserver数据库配置 以jdbc方式链接 --></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataHost</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">maxCon</span>=<span class=\"string\">\"1000\"</span> <span class=\"attr\">minCon</span>=<span class=\"string\">\"10\"</span> <span class=\"attr\">balance</span>=<span class=\"string\">\"0\"</span></span></span><br><span class=\"line\"><span class=\"tag\">\t\t\t <span class=\"attr\">writeType</span>=<span class=\"string\">\"0\"</span> <span class=\"attr\">dbType</span>=<span class=\"string\">\"sqlserver\"</span> <span class=\"attr\">dbDriver</span>=<span class=\"string\">\"jdbc\"</span> ></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">heartbeat</span>></span><span class=\"tag\"></<span class=\"name\">heartbeat</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">connectionInitSql</span>></span><span class=\"tag\"></<span class=\"name\">connectionInitSql</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">writeHost</span> <span class=\"attr\">host</span>=<span class=\"string\">\"hostM1\"</span> <span class=\"attr\">url</span>=<span class=\"string\">\"jdbc:sqlserver://192.168.xx.xx:1433\"</span> <span class=\"attr\">user</span>=<span class=\"string\">\"xxxx\"</span></span></span><br><span class=\"line\"><span class=\"tag\">\t\t\t\t <span class=\"attr\">password</span>=<span class=\"string\">\"xxxx\"</span> ></span></span><br><span class=\"line\">\t\t\t\t<span class=\"tag\"></<span class=\"name\">writeHost</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">dataHost</span>></span></span><br><span class=\"line\">\t</span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">mycat:schema</span>></span></span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p><code>server.xml</code>中<code>user</code>标签对应<code>schema.xml</code>中<code>writeHost</code>标签的<code>user</code>.</p>\n</blockquote>\n<h5 id=\"rule-xml\"><a href=\"#rule-xml\" class=\"headerlink\" title=\"rule.xml\"></a>rule.xml</h5><p>不使用规则可不配置rule.xml (待研究.</p>\n<h4 id=\"启动mycat\"><a href=\"#启动mycat\" class=\"headerlink\" title=\"启动mycat\"></a>启动mycat</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mycat start</span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p>mycat启动后默认端口为8066,用户名、密码、数据库为<code>server.xml</code>中<code>user</code>的配置.</p>\n<p>例:</p>\n</blockquote>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">user</span> <span class=\"attr\">name</span>=<span class=\"string\">\"xxxx\"</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"password\"</span>></span>xxxx<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"schemas\"</span>></span>box<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">user</span>></span></span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p>mycat启动后,项目中配置数据源后即可使用.</p>\n</blockquote>\n<h4 id=\"使用多数据源\"><a href=\"#使用多数据源\" class=\"headerlink\" title=\"使用多数据源\"></a>使用多数据源</h4><p>同时链接mysql和mycat。</p>\n<p>参考 <a href=\"/2019/09/11/use-multi-datasource/\">多数据源配置</a></p>\n<h5 id=\"参考:\"><a href=\"#参考:\" class=\"headerlink\" title=\"参考:\"></a>参考:</h5><p><a href=\"https://github.com/xkcoding/spring-boot-demo\" target=\"_blank\" rel=\"noopener\">https://github.com/xkcoding/spring-boot-demo</a></p>\n<p><a href=\"http://www.mycat.io/document/mycat-definitive-guide.pdf\" target=\"_blank\" rel=\"noopener\">http://www.mycat.io/document/mycat-definitive-guide.pdf</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"问题\"><a href=\"#问题\" class=\"headerlink\" title=\"问题\"></a>问题</h3><blockquote>\n<p>因业务原因需要实现查询多库操作,目前多个库中表结构相同。</p>\n</blockquote>\n<blockquote>\n<p>同时使用mysql数据库和sqlserver数据库。</p>\n</blockquote>\n<h3 id=\"Sharding-jdbc方案\"><a href=\"#Sharding-jdbc方案\" class=\"headerlink\" title=\"Sharding-jdbc方案\"></a>Sharding-jdbc方案</h3><h4 id=\"项目配置\"><a href=\"#项目配置\" class=\"headerlink\" title=\"项目配置\"></a>项目配置</h4><p>依赖</p>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>io.shardingsphere<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>sharding-jdbc-core<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${shardingsphere.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"配置sharding-jdbc参数\"><a href=\"#配置sharding-jdbc参数\" class=\"headerlink\" title=\"配置sharding-jdbc参数\"></a>配置sharding-jdbc参数</h5><figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br><span class=\"line\">60</span><br><span class=\"line\">61</span><br><span class=\"line\">62</span><br><span class=\"line\">63</span><br><span class=\"line\">64</span><br><span class=\"line\">65</span><br><span class=\"line\">66</span><br><span class=\"line\">67</span><br><span class=\"line\">68</span><br><span class=\"line\">69</span><br><span class=\"line\">70</span><br><span class=\"line\">71</span><br><span class=\"line\">72</span><br><span class=\"line\">73</span><br><span class=\"line\">74</span><br><span class=\"line\">75</span><br><span class=\"line\">76</span><br><span class=\"line\">77</span><br><span class=\"line\">78</span><br><span class=\"line\">79</span><br><span class=\"line\">80</span><br><span class=\"line\">81</span><br><span class=\"line\">82</span><br><span class=\"line\">83</span><br><span class=\"line\">84</span><br><span class=\"line\">85</span><br><span class=\"line\">86</span><br><span class=\"line\">87</span><br><span class=\"line\">88</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">package</span> com.jiahua.ddxdataserver.config;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">import</span> com.zaxxer.hikari.HikariDataSource;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.api.config.rule.ShardingRuleConfiguration;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.api.config.rule.TableRuleConfiguration;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.api.config.strategy.NoneShardingStrategyConfiguration;</span><br><span class=\"line\"><span class=\"keyword\">import</span> io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.beans.factory.annotation.Qualifier;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.context.annotation.Bean;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.context.annotation.Primary;</span><br><span class=\"line\"><span class=\"keyword\">import</span> org.springframework.jdbc.datasource.DataSourceTransactionManager;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">import</span> javax.sql.DataSource;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.sql.SQLException;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.HashMap;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.Map;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.Properties;</span><br><span class=\"line\"><span class=\"keyword\">import</span> java.util.concurrent.ConcurrentHashMap;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">@Configuration</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">DataSourceShardingConfig</span> </span>{</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * 需要手动配置事务管理器</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> DataSourceTransactionManager <span class=\"title\">transactionManager</span><span class=\"params\">(@Qualifier(<span class=\"string\">\"dataSource\"</span>)</span> DataSource dataSource) </span>{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">new</span> DataSourceTransactionManager(dataSource);</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span>(name = <span class=\"string\">\"dataSource\"</span>)</span><br><span class=\"line\"> <span class=\"meta\">@Primary</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> DataSource <span class=\"title\">dataSource</span><span class=\"params\">()</span> <span class=\"keyword\">throws</span> SQLException </span>{</span><br><span class=\"line\"> ShardingRuleConfiguration shardingRuleConfig = <span class=\"keyword\">new</span> ShardingRuleConfiguration();</span><br><span class=\"line\"> <span class=\"comment\">// 设置分表策略</span></span><br><span class=\"line\"> shardingRuleConfig.getTableRuleConfigs().add(orderTableRule());</span><br><span class=\"line\"> shardingRuleConfig.setDefaultDataSourceName(<span class=\"string\">\"ds0\"</span>);</span><br><span class=\"line\"> shardingRuleConfig.setDefaultTableShardingStrategyConfig(<span class=\"keyword\">new</span> NoneShardingStrategyConfiguration());</span><br><span class=\"line\"></span><br><span class=\"line\"> Properties properties = <span class=\"keyword\">new</span> Properties();</span><br><span class=\"line\"> properties.setProperty(<span class=\"string\">\"sql.show\"</span>, <span class=\"string\">\"true\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> ShardingDataSourceFactory.createDataSource(dataSourceMap(), shardingRuleConfig, <span class=\"keyword\">new</span> ConcurrentHashMap<>(<span class=\"number\">16</span>), properties);</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">private</span> TableRuleConfiguration <span class=\"title\">orderTableRule</span><span class=\"params\">()</span> </span>{</span><br><span class=\"line\"> TableRuleConfiguration tableRule = <span class=\"keyword\">new</span> TableRuleConfiguration();</span><br><span class=\"line\"> <span class=\"comment\">// 设置逻辑表名</span></span><br><span class=\"line\"> tableRule.setLogicTable(<span class=\"string\">\"top_XXX\"</span>);</span><br><span class=\"line\"> <span class=\"comment\">// ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1}</span></span><br><span class=\"line\"> tableRule.setActualDataNodes(<span class=\"string\">\"ds${0..2}.top_order\"</span>);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> tableRule;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">private</span> Map<String, DataSource> <span class=\"title\">dataSourceMap</span><span class=\"params\">()</span> </span>{</span><br><span class=\"line\"> Map<String, DataSource> dataSourceMap = <span class=\"keyword\">new</span> HashMap<>(<span class=\"number\">16</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">// 配置第一个数据源</span></span><br><span class=\"line\"> HikariDataSource ds0 = <span class=\"keyword\">new</span> HikariDataSource();</span><br><span class=\"line\"> ds0.setDriverClassName(<span class=\"string\">\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"</span>);</span><br><span class=\"line\"> ds0.setJdbcUrl(<span class=\"string\">\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX1\"</span>);</span><br><span class=\"line\"> ds0.setUsername(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"> ds0.setPassword(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">// 配置第二个数据源</span></span><br><span class=\"line\"> HikariDataSource ds1 = <span class=\"keyword\">new</span> HikariDataSource();</span><br><span class=\"line\"> ds1.setDriverClassName(<span class=\"string\">\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"</span>);</span><br><span class=\"line\"> ds1.setJdbcUrl(<span class=\"string\">\"jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=XXXX2\"</span>);</span><br><span class=\"line\"> ds1.setUsername(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"> ds1.setPassword(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">// 配置第三个数据源</span></span><br><span class=\"line\"> HikariDataSource ds2 = <span class=\"keyword\">new</span> HikariDataSource();</span><br><span class=\"line\"> ds2.setDriverClassName(<span class=\"string\">\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"</span>);</span><br><span class=\"line\"> ds2.setJdbcUrl(<span class=\"string\">\"jdbc:sqlserver://192.168.XX.XX:1433; DatabaseName=XXXX3\"</span>);</span><br><span class=\"line\"> ds2.setUsername(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"> ds2.setPassword(<span class=\"string\">\"XXXX\"</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"> dataSourceMap.put(<span class=\"string\">\"ds0\"</span>, ds0);</span><br><span class=\"line\"> dataSourceMap.put(<span class=\"string\">\"ds1\"</span>, ds1);</span><br><span class=\"line\"> dataSourceMap.put(<span class=\"string\">\"ds2\"</span>, ds2);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> dataSourceMap;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n<h5 id=\"存在问题\"><a href=\"#存在问题\" class=\"headerlink\" title=\"存在问题\"></a>存在问题</h5><blockquote>\n<p>使用后发现,sqlserver数据库中nvarchar类型无法对应java中String类型,报错如下:</p>\n</blockquote>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column <span class=\"string\">'top_sku_properties_name'</span> from result set. Cause: java.sql.SQLFeatureNotSupportedException: getNString</span><br><span class=\"line\">; getNString; nested exception is java.sql.SQLFeatureNotSupportedException: getNString</span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p>暂未找到解决办法,改用mycat.</p>\n</blockquote>\n<hr>\n<h3 id=\"Mycat方案\"><a href=\"#Mycat方案\" class=\"headerlink\" title=\"Mycat方案\"></a>Mycat方案</h3><p>mycat官网 <a href=\"http://mycat.io/\" target=\"_blank\" rel=\"noopener\">http://mycat.io/</a></p>\n<h4 id=\"mycat配置\"><a href=\"#mycat配置\" class=\"headerlink\" title=\"mycat配置\"></a>mycat配置</h4><h5 id=\"server-xml\"><a href=\"#server-xml\" class=\"headerlink\" title=\"server.xml\"></a>server.xml</h5><figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br><span class=\"line\">60</span><br><span class=\"line\">61</span><br><span class=\"line\">62</span><br><span class=\"line\">63</span><br><span class=\"line\">64</span><br><span class=\"line\">65</span><br><span class=\"line\">66</span><br><span class=\"line\">67</span><br><span class=\"line\">68</span><br><span class=\"line\">69</span><br><span class=\"line\">70</span><br><span class=\"line\">71</span><br><span class=\"line\">72</span><br><span class=\"line\">73</span><br><span class=\"line\">74</span><br><span class=\"line\">75</span><br><span class=\"line\">76</span><br><span class=\"line\">77</span><br><span class=\"line\">78</span><br><span class=\"line\">79</span><br><span class=\"line\">80</span><br><span class=\"line\">81</span><br><span class=\"line\">82</span><br><span class=\"line\">83</span><br><span class=\"line\">84</span><br><span class=\"line\">85</span><br><span class=\"line\">86</span><br><span class=\"line\">87</span><br><span class=\"line\">88</span><br><span class=\"line\">89</span><br><span class=\"line\">90</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\"><?xml version=\"1.0\" encoding=\"UTF-8\"?></span></span><br><span class=\"line\"><span class=\"comment\"><!-- - - Licensed under the Apache License, Version 2.0 (the \"License\"); </span></span><br><span class=\"line\"><span class=\"comment\">\t- you may not use this file except in compliance with the License. - You </span></span><br><span class=\"line\"><span class=\"comment\">\tmay obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 </span></span><br><span class=\"line\"><span class=\"comment\">\t- - Unless required by applicable law or agreed to in writing, software - </span></span><br><span class=\"line\"><span class=\"comment\">\tdistributed under the License is distributed on an \"AS IS\" BASIS, - WITHOUT </span></span><br><span class=\"line\"><span class=\"comment\">\tWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the </span></span><br><span class=\"line\"><span class=\"comment\">\tLicense for the specific language governing permissions and - limitations </span></span><br><span class=\"line\"><span class=\"comment\">\tunder the License. --></span></span><br><span class=\"line\"><span class=\"meta\"><!DOCTYPE <span class=\"meta-keyword\">mycat</span>:server <span class=\"meta-keyword\">SYSTEM</span> <span class=\"meta-string\">\"server.dtd\"</span>></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">mycat:server</span> <span class=\"attr\">xmlns:mycat</span>=<span class=\"string\">\"http://io.mycat/\"</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">system</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"nonePasswordLogin\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户--></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useHandshakeV10\"</span>></span>1<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useSqlStat\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 1为开启实时统计、0为关闭 --></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useGlobleTableCheck\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 1为开启全加班一致性检测、0为关闭 --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sqlExecuteTimeout\"</span>></span>300<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- SQL 执行超时 单位:秒--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sequnceHandlerType\"</span>></span>2<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"sequnceHandlerPattern\">(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sequnceHandlerPattern\"</span>></span>(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"subqueryRelationshipCheck\"</span>></span>false<span class=\"tag\"></<span class=\"name\">property</span>></span> <span class=\"comment\"><!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false --></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- <property name=\"useCompression\">1</property>--></span> <span class=\"comment\"><!--1为开启mysql压缩协议--></span></span><br><span class=\"line\"> <span class=\"comment\"><!-- <property name=\"fakeMySQLVersion\">5.6.20</property>--></span> <span class=\"comment\"><!--设置模拟的MySQL版本号--></span></span><br><span class=\"line\">\t<span class=\"comment\"><!-- <property name=\"processorBufferChunk\">40960</property> --></span></span><br><span class=\"line\">\t<span class=\"comment\"><!-- </span></span><br><span class=\"line\"><span class=\"comment\">\t<property name=\"processors\">1</property> </span></span><br><span class=\"line\"><span class=\"comment\">\t<property name=\"processorExecutor\">32</property> </span></span><br><span class=\"line\"><span class=\"comment\">\t --></span></span><br><span class=\"line\"> <span class=\"comment\"><!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"processorBufferPoolType\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--默认是65535 64K 用于sql解析时最大文本长度 --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"maxStringLiteralLength\">65535</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"sequnceHandlerType\">0</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"backSocketNoDelay\">1</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"frontSocketNoDelay\">1</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"processorExecutor\">16</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"serverPort\">8066</property> <property name=\"managerPort\">9066</property> </span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"idleTimeout\">300000</property> <property name=\"bindIp\">0.0.0.0</property></span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"dataNodeIdleCheckPeriod\">300000</property> 5 * 60 * 1000L; //连接空闲检查</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t<property name=\"frontWriteQueueSize\">4096</property> <property name=\"processors\">32</property> --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"handleDistributedTransactions\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t</span><br><span class=\"line\">\t\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\toff heap for merge/order/group/limit 1开启 0关闭</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useOffHeapForMerge\"</span>></span>1<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t单位为m</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"memoryPageSize\"</span>></span>64k<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t单位为k</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"spillsFileBufferSize\"</span>></span>1k<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useStreamOutput\"</span>></span>0<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--</span></span><br><span class=\"line\"><span class=\"comment\">\t\t\t单位为m</span></span><br><span class=\"line\"><span class=\"comment\">\t\t--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"systemReserveMemorySize\"</span>></span>384m<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--是否采用zookeeper协调切换 --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useZKSwitch\"</span>></span>false<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!-- XA Recovery Log日志路径 --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"XARecoveryLogBaseDir\">./</property>--></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t\t<span class=\"comment\"><!-- XA Recovery Log日志名称 --></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--<property name=\"XARecoveryLogBaseName\">tmlog</property>--></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接--></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"strictTxIsolation\"</span>></span>false<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t</span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"useZKSwitch\"</span>></span>true<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t</span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">system</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">user</span> <span class=\"attr\">name</span>=<span class=\"string\">\"xxxx\"</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"password\"</span>></span>xxxx<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"schemas\"</span>></span>box<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">user</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">mycat:server</span>></span></span><br></pre></td></tr></table></figure>\n\n<h5 id=\"schema-xml\"><a href=\"#schema-xml\" class=\"headerlink\" title=\"schema.xml\"></a>schema.xml</h5><figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\"><?xml version=\"1.0\"?></span></span><br><span class=\"line\"><span class=\"meta\"><!DOCTYPE <span class=\"meta-keyword\">mycat</span>:schema <span class=\"meta-keyword\">SYSTEM</span> <span class=\"meta-string\">\"schema.dtd\"</span>></span></span><br><span class=\"line\"><span class=\"tag\"><<span class=\"name\">mycat:schema</span> <span class=\"attr\">xmlns:mycat</span>=<span class=\"string\">\"http://io.mycat/\"</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">schema</span> <span class=\"attr\">name</span>=<span class=\"string\">\"box\"</span> <span class=\"attr\">checkSQLschema</span>=<span class=\"string\">\"false\"</span> <span class=\"attr\">sqlMaxLimit</span>=<span class=\"string\">\"100\"</span>></span></span><br><span class=\"line\">\t\t<span class=\"comment\"><!-- 需要查询的表 --></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">table</span> <span class=\"attr\">name</span>=<span class=\"string\">\"top_xxx\"</span> <span class=\"attr\">dataNode</span>=<span class=\"string\">\"ds0,ds1,ds3\"</span> <span class=\"attr\">needAddLimit</span>=<span class=\"string\">\"false\"</span> /></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">table</span> <span class=\"attr\">name</span>=<span class=\"string\">\"top_xxxx\"</span> <span class=\"attr\">dataNode</span>=<span class=\"string\">\"ds0,ds1,ds3\"</span> <span class=\"attr\">needAddLimit</span>=<span class=\"string\">\"false\"</span> /></span></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">schema</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\"><!-- 数据库节点 --></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataNode</span> <span class=\"attr\">name</span>=<span class=\"string\">\"ds0\"</span> <span class=\"attr\">dataHost</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">database</span>=<span class=\"string\">\"xxx1\"</span> /></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataNode</span> <span class=\"attr\">name</span>=<span class=\"string\">\"ds1\"</span> <span class=\"attr\">dataHost</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">database</span>=<span class=\"string\">\"xxx2\"</span> /></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataNode</span> <span class=\"attr\">name</span>=<span class=\"string\">\"ds3\"</span> <span class=\"attr\">dataHost</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">database</span>=<span class=\"string\">\"xxx3\"</span> /></span></span><br><span class=\"line\"> </span><br><span class=\"line\">\t<span class=\"comment\"><!-- sqlserver数据库配置 以jdbc方式链接 --></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">dataHost</span> <span class=\"attr\">name</span>=<span class=\"string\">\"sqlserver1\"</span> <span class=\"attr\">maxCon</span>=<span class=\"string\">\"1000\"</span> <span class=\"attr\">minCon</span>=<span class=\"string\">\"10\"</span> <span class=\"attr\">balance</span>=<span class=\"string\">\"0\"</span></span></span><br><span class=\"line\"><span class=\"tag\">\t\t\t <span class=\"attr\">writeType</span>=<span class=\"string\">\"0\"</span> <span class=\"attr\">dbType</span>=<span class=\"string\">\"sqlserver\"</span> <span class=\"attr\">dbDriver</span>=<span class=\"string\">\"jdbc\"</span> ></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">heartbeat</span>></span><span class=\"tag\"></<span class=\"name\">heartbeat</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">connectionInitSql</span>></span><span class=\"tag\"></<span class=\"name\">connectionInitSql</span>></span></span><br><span class=\"line\">\t\t<span class=\"tag\"><<span class=\"name\">writeHost</span> <span class=\"attr\">host</span>=<span class=\"string\">\"hostM1\"</span> <span class=\"attr\">url</span>=<span class=\"string\">\"jdbc:sqlserver://192.168.xx.xx:1433\"</span> <span class=\"attr\">user</span>=<span class=\"string\">\"xxxx\"</span></span></span><br><span class=\"line\"><span class=\"tag\">\t\t\t\t <span class=\"attr\">password</span>=<span class=\"string\">\"xxxx\"</span> ></span></span><br><span class=\"line\">\t\t\t\t<span class=\"tag\"></<span class=\"name\">writeHost</span>></span></span><br><span class=\"line\"></span><br><span class=\"line\">\t<span class=\"tag\"></<span class=\"name\">dataHost</span>></span></span><br><span class=\"line\">\t</span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">mycat:schema</span>></span></span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p><code>server.xml</code>中<code>user</code>标签对应<code>schema.xml</code>中<code>writeHost</code>标签的<code>user</code>.</p>\n</blockquote>\n<h5 id=\"rule-xml\"><a href=\"#rule-xml\" class=\"headerlink\" title=\"rule.xml\"></a>rule.xml</h5><p>不使用规则可不配置rule.xml (待研究.</p>\n<h4 id=\"启动mycat\"><a href=\"#启动mycat\" class=\"headerlink\" title=\"启动mycat\"></a>启动mycat</h4><figure class=\"highlight shell\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mycat start</span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p>mycat启动后默认端口为8066,用户名、密码、数据库为<code>server.xml</code>中<code>user</code>的配置.</p>\n<p>例:</p>\n</blockquote>\n<figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">user</span> <span class=\"attr\">name</span>=<span class=\"string\">\"xxxx\"</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"password\"</span>></span>xxxx<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\">\t<span class=\"tag\"><<span class=\"name\">property</span> <span class=\"attr\">name</span>=<span class=\"string\">\"schemas\"</span>></span>box<span class=\"tag\"></<span class=\"name\">property</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">user</span>></span></span><br></pre></td></tr></table></figure>\n\n<blockquote>\n<p>mycat启动后,项目中配置数据源后即可使用.</p>\n</blockquote>\n<h4 id=\"使用多数据源\"><a href=\"#使用多数据源\" class=\"headerlink\" title=\"使用多数据源\"></a>使用多数据源</h4><p>同时链接mysql和mycat。</p>\n<p>参考 <a href=\"/2019/09/11/use-multi-datasource/\">多数据源配置</a></p>\n<h5 id=\"参考:\"><a href=\"#参考:\" class=\"headerlink\" title=\"参考:\"></a>参考:</h5><p><a href=\"https://github.com/xkcoding/spring-boot-demo\" target=\"_blank\" rel=\"noopener\">https://github.com/xkcoding/spring-boot-demo</a></p>\n<p><a href=\"http://www.mycat.io/document/mycat-definitive-guide.pdf\" target=\"_blank\" rel=\"noopener\">http://www.mycat.io/document/mycat-definitive-guide.pdf</a></p>\n"},{"title":"Spring boot使用多数据源","date":"2019-09-11T07:56:39.000Z","_content":"\n#### 依赖: pom.xml\n\n```xml\n <dependency>\n <groupId>com.baomidou</groupId>\n <artifactId>dynamic-datasource-spring-boot-starter</artifactId>\n <version>${baomidou.version}</version>\n </dependency>\n```\n\n#### 数据源配置: application.yml\n\n```yaml\nspring:\n datasource:\n dynamic:\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://129.xx.xx.xx:3306/jiahua?useUnicode=true&characterEncoding=UTF-8&useSSL=false\n username: xxxx\n password: xxxx\n slave:\n driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n url: jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=xxx1\n username: xxxx\n password: xxxx\n slave1:\n driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n url: jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=xxx2\n username: xxxx\n password: xxxx\n mp-enabled: true\n```\n\n\n\n#### ServiceImpl\n\n@DS: 注解在类上或方法上来切换数据源,方法上的@DS优先级大于类上的@DS\n默认走从库: @DS(value = \"slave\")在类上,默认走从库,除非在方法在添加@DS(value = \"master\")才走主库\n\n```java\n@Service\n@DS(value = \"slave\")\npublic class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements ItemService {\n /**\n * 类上 {@code @DS(\"slave\")} 代表默认从库,在方法上写 {@code @DS(\"master\")} 代表默认主库\n *\n * @param user 用户\n */\n @DS(\"master\")\n @Override\n public void addUser(User user) {\n baseMapper.insert(user);\n }\n}\n```\n\n","source":"_posts/use-multi-datasource.md","raw":"---\ntitle: Spring boot使用多数据源\ndate: 2019-09-11 15:56:39\ntags: [springboot,多数据源]\ncategories: [学习,java,事务,多数据源]\n---\n\n#### 依赖: pom.xml\n\n```xml\n <dependency>\n <groupId>com.baomidou</groupId>\n <artifactId>dynamic-datasource-spring-boot-starter</artifactId>\n <version>${baomidou.version}</version>\n </dependency>\n```\n\n#### 数据源配置: application.yml\n\n```yaml\nspring:\n datasource:\n dynamic:\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://129.xx.xx.xx:3306/jiahua?useUnicode=true&characterEncoding=UTF-8&useSSL=false\n username: xxxx\n password: xxxx\n slave:\n driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n url: jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=xxx1\n username: xxxx\n password: xxxx\n slave1:\n driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n url: jdbc:sqlserver://192.168.xx.xx:1433; DatabaseName=xxx2\n username: xxxx\n password: xxxx\n mp-enabled: true\n```\n\n\n\n#### ServiceImpl\n\n@DS: 注解在类上或方法上来切换数据源,方法上的@DS优先级大于类上的@DS\n默认走从库: @DS(value = \"slave\")在类上,默认走从库,除非在方法在添加@DS(value = \"master\")才走主库\n\n```java\n@Service\n@DS(value = \"slave\")\npublic class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements ItemService {\n /**\n * 类上 {@code @DS(\"slave\")} 代表默认从库,在方法上写 {@code @DS(\"master\")} 代表默认主库\n *\n * @param user 用户\n */\n @DS(\"master\")\n @Override\n public void addUser(User user) {\n baseMapper.insert(user);\n }\n}\n```\n\n","slug":"use-multi-datasource","published":1,"updated":"2020-09-13T07:00:35.725Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ckf0rn2he001g58sydfq0ayiw","content":"<h4 id=\"依赖:-pom-xml\"><a href=\"#依赖:-pom-xml\" class=\"headerlink\" title=\"依赖: pom.xml\"></a>依赖: pom.xml</h4><figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.baomidou<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>dynamic-datasource-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${baomidou.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"数据源配置:-application-yml\"><a href=\"#数据源配置:-application-yml\" class=\"headerlink\" title=\"数据源配置: application.yml\"></a>数据源配置: application.yml</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">spring:</span></span><br><span class=\"line\"> <span class=\"attr\">datasource:</span></span><br><span class=\"line\"> <span class=\"attr\">dynamic:</span></span><br><span class=\"line\"> <span class=\"attr\">datasource:</span></span><br><span class=\"line\"> <span class=\"attr\">master:</span></span><br><span class=\"line\"> <span class=\"attr\">driver-class-name:</span> <span class=\"string\">com.mysql.cj.jdbc.Driver</span></span><br><span class=\"line\"> <span class=\"attr\">url:</span> <span class=\"string\">jdbc:mysql://129.xx.xx.xx:3306/jiahua?useUnicode=true&characterEncoding=UTF-8&useSSL=false</span></span><br><span class=\"line\"> <span class=\"attr\">username:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">password:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">slave:</span></span><br><span class=\"line\"> <span class=\"attr\">driver-class-name:</span> <span class=\"string\">com.microsoft.sqlserver.jdbc.SQLServerDriver</span></span><br><span class=\"line\"> <span class=\"attr\">url:</span> <span class=\"string\">jdbc:sqlserver://192.168.xx.xx:1433;</span> <span class=\"string\">DatabaseName=xxx1</span></span><br><span class=\"line\"> <span class=\"attr\">username:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">password:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">slave1:</span></span><br><span class=\"line\"> <span class=\"attr\">driver-class-name:</span> <span class=\"string\">com.microsoft.sqlserver.jdbc.SQLServerDriver</span></span><br><span class=\"line\"> <span class=\"attr\">url:</span> <span class=\"string\">jdbc:sqlserver://192.168.xx.xx:1433;</span> <span class=\"string\">DatabaseName=xxx2</span></span><br><span class=\"line\"> <span class=\"attr\">username:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">password:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">mp-enabled:</span> <span class=\"literal\">true</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"ServiceImpl\"><a href=\"#ServiceImpl\" class=\"headerlink\" title=\"ServiceImpl\"></a>ServiceImpl</h4><p>@DS: 注解在类上或方法上来切换数据源,方法上的@DS优先级大于类上的@DS<br>默认走从库: @DS(value = “slave”)在类上,默认走从库,除非在方法在添加@DS(value = “master”)才走主库</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@Service</span></span><br><span class=\"line\"><span class=\"meta\">@DS</span>(value = <span class=\"string\">\"slave\"</span>)</span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ItemServiceImpl</span> <span class=\"keyword\">extends</span> <span class=\"title\">ServiceImpl</span><<span class=\"title\">ItemMapper</span>, <span class=\"title\">Item</span>> <span class=\"keyword\">implements</span> <span class=\"title\">ItemService</span> </span>{</span><br><span class=\"line\"> <span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * 类上 {<span class=\"doctag\">@code</span> <span class=\"doctag\">@DS</span>(\"slave\")} 代表默认从库,在方法上写 {<span class=\"doctag\">@code</span> <span class=\"doctag\">@DS</span>(\"master\")} 代表默认主库</span></span><br><span class=\"line\"><span class=\"comment\"> *</span></span><br><span class=\"line\"><span class=\"comment\"> * <span class=\"doctag\">@param</span> user 用户</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"> <span class=\"meta\">@DS</span>(<span class=\"string\">\"master\"</span>)</span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">addUser</span><span class=\"params\">(User user)</span> </span>{</span><br><span class=\"line\"> baseMapper.insert(user);</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"依赖:-pom-xml\"><a href=\"#依赖:-pom-xml\" class=\"headerlink\" title=\"依赖: pom.xml\"></a>依赖: pom.xml</h4><figure class=\"highlight xml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">dependency</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">groupId</span>></span>com.baomidou<span class=\"tag\"></<span class=\"name\">groupId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">artifactId</span>></span>dynamic-datasource-spring-boot-starter<span class=\"tag\"></<span class=\"name\">artifactId</span>></span></span><br><span class=\"line\"> <span class=\"tag\"><<span class=\"name\">version</span>></span>${baomidou.version}<span class=\"tag\"></<span class=\"name\">version</span>></span></span><br><span class=\"line\"><span class=\"tag\"></<span class=\"name\">dependency</span>></span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"数据源配置:-application-yml\"><a href=\"#数据源配置:-application-yml\" class=\"headerlink\" title=\"数据源配置: application.yml\"></a>数据源配置: application.yml</h4><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">spring:</span></span><br><span class=\"line\"> <span class=\"attr\">datasource:</span></span><br><span class=\"line\"> <span class=\"attr\">dynamic:</span></span><br><span class=\"line\"> <span class=\"attr\">datasource:</span></span><br><span class=\"line\"> <span class=\"attr\">master:</span></span><br><span class=\"line\"> <span class=\"attr\">driver-class-name:</span> <span class=\"string\">com.mysql.cj.jdbc.Driver</span></span><br><span class=\"line\"> <span class=\"attr\">url:</span> <span class=\"string\">jdbc:mysql://129.xx.xx.xx:3306/jiahua?useUnicode=true&characterEncoding=UTF-8&useSSL=false</span></span><br><span class=\"line\"> <span class=\"attr\">username:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">password:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">slave:</span></span><br><span class=\"line\"> <span class=\"attr\">driver-class-name:</span> <span class=\"string\">com.microsoft.sqlserver.jdbc.SQLServerDriver</span></span><br><span class=\"line\"> <span class=\"attr\">url:</span> <span class=\"string\">jdbc:sqlserver://192.168.xx.xx:1433;</span> <span class=\"string\">DatabaseName=xxx1</span></span><br><span class=\"line\"> <span class=\"attr\">username:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">password:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">slave1:</span></span><br><span class=\"line\"> <span class=\"attr\">driver-class-name:</span> <span class=\"string\">com.microsoft.sqlserver.jdbc.SQLServerDriver</span></span><br><span class=\"line\"> <span class=\"attr\">url:</span> <span class=\"string\">jdbc:sqlserver://192.168.xx.xx:1433;</span> <span class=\"string\">DatabaseName=xxx2</span></span><br><span class=\"line\"> <span class=\"attr\">username:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">password:</span> <span class=\"string\">xxxx</span></span><br><span class=\"line\"> <span class=\"attr\">mp-enabled:</span> <span class=\"literal\">true</span></span><br></pre></td></tr></table></figure>\n\n<h4 id=\"ServiceImpl\"><a href=\"#ServiceImpl\" class=\"headerlink\" title=\"ServiceImpl\"></a>ServiceImpl</h4><p>@DS: 注解在类上或方法上来切换数据源,方法上的@DS优先级大于类上的@DS<br>默认走从库: @DS(value = “slave”)在类上,默认走从库,除非在方法在添加@DS(value = “master”)才走主库</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@Service</span></span><br><span class=\"line\"><span class=\"meta\">@DS</span>(value = <span class=\"string\">\"slave\"</span>)</span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ItemServiceImpl</span> <span class=\"keyword\">extends</span> <span class=\"title\">ServiceImpl</span><<span class=\"title\">ItemMapper</span>, <span class=\"title\">Item</span>> <span class=\"keyword\">implements</span> <span class=\"title\">ItemService</span> </span>{</span><br><span class=\"line\"> <span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * 类上 {<span class=\"doctag\">@code</span> <span class=\"doctag\">@DS</span>(\"slave\")} 代表默认从库,在方法上写 {<span class=\"doctag\">@code</span> <span class=\"doctag\">@DS</span>(\"master\")} 代表默认主库</span></span><br><span class=\"line\"><span class=\"comment\"> *</span></span><br><span class=\"line\"><span class=\"comment\"> * <span class=\"doctag\">@param</span> user 用户</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"> <span class=\"meta\">@DS</span>(<span class=\"string\">\"master\"</span>)</span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">addUser</span><span class=\"params\">(User user)</span> </span>{</span><br><span class=\"line\"> baseMapper.insert(user);</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n\n"}],"PostAsset":[{"_id":"source/_posts/build-blog/Githubpicture.png","slug":"Githubpicture.png","post":"ckf0rn2gd000158sytze0zf8w","modified":0,"renderable":0}],"PostCategory":[{"post_id":"ckf0rn2gd000158sytze0zf8w","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2gu000i58syut06behp"},{"post_id":"ckf0rn2gm000958sykhbed2ta","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2h5000x58sylsh123bi"},{"post_id":"ckf0rn2gm000958sykhbed2ta","category_id":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2h6001158syrb7gnzqn"},{"post_id":"ckf0rn2hc001c58syughiqcve","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hg001k58syyl3amowu"},{"post_id":"ckf0rn2gl000758sy1qvlmyde","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hh001p58syo531wef5"},{"post_id":"ckf0rn2gl000758sy1qvlmyde","category_id":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2hi001r58syk8ztlue3"},{"post_id":"ckf0rn2h1000q58syd7ech2qc","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hk002158symu9izc4b"},{"post_id":"ckf0rn2h1000q58syd7ech2qc","category_id":"ckf0rn2hi001v58sy0mq826jl","_id":"ckf0rn2hl002358syci2n0hhl"},{"post_id":"ckf0rn2gp000b58syd6unbt8w","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hm002758syoo7t09ah"},{"post_id":"ckf0rn2gp000b58syd6unbt8w","category_id":"ckf0rn2h2000r58syhf4m8y9o","_id":"ckf0rn2hn002a58sycz77ey1m"},{"post_id":"ckf0rn2gp000b58syd6unbt8w","category_id":"ckf0rn2hk002258sy7n6ndcht","_id":"ckf0rn2hn002d58syb30tg5yv"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hp002j58syads1k06z"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","category_id":"ckf0rn2h5000y58syzd9j2riz","_id":"ckf0rn2hp002l58syz2xcmn29"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","category_id":"ckf0rn2hn002f58sy868tvw93","_id":"ckf0rn2hq002n58sytq3anlvp"},{"post_id":"ckf0rn2h6001258sy9x57hkdx","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hq002p58sy785z6iyz"},{"post_id":"ckf0rn2h6001258sy9x57hkdx","category_id":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2hq002r58sy4hfb956l"},{"post_id":"ckf0rn2h6001258sy9x57hkdx","category_id":"ckf0rn2ho002h58sy7tvum34o","_id":"ckf0rn2hr002u58syapj645o9"},{"post_id":"ckf0rn2h8001658syakx6isjf","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hs002y58syn0d285l3"},{"post_id":"ckf0rn2h8001658syakx6isjf","category_id":"ckf0rn2hq002o58sylxdw4018","_id":"ckf0rn2hu003158synji5nx6t"},{"post_id":"ckf0rn2gh000358sy3mcmary0","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hv003558syti3ihvkg"},{"post_id":"ckf0rn2gh000358sy3mcmary0","category_id":"ckf0rn2h7001358syhvl5mjt0","_id":"ckf0rn2hw003658syvg7ldgiw"},{"post_id":"ckf0rn2gh000358sy3mcmary0","category_id":"ckf0rn2hr002t58syc5gxc5an","_id":"ckf0rn2hw003858syi27guh04"},{"post_id":"ckf0rn2h9001758syktakddre","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hx003a58syag35sbdj"},{"post_id":"ckf0rn2h9001758syktakddre","category_id":"ckf0rn2hl002558sy9zol191j","_id":"ckf0rn2hy003c58syknzhemxd"},{"post_id":"ckf0rn2hb001a58sy0ph5cedm","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2hy003f58syiyyh15tm"},{"post_id":"ckf0rn2hb001a58sy0ph5cedm","category_id":"ckf0rn2hv003458syl8ajwww7","_id":"ckf0rn2hz003i58syqi9n4ega"},{"post_id":"ckf0rn2gt000g58sydgd1a38k","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2i0003l58syxsx1zf4n"},{"post_id":"ckf0rn2gt000g58sydgd1a38k","category_id":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2i1003n58syds5fc1t5"},{"post_id":"ckf0rn2gt000g58sydgd1a38k","category_id":"ckf0rn2hw003958sy3yn0kltb","_id":"ckf0rn2i1003q58syqti68if5"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2i2003t58sy35bdhjij"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","category_id":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2i2003u58sy12njr3rm"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","category_id":"ckf0rn2hh001o58syy5hj412c","_id":"ckf0rn2i3003v58sy8kerqjwy"},{"post_id":"ckf0rn2h0000o58syiot10b2y","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2i4003z58sya7ablv7y"},{"post_id":"ckf0rn2h0000o58syiot10b2y","category_id":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2i5004258syx78efwer"},{"post_id":"ckf0rn2h0000o58syiot10b2y","category_id":"ckf0rn2hh001o58syy5hj412c","_id":"ckf0rn2i5004558syvjoxsgi2"},{"post_id":"ckf0rn2h0000o58syiot10b2y","category_id":"ckf0rn2i2003s58syvtpvfavv","_id":"ckf0rn2i6004858syau27hdew"},{"post_id":"ckf0rn2h3000u58syoolh0s2h","category_id":"ckf0rn2hj001y58sywo5n1vfq","_id":"ckf0rn2i6004a58syy46vw815"},{"post_id":"ckf0rn2h3000u58syoolh0s2h","category_id":"ckf0rn2i3003x58sy96r1h13t","_id":"ckf0rn2i7004e58syvaif82al"},{"post_id":"ckf0rn2h4000w58sy41ea02th","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2i7004f58syqb4oj3a8"},{"post_id":"ckf0rn2h4000w58sy41ea02th","category_id":"ckf0rn2hl002558sy9zol191j","_id":"ckf0rn2i8004i58sy25izpuha"},{"post_id":"ckf0rn2h4000w58sy41ea02th","category_id":"ckf0rn2i4004058syes8ogi9b","_id":"ckf0rn2i8004j58syu8tel4o0"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2ia004m58syu7xs0xfd"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","category_id":"ckf0rn2hm002958syg0yxzzsx","_id":"ckf0rn2ia004o58synny3yabm"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","category_id":"ckf0rn2i6004658sy2gsuojqa","_id":"ckf0rn2ib004s58sypeee29xo"},{"post_id":"ckf0rn2h7001458sy1kamcuhy","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2ic004u58syslnx3qgo"},{"post_id":"ckf0rn2h7001458sy1kamcuhy","category_id":"ckf0rn2hp002k58sykkf71qtv","_id":"ckf0rn2ic004x58sy2j48kq79"},{"post_id":"ckf0rn2h7001458sy1kamcuhy","category_id":"ckf0rn2i7004d58sycsmzdgnh","_id":"ckf0rn2id004y58sydgdlipm3"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2id005058syfvbafqoc"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","category_id":"ckf0rn2gz000m58syhci847uf","_id":"ckf0rn2id005158syq7h4pd8e"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","category_id":"ckf0rn2hh001o58syy5hj412c","_id":"ckf0rn2ie005358sy90sznu9s"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","category_id":"ckf0rn2i2003s58syvtpvfavv","_id":"ckf0rn2ie005558sy1qcgf37f"},{"post_id":"ckf0rn2he001g58sydfq0ayiw","category_id":"ckf0rn2gj000558sy0razs9mf","_id":"ckf0rn2ie005758sylt9cqxmf"},{"post_id":"ckf0rn2he001g58sydfq0ayiw","category_id":"ckf0rn2hm002958syg0yxzzsx","_id":"ckf0rn2if005a58syvevtthlu"},{"post_id":"ckf0rn2he001g58sydfq0ayiw","category_id":"ckf0rn2i6004658sy2gsuojqa","_id":"ckf0rn2if005c58syn1ekvvcy"},{"post_id":"ckf0rn2he001g58sydfq0ayiw","category_id":"ckf0rn2ib004r58syjzhxw79t","_id":"ckf0rn2ig005e58sylbpv77dg"}],"PostTag":[{"post_id":"ckf0rn2gd000158sytze0zf8w","tag_id":"ckf0rn2gk000658syf8nq6bw1","_id":"ckf0rn2h1000p58syvnv9k5sy"},{"post_id":"ckf0rn2gd000158sytze0zf8w","tag_id":"ckf0rn2gq000d58sy1zk4j615","_id":"ckf0rn2h2000s58syb6qx53tj"},{"post_id":"ckf0rn2gd000158sytze0zf8w","tag_id":"ckf0rn2gv000j58syk8pk9696","_id":"ckf0rn2h4000v58sywb7wuv53"},{"post_id":"ckf0rn2gh000358sy3mcmary0","tag_id":"ckf0rn2h0000n58sy7ahkba8n","_id":"ckf0rn2hc001b58syzxz3lrtd"},{"post_id":"ckf0rn2gh000358sy3mcmary0","tag_id":"ckf0rn2h3000t58sy2rezyazr","_id":"ckf0rn2hd001e58sybgzq2jqj"},{"post_id":"ckf0rn2gh000358sy3mcmary0","tag_id":"ckf0rn2h6001058syiav763nk","_id":"ckf0rn2hf001h58sytts66zmm"},{"post_id":"ckf0rn2gh000358sy3mcmary0","tag_id":"ckf0rn2h8001558sy64opqv30","_id":"ckf0rn2hf001j58syoqymjekv"},{"post_id":"ckf0rn2gl000758sy1qvlmyde","tag_id":"ckf0rn2ha001958syuj27bggz","_id":"ckf0rn2hh001q58sys0ozjjet"},{"post_id":"ckf0rn2gl000758sy1qvlmyde","tag_id":"ckf0rn2he001f58syecysm3bj","_id":"ckf0rn2hi001s58syzwobkwp4"},{"post_id":"ckf0rn2gl000758sy1qvlmyde","tag_id":"ckf0rn2hg001l58syab5k4wuy","_id":"ckf0rn2hi001u58syht5gx8tq"},{"post_id":"ckf0rn2gm000958sykhbed2ta","tag_id":"ckf0rn2ha001958syuj27bggz","_id":"ckf0rn2hj001x58sy4lkaai8f"},{"post_id":"ckf0rn2gm000958sykhbed2ta","tag_id":"ckf0rn2hi001t58sy8x8youln","_id":"ckf0rn2hk001z58sy84vpxgrq"},{"post_id":"ckf0rn2gp000b58syd6unbt8w","tag_id":"ckf0rn2hj001w58sy3jc4ky6n","_id":"ckf0rn2hm002858syu1hibyla"},{"post_id":"ckf0rn2gp000b58syd6unbt8w","tag_id":"ckf0rn2hk002058syod7t9tnf","_id":"ckf0rn2hn002b58syjzxgewdj"},{"post_id":"ckf0rn2gp000b58syd6unbt8w","tag_id":"ckf0rn2hl002458syxa46v5uu","_id":"ckf0rn2hn002e58syl26bwlil"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","tag_id":"ckf0rn2hl002658sy346klk5r","_id":"ckf0rn2hr002s58syfqnqlkpq"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","tag_id":"ckf0rn2hn002c58sy5is654ov","_id":"ckf0rn2hr002v58symrcdnycx"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","tag_id":"ckf0rn2ho002g58syc8pwleok","_id":"ckf0rn2hs002x58syblacjsfh"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","tag_id":"ckf0rn2ho002i58sygd51sgdr","_id":"ckf0rn2ht003058sy3mbvpfp1"},{"post_id":"ckf0rn2gs000f58syi5n5mxtj","tag_id":"ckf0rn2hp002m58sygvvfpo5e","_id":"ckf0rn2hv003358syov0q3ma8"},{"post_id":"ckf0rn2gt000g58sydgd1a38k","tag_id":"ckf0rn2ha001958syuj27bggz","_id":"ckf0rn2hy003d58syzlnu7dpt"},{"post_id":"ckf0rn2gt000g58sydgd1a38k","tag_id":"ckf0rn2hs002w58syc5m1tp5x","_id":"ckf0rn2hy003g58sy9rfwmqow"},{"post_id":"ckf0rn2gt000g58sydgd1a38k","tag_id":"ckf0rn2hu003258syhgrchkvh","_id":"ckf0rn2hz003j58sy2j3hxo0v"},{"post_id":"ckf0rn2gt000g58sydgd1a38k","tag_id":"ckf0rn2hw003758sy1nwbx3a4","_id":"ckf0rn2i0003m58sy7014d2ge"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","tag_id":"ckf0rn2hx003b58sy1e9r7dv8","_id":"ckf0rn2i5004158sy8tmdiphw"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","tag_id":"ckf0rn2hz003h58sy1pmhj9o2","_id":"ckf0rn2i5004358syq71gjcmh"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","tag_id":"ckf0rn2i1003o58sygm9k2oih","_id":"ckf0rn2i6004758syjzmc8mzm"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","tag_id":"ckf0rn2i2003r58sy2xhpmn3d","_id":"ckf0rn2i6004958sykde89rbg"},{"post_id":"ckf0rn2gv000k58syq8wvswt5","tag_id":"ckf0rn2ha001958syuj27bggz","_id":"ckf0rn2i7004c58syrnmelg2x"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","tag_id":"ckf0rn2hx003b58sy1e9r7dv8","_id":"ckf0rn2ia004n58sywrxlynky"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","tag_id":"ckf0rn2i5004458sy3qs2stjc","_id":"ckf0rn2ia004p58sysa4etewf"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","tag_id":"ckf0rn2i7004b58sy03ay96wr","_id":"ckf0rn2ib004t58syfaz4glgw"},{"post_id":"ckf0rn2gz000l58sykz80vsc2","tag_id":"ckf0rn2i8004g58sywwafnhys","_id":"ckf0rn2ic004v58syd5wu2bdd"},{"post_id":"ckf0rn2h0000o58syiot10b2y","tag_id":"ckf0rn2hx003b58sy1e9r7dv8","_id":"ckf0rn2ie005458sy96q4154h"},{"post_id":"ckf0rn2h0000o58syiot10b2y","tag_id":"ckf0rn2i5004458sy3qs2stjc","_id":"ckf0rn2ie005658syttyo83od"},{"post_id":"ckf0rn2h0000o58syiot10b2y","tag_id":"ckf0rn2i7004b58sy03ay96wr","_id":"ckf0rn2if005958sypllztmel"},{"post_id":"ckf0rn2h0000o58syiot10b2y","tag_id":"ckf0rn2id004z58sy25r6skvd","_id":"ckf0rn2if005b58syr3rkiwu4"},{"post_id":"ckf0rn2h1000q58syd7ech2qc","tag_id":"ckf0rn2id005258syr6efpowz","_id":"ckf0rn2ig005g58syd9mbqlb9"},{"post_id":"ckf0rn2h1000q58syd7ech2qc","tag_id":"ckf0rn2if005858syirqg4hr7","_id":"ckf0rn2ig005h58sy687g0gj5"},{"post_id":"ckf0rn2h1000q58syd7ech2qc","tag_id":"ckf0rn2if005d58sy6s2sltf8","_id":"ckf0rn2ih005j58sylmwb3rgi"},{"post_id":"ckf0rn2h3000u58syoolh0s2h","tag_id":"ckf0rn2ig005f58syx0ej1vz5","_id":"ckf0rn2ii005n58sy53r6vk6r"},{"post_id":"ckf0rn2h3000u58syoolh0s2h","tag_id":"ckf0rn2ih005i58syekmeje2y","_id":"ckf0rn2ii005o58sy4t95ouni"},{"post_id":"ckf0rn2h3000u58syoolh0s2h","tag_id":"ckf0rn2ih005k58sy4knuxqkq","_id":"ckf0rn2ii005q58sys26zhw87"},{"post_id":"ckf0rn2h3000u58syoolh0s2h","tag_id":"ckf0rn2ih005l58sy94uinnt1","_id":"ckf0rn2ij005r58sy79c6r8ld"},{"post_id":"ckf0rn2h4000w58sy41ea02th","tag_id":"ckf0rn2ii005m58sytnqs0mc9","_id":"ckf0rn2ik005t58syyxz6yikl"},{"post_id":"ckf0rn2h4000w58sy41ea02th","tag_id":"ckf0rn2ii005p58syv4tj9lvt","_id":"ckf0rn2ik005u58sykbmpalx4"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","tag_id":"ckf0rn2ij005s58syozskx880","_id":"ckf0rn2im006158syo708rv8v"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","tag_id":"ckf0rn2ik005v58syr0n8rrpz","_id":"ckf0rn2im006258syw80ki26b"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","tag_id":"ckf0rn2ik005w58sy4efbj8ea","_id":"ckf0rn2in006458sy1lzm4a1d"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","tag_id":"ckf0rn2il005x58sy7m35s03b","_id":"ckf0rn2in006558syf0j5d6cs"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","tag_id":"ckf0rn2il005y58syw8hraobh","_id":"ckf0rn2in006758syo54ctsft"},{"post_id":"ckf0rn2h5000z58sytseqbcvk","tag_id":"ckf0rn2il005z58sy84uu4b8q","_id":"ckf0rn2in006858syfgplo1s7"},{"post_id":"ckf0rn2h6001258sy9x57hkdx","tag_id":"ckf0rn2il006058syruu73e74","_id":"ckf0rn2ip006b58syuyon4knl"},{"post_id":"ckf0rn2h6001258sy9x57hkdx","tag_id":"ckf0rn2im006358sy7rljravt","_id":"ckf0rn2ip006c58sy3lb1ewe6"},{"post_id":"ckf0rn2h6001258sy9x57hkdx","tag_id":"ckf0rn2in006658sy2ir4qr0k","_id":"ckf0rn2ip006e58sy0v43xrlg"},{"post_id":"ckf0rn2h6001258sy9x57hkdx","tag_id":"ckf0rn2ik005v58syr0n8rrpz","_id":"ckf0rn2ip006f58syjlk45fk3"},{"post_id":"ckf0rn2h7001458sy1kamcuhy","tag_id":"ckf0rn2io006a58sylylh4j5k","_id":"ckf0rn2iq006i58syt51d9qq6"},{"post_id":"ckf0rn2h7001458sy1kamcuhy","tag_id":"ckf0rn2ip006d58syfvyj8dlv","_id":"ckf0rn2iq006j58syvo8wfwrr"},{"post_id":"ckf0rn2h7001458sy1kamcuhy","tag_id":"ckf0rn2ip006g58syjmiampmw","_id":"ckf0rn2is006l58syo9khn6pq"},{"post_id":"ckf0rn2h8001658syakx6isjf","tag_id":"ckf0rn2iq006h58syycem0f22","_id":"ckf0rn2is006m58sy62gcpus0"},{"post_id":"ckf0rn2h9001758syktakddre","tag_id":"ckf0rn2ii005m58sytnqs0mc9","_id":"ckf0rn2iu006t58syu9giqqai"},{"post_id":"ckf0rn2h9001758syktakddre","tag_id":"ckf0rn2is006n58syg5nu5qau","_id":"ckf0rn2iu006u58syt3zcaopy"},{"post_id":"ckf0rn2h9001758syktakddre","tag_id":"ckf0rn2it006o58sywm67uc8a","_id":"ckf0rn2iv006w58syecorpng2"},{"post_id":"ckf0rn2h9001758syktakddre","tag_id":"ckf0rn2it006p58sy7bjuhsih","_id":"ckf0rn2iv006x58sykveto3sc"},{"post_id":"ckf0rn2h9001758syktakddre","tag_id":"ckf0rn2it006q58sy00jjh4dw","_id":"ckf0rn2iv006z58sybllscgig"},{"post_id":"ckf0rn2h9001758syktakddre","tag_id":"ckf0rn2it006r58syuelrcamk","_id":"ckf0rn2iw007058syhmsh0u0b"},{"post_id":"ckf0rn2hb001a58sy0ph5cedm","tag_id":"ckf0rn2iu006s58syxdemwd7q","_id":"ckf0rn2iw007358syibm661ga"},{"post_id":"ckf0rn2hb001a58sy0ph5cedm","tag_id":"ckf0rn2io006a58sylylh4j5k","_id":"ckf0rn2iw007458sye1odl38k"},{"post_id":"ckf0rn2hb001a58sy0ph5cedm","tag_id":"ckf0rn2iv006y58syzeeco1z8","_id":"ckf0rn2ix007658sy3blnzlxm"},{"post_id":"ckf0rn2hb001a58sy0ph5cedm","tag_id":"ckf0rn2iw007158syzq4hn04a","_id":"ckf0rn2ix007758sy42pvv4p6"},{"post_id":"ckf0rn2hc001c58syughiqcve","tag_id":"ckf0rn2iw007258syyzzxkj80","_id":"ckf0rn2iy007c58syipshmn1a"},{"post_id":"ckf0rn2hc001c58syughiqcve","tag_id":"ckf0rn2ix007558sym0j1tnfv","_id":"ckf0rn2iz007d58sy5aa9ewsw"},{"post_id":"ckf0rn2hc001c58syughiqcve","tag_id":"ckf0rn2ix007858sydk05hk8i","_id":"ckf0rn2iz007f58sy4y8n4v59"},{"post_id":"ckf0rn2hc001c58syughiqcve","tag_id":"ckf0rn2iy007958sygbr895qc","_id":"ckf0rn2j0007g58sy5z42e3y9"},{"post_id":"ckf0rn2hc001c58syughiqcve","tag_id":"ckf0rn2iy007a58sytcvfzdmu","_id":"ckf0rn2j0007h58sygac0y761"},{"post_id":"ckf0rn2he001g58sydfq0ayiw","tag_id":"ckf0rn2iy007b58sypmgi98vm","_id":"ckf0rn2j0007i58sy5pukhk23"},{"post_id":"ckf0rn2he001g58sydfq0ayiw","tag_id":"ckf0rn2il005x58sy7m35s03b","_id":"ckf0rn2j0007j58syjybk13kh"}],"Tag":[{"name":"Hexo","_id":"ckf0rn2gk000658syf8nq6bw1"},{"name":"博客","_id":"ckf0rn2gq000d58sy1zk4j615"},{"name":"Node.js","_id":"ckf0rn2gv000j58syk8pk9696"},{"name":".acme.sh","_id":"ckf0rn2h0000n58sy7ahkba8n"},{"name":"https","_id":"ckf0rn2h3000t58sy2rezyazr"},{"name":"证书","_id":"ckf0rn2h6001058syiav763nk"},{"name":"nginx","_id":"ckf0rn2h8001558sy64opqv30"},{"name":"docker","_id":"ckf0rn2ha001958syuj27bggz"},{"name":"storage","_id":"ckf0rn2he001f58syecysm3bj"},{"name":"存储位置","_id":"ckf0rn2hg001l58syab5k4wuy"},{"name":"docker-compose","_id":"ckf0rn2hi001t58sy8x8youln"},{"name":"themes","_id":"ckf0rn2hj001w58sy3jc4ky6n"},{"name":"cactus","_id":"ckf0rn2hk002058syod7t9tnf"},{"name":"hexo","_id":"ckf0rn2hl002458syxa46v5uu"},{"name":"cordova","_id":"ckf0rn2hl002658sy346klk5r"},{"name":"插件","_id":"ckf0rn2hn002c58sy5is654ov"},{"name":"plugin","_id":"ckf0rn2ho002g58syc8pwleok"},{"name":"cordova-plugin","_id":"ckf0rn2ho002i58sygd51sgdr"},{"name":"开发","_id":"ckf0rn2hp002m58sygvvfpo5e"},{"name":"rancher","_id":"ckf0rn2hs002w58syc5m1tp5x"},{"name":"drone","_id":"ckf0rn2hu003258syhgrchkvh"},{"name":"gitea","_id":"ckf0rn2hw003758sy1nwbx3a4"},{"name":"elasticsearch","_id":"ckf0rn2hx003b58sy1e9r7dv8"},{"name":"cluster","_id":"ckf0rn2hz003h58sy1pmhj9o2"},{"name":"elasticsearch集群安装","_id":"ckf0rn2i1003o58sygm9k2oih"},{"name":"elasticsearch集群安装配置","_id":"ckf0rn2i2003r58sy2xhpmn3d"},{"name":"error","_id":"ckf0rn2i5004458sy3qs2stjc"},{"name":"异常","_id":"ckf0rn2i7004b58sy03ay96wr"},{"name":"Data too large","_id":"ckf0rn2i8004g58sywwafnhys"},{"name":"maximum allowed to be analyzed for highlighting","_id":"ckf0rn2id004z58sy25r6skvd"},{"name":"golang","_id":"ckf0rn2id005258syr6efpowz"},{"name":"go","_id":"ckf0rn2if005858syirqg4hr7"},{"name":"goproxy","_id":"ckf0rn2if005d58sy6s2sltf8"},{"name":"2018","_id":"ckf0rn2ig005f58syx0ej1vz5"},{"name":"joehisaishi","_id":"ckf0rn2ih005i58syekmeje2y"},{"name":"wdo","_id":"ckf0rn2ih005k58sy4knuxqkq"},{"name":"久石让","_id":"ckf0rn2ih005l58sy94uinnt1"},{"name":"jenkins","_id":"ckf0rn2ii005m58sytnqs0mc9"},{"name":"maven","_id":"ckf0rn2ii005p58syv4tj9lvt"},{"name":"seata","_id":"ckf0rn2ij005s58syozskx880"},{"name":"spring boot","_id":"ckf0rn2ik005v58syr0n8rrpz"},{"name":"mybatis plus","_id":"ckf0rn2ik005w58sy4efbj8ea"},{"name":"多数据源","_id":"ckf0rn2il005x58sy7m35s03b"},{"name":"事务","_id":"ckf0rn2il005y58syw8hraobh"},{"name":"nacos","_id":"ckf0rn2il005z58sy84uu4b8q"},{"name":"Prometheus","_id":"ckf0rn2il006058syruu73e74"},{"name":"Grafana","_id":"ckf0rn2im006358sy7rljravt"},{"name":"Java","_id":"ckf0rn2in006658sy2ir4qr0k"},{"name":"mysql","_id":"ckf0rn2io006a58sylylh4j5k"},{"name":"mybaits","_id":"ckf0rn2ip006d58syfvyj8dlv"},{"name":"java","_id":"ckf0rn2ip006g58syjmiampmw"},{"name":"ssh","_id":"ckf0rn2iq006h58syycem0f22"},{"name":"自动化构建","_id":"ckf0rn2is006n58syg5nu5qau"},{"name":"自动部署","_id":"ckf0rn2it006o58sywm67uc8a"},{"name":"CI/CD","_id":"ckf0rn2it006p58sy7bjuhsih"},{"name":"持续集成","_id":"ckf0rn2it006q58sy00jjh4dw"},{"name":"持续部署","_id":"ckf0rn2it006r58syuelrcamk"},{"name":"canal","_id":"ckf0rn2iu006s58syxdemwd7q"},{"name":"canal-server","_id":"ckf0rn2iv006y58syzeeco1z8"},{"name":"canal-adapter","_id":"ckf0rn2iw007158syzq4hn04a"},{"name":"mycat","_id":"ckf0rn2iw007258syyzzxkj80"},{"name":"database","_id":"ckf0rn2ix007558sym0j1tnfv"},{"name":"sharding-jdbc","_id":"ckf0rn2ix007858sydk05hk8i"},{"name":"分库分表","_id":"ckf0rn2iy007958sygbr895qc"},{"name":"sqlserver","_id":"ckf0rn2iy007a58sytcvfzdmu"},{"name":"springboot","_id":"ckf0rn2iy007b58sypmgi98vm"}]}}