Browse Source

首次提交

zhuyijun 2 years ago
commit
346b73c7ad
70 changed files with 4106 additions and 0 deletions
  1. 7 0
      .github/dependabot.yml
  2. 7 0
      .gitignore
  3. 123 0
      _config.yml
  4. 1872 0
      package-lock.json
  5. 33 0
      package.json
  6. 4 0
      scaffolds/draft.md
  7. 4 0
      scaffolds/page.md
  8. 5 0
      scaffolds/post.md
  9. 0 0
      source/_data/bangumis.json
  10. 6 0
      source/_posts/hello-world.md
  11. 2038 0
      source/_posts/微服务框架.md
  12. BIN
      source/_posts/微服务框架/images/1605019839175.png
  13. BIN
      source/_posts/微服务框架/images/1605103387256.png
  14. BIN
      source/_posts/微服务框架/images/1605103421256.png
  15. BIN
      source/_posts/微服务框架/images/1605103436874.png
  16. BIN
      source/_posts/微服务框架/images/1605104987931.png
  17. BIN
      source/_posts/微服务框架/images/1605106759891.png
  18. BIN
      source/_posts/微服务框架/images/1605106760380.png
  19. BIN
      source/_posts/微服务框架/images/20190325232054468.png
  20. BIN
      source/_posts/微服务框架/images/image-20201111095513133.png
  21. BIN
      source/_posts/微服务框架/images/image-20201111095518705.png
  22. BIN
      source/_posts/微服务框架/images/image-20201111110217411.png
  23. BIN
      source/_posts/微服务框架/images/image-20201111132523595.png
  24. BIN
      source/_posts/微服务框架/images/image-20201111134022333.png
  25. BIN
      source/_posts/微服务框架/images/image-20201111155409030.png
  26. BIN
      source/_posts/微服务框架/images/image-20201111162630381.png
  27. BIN
      source/_posts/微服务框架/images/image-20201111164239591.png
  28. BIN
      source/_posts/微服务框架/images/image-20201111181650929.png
  29. BIN
      source/_posts/微服务框架/images/image-20201112110708902.png
  30. BIN
      source/_posts/微服务框架/images/image-20201112113609523.png
  31. BIN
      source/_posts/微服务框架/images/image-20201112132217601.png
  32. BIN
      source/_posts/微服务框架/images/image-20201112135410803.png
  33. BIN
      source/_posts/微服务框架/images/image-20201112135429409.png
  34. BIN
      source/_posts/微服务框架/images/image-20201112140037987.png
  35. BIN
      source/_posts/微服务框架/images/image-20201112140312697.png
  36. BIN
      source/_posts/微服务框架/images/image-20201112141523371.png
  37. BIN
      source/_posts/微服务框架/images/image-20201112145449105.png
  38. BIN
      source/_posts/微服务框架/images/image-20201112151632111.png
  39. BIN
      source/_posts/微服务框架/images/image-20201112155652269.png
  40. BIN
      source/_posts/微服务框架/images/image-20201112155707148.png
  41. BIN
      source/_posts/微服务框架/images/image-20201112160258956.png
  42. BIN
      source/_posts/微服务框架/images/image-20201112165325023.png
  43. BIN
      source/_posts/微服务框架/images/image-20201112165641574.png
  44. BIN
      source/_posts/微服务框架/images/image-20201112173342142.png
  45. BIN
      source/_posts/微服务框架/images/image-20201112180552221.png
  46. BIN
      source/_posts/微服务框架/images/image-20201113093057704.png
  47. BIN
      source/_posts/微服务框架/images/image-20201113094055276.png
  48. BIN
      source/_posts/微服务框架/images/image-20201113102316294.png
  49. BIN
      source/_posts/微服务框架/images/image-20201113103152115.png
  50. BIN
      source/_posts/微服务框架/images/image-20201113104134210.png
  51. BIN
      source/_posts/微服务框架/images/image-20201113113814310.png
  52. BIN
      source/_posts/微服务框架/images/image-20201113114050201.png
  53. BIN
      source/_posts/微服务框架/images/image-20201113114131931.png
  54. BIN
      source/_posts/微服务框架/images/image-20201113120733998.png
  55. BIN
      source/_posts/微服务框架/images/image-20201113121001855.png
  56. BIN
      source/_posts/微服务框架/images/image-20201113121035781.png
  57. BIN
      source/_posts/微服务框架/images/image-20201113131325996.png
  58. BIN
      source/_posts/微服务框架/images/image-20201113133658258.png
  59. BIN
      source/_posts/微服务框架/images/image-20201113133713872.png
  60. BIN
      source/_posts/微服务框架/images/image-20201113133745985.png
  61. BIN
      source/_posts/微服务框架/images/image-20201113153443738.png
  62. BIN
      source/_posts/微服务框架/images/image-20201113160658535.png
  63. BIN
      source/_posts/微服务框架/images/image-20201113160724897.png
  64. BIN
      source/_posts/微服务框架/images/image-20201113164636525.png
  65. BIN
      source/_posts/微服务框架/images/image-20201113164930192.png
  66. BIN
      source/_posts/微服务框架/images/image-20201113165759501.png
  67. 6 0
      source/bangumis/index.md
  68. BIN
      source/bangumis/loading.gif
  69. 0 0
      themes/.gitkeep
  70. 1 0
      themes/butterfly

+ 7 - 0
.github/dependabot.yml

@@ -0,0 +1,7 @@
+version: 2
+updates:
+- package-ecosystem: npm
+  directory: "/"
+  schedule:
+    interval: daily
+  open-pull-requests-limit: 20

+ 7 - 0
.gitignore

@@ -0,0 +1,7 @@
+.DS_Store
+Thumbs.db
+db.json
+*.log
+node_modules/
+public/
+.deploy*/

+ 123 - 0
_config.yml

@@ -0,0 +1,123 @@
+# Hexo Configuration
+## Docs: https://hexo.io/docs/configuration.html
+## Source: https://github.com/hexojs/hexo/
+
+# Site
+title: 逝水无痕の博客
+subtitle: ''
+description: ''
+keywords: 学习笔记
+author: 逝水无痕
+language: zh
+timezone: ''
+
+# URL
+## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
+url: https://hexo.zyjblogs.cn
+# permalink: :year/:month/:day/:title/
+permalink: posts/:abbrlink/
+permalink_defaults:
+pretty_urls:
+  trailing_index: true # Set to false to remove trailing 'index.html' from permalinks
+  trailing_html: true # Set to false to remove trailing '.html' from permalinks
+
+# Directory
+source_dir: source
+public_dir: public
+tag_dir: tags
+archive_dir: archives
+category_dir: categories
+code_dir: downloads/code
+i18n_dir: :lang
+skip_render:
+
+# Writing
+new_post_name: :title.md # File name of new posts
+default_layout: post
+titlecase: false # Transform title into titlecase
+external_link:
+  enable: true # Open external links in new tab
+  field: site # Apply to the whole site
+  exclude: ''
+filename_case: 0
+render_drafts: false
+post_asset_folder: true
+marked:
+  prependRoot: true
+  postAsset: true
+# # 开启Pixiv 日榜
+# card_pixiv: true
+# card_calendar: true
+relative_link: false
+future: true
+highlight:
+  enable: true
+  line_number: true
+  auto_detect: false
+  tab_replace: ''
+  wrap: true
+  hljs: false
+prismjs:
+  enable: false
+  preprocess: true
+  line_number: true
+  tab_replace: ''
+
+# Home page setting
+# path: Root path for your blogs index page. (default = '')
+# per_page: Posts displayed per page. (0 = disable pagination)
+# order_by: Posts order. (Order by date descending by default)
+index_generator:
+  path: ''
+  per_page: 10
+  order_by: -date
+
+# Category & Tag
+default_category: uncategorized
+category_map:
+tag_map:
+
+# Metadata elements
+## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta
+meta_generator: true
+
+# Date / Time format
+## Hexo uses Moment.js to parse and display date
+## You can customize the date format as defined in
+## http://momentjs.com/docs/#/displaying/format/
+date_format: YYYY-MM-DD
+time_format: HH:mm:ss
+## updated_option supports 'mtime', 'date', 'empty'
+updated_option: 'mtime'
+
+# Pagination
+## Set per_page to 0 to disable pagination
+per_page: 10
+pagination_dir: page
+
+# Include / Exclude file(s)
+## include:/exclude: options only apply to the 'source/' folder
+include:
+exclude:
+ignore:
+
+# Extensions
+## Plugins: https://hexo.io/plugins/
+## Themes: https://hexo.io/themes/
+# theme: landscape
+theme: butterfly
+
+# Deployment
+## Docs: https://hexo.io/docs/one-command-deployment
+deploy:
+  type: git
+  repo: https://gitee.com/zyjblog/hexo.zyjblogs.cn.git
+  branch: branch
+
+bangumi:
+  enable: true 
+  vmid: 17719291
+  title: '追番列表'
+  quote: '生命不息,追番不止!'
+  show: 1
+  # loading: 'loading.gif'

+ 1872 - 0
package-lock.json

@@ -0,0 +1,1872 @@
+{
+  "name": "hexo-site",
+  "version": "0.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/helper-validator-identifier": {
+      "version": "7.14.9",
+      "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.9.tgz?cache=0&sync_timestamp=1627804430461&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.9.tgz",
+      "integrity": "sha1-ZlTRcbICT22O4VG/JQlpmRkTHUg="
+    },
+    "@babel/parser": {
+      "version": "7.15.0",
+      "resolved": "https://registry.nlark.com/@babel/parser/download/@babel/parser-7.15.0.tgz",
+      "integrity": "sha1-ttbikFjKNpEnsO7KKhxLV5Txtrk="
+    },
+    "@babel/runtime": {
+      "version": "7.14.8",
+      "resolved": "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.14.8.tgz",
+      "integrity": "sha1-cRmlb0IQGIUmlCkLn5FICXORtEY=",
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "@babel/types": {
+      "version": "7.15.0",
+      "resolved": "https://registry.nlark.com/@babel/types/download/@babel/types-7.15.0.tgz?cache=0&sync_timestamp=1628111608723&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.15.0.tgz",
+      "integrity": "sha1-Ya8R8ihsTpxpyo3rX0N1pzxy3L0=",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.14.9",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "JSONStream": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz",
+      "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=",
+      "requires": {
+        "jsonparse": "^1.2.0",
+        "through": ">=2.2.7 <3"
+      }
+    },
+    "a-sync-waterfall": {
+      "version": "1.0.1",
+      "resolved": "https://registry.nlark.com/a-sync-waterfall/download/a-sync-waterfall-1.0.1.tgz",
+      "integrity": "sha1-dba2qnJZi0l6El56J3DxT0yKH6c="
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz",
+      "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg="
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz",
+      "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz?cache=0&sync_timestamp=1624526855420&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-7.4.1.tgz",
+      "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo="
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.nlark.com/amdefine/download/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+    },
+    "ansi-regex": {
+      "version": "5.0.0",
+      "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.0.tgz",
+      "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U="
+    },
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
+      "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "anymatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.nlark.com/anymatch/download/anymatch-3.1.2.tgz",
+      "integrity": "sha1-wFV8CWrzLxBhmPT04qODU343hxY=",
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "archy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/archy/download/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.nlark.com/argparse/download/argparse-1.0.10.tgz",
+      "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.nlark.com/asap/download/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+    },
+    "assert-never": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/assert-never/download/assert-never-1.2.1.tgz",
+      "integrity": "sha1-EfDjY78UYgX7CBk7XHuQ9NHPRP4="
+    },
+    "async": {
+      "version": "0.9.2",
+      "resolved": "https://registry.nlark.com/async/download/async-0.9.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fasync%2Fdownload%2Fasync-0.9.2.tgz",
+      "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.nlark.com/atob/download/atob-2.1.2.tgz",
+      "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k="
+    },
+    "axios": {
+      "version": "0.21.1",
+      "resolved": "https://registry.nlark.com/axios/download/axios-0.21.1.tgz",
+      "integrity": "sha1-IlY0gZYvTWvemnbVFu8OXTwJsrg=",
+      "requires": {
+        "follow-redirects": "^1.10.0"
+      }
+    },
+    "babel-walk": {
+      "version": "3.0.0-canary-5",
+      "resolved": "https://registry.npm.taobao.org/babel-walk/download/babel-walk-3.0.0-canary-5.tgz",
+      "integrity": "sha1-9m7Ncpg1eu5ElV8jWm71QhkQSxE=",
+      "requires": {
+        "@babel/types": "^7.9.6"
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz",
+      "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4="
+    },
+    "basic-auth": {
+      "version": "2.0.1",
+      "resolved": "https://registry.nlark.com/basic-auth/download/basic-auth-2.0.1.tgz",
+      "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=",
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.nlark.com/binary-extensions/download/binary-extensions-2.2.0.tgz",
+      "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0="
+    },
+    "bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.nlark.com/bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1618847007562&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz",
+      "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28="
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.nlark.com/brace-expansion/download/brace-expansion-1.1.11.tgz",
+      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.nlark.com/braces/download/braces-3.0.2.tgz",
+      "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+    },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz",
+      "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "camel-case": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz",
+      "integrity": "sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=",
+      "requires": {
+        "pascal-case": "^3.1.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz",
+      "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "character-parser": {
+      "version": "2.2.0",
+      "resolved": "https://registry.nlark.com/character-parser/download/character-parser-2.2.0.tgz",
+      "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
+      "requires": {
+        "is-regex": "^1.0.3"
+      }
+    },
+    "chokidar": {
+      "version": "3.5.2",
+      "resolved": "https://registry.nlark.com/chokidar/download/chokidar-3.5.2.tgz?cache=0&sync_timestamp=1623763535523&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchokidar%2Fdownload%2Fchokidar-3.5.2.tgz",
+      "integrity": "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU=",
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      }
+    },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+      "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+      "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI="
+    },
+    "command-exists": {
+      "version": "1.2.9",
+      "resolved": "https://registry.nlark.com/command-exists/download/command-exists-1.2.9.tgz",
+      "integrity": "sha1-xQclrzgIyKsCYP1gsB+/oluVT2k="
+    },
+    "commander": {
+      "version": "5.1.0",
+      "resolved": "https://registry.nlark.com/commander/download/commander-5.1.0.tgz?cache=0&sync_timestamp=1627358203890&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-5.1.0.tgz",
+      "integrity": "sha1-Rqu9FlL44Fm92u+Zu9yyrZzxea4="
+    },
+    "compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.nlark.com/compressible/download/compressible-2.0.18.tgz",
+      "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=",
+      "requires": {
+        "mime-db": ">= 1.43.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz",
+      "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=",
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "connect": {
+      "version": "3.7.0",
+      "resolved": "https://registry.nlark.com/connect/download/connect-3.7.0.tgz?cache=0&sync_timestamp=1618847040246&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconnect%2Fdownload%2Fconnect-3.7.0.tgz",
+      "integrity": "sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=",
+      "requires": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.2",
+        "parseurl": "~1.3.3",
+        "utils-merge": "1.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "constantinople": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/constantinople/download/constantinople-4.0.1.tgz",
+      "integrity": "sha1-De8RP6Dk3I3oMzGlz3nIsyUhMVE=",
+      "requires": {
+        "@babel/parser": "^7.6.0",
+        "@babel/types": "^7.6.1"
+      }
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz",
+      "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "css": {
+      "version": "2.2.4",
+      "resolved": "https://registry.nlark.com/css/download/css-2.2.4.tgz",
+      "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=",
+      "requires": {
+        "inherits": "^2.0.3",
+        "source-map": "^0.6.1",
+        "source-map-resolve": "^0.5.2",
+        "urix": "^0.1.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
+        }
+      }
+    },
+    "css-parse": {
+      "version": "1.7.0",
+      "resolved": "https://registry.nlark.com/css-parse/download/css-parse-1.7.0.tgz",
+      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs="
+    },
+    "cuid": {
+      "version": "2.1.8",
+      "resolved": "https://registry.nlark.com/cuid/download/cuid-2.1.8.tgz",
+      "integrity": "sha1-y7iPlUFx4NV0dgbAE5+2XFEB6sA="
+    },
+    "debug": {
+      "version": "4.3.2",
+      "resolved": "https://registry.nlark.com/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz",
+      "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=",
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.nlark.com/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+    },
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.2.2.tgz",
+      "integrity": "sha1-RNLqNnm49NT/ujPwPYZfwee/SVU="
+    },
+    "depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz",
+      "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8="
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+    },
+    "doctypes": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/doctypes/download/doctypes-1.1.0.tgz",
+      "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
+    },
+    "dom-serializer": {
+      "version": "1.3.2",
+      "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz",
+      "integrity": "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=",
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
+        "entities": "^2.0.0"
+      }
+    },
+    "domelementtype": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298545989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz",
+      "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc="
+    },
+    "domhandler": {
+      "version": "4.2.0",
+      "resolved": "https://registry.nlark.com/domhandler/download/domhandler-4.2.0.tgz",
+      "integrity": "sha1-+XaKXwNL5gqJonwuTQ9066DYsFk=",
+      "requires": {
+        "domelementtype": "^2.2.0"
+      }
+    },
+    "domutils": {
+      "version": "2.7.0",
+      "resolved": "https://registry.nlark.com/domutils/download/domutils-2.7.0.tgz",
+      "integrity": "sha1-jrrwxB66/PVbC3LsMcVjI3EsVEI=",
+      "requires": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+    },
+    "ejs": {
+      "version": "2.7.4",
+      "resolved": "https://registry.nlark.com/ejs/download/ejs-2.7.4.tgz",
+      "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo="
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/encodeurl/download/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+    },
+    "entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.nlark.com/entities/download/entities-2.2.0.tgz",
+      "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU="
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.nlark.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz",
+      "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+    },
+    "filelist": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/filelist/download/filelist-1.0.2.tgz",
+      "integrity": "sha1-gCAvIUYtTRwuIUEZsYB8G8A4Dls=",
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.nlark.com/fill-range/download/fill-range-7.0.1.tgz",
+      "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz",
+      "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=",
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "follow-redirects": {
+      "version": "1.14.1",
+      "resolved": "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.1.tgz?cache=0&sync_timestamp=1620555300559&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.1.tgz",
+      "integrity": "sha1-2RFN7Qoc/dM04WTmZirQK/2R/0M="
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz",
+      "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=",
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
+      "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
+    },
+    "get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "glob": {
+      "version": "7.0.6",
+      "resolved": "https://registry.nlark.com/glob/download/glob-7.0.6.tgz",
+      "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.2",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.nlark.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1626760200164&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz",
+      "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.8",
+      "resolved": "https://registry.nlark.com/graceful-fs/download/graceful-fs-4.2.8.tgz?cache=0&sync_timestamp=1628194078324&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.8.tgz",
+      "integrity": "sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo="
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz",
+      "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz",
+      "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s="
+    },
+    "has-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/has-symbols/download/has-symbols-1.0.2.tgz",
+      "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM="
+    },
+    "has-tostringtag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz?cache=0&sync_timestamp=1628196402801&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-tostringtag%2Fdownload%2Fhas-tostringtag-1.0.0.tgz",
+      "integrity": "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=",
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "hexo": {
+      "version": "5.4.0",
+      "resolved": "https://registry.npm.taobao.org/hexo/download/hexo-5.4.0.tgz",
+      "integrity": "sha1-d9V/ocKfOrBZZP5OvZxE4j31Gzc=",
+      "requires": {
+        "abbrev": "^1.1.1",
+        "archy": "^1.0.0",
+        "bluebird": "^3.5.2",
+        "chalk": "^4.0.0",
+        "hexo-cli": "^4.0.0",
+        "hexo-front-matter": "^2.0.0",
+        "hexo-fs": "^3.1.0",
+        "hexo-i18n": "^1.0.0",
+        "hexo-log": "^2.0.0",
+        "hexo-util": "^2.4.0",
+        "js-yaml": "^4.0.0",
+        "micromatch": "^4.0.2",
+        "moment": "^2.22.2",
+        "moment-timezone": "^0.5.21",
+        "nunjucks": "^3.2.1",
+        "pretty-hrtime": "^1.0.3",
+        "resolve": "^1.8.1",
+        "strip-ansi": "^6.0.0",
+        "text-table": "^0.2.0",
+        "tildify": "^2.0.0",
+        "titlecase": "^1.1.2",
+        "warehouse": "^4.0.0"
+      },
+      "dependencies": {
+        "hexo-cli": {
+          "version": "4.3.0",
+          "resolved": "https://registry.nlark.com/hexo-cli/download/hexo-cli-4.3.0.tgz",
+          "integrity": "sha1-S7K/EaMPrmAfL1OsDLgz/uMYdkk=",
+          "requires": {
+            "abbrev": "^1.1.1",
+            "bluebird": "^3.5.5",
+            "chalk": "^4.0.0",
+            "command-exists": "^1.2.8",
+            "hexo-fs": "^3.0.1",
+            "hexo-log": "^2.0.0",
+            "hexo-util": "^2.0.0",
+            "minimist": "^1.2.5",
+            "resolve": "^1.11.0",
+            "tildify": "^2.0.0"
+          }
+        }
+      }
+    },
+    "hexo-abbrlink": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/hexo-abbrlink/download/hexo-abbrlink-2.2.1.tgz",
+      "integrity": "sha1-A6O79zgW7RknnpdFLOYXxsr5i1o=",
+      "requires": {
+        "hexo-front-matter": "^1.0.0",
+        "hexo-fs": "^3.1.0"
+      },
+      "dependencies": {
+        "hexo-front-matter": {
+          "version": "1.0.0",
+          "resolved": "https://registry.nlark.com/hexo-front-matter/download/hexo-front-matter-1.0.0.tgz",
+          "integrity": "sha1-C0ixwe0UPoyyWzsiOpA3OF2RBlU=",
+          "requires": {
+            "js-yaml": "^3.13.1"
+          }
+        },
+        "js-yaml": {
+          "version": "3.14.1",
+          "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.1.tgz",
+          "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=",
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        }
+      }
+    },
+    "hexo-bilibili-bangumi": {
+      "version": "1.6.0",
+      "resolved": "https://registry.nlark.com/hexo-bilibili-bangumi/download/hexo-bilibili-bangumi-1.6.0.tgz",
+      "integrity": "sha1-Jc47bn3Q1p3wFzXN3XiKAIv3C/Y=",
+      "requires": {
+        "@babel/runtime": "^7.9.6",
+        "axios": "^0.21.1",
+        "ejs": "3.1.6",
+        "hexo-fs": "^3.1.0",
+        "hexo-i18n": "^1.0.0",
+        "hexo-log": "^2.0.0",
+        "progress": "^2.0.3"
+      },
+      "dependencies": {
+        "ejs": {
+          "version": "3.1.6",
+          "resolved": "https://registry.nlark.com/ejs/download/ejs-3.1.6.tgz",
+          "integrity": "sha1-W/0KBol0O7UmizVQzO7rvBcCgio=",
+          "requires": {
+            "jake": "^10.6.1"
+          }
+        }
+      }
+    },
+    "hexo-deployer-git": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-deployer-git/download/hexo-deployer-git-3.0.0.tgz",
+      "integrity": "sha1-2oL3o0Rd8rITkm3I0DC6VJm2jPM=",
+      "requires": {
+        "bluebird": "^3.5.0",
+        "chalk": "^4.0.0",
+        "hexo-fs": "^3.0.1",
+        "hexo-util": "^2.1.0",
+        "moment": "^2.18.0",
+        "nunjucks": "^3.2.1"
+      }
+    },
+    "hexo-front-matter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/hexo-front-matter/download/hexo-front-matter-2.0.0.tgz",
+      "integrity": "sha1-A/Oanu2xbFRI27O+x9/yxOIkAGw=",
+      "requires": {
+        "js-yaml": "^3.13.1"
+      },
+      "dependencies": {
+        "js-yaml": {
+          "version": "3.14.1",
+          "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.1.tgz",
+          "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=",
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        }
+      }
+    },
+    "hexo-fs": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-3.1.0.tgz",
+      "integrity": "sha1-IFL/csaM2ixXeoeqDqeYCuUD+pk=",
+      "requires": {
+        "bluebird": "^3.5.1",
+        "chokidar": "^3.0.0",
+        "graceful-fs": "^4.1.11",
+        "hexo-util": "^2.0.0"
+      }
+    },
+    "hexo-generator-archive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-generator-archive/download/hexo-generator-archive-1.0.0.tgz",
+      "integrity": "sha1-rSr7EiMqZeL4YI/Byj8ZFi+2N4Y=",
+      "requires": {
+        "hexo-pagination": "1.0.0"
+      }
+    },
+    "hexo-generator-calendar": {
+      "version": "git://github.com/howiefh/hexo-generator-calendar.git#9c25735a38dc7997bd498563cd624091905c8e72",
+      "from": "git://github.com/howiefh/hexo-generator-calendar.git",
+      "requires": {
+        "object-assign": "^4.0.1"
+      }
+    },
+    "hexo-generator-category": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-generator-category/download/hexo-generator-category-1.0.0.tgz",
+      "integrity": "sha1-zSorA+sybaPvgh1uKUCEiMwTLrU=",
+      "requires": {
+        "hexo-pagination": "1.0.0"
+      }
+    },
+    "hexo-generator-index": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-generator-index/download/hexo-generator-index-2.0.0.tgz",
+      "integrity": "sha1-FecfTSjunSFy4td+jR26BIgu3I8=",
+      "requires": {
+        "hexo-pagination": "1.0.0",
+        "timsort": "^0.3.0"
+      }
+    },
+    "hexo-generator-tag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-generator-tag/download/hexo-generator-tag-1.0.0.tgz",
+      "integrity": "sha1-VOwj3pQJx1WE6oHjYFelkDGwIvE=",
+      "requires": {
+        "hexo-pagination": "1.0.0"
+      }
+    },
+    "hexo-helper-qrcode": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/hexo-helper-qrcode/download/hexo-helper-qrcode-1.0.2.tgz",
+      "integrity": "sha1-hnyjYQSraWJxH0S0fmZFw1SMvAo=",
+      "requires": {
+        "qr-image": "^3.1.0"
+      }
+    },
+    "hexo-i18n": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/hexo-i18n/download/hexo-i18n-1.0.0.tgz",
+      "integrity": "sha1-eYP7OjE+kGFbhN2PqUanHEie9b0=",
+      "requires": {
+        "sprintf-js": "^1.0.3"
+      }
+    },
+    "hexo-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-log/download/hexo-log-2.0.0.tgz",
+      "integrity": "sha1-HcyOlgApsIshmU/ixWxOPWNG6JM=",
+      "requires": {
+        "chalk": "^4.0.0"
+      }
+    },
+    "hexo-pagination": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/hexo-pagination/download/hexo-pagination-1.0.0.tgz",
+      "integrity": "sha1-ycDKNmUme56dCon8PtyvMnaQfcE="
+    },
+    "hexo-renderer-ejs": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-renderer-ejs/download/hexo-renderer-ejs-1.0.0.tgz",
+      "integrity": "sha1-Q8TeSe6uIkA2pFffhg6xwUxotLQ=",
+      "requires": {
+        "ejs": "^2.6.1"
+      }
+    },
+    "hexo-renderer-marked": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-renderer-marked/download/hexo-renderer-marked-4.0.0.tgz",
+      "integrity": "sha1-9q2ICjhL4Tx+vD/IeI+G+vzxUAc=",
+      "requires": {
+        "hexo-util": "^2.1.0",
+        "marked": "^2.0.0"
+      }
+    },
+    "hexo-renderer-pug": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/hexo-renderer-pug/download/hexo-renderer-pug-2.0.0.tgz",
+      "integrity": "sha1-XOqyRkXRhLc3Bgjr3Lhp53b3LQU=",
+      "requires": {
+        "pug": "^3.0.2"
+      }
+    },
+    "hexo-renderer-stylus": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/hexo-renderer-stylus/download/hexo-renderer-stylus-2.0.1.tgz",
+      "integrity": "sha1-xlVm6X6QWKUuRsgrDEXPVh9LlMs=",
+      "requires": {
+        "nib": "^1.1.2",
+        "stylus": "^0.54.8"
+      }
+    },
+    "hexo-server": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/hexo-server/download/hexo-server-2.0.0.tgz",
+      "integrity": "sha1-GtksyKfTUo/sb/pl/4RT8kL3mD8=",
+      "requires": {
+        "bluebird": "^3.5.5",
+        "chalk": "^4.0.0",
+        "compression": "^1.7.4",
+        "connect": "^3.7.0",
+        "mime": "^2.4.3",
+        "morgan": "^1.9.1",
+        "open": "^7.0.0",
+        "serve-static": "^1.14.1"
+      }
+    },
+    "hexo-theme-landscape": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npm.taobao.org/hexo-theme-landscape/download/hexo-theme-landscape-0.0.3.tgz",
+      "integrity": "sha1-h9H01hPam+UkXa0NS4BHnqtw04Y="
+    },
+    "hexo-util": {
+      "version": "2.5.0",
+      "resolved": "https://registry.nlark.com/hexo-util/download/hexo-util-2.5.0.tgz",
+      "integrity": "sha1-3lY1NBEWuiVjp4mg6861WodSIa0=",
+      "requires": {
+        "bluebird": "^3.5.2",
+        "camel-case": "^4.0.0",
+        "cross-spawn": "^7.0.0",
+        "deepmerge": "^4.2.2",
+        "highlight.js": "^10.7.1",
+        "htmlparser2": "^6.0.0",
+        "prismjs": "^1.17.1",
+        "strip-indent": "^3.0.0"
+      }
+    },
+    "highlight.js": {
+      "version": "10.7.3",
+      "resolved": "https://registry.nlark.com/highlight.js/download/highlight.js-10.7.3.tgz",
+      "integrity": "sha1-aXJy45kTVuQMPKxWanTu9oF1ZTE="
+    },
+    "htmlparser2": {
+      "version": "6.1.0",
+      "resolved": "https://registry.nlark.com/htmlparser2/download/htmlparser2-6.1.0.tgz?cache=0&sync_timestamp=1618846794076&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-6.1.0.tgz",
+      "integrity": "sha1-xNditsM3GgXb5l6UrkOp+EX7j7c=",
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0",
+        "domutils": "^2.5.2",
+        "entities": "^2.0.0"
+      }
+    },
+    "http-errors": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz?cache=0&sync_timestamp=1593407710477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.3.tgz",
+      "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=",
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        }
+      }
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz",
+      "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
+    },
+    "install": {
+      "version": "0.13.0",
+      "resolved": "https://registry.npm.taobao.org/install/download/install-0.13.0.tgz",
+      "integrity": "sha1-avbp2p3QmH3iq0IPeOYNnBcmB3Y="
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/is-binary-path/download/is-binary-path-2.1.0.tgz",
+      "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=",
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.5.0",
+      "resolved": "https://registry.nlark.com/is-core-module/download/is-core-module-2.5.0.tgz?cache=0&sync_timestamp=1626158736739&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-core-module%2Fdownload%2Fis-core-module-2.5.0.tgz",
+      "integrity": "sha1-91SENhfHC/0pt72HMnQAzaXBhJE=",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.nlark.com/is-docker/download/is-docker-2.2.1.tgz",
+      "integrity": "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao="
+    },
+    "is-expression": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-expression/download/is-expression-4.0.0.tgz",
+      "integrity": "sha1-wzFVliq/IdCv0lUlFNZ9LsFv0qs=",
+      "requires": {
+        "acorn": "^7.1.1",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.nlark.com/is-extglob/download/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/is-glob/download/is-glob-4.0.1.tgz",
+      "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.nlark.com/is-number/download/is-number-7.0.0.tgz",
+      "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss="
+    },
+    "is-plain-object": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.1.tgz",
+      "integrity": "sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs="
+    },
+    "is-promise": {
+      "version": "2.2.2",
+      "resolved": "https://registry.nlark.com/is-promise/download/is-promise-2.2.2.tgz",
+      "integrity": "sha1-OauVnMv5p3TPB597QMeib3YxNfE="
+    },
+    "is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz?cache=0&sync_timestamp=1628221853554&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-regex%2Fdownload%2Fis-regex-1.1.4.tgz",
+      "integrity": "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.nlark.com/is-wsl/download/is-wsl-2.2.0.tgz",
+      "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=",
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "jake": {
+      "version": "10.8.2",
+      "resolved": "https://registry.npm.taobao.org/jake/download/jake-10.8.2.tgz",
+      "integrity": "sha1-68nehVgWCmbYLQ6txqLlj7xQCns=",
+      "requires": {
+        "async": "0.9.x",
+        "chalk": "^2.4.2",
+        "filelist": "^1.0.1",
+        "minimatch": "^3.0.4"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz",
+          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz",
+          "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+          "requires": {
+            "color-name": "1.1.3"
+          }
+        },
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703342506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "js-stringify": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/js-stringify/download/js-stringify-1.0.2.tgz",
+      "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
+    },
+    "js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-4.1.0.tgz",
+      "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=",
+      "requires": {
+        "argparse": "^2.0.1"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.nlark.com/argparse/download/argparse-2.0.1.tgz",
+          "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg="
+        }
+      }
+    },
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.nlark.com/jsonparse/download/jsonparse-1.3.1.tgz",
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+    },
+    "jstransformer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/jstransformer/download/jstransformer-1.0.0.tgz",
+      "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
+      "requires": {
+        "is-promise": "^2.0.0",
+        "promise": "^7.0.1"
+      }
+    },
+    "lower-case": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz",
+      "integrity": "sha1-b6I3xj29xKgsoP2ILkci3F5jTig=",
+      "requires": {
+        "tslib": "^2.0.3"
+      }
+    },
+    "marked": {
+      "version": "2.1.3",
+      "resolved": "https://registry.nlark.com/marked/download/marked-2.1.3.tgz",
+      "integrity": "sha1-vQF872Qxck/Usn4GV/XOsUv/N1M="
+    },
+    "micromatch": {
+      "version": "4.0.4",
+      "resolved": "https://registry.nlark.com/micromatch/download/micromatch-4.0.4.tgz",
+      "integrity": "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=",
+      "requires": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.2.3"
+      }
+    },
+    "mime": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.5.2.tgz?cache=0&sync_timestamp=1615984369368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.5.2.tgz",
+      "integrity": "sha1-bj3GzCuVEGQ4MOXxnVy3U9pe6r4="
+    },
+    "mime-db": {
+      "version": "1.49.0",
+      "resolved": "https://registry.nlark.com/mime-db/download/mime-db-1.49.0.tgz",
+      "integrity": "sha1-89/eYMmenPO8lwHWh3ePU3ABy+0="
+    },
+    "mime-types": {
+      "version": "2.1.32",
+      "resolved": "https://registry.nlark.com/mime-types/download/mime-types-2.1.32.tgz?cache=0&sync_timestamp=1627407819001&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.32.tgz",
+      "integrity": "sha1-HQDonn3n/gIAjbYQAdngKFJnD9U=",
+      "requires": {
+        "mime-db": "1.49.0"
+      }
+    },
+    "min-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.nlark.com/min-indent/download/min-indent-1.0.1.tgz",
+      "integrity": "sha1-pj9oFnOzBXH76LwlaGrnRu76mGk="
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz",
+      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
+      "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI="
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz",
+      "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "moment": {
+      "version": "2.29.1",
+      "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz",
+      "integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M="
+    },
+    "moment-timezone": {
+      "version": "0.5.33",
+      "resolved": "https://registry.nlark.com/moment-timezone/download/moment-timezone-0.5.33.tgz",
+      "integrity": "sha1-slL9a7V/NBybWaWrYajlGnO70iw=",
+      "requires": {
+        "moment": ">= 2.9.0"
+      }
+    },
+    "morgan": {
+      "version": "1.10.0",
+      "resolved": "https://registry.nlark.com/morgan/download/morgan-1.10.0.tgz",
+      "integrity": "sha1-CRd4q8H8R801CYJGU9rh+qtrF9c=",
+      "requires": {
+        "basic-auth": "~2.0.1",
+        "debug": "2.6.9",
+        "depd": "~2.0.0",
+        "on-finished": "~2.3.0",
+        "on-headers": "~1.0.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz",
+      "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+    },
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.nlark.com/negotiator/download/negotiator-0.6.2.tgz",
+      "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
+    },
+    "nib": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/nib/download/nib-1.1.2.tgz",
+      "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=",
+      "requires": {
+        "stylus": "0.54.5"
+      },
+      "dependencies": {
+        "stylus": {
+          "version": "0.54.5",
+          "resolved": "https://registry.nlark.com/stylus/download/stylus-0.54.5.tgz",
+          "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
+          "requires": {
+            "css-parse": "1.7.x",
+            "debug": "*",
+            "glob": "7.0.x",
+            "mkdirp": "0.5.x",
+            "sax": "0.5.x",
+            "source-map": "0.1.x"
+          }
+        }
+      }
+    },
+    "no-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.nlark.com/no-case/download/no-case-3.0.4.tgz",
+      "integrity": "sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=",
+      "requires": {
+        "lower-case": "^2.0.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz",
+      "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU="
+    },
+    "nunjucks": {
+      "version": "3.2.3",
+      "resolved": "https://registry.nlark.com/nunjucks/download/nunjucks-3.2.3.tgz",
+      "integrity": "sha1-GzNhUkcpDpTigmO12FXs52VkijE=",
+      "requires": {
+        "a-sync-waterfall": "^1.0.0",
+        "asap": "^2.0.3",
+        "commander": "^5.1.0"
+      }
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.nlark.com/on-finished/download/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/on-headers/download/on-headers-1.0.2.tgz",
+      "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8="
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.nlark.com/open/download/open-7.4.2.tgz",
+      "integrity": "sha1-uBR+Jtzz5CYxbHMAif1x7dKcIyE=",
+      "requires": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz?cache=0&sync_timestamp=1615984376007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparseurl%2Fdownload%2Fparseurl-1.3.3.tgz",
+      "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ="
+    },
+    "pascal-case": {
+      "version": "3.1.2",
+      "resolved": "https://registry.nlark.com/pascal-case/download/pascal-case-3.1.2.tgz",
+      "integrity": "sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=",
+      "requires": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz",
+      "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U="
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz",
+      "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU="
+    },
+    "picomatch": {
+      "version": "2.3.0",
+      "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz?cache=0&sync_timestamp=1621648246651&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpicomatch%2Fdownload%2Fpicomatch-2.3.0.tgz",
+      "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI="
+    },
+    "pretty-hrtime": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
+    },
+    "prismjs": {
+      "version": "1.24.1",
+      "resolved": "https://registry.nlark.com/prismjs/download/prismjs-1.24.1.tgz?cache=0&sync_timestamp=1625313362193&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprismjs%2Fdownload%2Fprismjs-1.24.1.tgz",
+      "integrity": "sha1-xNeJXE1lACiUgvqJNtnN0ZJoQDY="
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz",
+      "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg="
+    },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.nlark.com/promise/download/promise-7.3.1.tgz",
+      "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
+      "requires": {
+        "asap": "~2.0.3"
+      }
+    },
+    "pug": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/pug/download/pug-3.0.2.tgz",
+      "integrity": "sha1-81xxBzQ0VOQ7wnrg/3bHMbeOpTU=",
+      "requires": {
+        "pug-code-gen": "^3.0.2",
+        "pug-filters": "^4.0.0",
+        "pug-lexer": "^5.0.1",
+        "pug-linker": "^4.0.0",
+        "pug-load": "^3.0.0",
+        "pug-parser": "^6.0.0",
+        "pug-runtime": "^3.0.1",
+        "pug-strip-comments": "^2.0.0"
+      }
+    },
+    "pug-attrs": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/pug-attrs/download/pug-attrs-3.0.0.tgz",
+      "integrity": "sha1-sQRR4DSBZeMfrRzCPr3dncc0fEE=",
+      "requires": {
+        "constantinople": "^4.0.1",
+        "js-stringify": "^1.0.2",
+        "pug-runtime": "^3.0.0"
+      }
+    },
+    "pug-code-gen": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/pug-code-gen/download/pug-code-gen-3.0.2.tgz",
+      "integrity": "sha1-rRkPSUMTO/GGtguA3kgxAOEy4s4=",
+      "requires": {
+        "constantinople": "^4.0.1",
+        "doctypes": "^1.1.0",
+        "js-stringify": "^1.0.2",
+        "pug-attrs": "^3.0.0",
+        "pug-error": "^2.0.0",
+        "pug-runtime": "^3.0.0",
+        "void-elements": "^3.1.0",
+        "with": "^7.0.0"
+      }
+    },
+    "pug-error": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/pug-error/download/pug-error-2.0.0.tgz",
+      "integrity": "sha1-XGIXPLCcNN4qLOBPF7it/sdNjKU="
+    },
+    "pug-filters": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/pug-filters/download/pug-filters-4.0.0.tgz",
+      "integrity": "sha1-0+Sa9bqEcum3pm2YDnB86dLMm14=",
+      "requires": {
+        "constantinople": "^4.0.1",
+        "jstransformer": "1.0.0",
+        "pug-error": "^2.0.0",
+        "pug-walk": "^2.0.0",
+        "resolve": "^1.15.1"
+      }
+    },
+    "pug-lexer": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npm.taobao.org/pug-lexer/download/pug-lexer-5.0.1.tgz",
+      "integrity": "sha1-rkRijFvvmxkLZlaDsojKkCS4sNU=",
+      "requires": {
+        "character-parser": "^2.2.0",
+        "is-expression": "^4.0.0",
+        "pug-error": "^2.0.0"
+      }
+    },
+    "pug-linker": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/pug-linker/download/pug-linker-4.0.0.tgz",
+      "integrity": "sha1-EsvAWU/Fo+Brn8Web5PBRpYqdwg=",
+      "requires": {
+        "pug-error": "^2.0.0",
+        "pug-walk": "^2.0.0"
+      }
+    },
+    "pug-load": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/pug-load/download/pug-load-3.0.0.tgz",
+      "integrity": "sha1-n9nNpSICsIrbEdJWgfufNL1BtmI=",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "pug-walk": "^2.0.0"
+      }
+    },
+    "pug-parser": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npm.taobao.org/pug-parser/download/pug-parser-6.0.0.tgz",
+      "integrity": "sha1-qP3ANYY6lbLB3F6/Ts+AtOdqEmA=",
+      "requires": {
+        "pug-error": "^2.0.0",
+        "token-stream": "1.0.0"
+      }
+    },
+    "pug-runtime": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/pug-runtime/download/pug-runtime-3.0.1.tgz",
+      "integrity": "sha1-9jaXYgRyPzWoxfb61qzaKhkbg9c="
+    },
+    "pug-strip-comments": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/pug-strip-comments/download/pug-strip-comments-2.0.0.tgz",
+      "integrity": "sha1-+UsH/WtJVSMzD0kKf1VLT/h2MD4=",
+      "requires": {
+        "pug-error": "^2.0.0"
+      }
+    },
+    "pug-walk": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/pug-walk/download/pug-walk-2.0.0.tgz",
+      "integrity": "sha1-QXqrwpIyu0SZtbUGmistKiTV9f4="
+    },
+    "qr-image": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npm.taobao.org/qr-image/download/qr-image-3.2.0.tgz",
+      "integrity": "sha1-n6gpW+rlDEoUnPn5CaHbRkqGcug="
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz",
+      "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE="
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.nlark.com/readdirp/download/readdirp-3.6.0.tgz",
+      "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=",
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.13.9",
+      "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz",
+      "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I="
+    },
+    "resolve": {
+      "version": "1.20.0",
+      "resolved": "https://registry.nlark.com/resolve/download/resolve-1.20.0.tgz",
+      "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=",
+      "requires": {
+        "is-core-module": "^2.2.0",
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.nlark.com/resolve-url/download/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+    },
+    "rfdc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/rfdc/download/rfdc-1.3.0.tgz",
+      "integrity": "sha1-0LfEQasnINBdxM8m4ByJYx2doIs="
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
+    },
+    "sax": {
+      "version": "0.5.8",
+      "resolved": "https://registry.npm.taobao.org/sax/download/sax-0.5.8.tgz",
+      "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
+    },
+    "semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+      "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
+    },
+    "send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.nlark.com/send/download/send-0.17.1.tgz",
+      "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=",
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+            }
+          }
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1615984369368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz",
+          "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE="
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.nlark.com/serve-static/download/serve-static-1.14.1.tgz",
+      "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=",
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      }
+    },
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz",
+      "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz",
+      "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz",
+      "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI="
+    },
+    "source-map": {
+      "version": "0.1.43",
+      "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz",
+      "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+      "requires": {
+        "amdefine": ">=0.0.4"
+      }
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.nlark.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=",
+      "requires": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.nlark.com/source-map-url/download/source-map-url-0.4.1.tgz",
+      "integrity": "sha1-CvZmBadFpaL5HPG7+KevvCg97FY="
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.nlark.com/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&sync_timestamp=1618847174560&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+    },
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1609654060878&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+    },
+    "strip-ansi": {
+      "version": "6.0.0",
+      "resolved": "https://registry.nlark.com/strip-ansi/download/strip-ansi-6.0.0.tgz",
+      "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=",
+      "requires": {
+        "ansi-regex": "^5.0.0"
+      }
+    },
+    "strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-3.0.0.tgz?cache=0&sync_timestamp=1620053310624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-indent%2Fdownload%2Fstrip-indent-3.0.0.tgz",
+      "integrity": "sha1-wy4c7pQLazQyx3G8LFS8znPNMAE=",
+      "requires": {
+        "min-indent": "^1.0.0"
+      }
+    },
+    "stylus": {
+      "version": "0.54.8",
+      "resolved": "https://registry.nlark.com/stylus/download/stylus-0.54.8.tgz",
+      "integrity": "sha1-PaPmWWa8Vnp7BEv+DuzmU+CZ0Uc=",
+      "requires": {
+        "css-parse": "~2.0.0",
+        "debug": "~3.1.0",
+        "glob": "^7.1.6",
+        "mkdirp": "~1.0.4",
+        "safer-buffer": "^2.1.2",
+        "sax": "~1.2.4",
+        "semver": "^6.3.0",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "css-parse": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/css-parse/download/css-parse-2.0.0.tgz",
+          "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=",
+          "requires": {
+            "css": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.nlark.com/debug/download/debug-3.1.0.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.7",
+          "resolved": "https://registry.nlark.com/glob/download/glob-7.1.7.tgz",
+          "integrity": "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA=",
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz",
+          "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34="
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz",
+          "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk="
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz",
+          "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M="
+        }
+      }
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703342506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
+      "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz?cache=0&sync_timestamp=1618847142316&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftext-table%2Fdownload%2Ftext-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+    },
+    "tildify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/tildify/download/tildify-2.0.0.tgz",
+      "integrity": "sha1-8gXzZ01nfOaYtwZ6melJzgO0dUo="
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.nlark.com/timsort/download/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
+    },
+    "titlecase": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.3.tgz",
+      "integrity": "sha1-/G1l/1grBgJBB2jvGgm3BQYxPcM="
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.nlark.com/to-regex-range/download/to-regex-range-5.0.1.tgz",
+      "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz",
+      "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM="
+    },
+    "token-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/token-stream/download/token-stream-1.0.0.tgz",
+      "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ="
+    },
+    "tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz",
+      "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4="
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.nlark.com/urix/download/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.nlark.com/utils-merge/download/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.nlark.com/vary/download/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+    },
+    "void-elements": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/void-elements/download/void-elements-3.1.0.tgz",
+      "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk="
+    },
+    "warehouse": {
+      "version": "4.0.0",
+      "resolved": "https://registry.nlark.com/warehouse/download/warehouse-4.0.0.tgz",
+      "integrity": "sha1-RYMrxD4f0yO9nTyGsnYUMLoNHns=",
+      "requires": {
+        "JSONStream": "^1.0.7",
+        "bluebird": "^3.2.2",
+        "cuid": "^2.1.4",
+        "graceful-fs": "^4.1.3",
+        "is-plain-object": "^3.0.0",
+        "rfdc": "^1.1.4"
+      }
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz",
+      "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "with": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npm.taobao.org/with/download/with-7.0.2.tgz",
+      "integrity": "sha1-zO461ULSVTinp6gKrSErmChJW6w=",
+      "requires": {
+        "@babel/parser": "^7.9.6",
+        "@babel/types": "^7.9.6",
+        "assert-never": "^1.2.1",
+        "babel-walk": "3.0.0-canary-5"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    }
+  }
+}

+ 33 - 0
package.json

@@ -0,0 +1,33 @@
+{
+  "name": "hexo-site",
+  "version": "0.0.0",
+  "private": true,
+  "scripts": {
+    "build": "hexo generate",
+    "clean": "hexo clean",
+    "deploy": "hexo deploy",
+    "server": "hexo server"
+  },
+  "hexo": {
+    "version": "5.4.0"
+  },
+  "dependencies": {
+    "hexo": "^5.0.0",
+    "hexo-abbrlink": "^2.2.1",
+    "hexo-bilibili-bangumi": "^1.6.0",
+    "hexo-deployer-git": "^3.0.0",
+    "hexo-generator-archive": "^1.0.0",
+    "hexo-generator-calendar": "git://github.com/howiefh/hexo-generator-calendar.git",
+    "hexo-generator-category": "^1.0.0",
+    "hexo-generator-index": "^2.0.0",
+    "hexo-generator-tag": "^1.0.0",
+    "hexo-helper-qrcode": "^1.0.2",
+    "hexo-renderer-ejs": "^1.0.0",
+    "hexo-renderer-marked": "^4.0.0",
+    "hexo-renderer-pug": "^2.0.0",
+    "hexo-renderer-stylus": "^2.0.1",
+    "hexo-server": "^2.0.0",
+    "hexo-theme-landscape": "^0.0.3",
+    "install": "^0.13.0"
+  }
+}

+ 4 - 0
scaffolds/draft.md

@@ -0,0 +1,4 @@
+---
+title: {{ title }}
+tags:
+---

+ 4 - 0
scaffolds/page.md

@@ -0,0 +1,4 @@
+---
+title: {{ title }}
+date: {{ date }}
+---

+ 5 - 0
scaffolds/post.md

@@ -0,0 +1,5 @@
+---
+title: {{ title }}
+date: {{ date }}
+tags:
+---

File diff suppressed because it is too large
+ 0 - 0
source/_data/bangumis.json


+ 6 - 0
source/_posts/hello-world.md

@@ -0,0 +1,6 @@
+---
+title: 第一次使用hexo
+date: 2021-08-06
+abbrlink: helloword
+---
+# 第一次使用仅为测试

+ 2038 - 0
source/_posts/微服务框架.md

@@ -0,0 +1,2038 @@
+---
+title: 微服务框架
+date: 2021-08-07
+tag: springcloud
+abbrlink: springcloud
+---
+
+# 微服务框架
+
+[toc]
+
+## 一、SpringCloud介绍
+
+### 1.1 微服务架构
+
+> https://martinfowler.com/articles/microservices.html
+>
+> 微服务架构提出者:马丁福勒
+
+> 简而言之,微服务体系结构[样式 [1\]](https://martinfowler.com/articles/microservices.html#footnote-etymology)是一种将单个应用程序开发为一组小型服务的方法,每个应用程序在自己的进程中运行,并与轻量级机制(通常是 HTTP 资源 API)通信。这些服务围绕业务功能构建,可通过全自动部署机制独立部署。这些服务的集中管理最少,可能以不同的编程语言编写,并使用不同的数据存储技术。
+
+### 1.2 SpringCloud介绍
+
+> SpringCloud是微服务架构落地的一套技术栈
+>
+> SpringCloud中的大多数技术都是基于Netflix公司的技术进行第二次开发。
+>
+> 1、SpringCloud的中文社区网站:http://springcloud.cn/
+>
+> 2、SpringCloud的中文网 :http://springcloud.cc/
+>
+> 八个技术点:
+>
+> 1、Eureka - 服务的注册与发现
+>
+> 2、Robbn - 服务之间的负载均衡
+>
+> 3、Feign - 服务之间的通讯
+>
+> 4、Hystrix - 服务的线程隔离及其熔断器
+>
+> 5、Zuul - 服务网关
+>
+> 6、Stream - 实现MQ的使用
+>
+> 7、Config - 动态配置
+>
+> 8、 Sleuth - 服务追踪
+
+## 二、服务的注册与发现-Eureka
+
+### 2.1 引言
+
+> Eureka就是帮助我们维护所有服务的信息,以便服务之间的相互调用
+
+![1605019839175](images/1605019839175.png)
+
+### 2.2 Eureka的快速入门
+
+#### 2.2.1 创建EurekaServer
+
+> 1、创建一个父工程,并且在父工程中指定SpringCloud版本,并且将packaing修改为pom
+
+```xml
+<packaging>pom</packaging>
+
+<properties>
+   <java.version>1.8</java.version>
+   <spring.cloud-version>Hoxton.SR8</spring.cloud-version>
+</properties>
+<dependencyManagement>
+   <dependencies>
+      <dependency>
+          <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-dependencies</artifactId>
+            <version>${spring.cloud-version}</version>
+            <type>pom</type>
+            <scope>import</scope>
+        </dependency>
+    </dependencies>
+</dependencyManagement>
+```
+
+> 2、创建eureka的server,创建springboot工程,并且导入依赖,再启动类中添`@EnableEurekaServer`注解和编写yml文件
+
+> 2.1、导入依赖
+
+```xml
+<dependencies>
+   <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+   </dependency>
+   <dependency>
+       <groupId>org.springframework.cloud</groupId>
+       <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
+   </dependency>
+</dependencies>
+```
+
+> 2.2、启动类添加注解
+
+```java
+@EnableEurekaServer
+@SpringBootApplication
+public class EurekaApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(EurekaApplication.class,args);
+    }
+}
+```
+
+> 2.3 编写yml配置文件
+
+```yml
+server:
+  port: 8761
+
+eureka:
+  instance:
+    hostname: localhost
+  client:
+    #当前的eureka是单机版的
+    registerWithEureka: false
+    fetchRegistry: false
+    serviceUrl:
+      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
+```
+
+
+
+#### 2.2.2 创建EurekaClient
+
+> 1、创建Maven工程,修改为SpringBoot
+
+> 2、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+</dependency>
+```
+
+> 3、在启动类上添加注解`@EnableEurekaClient`
+
+```java
+@EnableEurekaClient
+@SpringBootApplication
+public class CustomerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(CustomerApplication.class,args);
+    }
+}
+```
+
+> 4、编写配置文件
+
+```yml
+#指定Eureka服务地址
+eureka:
+  client:
+    service-url:
+      defaultZone: http://localhost:8761/eureka
+
+#指定服务名称
+spring:
+  application:
+    name: CUSTOMER
+```
+
+![image-20201111095518705](images/image-20201111095518705.png)
+
+#### 2.2.3 测试Eureka
+
+> 1、创建了一个Search搜索模块,并且注册到Eureka
+
+> 2、使用EurekaClient的对象获取服务信息
+
+```java
+@Autowired
+    private EurekaClient eurekaClient;
+```
+
+> 3、创建RestTemplate
+
+```java
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public  RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+}
+```
+
+> 4、使用RestTemplate调用
+
+```java
+@GetMapping("/customer")
+public String customer() {
+    //1. 通过eurekaClient 获取到SEARCH服务的信息
+    InstanceInfo info = eurekaClient.getNextServerFromEureka("SEARCH", false);
+    //2. 获取到访问的地址
+    String url = info.getHomePageUrl();
+    System.out.println(url);
+    //3. 通过restTemplate访问
+    String result = restTemplate.getForObject(url + "/search", String.class);
+    //4. 返回
+    return result;
+}
+```
+
+### 2.3 Eureka的安全性
+
+> 实现Eureka认证
+
+> 1、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-security</artifactId>
+</dependency>
+```
+
+> 2、编写配置类
+
+```java
+@EnableWebSecurity
+class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        //忽略掉/eureka/**路径
+        http.csrf().ignoringAntMatchers("/eureka/**");
+        super.configure(http);
+    }
+}
+```
+
+> 3、编写配置文件,配置用户密码
+
+```yml
+#指定用户名密码
+spring:
+  security:
+    user:
+      name: root
+      password: root
+```
+
+> 4、其他服务想注册到Eureka上需要添加用户名密码
+
+```yml
+#指定Eureka服务地址
+eureka:
+  client:
+    service-url:
+      defaultZone: http://用户名:密码@localhost:8761/eureka
+```
+
+### 2.4 Eureka的高可用性
+
+> 如果程序正在运行,突然Eureka宕机了
+>
+> 1、如果调用方访问过一次被调用方,Eureka的宕机就不会影响到功能
+>
+> 2、如果调用方没有访问过被调用方,Eureka的宕机就会造成当前功能的不可用到功能
+
+> 搭建Eureka高可用
+
+![image-20201111110217411](images/image-20201111110217411.png)
+
+> 1、准备多态Eureka
+>
+> 采用了复制的方式,删除iml和target文件,并且修改pom.xml中的项目名称,再给负公差添加module
+
+> 2、让服务注册到多台Eureka上
+
+```yml
+server:
+  port: 8761
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://root:root@localhost:8762/eureka/
+```
+
+```yml
+server:
+  port: 8762
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://root:root@localhost:8761/eureka/
+
+```
+
+> 3、让多台Eureka之间相互通讯
+
+```yml
+eureka:
+  client:
+    #当前的eureka是单机版的 false单机版  true集群
+    registerWithEureka: true
+    fetchRegistry: true
+    serviceUrl:
+      defaultZone: http://root:root@localhost:8761/eureka/
+```
+
+### 2.5 Eureka的细节
+
+>1、EurekaClient启动时,讲自己的信息注册到EurekaServer上,EurekaServer就会储存EurekaClient的注册信息。
+
+> 2、当EurekaClient调用服务时,本地没有注册信息的缓存时,去EurekaServer中获取注册信息
+
+> 3、EurekaClient会通过心跳的方式去和EurekaServer进行连接。(默认30s EurekaClient就会发送一次心跳请求,如果超过了90s还没有发送心跳信息的话,EurekaSevrer就认为你宕机了,将当前的EurekaClient从注册表中移除)
+
+```yml
+eureka:
+  instance:
+    lease-renewal-interval-in-seconds: 30 #心跳间隔
+    lease-expiration-duration-in-seconds: 90 #多久没法送,就认为你宕机了
+```
+
+> 4、EurekaClient会每个30s去EurekaServer中去更新本地的注册表
+
+```yml
+eureka:
+  client:
+  	#每隔多久去更新一下本地的注册表缓存信息
+    registry-fetch-interval-seconds: 30
+```
+
+> 5、Eureka的自我保护机制,统计15分钟内,如果一个服务的心跳发送比例低于85%,EurekaServer就会开启自我保护机制
+>
+> ​	1、不会从EurekaServer中去移除长时间没有收到心跳的服务
+>
+> ​	2、EurekaServer还是可以正常提供服务的
+>
+> ​	3、网络稳定时,EurekaServer才会开始将自己的信息被其他节点同步过去
+
+![image-20201111132523595](images/image-20201111132523595.png)
+
+```yml
+eureka:
+  # Eureka保护机制配置
+  server:
+  	#true 开启  false关闭
+    enable-self-preservation: true  
+```
+
+> 6、CAP定理,C-一致性  A-可用性  P-分区容错性,这三个特新在分布是环境下,只能满足2个,而且分区容错性在分布式环境下,时必须要满足的。只能在AC之间进行权衡。
+>
+> 1、如果选择CP,保证了一致性,可能会造成你系统在一定时间内是不可以的,如果你同步数据的时间比较长,造成的损失就越大。
+>
+> 2、如果选择AP的效果,高可用的集群,Eureka集群是无中心,Eureka即便宕机几个也不会影响系统的使用,不需要重新去枚举一个master,也会导致一定时间内数据是不一致。
+
+## 三、服务间的负载均衡-Robbin
+
+### 3.1 引言
+
+> Robbin是帮助我们实现服务和服务负载均衡
+>
+> 客户端负载均衡:customer客户端模块,将2个Search模块信息全部拉取到本地的缓存,在customer中自己做一个负载均衡的策略,选中某一个服务。
+>
+> 服务端负载均衡:在注册中心中,直接根据你指定的负载均衡策略,帮你选中一个指定的服务器信息,并返回。
+
+![image-20201111134022333](images/image-20201111134022333.png)
+
+### 3.2 Robbin的快速入门
+
+> 1、启动两个Search模块
+
+> 2、在customer导入robbin依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
+</dependency>
+```
+
+> 3、配置整合RestTemplate和Robbin
+
+```java
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    @LoadBalanced
+    public   RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+}
+```
+
+> 4、在customer中去访问Search
+
+```java
+@GetMapping("/customer")
+public String customer() {
+    String result = restTemplate.getForObject("http://SEARCH/search", String.class);
+    //4. 返回
+    return result;
+}
+```
+
+### 3.3 Robbin配置负载均衡策略
+
+> 1、负载均衡策略
+>
+> 	1. RandomRule:随机策略
+>  	2. RoundRobbinRule:轮询策略
+>  	3. WeightedResponseTimeRule:默认会采用轮询的策略,后续会根据服务的响应时间,自动给你分配权重
+>  	4. BestAvailableRule:根据被调用方并发数最小的去分配
+
+> 2、采用注解的形式
+
+```java
+@Bean
+public IRule robbinRule() {
+    return new RandomRule();
+}
+```
+
+> 3、配置文件去指定负载均衡的策略(推荐)
+
+```yml
+#指定具体服务的负载均衡策略
+SEARCH:        #编写服务名称
+  ribbon:
+    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule  #具体负载均衡使用的类
+```
+
+## 四、服务间的调用-Feign
+
+### 4.1 引言
+
+> Feign可以帮助我们实现面向接口编程,就直接调用其他服务,简化开发。
+
+### 4.2 Feign的快速入门
+
+> 1、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-openfeign</artifactId>
+</dependency>
+```
+
+> 2、添加一个注解`@EnableFeignClients`
+
+```java
+@EnableEurekaClient
+@SpringBootApplication
+@EnableFeignClients
+public class CustomerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(CustomerApplication.class,args);
+    }
+}
+```
+
+> 3、创建一个接口,并且和search模块做映射
+
+```java
+//指定服务名称
+@FeignClient("SEARCH")
+public interface SearchClient {
+
+    //value -> 目标服务的请求路径,method -> 映射请求方式
+    @RequestMapping(value = "/search",method = RequestMethod.GET)
+    public String search();
+}
+```
+
+> 4、测试使用
+
+```java
+@Autowired
+private SearchClient searchClient;
+
+@GetMapping("/customer")
+public String customer() {    
+    String result = searchClient.search();
+    return result;
+}
+```
+
+### 4.3 Feign的传递参数方式
+
+> 1、注意事项
+>
+> 	1. 如果你传递的参数,比较复杂时,默认会采用POST的请求方式。
+>  	2. 传递单个参数时,推荐使用@PathVariable,如果传递的单个参数比较多,这里也可以采用@RequestParam,不要省略value属性
+>  	3. 传递对象信息时,统一采用json的方式,添加@RequestBody
+>  	4. Client接口必须采用@RequestMapping
+
+> 2、在Search模块下准备三个接口
+
+```java
+@GetMapping("/search/{id}")
+public Customer findById(@PathVariable Integer id) {
+    return new Customer(1, "zhangsan", 23);
+}
+
+@GetMapping("/getCustomer")
+public Customer getcustomer(@RequestParam Integer id, @RequestParam String name) {
+    return new Customer(id, name, 23);
+}
+
+@PostMapping("save") 
+public Customer save(@RequestBody Customer customer) {
+    return customer;
+}
+```
+
+> 3、封装Customer模块的Controller
+
+```java
+@GetMapping("/customer/{id}")
+public Customer findById(@PathVariable Integer id) {
+    return searchClient.findById(id);
+}
+
+@GetMapping("/getCustomer")
+public Customer getcustomer(@RequestParam Integer id, @RequestParam String name) {
+    return searchClient.getcustomer(id,name);
+}
+
+@GetMapping("save")
+public Customer save(Customer customer) {
+    return searchClient.save(customer);
+}
+```
+
+> 4、再封装Client接口
+
+```java
+@RequestMapping(value = "/search/{id}",method = RequestMethod.GET)
+Customer findById(@PathVariable(value = "id") Integer id);
+
+@RequestMapping(value = "/getCustomer",method = RequestMethod.GET)
+Customer getcustomer(@RequestParam(value = "id") Integer id, @RequestParam(value = "name") String name);
+
+@RequestMapping(value = "save",method = RequestMethod.GET) //会自动转化成POST请求  405
+Customer save(@RequestBody Customer customer);
+```
+
+> 5、测试
+
+![image-20201111155409030](images/image-20201111155409030.png)
+
+### 4.4 Feign的Fallback
+
+> Fallback可以帮助我们在使用Feign去调用另一个服务时,如果出现了问题,走服务降级,返回一个错误的数据,避免功能因为一个服务出现问题,全部失效
+
+> 1、创建一个POJO类,实现Client接口
+
+```java
+@Component
+public class SearchClientFallBack implements SearchClient {
+    @Override
+    public String search() {
+        return "出现问题了";
+    }
+
+    @Override
+    public Customer findById(Integer id) {
+        return null;
+    }
+
+    @Override
+    public Customer getcustomer(Integer id, String name) {
+        return null;
+    }
+
+    @Override
+    public Customer save(Customer customer) {
+        return null;
+    }
+}
+```
+
+> 2、修改Client接口中的注解,添加一个属性
+
+```java
+@FeignClient(value = "SEARCH",fallback = SearchClientFallBack.class)
+```
+
+> 3、添加一个配置文件。
+
+```yml
+#feign和hystrix主件整合
+feign:
+  hystrix:
+    enabled: true
+```
+
+> 调用方无法知道具体的错误信息是什么,通过FallBackFactory的方式去实现这个功能
+
+> 1、FallBackFactory基于fallback
+
+> 2、创建一个POJO类,实现FallBackFactory<Client>
+
+```java
+@Component
+public class SearchClientFallBackFactory implements FallbackFactory<SearchClient> {
+
+    @Autowired
+    private SearchClientFallBack searchClientFallBack;
+    @Override
+    public SearchClient create(Throwable throwable) {
+        throwable.printStackTrace();
+        return searchClientFallBack;
+    }
+}
+```
+
+> 3、修改Client接口中的属性
+
+```java
+@FeignClient(value = "SEARCH",
+        fallbackFactory = SearchClientFallBackFactory.class
+)
+```
+
+## 五、服务的隔离及熔断器-Hystrix
+
+### 5.1 引言
+
+![image-20201111162630381](images/image-20201111162630381.png)
+
+### 5.2 降级机制实现
+
+> 1、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+</dependency>
+```
+
+> 2、添加一个注解`@EnableCircuitBreaker`
+
+```java
+@EnableEurekaClient
+@SpringBootApplication
+@EnableCircuitBreaker
+public class CustomerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(CustomerApplication.class,args);
+    }
+}
+```
+
+> 3、针对某一个接口去编写他的降级方法
+
+```java
+@GetMapping("/customer/{id}")
+@HystrixCommand(fallbackMethod ="findByIdFallBack" )
+public Customer findById(@PathVariable Integer id) {
+    int i = 1/0;
+    return searchClient.findById(id);
+}
+
+//findById的降级方法,方法描述要与接口一致
+public Customer findByIdFallBack(Integer id) {
+    return new Customer(-1,"",0);
+}
+```
+
+> 4、在接口上添加注解
+
+```java
+@HystrixCommand(fallbackMethod ="findByIdFallBack" )
+```
+
+> 5、测试
+
+![image-20201111164239591](images/image-20201111164239591.png)
+
+### 5.3 线程隔离
+
+> 如果使用Tomcat的线程池去接收用户的请求,使用当前线程去执行其他服务的功能,如果某一个服务出现了故障,导致tomcat的线程大量的堆积,导致tomcat无法处理其他业务功能。
+>
+> 1、Hystrix线程池(默认),接收用户请求采用tomcat的线程池,执行业务代码,调用其他服务时,采用Hystrix的线程池。
+>
+> 2、信号量,使用的还是Tomcat的线程池,帮助我们取关了Tomcat的线程池
+
+> 1、Hystrix的线程池的配置(具体的配置属性需要去查看HystrixCommandProperties类)  [wiki](https://github.com/Netflix/Hystrix/wiki/Configuration)
+>
+> 	1. 线程隔离策略:name = `hystrix.command.default.execution.isolation.strategy`,value=`THREAD`,`SEMAPHORE `
+>  	2. 指定超时时间(针对线程池):name= `hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds` ,value =`1000`
+>  	3. 是否开启超时时间配置:name=`hystrix.command.default.execution.timeout.enabled`,value=`true`
+>  	4. 超时之后是否中断线程:name=`hystrix.command.default.execution.isolation.thread.interruptOnTimeout`,value=`true`
+>  	5. 取消任务之后是否中断线程:name=`hystrix.command.default.execution.isolation.thread.interruptOnCancel`,value=false
+
+> 2、信号量配置信息
+>
+> 1. 线程隔离策略:name = `hystrix.command.default.execution.isolation.strategy`,value=`THREAD`,`SEMAPHORE `
+> 2. 指定信号量的最大并发请求数:name=`hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests`,value=`10`
+
+### 5.4 断路器
+
+#### 5.4.1 断路器介绍
+
+> 如果调用指定服务时,如果说这个服务的失败率达到你输入的阈值麻将断路器从closed状态,转变为open状态,指定服务时无法被访问的,如果你访问就直接走fallback方法,在一定时间内,open状态会再次转变为half open状态,允许一个请求发送到我指定服务,如果成功,则转变为closed,如果失败,服务再次转变为open状态,会再次循环到hald open,直到专路器回到一个closed状态。
+
+![image-20201111181650929](images/image-20201111181650929.png)
+
+#### 5.4.2 配置断路器的监控界面
+
+> 1、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
+</dependency>
+```
+
+> 2、在启动类中添加注解`@EnableHystrixDashboard`
+
+```java
+@EnableEurekaClient
+@SpringBootApplication
+@EnableFeignClients
+@EnableCircuitBreaker
+@EnableHystrixDashboard
+@ServletComponentScan("cn.zyjblogs.servlet")
+public class CustomerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(CustomerApplication.class,args);
+    }
+}
+```
+
+> 3、配置一个Servlet路径,指定上Hystrix的Servlet
+
+```java
+@WebServlet("/hystrix.stream")
+public class HystrixServlet extends HystrixMetricsStreamServlet {
+}
+```
+
+> 4、在启动类上添加扫描Servlet的注解`@ServletComponentScan("cn.zyjblogs.servlet")`
+
+> 5、配置文件
+
+```yml
+hystrix:
+  dashboard:
+    proxy-stream-allow-list: localhost
+```
+
+> 6、测试
+
+直接访问: http://host:port/hystrix.stream
+
+![1605103421256](images/1605103421256.png)
+
+> 在当前位置输入映射好的servlet路径
+
+![1605103436874](images/1605103436874.png)
+
+#### 5.4.3 配置断路器的属性
+
+> 断路器的属性(10秒之内)
+>
+> 	1. 断路器的开关:name=` hystrix.command.default.circuitBreaker.enabled `,value=`true`
+>  	2. 失败阈值的总请求数:name=` hystrix.command.default.circuitBreaker.requestVolumeThreshold `,value=`20`
+>  	3. 请求总数失败率达到%多少时打开断路器:name=` hystrix.command.default.circuitBreaker.errorThresholdPercentage `,value=`50`
+>  	4. 断路器open状态后,多少秒是拒绝请求的:name=` hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds `value=`5000`
+>  	5. 强制让服务拒绝请求:name=` hystrix.command.default.circuitBreaker.forceOpen `,value=`false`
+>  	6. 强制让服务接收请求:name=` hystrix.command.default.circuitBreaker.forceClosed `,value=`false`
+
+> 具体配置方式
+
+```java
+@GetMapping("/customer/{id}")
+@HystrixCommand(fallbackMethod ="findByIdFallBack",commandProperties = {
+    @HystrixProperty(name = "circuitBreaker.enabled",value="true"),
+    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value="10"),
+    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value="70"),
+    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value="5000")
+})
+```
+
+### 5.5 请求缓存
+
+#### 5.5.1 请求缓存的介绍
+
+> 1、请求缓存的声明周期是一次请求
+>
+> 2、请求缓存是缓存当前线程中的一个方法,将方法参数作为key,方法的返回结果作为value
+>
+> 3、在一次请求中,目标方法被调用过一次以后就都会被缓存
+
+![1605104987931](images/1605104987931.png)
+
+#### 5.5.2 请求缓存的实现
+
+> 1、创建一个Service,在Service中调用Search服务
+
+```java
+@Service
+public class CustomerService {
+
+    @Autowired
+    private SearchClient searchClient;
+
+    @CacheResult
+    @HystrixCommand(commandKey = "findById")
+    public Customer findById(@CacheKey Integer id) throws InterruptedException {
+        return searchClient.findById(id);
+    }
+
+    @CacheRemove(commandKey = "findById")
+    @HystrixCommand
+    public void clearFindById(@CacheKey Integer id) {
+        System.out.println("findById缓存被清空");
+    }
+
+}
+```
+
+> 2、使用请求缓存的注解`@CacheResult` `CacheRemove`
+>
+>  	1. @CacheResult:帮助我们缓存当前方法的返回结果(必须配合@HystrixCommand使用)
+>  	2. @CacheRemove:帮助我们清除某一个缓存信息(基于commandKey)
+>  	3. @CacheKey:指定那个方法参数作为缓存标识
+
+> 3、修改Search模块的结果返回值
+
+```java
+ return new Customer(id, name, (int) (Math.random() * 100000));
+```
+
+> 4、编写Filter,去构建HystrixRequestContext
+
+```java
+@WebFilter("/*")
+public class HystrixRequestContextFilter implements Filter {
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        HystrixRequestContext.initializeContext();
+        filterChain.doFilter(servletRequest,servletResponse);
+    }
+}
+```
+
+> 5、修改Controller
+
+```java
+@Autowired 
+private CustomerService customerService;
+
+ @GetMapping("/customer/{id}")
+  @HystrixCommand(
+      fallbackMethod = "findByIdFallBack",
+      commandProperties = {
+        @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
+        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
+        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "70"),
+        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),
+      })
+  public Customer findById(@PathVariable Integer id) throws InterruptedException {
+    System.out.println(Thread.currentThread().getName());
+    if (id == 1) {
+      int i = 1 / 0;
+    }
+    //一下为添加内容
+    System.out.println(customerService.findById(id));
+    System.out.println(customerService.findById(id));
+    customerService.clearFindById(id);
+    System.out.println(customerService.findById(id));
+    System.out.println(customerService.findById(id));
+    customerService.clearFindById(id);
+      
+    return searchClient.findById(id);
+  }
+```
+
+> 6、测试
+
+![1605106759891](images/1605106759891.png)
+
+## 六、服务的网关-Zuul
+
+### 6.1 引言
+
+> 1、客户端维护大量的ip和port信息,直接访问指定服务
+>
+> 2、认证和授权操作,需要在每一个模块中添加认证和授权操作
+>
+> 3、项目迭代,服务拆分,服务要合并,需要客户端镜像大量的变化
+>
+> 4、统一的把安全性校验都放在Zuul中
+
+![网关](images/image-20201112110708902.png)
+
+### 6.2 Zuul的快速入门
+
+> 1、创建Maven项目,修改SpringBoot
+
+> 2、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-web</artifactId>
+</dependency>
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
+</dependency>
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+</dependency>
+```
+
+> 3、添加注解`@EnableZuulProxy` `@EnableEurekaClient`
+
+```java
+@SpringBootApplication
+@EnableEurekaClient
+@EnableZuulProxy
+public class ZuulApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ZuulApplication.class,args);
+    }
+}
+```
+
+> 4、编写配置文件
+
+```yml
+server:
+  port: 80
+#指定Eureka服务地址
+eureka:
+  client:
+    service-url:
+      defaultZone: http://root:root@localhost:8761/eureka,http://root:root@localhost:8762/eureka
+
+#指定服务名称
+spring:
+  application:
+    name: ZUUL
+```
+
+> 5、测试
+
+![image-20201112113609523](images/image-20201112113609523.png)
+
+
+
+### 6.3  Zuul常用配置信息
+
+#### 6.3.1 Zuul的监控界面
+
+> 1、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-actuator</artifactId>
+</dependency>
+```
+
+> 2、编写配置文件
+
+```yml
+#查看zuul的监考界面(开发时,配置为*,上线,不要配置)
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+```
+
+> 3、直接访问:`http://localhost/actuator/routes`
+
+![image-20201112132217601](images/image-20201112132217601.png)
+
+#### 6.3.2 忽略服务设置
+
+```yml
+# zuul的配置
+zuul:
+  #基于服务名忽略服务,无法查看,如果要忽略全部的服务,"*",默认配置的全部路径都会被忽略掉(自定义服务配置,通过这种方式是无法忽略的)
+  ignored-services: eureka
+  #监考界面依然可以查看,在访问的时候,404无法访问
+  ignored-patterns: /**/search/**
+```
+
+#### 6.3.3 自定义服务配置
+
+```yml
+# zuul的配置
+zuul:
+  #基于服务名忽略服务,无法查看,如果要忽略全部的服务,"*",默认配置的全部路径都会被忽略掉(自定义服务配置,通过这种方式是无法忽略的)
+  ignored-services: "*"
+  #监考界面依然可以查看,在访问的时候,404无法访问
+  ignored-patterns: /**/search/**
+  # 指定自定义服务(方式一,key(服务名):value(路径))
+#  routes:
+#    search: /ss/**
+#    customer: /cc/**
+  # 指定自定义服务(方式二)
+  routes:
+    kehu: #自定义名称
+      path: /cc/**  # 映射路径
+      serviceId: customer
+```
+
+#### 6.3.4 灰度发布
+
+> 1、添加一个配置类
+
+```java
+@Configuration
+public class ZuulConfig {
+    @Bean
+    public PatternServiceRouteMapper serviceRouteMapper() {
+        return new PatternServiceRouteMapper(
+                "(?<name>^.+)-(?<version>v.+$)",
+                "${version}/${name}");
+        //服务名-v版本
+        //    /v版本/路径
+    }
+}
+```
+
+> 2、准备一个服务,提供2个版本
+
+```yml
+version: v1
+
+#指定服务名称
+spring:
+  application:
+    name: CUSTOMER-${version}
+```
+
+
+
+> 3、修改Zuul的配置
+
+```yml
+zuul:
+  #基于服务名忽略服务,无法查看,如果需要用到-v的方式,一定要忽略掉
+#  ignored-services: "*"
+```
+
+> 4、修改CustomerController
+
+```java
+@Value("${version}")
+  private String version;
+
+@GetMapping("/version")
+  public String version() {
+    return version;
+  }
+```
+
+
+
+> 5、测试
+
+![image-20201112135410803](images/image-20201112135410803.png)
+
+![image-20201112135429409](images/image-20201112135429409.png)
+
+### 6.4 Zuul的过滤器执行流程
+
+> 客户端请求发送到Zuul服务商,首先通过PreFilter,如果正常放行,会把请求再次转发给RoutingFilter,请求转发到一个指定的服务,在指定的服务响应一个结果之后,再次走一个PostFilter的过滤器链,最终将响应信息返回给客户端。
+
+![image-20201112140312697](images/image-20201112140312697.png)
+
+### 6.5 Zuul过滤器入门
+
+> 1、创建POJO类,继承ZuulFilter
+
+```java
+@Component
+public class ZuulFilterTest extends ZuulFilter {
+   
+}
+
+```
+
+> 2、指定当前过滤器的类型
+
+```java
+@Override
+public String filterType() {
+    return FilterConstants.PRE_TYPE;
+}  
+```
+
+> 3、指定过滤器的执行顺序
+
+```java
+@Override
+public int filterOrder() {
+    return FilterConstants.PRE_DECORATION_FILTER_ORDER -1;
+}
+```
+
+> 4、配置是否启用
+
+```java
+@Override
+public boolean shouldFilter() {
+    //开启当前过滤器
+    return true;
+}
+```
+
+> 5、指定过滤器中的具体业务代码
+
+```java
+@Override
+public Object run() throws ZuulException {
+    System.out.println("prefix过滤器已经执行~~~");
+    return null;
+}
+```
+
+> 6、测试
+
+![image-20201112141523371](images/image-20201112141523371.png)
+
+### 6.6 PreFilter实现token校验
+
+> 1、准备访问路径,请求参数专递token
+
+`http://localhost/v1/customer/version?token=123`
+
+> 2、创建AuthenticationFilter
+
+```java
+@Component
+public class AuthenticationFilter extends ZuulFilter{
+    @Override
+    public String filterType() {
+        return FilterConstants.PRE_TYPE;
+    }
+
+    @Override
+    public int filterOrder() {
+        return FilterConstants.PRE_DECORATION_FILTER_ORDER - 2;
+    }
+
+    @Override
+    public boolean shouldFilter() {
+        return true;
+    }
+
+    @Override
+    public Object run() throws ZuulException {
+        //...
+        return null;
+    }
+}
+```
+
+> 3、在run方法中编写具体的业务逻辑代码
+
+```java
+@Override
+    public Object run() throws ZuulException {
+        System.out.println("AuthenticationFilter执行了");
+        //1. 获取Request对象
+        RequestContext requestContext = RequestContext.getCurrentContext();
+        HttpServletRequest request = requestContext.getRequest();
+        //2. 获取token参数
+        String token = request.getParameter("token");
+        //3.对比token
+        if (token == null || !"123".equalsIgnoreCase(token)) {
+            System.out.println("token校验失败");
+            //4. token校验失败,直接响应数据
+            requestContext.setSendZuulResponse(false);
+            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
+        }
+        return null;
+    }
+```
+
+> 4、测试
+
+![image-20201112145449105](images/image-20201112145449105.png)
+
+### 6.7 Zuul的降级
+
+> 1、创建POJO类,实现接口FallbackProvider
+
+```java
+@Component
+public class ZuulFallBack implements FallbackProvider {
+    
+}
+
+```
+
+> 2、重写两个方法
+
+```java
+@Override
+public String getRoute() {
+    //代表指定全部出现问题的服务,都走这个降级方法
+    return "*";
+}
+
+@Override
+public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
+    System.out.println("降级的服务"+route);
+    cause.printStackTrace();
+    return new ClientHttpResponse() {
+        @Override
+        public HttpHeaders getHeaders() {
+            //指定响应头信息
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            return headers;
+        }
+
+        @Override
+        public InputStream getBody() throws IOException {
+            //给用户响应的信息
+            String msg = "当前服务" + route + "出现问题!!!";
+            return new ByteArrayInputStream(msg.getBytes());
+        }
+
+        @Override
+        public HttpStatus getStatusCode() throws IOException {
+            //指定具体的HttpStatus
+            return HttpStatus.INTERNAL_SERVER_ERROR;
+        }
+
+        @Override
+        public int getRawStatusCode() throws IOException {
+            //返回状态码
+            return HttpStatus.INTERNAL_SERVER_ERROR.value();
+        }
+
+        @Override
+        public String getStatusText() throws IOException {
+            //指定错误信息
+            return HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase();
+        }
+
+        @Override
+        public void close() {
+
+        }
+    };
+}
+```
+
+> 3、测试
+
+![image-20201112151632111](images/image-20201112151632111.png)
+
+### 6.8 Zuul动态路由
+
+> 1、创建一个过滤器
+
+```java
+@Component
+public class DynamicRoutingFilter  extends ZuulFilter{
+    
+}
+```
+
+> 2、在run方法中编辑业务逻辑
+
+```java
+@Override
+public String filterType() {
+    return FilterConstants.PRE_TYPE;
+}
+
+@Override
+public int filterOrder() {
+    return FilterConstants.PRE_DECORATION_FILTER_ORDER +3;
+}
+
+@Override
+public boolean shouldFilter() {
+    return true;
+}
+
+@Override
+public Object run() throws ZuulException {
+    System.out.println("DynamicRoutingFilter执行了");
+    //1、获取Request对象
+    RequestContext context = RequestContext.getCurrentContext();
+    HttpServletRequest request = context.getRequest();
+
+    //2、获取参数,redisKey
+    String redisKey = request.getParameter("redisKey");
+
+    //3、直接判断
+    if (redisKey != null && redisKey.equalsIgnoreCase("customer")) {
+        System.out.println("DynamicRoutingFilter执行了路由到了/customer");
+        //http://localhost:8080/customer
+        context.put(FilterConstants.SERVICE_ID_KEY,"customer-v1");
+        context.put(FilterConstants.REQUEST_URI_KEY,"/customer");
+    } else if (redisKey != null && redisKey.equalsIgnoreCase("search")) {
+        System.out.println("DynamicRoutingFilter执行了路由到了/search/1");
+        //http://localhost:8081/search
+        context.put(FilterConstants.SERVICE_ID_KEY,"search");
+        context.put(FilterConstants.REQUEST_URI_KEY,"/search/1");
+    }
+    return null;
+}
+```
+
+> 3、测试
+
+![image-20201112155707148](images/image-20201112155707148.png)
+
+![image-20201112155652269](images/image-20201112155652269.png)
+
+## 七、多语言支持-Sidecar
+
+### 7.1 引言
+
+> 在SpringCloud的项目中,需要接入一些非java程序,第三方接口,无法接入eureka,hystrix,feign等组件。启动一个代理的微服务,代理微服务去和非java的程序或第三方接口交流,通过代理的非服务去计入SpringCloud的相关组件。
+
+![image-20201112160258956](images/image-20201112160258956.png)
+
+### 7.2 Sidecar实现
+
+> 1、创建一个第三方的服务
+
+`创建一个SpringBoot工程,并且添加一个Controller`
+
+> 2、创建Maven工程,修改为SpringBoot
+
+> 2、导入以来
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+</dependency>
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-netflix-sidecar</artifactId>
+</dependency>
+```
+
+> 4、添加注解`@EnableSidecar`
+
+> 5、编写配置文件
+
+```yml
+server:
+  port: 81
+
+eureka:
+  client:
+    service-url:
+      defaultZone:  http://root:root@localhost:8761/eureka,http://root:root@localhost:8762/eureka
+
+#指定服务名称
+spring:
+  application:
+    name: OTHER-SERVICE    #other-service
+
+# 指定代理的第三方服务
+sidecar:
+  port: 7001
+```
+
+> 6、通过customer通过Feign的方式调用第三方服务
+
+![image-20201112165325023](images/image-20201112165325023.png)
+
+## 八、服务间消息传递-Stream
+
+### 8.1 引言
+
+> 用于构建消息驱动微服务的框架(在下面方便起见也叫它Stream框架),该框架在Spring Boot的基础上整合了Spring Integration来连接消息代理中间件(RabbitMQ,Kafka等)。它支持多个消息中间件的自定义配置,同时吸收了这些消息中间件的部分概念,例如持久化订阅、消费者分组,和分区等概念。使用Stream框架,我们不必关系如何连接各个消息代理中间件,也不必关系消息的发送与接收,只需要进行简单的配置就可以实现这些功能了,可以让我们更敏捷的进行开发主体业务逻辑了。
+>
+> **Spring Cloud Stream框架的组成部分:**
+>
+> 1. Stream框架自己的应用模型;
+> 2. 绑定器抽象层,可以与消息代理中间件进行绑定,通过绑定器的API,可实现插件式的绑定器。
+> 3. 持久化订阅的支持。
+> 4. 消费者组的支持。
+> 5. Topic分区的支持。
+
+![image-20201112165641574](images/20190325232054468.png)
+
+### 8.2 Stream快速入门
+
+> 1、启动RabbitMQ
+
+> 2、消费者-导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
+</dependency>
+```
+
+> 3、消费者-配置文件
+
+```yml
+spring:
+  rabbitmq:
+    port: 5672
+    username: test
+    password: test
+    virtual-host: /test
+```
+
+> 4、消费者-监听的队列
+
+```java
+public interface StreamClient {
+    @Input("myMessage")
+    SubscribableChannel input();
+}
+```
+
+```java
+@Component
+@EnableBinding(StreamClient.class)
+public class StreamReceiver {
+    @StreamListener("myMessage")
+    public void msg(Object msg) {
+        System.out.println("接收到消息" + msg);
+    }
+}
+```
+
+> 5、启动类添加注解`@EnableBinding(StreamClient.class)`
+
+> 6、生产者-导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
+</dependency>
+```
+
+> 7、生产者-配置文件
+
+```yml
+spring:
+  rabbitmq:
+    port: 5672
+    username: test
+    password: test
+    virtual-host: /test
+```
+
+> 8、生产者-发布消息
+
+```java
+public interface StreamClient {
+    @Output("myMessage")
+    MessageChannel output();
+}
+```
+
+```java
+@RestController
+public class MessageController {
+    @Autowired
+    private StreamClient streamClient;
+    @GetMapping("/send")
+    public String send() {
+        streamClient.output().send(MessageBuilder.withPayload("Hello Stream").build());
+        return "消息发送成功!!";
+    }
+}
+```
+
+> 9、启动类添加注解`@EnableBinding(StreamClient.class)`
+
+> 10、测试访问`http://localhost:8080/send`
+
+![image-20201113093057704](images/image-20201113093057704.png)
+
+![image-20201112173342142](images/image-20201112173342142.png)
+
+### 8.3 Stream重复消费问题
+
+> 只需要添加一个配置,指定消费者组
+
+```yml
+spring:
+  cloud:
+    stream:
+      binders:
+        myMessage:  #队列名称
+          group: customer #消费者组
+```
+
+### 8.4 Stream的消费者手动ack
+
+> 1、编写配置
+
+```yml
+#指定服务名称
+spring:
+  cloud:
+    stream:
+      #实现手动ack
+      rabbit:
+        bindings:
+          myMessage:
+            consumer:
+              acknowledgeMode: MANUAL
+```
+
+> 2、修改消费端方法
+
+```java
+@Component
+@EnableBinding(StreamClient.class)
+public class StreamReceiver {
+    @StreamListener("myMessage")
+    public void msg(Object msg,
+                    @Header(name = AmqpHeaders.CHANNEL) Channel channel,
+                    @Header(name = AmqpHeaders.DELIVERY_TAG) Long deliveryTag) throws IOException {
+        System.out.println("接收到消息" + msg);
+        channel.basicAck(deliveryTag,false);
+    }
+}
+```
+
+## 九、服务的动态配置-Config
+
+### 9.1 引言
+
+> 1、配置文件分散在不同项目中的,不方便去维护。
+>
+> 2、配置文件的安全问题。
+>
+> 3、修改配置文件,无法立即生效。
+
+![image-20201112180552221](images/image-20201112180552221.png)
+
+### 9.2 搭建Config-Server
+
+> 1、创建Maven工程,修改SpringBoot
+
+> 2、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+</dependency>
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-config-server</artifactId>
+</dependency>
+```
+
+> 3、添加注解`@EnableConfigServer`
+
+```java
+@SpringBootApplication
+@EnableConfigServer
+public class ConfigApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ConfigApplication.class,args);
+    }
+}
+```
+
+> 4、编写配置文件(git)
+
+```yml
+spring:
+  cloud:
+    config:
+      server:
+        git:
+          basedir:     E:\config # 本地仓库地址
+          username:    xxxxxx@xxxx.com #远程仓库的用户名
+          password:    xxxxxxxx #远程仓库的密码
+          uri: https://gitee.com/zyjblog/config-resp.git
+```
+
+> 5、测试(例子:`http://localhost:82/master/customer-xxx.yml ` (master可以省略))
+>
+> 访问方式如下:
+>
+> `/{application}/{profile}[/{label}]`
+> `/{application}-{profile}.yml`
+> `/{label}/{application}-{profile}.yml`  
+>
+> `/{application}-{profile}.properties`
+> `/{label}/{application}-{profile}.properties`
+
+![image-20201113094055276](images/image-20201113094055276.png)
+
+### 9.3、修改Customer连接Config
+
+> 1、导入依赖
+
+```yml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-config-client</artifactId>
+</dependency>
+```
+
+> 2、修改配置文件
+
+```java
+#指定Eureka服务地址
+eureka:
+  client:
+    service-url:
+      defaultZone: http://root:root@localhost:8761/eureka,http://root:root@localhost:8762/eureka
+
+version: v1
+#指定服务名称
+spring:
+  application:
+    name: CUSTOMER-${version}
+  cloud:
+    config:
+      discovery:
+        enabled: true
+        service-id: CONFIG
+      profile: dev
+```
+
+> 3、修改配置文件名称`application.yml`改为`bootstrap.yml`
+
+> 4、测试测试发布消息到RabbMQ
+
+![image-20201113102316294](images/image-20201113102316294.png)
+
+### 9.4 实现动态配置
+
+#### 9.4.1 实现原理
+
+![image-20201113103152115](images/image-20201113103152115.png)
+
+#### 9.4.2 服务连接RabbitMQ
+
+> 1、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+</dependency>
+```
+
+> 2、编写配置文件
+
+```yml
+spring:
+  rabbitmq:
+    virtual-host: /test
+    host: localhost
+    username: test
+    password: test
+    port: 5672
+```
+
+> 3、测试
+
+![image-20201113104134210](images/image-20201113104134210.png)
+
+#### 9.4.3 实现手动刷新
+
+> 1、导入依赖(两个服务config和customer均添加)
+
+```xml
+<dependency>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-actuator</artifactId>
+</dependency>
+```
+
+> 2、编写配置文件(两个服务config和customer均添加)
+
+```yml
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+```
+
+> 3、为customer添加一个controller,添加注解`@RefreshScope`
+
+```java
+@RestController
+@RefreshScope
+public class CustomerController {
+
+    @Value("${env}")
+    private String env;
+
+    @GetMapping("/env")
+    public String env() {
+        return env;
+    }
+}
+```
+
+> 4、测试
+>
+> 1. CONFIG在gitee修改之后,自动拉取最新的配置信息。
+> 2. 其他模块需要更新的话,手动发送一个POST请求:http://localhost:10000/actuator/bus-refresh ,不重启项目,即可获取最新的配置信息
+
+#### 9.4.4 内网穿透
+
+> 1、内网穿透官网:http://www.ngrok.cc/
+
+> 2、注册登录
+
+> 3、购买免费隧道,并配置
+
+![image-20201113113814310](images/image-20201113113814310.png)
+
+> 4、下载客户端,并复制隧道id,点击运行客户端,复制到客户端中
+
+![image-20201113114050201](images/image-20201113114050201.png)
+
+> 5、测试访问是否成功
+
+![image-20201113114131931](images/image-20201113114131931.png)
+
+#### 9.4.5 实现自动刷新配置
+
+> 1、配置Gitee中的WebHooks
+
+![image-20201113120733998](images/image-20201113120733998.png)
+
+> 2、给Config添加一个过滤器UrlFilter
+
+```java
+
+@WebFilter("/*")
+public  class UrlFilter implements Filter {
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest;
+        String url=httpServletRequest.getRequestURI();
+        System.out.println(url);
+        if(!url.endsWith("/actuator/bus-refresh")){
+            filterChain.doFilter(servletRequest,servletResponse);
+            return;
+        }
+        String body=(httpServletRequest).toString();
+        System.out.println("original body: "+ body);
+        RequestWrapper requestWrapper=new RequestWrapper(httpServletRequest);
+        filterChain.doFilter(requestWrapper,servletResponse);
+    }
+    private class RequestWrapper extends HttpServletRequestWrapper {
+        public RequestWrapper(HttpServletRequest request) {
+            super(request);
+        }
+
+        @Override
+        public ServletInputStream getInputStream() throws IOException {
+            byte[] bytes = new byte[0];
+            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
+            ServletInputStream servletInputStream = new ServletInputStream() {
+                @Override
+                public int read() throws IOException {
+                    return byteArrayInputStream.read();
+                }
+
+                @Override
+                public boolean isFinished() {
+                    return byteArrayInputStream.read() == -1 ? true : false;
+                }
+
+                @Override
+                public boolean isReady() {
+                    return false;
+                }
+
+                @Override
+                public void setReadListener(ReadListener listener) {
+
+                }
+            };
+            return servletInputStream;
+        }
+    }
+}
+```
+
+> 3、添加注解`@ServletComponentScan("cn.zyjblogs.filter")`
+
+```java
+@SpringBootApplication
+@EnableConfigServer
+@ServletComponentScan("cn.zyjblogs.filter")
+public class ConfigApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ConfigApplication.class,args);
+    }
+}
+```
+
+> 3、测试
+
+![image-20201113121035781](images/image-20201113121035781.png)
+
+## 十、服务的追踪-Sleuth
+
+### 10.1 引言
+
+> 在整个微服务架构中,微服务很多,一个请求可能需要调用很多很多的服务,最终才能完成一个功能,如果说,整个功能出现了问题,在这么多的服务中,如何区定位到问题的所在点,出现问题的原因是什么。
+>
+> 1、Sleuth可以获取得到整个服务链路的信息
+>
+> 2、Zipkin通过图形化界面去看到信息。
+>
+> 3、Sleuth将日志信息存储到数据库中
+
+![image-20201113131325996](images/image-20201113131325996.png)
+
+### 10.2 Sleuth使用
+
+> 1、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-sleuth</artifactId>
+</dependency>
+```
+
+> 2、编写配置文件
+
+```yml
+logging:
+  level:
+    org.springframework.web.servlet.DispatcherServlet: DEBUG
+```
+
+> 3、测试
+>
+> SEARCH:服务名称
+>
+> 012 总链路id
+>
+> b0e:当前服务的链路id
+>
+> false:不会将当前的日志信息,输出到其他系统中
+
+![image-20201113133658258](images/image-20201113133658258.png)
+
+![image-20201113133713872](images/image-20201113133713872.png)
+
+![image-20201113133745985](images/image-20201113133745985.png)
+
+### 10.3 Zipkin的使用
+
+> 1、搭建Zipkin的web工程 https://zipkin.io/pages/quickstart
+>
+> 1. docker安装Zipkin
+
+1、使用docker pull拉取
+
+```bash
+docker pull openzipkin/zipkin
+```
+
+2、使用docker-compose
+
+```yml
+version: "3.1"
+services:
+  zipkin:
+    image: daocloud.io/daocloud/zipkin:latest
+    restart: always
+    container_name: zipkin
+    ports:
+    - 9411:9411
+```
+
+```bash
+docker-compose up -d  #启动
+docker-compose down   #关闭
+```
+
+> 2、导入依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-zipkin</artifactId>
+</dependency>
+```
+
+> 3、编写配置文件
+
+```yml
+spring:
+  sleuth:
+    sampler:
+      probability: 1 #百分之多少的sleuth信息需要输出到zipkin
+  zipkin:
+    base-url: http://127.0.0.1:9411/  #指定zipkin的地址
+```
+
+> 4、测试
+
+![image-20201113153443738](images/image-20201113153443738.png)
+
+### 10.4 整合RabbitMQ
+
+> 1、导入RabbitMQ依赖(zipkin中已经依赖了RabbitMQ了)
+
+> 2、修改配置文件
+
+```yml
+spring:
+  zipkin:
+    sender:
+      type: rabbit
+```
+
+
+
+> 3、修改Zipkin信息
+
+```yml
+version: "3.1"
+services:
+  zipkin:
+    image: daocloud.io/daocloud/zipkin:latest
+    #image: docker.io/openzipkin/zipkin:latest
+    restart: always
+    container_name: zipkin
+    ports:
+    - 9411:9411
+    environment:
+      - RABBIT_ADDRESSES=10.27.10.123:5672 #本地ipv4地址:端口
+      - RABBIT_USER=test
+      - RABBIT_PASSWORD=test
+      - RABBIT_VIRTUAL_HOST=/test
+```
+
+> 3、测试
+
+![image-20201113160658535](images/image-20201113160658535.png)
+
+![image-20201113160724897](images/image-20201113160724897.png)
+
+### 10.5  Zipkin存储数据到ES
+
+> 1、重新修改zipkin的文件yml文件
+
+```yml
+version: "3.1"
+services:
+  zipkin:
+    image: daocloud.io/daocloud/zipkin:latest
+    #image: docker.io/openzipkin/zipkin:latest
+    restart: always
+    container_name: zipkin
+    ports:
+    - 9411:9411
+    environment:
+      - RABBIT_ADDRESSES=10.27.10.123:5672
+      - RABBIT_USER=test
+      - RABBIT_PASSWORD=test
+      - RABBIT_VIRTUAL_HOST=/test
+      - STORAGE_TYPE=elasticsearch
+      - ES_HOSTS=http://10.27.10.123:9200
+```
+
+> 2、安装Es
+
+```bash
+ #拉取镜像
+ docker pull elasticsearch
+ #启动参数
+ docker run --name es1_6.6.0 \
+-p 9200:9200 \
+-p 9300:9300 \
+-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \ 
+-v /d/elasticsearch/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ 
+-v /d/elasticsearch/data/es1:/usr/share/elasticsearch/data \ 
+-v /d/elasticsearch/logs/es1:/usr/share/elasticsearch/logs \
+-d 13aa43015aa1
+```
+
+> 3、安装kibana
+
+```bash
+#拉取kibana
+docker pull kibana
+#启动参数
+docker run --name kibana6.6.0 -e ELASTICSEARCH_URL=http://10.27.10.123:9200 -p 5601:5601 -d dfc685453eaa
+```
+
+创建索引
+
+![image-20201113164636525](images/image-20201113164636525.png)
+
+> 4、重启zipkin后数据未丢失
+
+```bash
+docker-compose restart
+```
+
+> 5、测试
+
+![image-20201113164930192](images/image-20201113164930192.png)
+
+## 十一、完整SpringCloud架构图
+
+![image-20201113165759501](images/image-20201113165759501.png)

BIN
source/_posts/微服务框架/images/1605019839175.png


BIN
source/_posts/微服务框架/images/1605103387256.png


BIN
source/_posts/微服务框架/images/1605103421256.png


BIN
source/_posts/微服务框架/images/1605103436874.png


BIN
source/_posts/微服务框架/images/1605104987931.png


BIN
source/_posts/微服务框架/images/1605106759891.png


BIN
source/_posts/微服务框架/images/1605106760380.png


BIN
source/_posts/微服务框架/images/20190325232054468.png


BIN
source/_posts/微服务框架/images/image-20201111095513133.png


BIN
source/_posts/微服务框架/images/image-20201111095518705.png


BIN
source/_posts/微服务框架/images/image-20201111110217411.png


BIN
source/_posts/微服务框架/images/image-20201111132523595.png


BIN
source/_posts/微服务框架/images/image-20201111134022333.png


BIN
source/_posts/微服务框架/images/image-20201111155409030.png


BIN
source/_posts/微服务框架/images/image-20201111162630381.png


BIN
source/_posts/微服务框架/images/image-20201111164239591.png


BIN
source/_posts/微服务框架/images/image-20201111181650929.png


BIN
source/_posts/微服务框架/images/image-20201112110708902.png


BIN
source/_posts/微服务框架/images/image-20201112113609523.png


BIN
source/_posts/微服务框架/images/image-20201112132217601.png


BIN
source/_posts/微服务框架/images/image-20201112135410803.png


BIN
source/_posts/微服务框架/images/image-20201112135429409.png


BIN
source/_posts/微服务框架/images/image-20201112140037987.png


BIN
source/_posts/微服务框架/images/image-20201112140312697.png


BIN
source/_posts/微服务框架/images/image-20201112141523371.png


BIN
source/_posts/微服务框架/images/image-20201112145449105.png


BIN
source/_posts/微服务框架/images/image-20201112151632111.png


BIN
source/_posts/微服务框架/images/image-20201112155652269.png


BIN
source/_posts/微服务框架/images/image-20201112155707148.png


BIN
source/_posts/微服务框架/images/image-20201112160258956.png


BIN
source/_posts/微服务框架/images/image-20201112165325023.png


BIN
source/_posts/微服务框架/images/image-20201112165641574.png


BIN
source/_posts/微服务框架/images/image-20201112173342142.png


BIN
source/_posts/微服务框架/images/image-20201112180552221.png


BIN
source/_posts/微服务框架/images/image-20201113093057704.png


BIN
source/_posts/微服务框架/images/image-20201113094055276.png


BIN
source/_posts/微服务框架/images/image-20201113102316294.png


BIN
source/_posts/微服务框架/images/image-20201113103152115.png


BIN
source/_posts/微服务框架/images/image-20201113104134210.png


BIN
source/_posts/微服务框架/images/image-20201113113814310.png


BIN
source/_posts/微服务框架/images/image-20201113114050201.png


BIN
source/_posts/微服务框架/images/image-20201113114131931.png


BIN
source/_posts/微服务框架/images/image-20201113120733998.png


BIN
source/_posts/微服务框架/images/image-20201113121001855.png


BIN
source/_posts/微服务框架/images/image-20201113121035781.png


BIN
source/_posts/微服务框架/images/image-20201113131325996.png


BIN
source/_posts/微服务框架/images/image-20201113133658258.png


BIN
source/_posts/微服务框架/images/image-20201113133713872.png


BIN
source/_posts/微服务框架/images/image-20201113133745985.png


BIN
source/_posts/微服务框架/images/image-20201113153443738.png


BIN
source/_posts/微服务框架/images/image-20201113160658535.png


BIN
source/_posts/微服务框架/images/image-20201113160724897.png


BIN
source/_posts/微服务框架/images/image-20201113164636525.png


BIN
source/_posts/微服务框架/images/image-20201113164930192.png


BIN
source/_posts/微服务框架/images/image-20201113165759501.png


+ 6 - 0
source/bangumis/index.md

@@ -0,0 +1,6 @@
+---
+title: bangumis
+date: 2021-08-07 17:49:20
+type: "bangumis"
+abbrlink: bangumis
+---

BIN
source/bangumis/loading.gif


+ 0 - 0
themes/.gitkeep


+ 1 - 0
themes/butterfly

@@ -0,0 +1 @@
+Subproject commit 101cb45b90a4b8ad6222201db3580869bf252eac

Some files were not shown because too many files changed in this diff