diff --git a/docs/404.html b/docs/404.html deleted file mode 100644 index a9ea1b0..0000000 --- a/docs/404.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Fizz Gateway - - - - - - - -

404

How did we get here?
- Take me home. -
- - - diff --git a/docs/aggr_config_exception.png b/docs/aggr_config_exception.png deleted file mode 100644 index bae514a..0000000 Binary files a/docs/aggr_config_exception.png and /dev/null differ diff --git a/docs/aggr_config_exception2.png b/docs/aggr_config_exception2.png deleted file mode 100644 index fc5c51d..0000000 Binary files a/docs/aggr_config_exception2.png and /dev/null differ diff --git a/docs/aggr_config_import_export.png b/docs/aggr_config_import_export.png deleted file mode 100644 index 2b8c97f..0000000 Binary files a/docs/aggr_config_import_export.png and /dev/null differ diff --git a/docs/aggr_config_input.png b/docs/aggr_config_input.png deleted file mode 100644 index badf1b3..0000000 Binary files a/docs/aggr_config_input.png and /dev/null differ diff --git a/docs/aggr_config_input_validate_result.png b/docs/aggr_config_input_validate_result.png deleted file mode 100644 index a256a8d..0000000 Binary files a/docs/aggr_config_input_validate_result.png and /dev/null differ diff --git a/docs/aggr_config_output.png b/docs/aggr_config_output.png deleted file mode 100644 index 2ef2b86..0000000 Binary files a/docs/aggr_config_output.png and /dev/null differ diff --git a/docs/aggr_config_redirect.png b/docs/aggr_config_redirect.png deleted file mode 100644 index cf4c265..0000000 Binary files a/docs/aggr_config_redirect.png and /dev/null differ diff --git a/docs/aggr_config_route.png b/docs/aggr_config_route.png deleted file mode 100644 index 18fb5c5..0000000 Binary files a/docs/aggr_config_route.png and /dev/null differ diff --git a/docs/aggr_config_script_1.png b/docs/aggr_config_script_1.png deleted file mode 100644 index 6afff6c..0000000 Binary files a/docs/aggr_config_script_1.png and /dev/null differ diff --git a/docs/aggr_config_script_2.png b/docs/aggr_config_script_2.png deleted file mode 100644 index 6a450d4..0000000 Binary files a/docs/aggr_config_script_2.png and /dev/null differ diff --git a/docs/aggr_config_step1.png b/docs/aggr_config_step1.png deleted file mode 100644 index 75ffda9..0000000 Binary files a/docs/aggr_config_step1.png and /dev/null differ diff --git a/docs/aggr_config_step2.png b/docs/aggr_config_step2.png deleted file mode 100644 index 7c3758b..0000000 Binary files a/docs/aggr_config_step2.png and /dev/null differ diff --git a/docs/aggr_config_step_fallback.png b/docs/aggr_config_step_fallback.png deleted file mode 100644 index de4ec0f..0000000 Binary files a/docs/aggr_config_step_fallback.png and /dev/null differ diff --git a/docs/aggr_config_step_mapping_1.png b/docs/aggr_config_step_mapping_1.png deleted file mode 100644 index 3ccfd3f..0000000 Binary files a/docs/aggr_config_step_mapping_1.png and /dev/null differ diff --git a/docs/aggr_config_step_mapping_2.png b/docs/aggr_config_step_mapping_2.png deleted file mode 100644 index 2afad67..0000000 Binary files a/docs/aggr_config_step_mapping_2.png and /dev/null differ diff --git a/docs/aggr_config_step_mapping_3.png b/docs/aggr_config_step_mapping_3.png deleted file mode 100644 index 0b911db..0000000 Binary files a/docs/aggr_config_step_mapping_3.png and /dev/null differ diff --git a/docs/aggr_config_step_mapping_4.png b/docs/aggr_config_step_mapping_4.png deleted file mode 100644 index a618977..0000000 Binary files a/docs/aggr_config_step_mapping_4.png and /dev/null differ diff --git a/docs/aggr_config_step_mapping_5.png b/docs/aggr_config_step_mapping_5.png deleted file mode 100644 index 82ec4c4..0000000 Binary files a/docs/aggr_config_step_mapping_5.png and /dev/null differ diff --git a/docs/aggr_config_step_result.png b/docs/aggr_config_step_result.png deleted file mode 100644 index 3021748..0000000 Binary files a/docs/aggr_config_step_result.png and /dev/null differ diff --git a/docs/aggr_config_test.png b/docs/aggr_config_test.png deleted file mode 100644 index b11a684..0000000 Binary files a/docs/aggr_config_test.png and /dev/null differ diff --git a/docs/aggr_config_test2.png b/docs/aggr_config_test2.png deleted file mode 100644 index 3fe3b77..0000000 Binary files a/docs/aggr_config_test2.png and /dev/null differ diff --git a/docs/aggr_newapi.png b/docs/aggr_newapi.png deleted file mode 100644 index 072cbf7..0000000 Binary files a/docs/aggr_newapi.png and /dev/null differ diff --git a/docs/aggr_newapi0.png b/docs/aggr_newapi0.png deleted file mode 100644 index e878d5c..0000000 Binary files a/docs/aggr_newapi0.png and /dev/null differ diff --git a/docs/aggr_newservice.png b/docs/aggr_newservice.png deleted file mode 100644 index ff76a0f..0000000 Binary files a/docs/aggr_newservice.png and /dev/null differ diff --git a/docs/aggr_overview1.png b/docs/aggr_overview1.png deleted file mode 100644 index f31f381..0000000 Binary files a/docs/aggr_overview1.png and /dev/null differ diff --git a/docs/aggr_overview2.png b/docs/aggr_overview2.png deleted file mode 100644 index cfce088..0000000 Binary files a/docs/aggr_overview2.png and /dev/null differ diff --git a/docs/aggr_release_1.png b/docs/aggr_release_1.png deleted file mode 100644 index ad6633c..0000000 Binary files a/docs/aggr_release_1.png and /dev/null differ diff --git a/docs/aggr_release_2.png b/docs/aggr_release_2.png deleted file mode 100644 index e67e5b3..0000000 Binary files a/docs/aggr_release_2.png and /dev/null differ diff --git a/docs/aggr_release_rollback.png b/docs/aggr_release_rollback.png deleted file mode 100644 index 0a772c1..0000000 Binary files a/docs/aggr_release_rollback.png and /dev/null differ diff --git a/docs/aggr_release_rollback1.png b/docs/aggr_release_rollback1.png deleted file mode 100644 index c5fa235..0000000 Binary files a/docs/aggr_release_rollback1.png and /dev/null differ diff --git a/docs/assets/css/0.styles.1a4b7b81.css b/docs/assets/css/0.styles.1a4b7b81.css deleted file mode 100644 index e353012..0000000 --- a/docs/assets/css/0.styles.1a4b7b81.css +++ /dev/null @@ -1 +0,0 @@ -code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{font-weight:600;font-size:inherit}.dropdown-wrapper .dropdown-title:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.badge[data-v-0d148f50]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-0d148f50],.badge.tip[data-v-0d148f50],.badge[data-v-0d148f50]{background-color:#42b983}.badge.error[data-v-0d148f50]{background-color:#da5961}.badge.warn[data-v-0d148f50],.badge.warning[data-v-0d148f50],.badge.yellow[data-v-0d148f50]{background-color:#e7c000}.badge+.badge[data-v-0d148f50]{margin-left:5px} \ No newline at end of file diff --git a/docs/assets/img/search.83621669.svg b/docs/assets/img/search.83621669.svg deleted file mode 100644 index 03d8391..0000000 --- a/docs/assets/img/search.83621669.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/assets/js/10.3c989e54.js b/docs/assets/js/10.3c989e54.js deleted file mode 100644 index da9c467..0000000 --- a/docs/assets/js/10.3c989e54.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{355:function(t,v,e){"use strict";e.r(v);var r=e(42),_=Object(r.a)({},(function(){var t=this,v=t.$createElement,e=t._self._c||v;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("1.创建服务")]),t._v(" "),e("p",[t._v("此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务")]),t._v(" "),e("p",[t._v("2.创建服务编排接口")]),t._v(" "),e("p",[t._v("3.开通网关白名单和配置访问策略和插件")]),t._v(" "),e("p",[t._v("4.测试服务编排接口")]),t._v(" "),e("p",[t._v("5.发布接口")]),t._v(" "),e("p",[t._v("界面总览")]),t._v(" "),e("p",[e("img",{attrs:{src:"/aggr_overview1.png",alt:""}})]),t._v(" "),e("p",[e("img",{attrs:{src:"/aggr_overview2.png",alt:""}})])])}),[],!1,null,null,null);v.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/11.a76c2e4c.js b/docs/assets/js/11.a76c2e4c.js deleted file mode 100644 index a21ecae..0000000 --- a/docs/assets/js/11.a76c2e4c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{357:function(t,_,v){"use strict";v.r(_);var a=v(42),e=Object(a.a)({},(function(){var t=this,_=t.$createElement,v=t._self._c||_;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h2",{attrs:{id:"基准测试结果"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#基准测试结果"}},[t._v("#")]),t._v(" 基准测试结果")]),t._v(" "),v("p",[t._v("我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。")]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",{staticStyle:{"text-align":"center"}},[t._v("产品")]),t._v(" "),v("th",[t._v("QPS")]),t._v(" "),v("th",[t._v("90% Latency(ms)")])])]),t._v(" "),v("tbody",[v("tr",[v("td",{staticStyle:{"text-align":"center"}},[t._v("直接访问后端服务")]),t._v(" "),v("td",[t._v("9087.46")]),t._v(" "),v("td",[t._v("10.76")])]),t._v(" "),v("tr",[v("td",{staticStyle:{"text-align":"center"}},[t._v("fizz-gateway")]),t._v(" "),v("td",[t._v("5927.13")]),t._v(" "),v("td",[t._v("19.86")])]),t._v(" "),v("tr",[v("td",{staticStyle:{"text-align":"center"}},[t._v("spring-cloud-gateway")]),t._v(" "),v("td",[t._v("5044.04")]),t._v(" "),v("td",[t._v("22.91")])])])]),t._v(" "),v("h2",{attrs:{id:"基准测试详情"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#基准测试详情"}},[t._v("#")]),t._v(" 基准测试详情")]),t._v(" "),v("h3",{attrs:{id:"硬件环境"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#硬件环境"}},[t._v("#")]),t._v(" 硬件环境")]),t._v(" "),v("p",[t._v("后端服务所在服务器:")]),t._v(" "),v("p",[t._v("4核8G内存")]),t._v(" "),v("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),v("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),v("p",[t._v("节点所在服务器:")]),t._v(" "),v("p",[t._v("4核8G内存")]),t._v(" "),v("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),v("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),v("p",[t._v("压测程序所在服务器:")]),t._v(" "),v("p",[t._v("4核8G内存")]),t._v(" "),v("p",[t._v("Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4")]),t._v(" "),v("p",[t._v("Linux version 3.10.0-327.el7.x86_64")]),t._v(" "),v("h3",{attrs:{id:"压测工具"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#压测工具"}},[t._v("#")]),t._v(" 压测工具")]),t._v(" "),v("p",[t._v("压测软件:wrk")]),t._v(" "),v("p",[t._v("并发连接: 100")]),t._v(" "),v("h3",{attrs:{id:"压测结果截图"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#压测结果截图"}},[t._v("#")]),t._v(" 压测结果截图")]),t._v(" "),v("ul",[v("li",[v("p",[t._v("直接访问后端服务:\n"),v("img",{attrs:{src:"/benchmark_backend.png",alt:""}})])]),t._v(" "),v("li",[v("p",[t._v("fizz-gateway:\n"),v("img",{attrs:{src:"/benchmark_fizz.png",alt:""}})])]),t._v(" "),v("li",[v("p",[t._v("spring-cloud-gateway:\n"),v("img",{attrs:{src:"/benchmark_scgw.png",alt:""}})])])])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.9b8b7937.js b/docs/assets/js/12.9b8b7937.js deleted file mode 100644 index 93ffd65..0000000 --- a/docs/assets/js/12.9b8b7937.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{358:function(a,t,s){"use strict";s.r(t);var e=s(42),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"安装依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装依赖"}},[a._v("#")]),a._v(" 安装依赖")]),a._v(" "),s("p",[a._v("安装以下依赖软件:")]),a._v(" "),s("ul",[s("li",[a._v("Redis 2.8或以上版本")]),a._v(" "),s("li",[a._v("MySQL 5.7或以上版本")]),a._v(" "),s("li",[a._v("Apollo配置中心 (可选)")]),a._v(" "),s("li",[a._v("Eureka服务注册中心")])]),a._v(" "),s("h3",{attrs:{id:"安装mysql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装mysql"}},[a._v("#")]),a._v(" 安装MySQL")]),a._v(" "),s("ul",[s("li",[a._v("操作系统 CentOS 6.5")]),a._v(" "),s("li",[a._v("MySQL 5.7.30")])]),a._v(" "),s("ol",[s("li",[a._v("下载MySQL")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("解压")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("安装")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" mysql-community-"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("server,client,common,libs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-*\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[a._v("启动")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("service")]),a._v(" mysqld start\n")])])]),s("p",[a._v("启动成功会显示以下信息:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("[root@localhost ~]# sudo service mysqld start\nInitializing MySQL database: [ OK ]\nStarting mysqld: [ OK ]\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[a._v("初始密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("sudo grep 'temporary password' /var/log/mysqld.log\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[a._v("使用初始密码登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("mysql -uroot -p\n")])])]),s("ol",{attrs:{start:"7"}},[s("li",[a._v("修改密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';\n")])])]),s("ol",{attrs:{start:"8"}},[s("li",[a._v("退出登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("quit\n")])])]),s("h3",{attrs:{id:"安装redis-6-0-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装redis-6-0-8"}},[a._v("#")]),a._v(" 安装Redis 6.0.8")]),a._v(" "),s("ol",[s("li",[a._v("下载解压并编译")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz\n$ tar xzf redis-6.0.8.tar.gz\n$ cd redis-6.0.8\n$ make\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("启动redis")])]),a._v(" "),s("p",[a._v("运行编译后的文件:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ src/redis-server\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("客户端连接")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v('$ src/redis-cli\nredis> set foo bar\nOK\nredis> get foo\n"bar"\n')])])]),s("h3",{attrs:{id:"安装apollo配置中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装apollo配置中心"}},[a._v("#")]),a._v(" 安装Apollo配置中心")]),a._v(" "),s("p",[a._v("说明: apollo是可选组件,如果不使用apollo可使用本地配置文件(application.yml), 如果不使用apollo可跳过此步骤。")]),a._v(" "),s("p",[a._v("安装步骤详见apollo官方文档: "),s("a",{attrs:{href:"https://github.com/ctripcorp/apollo/wiki/Quick-Start",target:"_blank",rel:"noopener noreferrer"}},[s("OutboundLink")],1)]),a._v(" "),s("h3",{attrs:{id:"安装eureka服务注册中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装eureka服务注册中心"}},[a._v("#")]),a._v(" 安装Eureka服务注册中心")]),a._v(" "),s("p",[a._v("环境要求:")]),a._v(" "),s("ul",[s("li",[a._v("JDK 1.8 或以上版本")]),a._v(" "),s("li",[a._v("Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)")])]),a._v(" "),s("ol",[s("li",[a._v("安装JDK 1.8")])]),a._v(" "),s("p",[a._v("1)下载JDK,如: jdk-8u192-linux-x64.tar.gz")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("tar -zxvf jdk-8u192-linux-x64.tar.gz\nmv jdk1.8.0_192 /usr/local/\n\n")])])]),s("p",[a._v("2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("JAVA_HOME=/usr/local/jdk/jdk1.8.0_192\nJRE_HOME=$JAVA_HOME/jre\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nCLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar\nexport JAVA_HOME JRE_HOME PATH CLASSPATH\n\n")])])]),s("p",[a._v("3)执行以下命令全环境变量生效:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("source /etc/profile\n\n")])])]),s("p",[a._v("4)查看是否安装成功")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("java -version\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("安装eureka")])]),a._v(" "),s("p",[a._v("1)使用IDE创建一个spring boot项目,如:sc-eureka-server")]),a._v(" "),s("p",[a._v("pom.xml:")]),a._v(" "),s("div",{staticClass:"language-xml extra-class"},[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"}},[a._v("<")]),a._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._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"}},[a._v("<")]),a._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("org.springframework.cloud"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._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"}},[a._v("<")]),a._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("spring-cloud-starter-netflix-eureka-server"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._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"}},[a._v("")])]),a._v("\n")])])]),s("p",[a._v("在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:")]),a._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@SpringBootApplication")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@EnableEurekaServer")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("static")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("void")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("SpringApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("application.properties配置文件:")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("spring.application.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("sc-eureka-server")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("server.port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("8761")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.instance.hostname")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("localhost")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.registerWithEureka")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.fetchRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.server.enableSelfPreservation")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n")])])]),s("p",[a._v("2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面")]),a._v(" "),s("p",[a._v("3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)")]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[a._v("nohub java -jar sc-eureka-server-1.0.0.jar "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&")]),a._v(" \n")])])]),s("p",[a._v("4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.serviceUrl.defaultZone")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("http://localhost:8761/eureka/")]),a._v("\n")])])]),s("h2",{attrs:{id:"安装fizz"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装fizz"}},[a._v("#")]),a._v(" 安装Fizz")]),a._v(" "),s("h3",{attrs:{id:"管理后台"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#管理后台"}},[a._v("#")]),a._v(" 管理后台")]),a._v(" "),s("p",[a._v("从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包")]),a._v(" "),s("ul",[s("li",[a._v("管理后台服务端(fizz-manager-professional)")])]),a._v(" "),s("ol",[s("li",[a._v("首次安装执行"),s("code",[a._v("fizz-manager-professional-1.1.0-mysql.sql")]),a._v("数据库脚本,低版本升级执行"),s("code",[a._v("update")]),a._v("目录下的升级脚本")]),a._v(" "),s("li",[a._v("将"),s("code",[a._v("application-prod.yml")]),a._v("、"),s("code",[a._v("boot.sh")]),a._v("、"),s("code",[a._v("fizz-manager-professional-1.1.0.jar")]),a._v("拷贝到"),s("code",[a._v("/data/webapps/fizz-manager-professional")]),a._v("目录下")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("application-prod.yml")]),a._v("文件,将相关配置修改成部署环境的配置")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("boot.sh")]),a._v("文件,将"),s("code",[a._v("RUN_CMD")]),a._v("变量值修改成部署环境的JAVA实际路径")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("chmod +x boot.sh")]),a._v(" 命令给"),s("code",[a._v("boot.sh")]),a._v("增加执行权限")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart(升级发布时需要手动kill原进程)/status命令")]),a._v(" "),s("li",[a._v("服务启动后访问前端登录地址,使用超级管理员账户"),s("code",[a._v("admin")]),a._v("密码"),s("code",[a._v("Aa123!")]),a._v("登录")])]),a._v(" "),s("ul",[s("li",[a._v("管理后台前端(fizz-admin-professional)")])]),a._v(" "),s("p",[a._v("zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/")]),a._v(" "),s("p",[a._v("nginx配置")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("server {\n listen 9000;\n server_name localhost:9000;\n location / {\n root /home/data/fizzAdmin;\n }\n location ^~ /api {\n rewrite ^/api/(.*) /$1 break;\n proxy_pass http://127.0.0.1:8000;\n }\n}\n\n# 注:root中地址需与资源包存放目录路径一致\n# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址\n")])])]),s("p",[a._v("访问地址")]),a._v(" "),s("p",[a._v("【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/")]),a._v(" "),s("p",[a._v("(端口号与nginx配置端口号一致)")]),a._v(" "),s("h3",{attrs:{id:"fizz-gateway-community社区版"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fizz-gateway-community社区版"}},[a._v("#")]),a._v(" fizz-gateway-community社区版")]),a._v(" "),s("p",[a._v("说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。")]),a._v(" "),s("p",[a._v("脚本启动:")]),a._v(" "),s("ol",[s("li",[a._v("下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录")]),a._v(" "),s("li",[a._v("修改boot.sh脚本的apollo连接,JVM内存配置,")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart/status命令")])]),a._v(" "),s("p",[a._v("IDE启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码")]),a._v(" "),s("li",[a._v("将项目fizz-gateway导入IDE")]),a._v(" "),s("li",[a._v("导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入"),s("code",[a._v("-Denv=dev -Dapollo.meta=http://localhost:66")]),a._v("(Apollo配置中心地址)")])]),a._v(" "),s("p",[a._v("jar启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置")]),a._v(" "),s("li",[a._v("在项目根目录fizz-gateway-community下执行Maven命令"),s("code",[a._v("mvn clean package -DskipTests=true")]),a._v("打包")]),a._v(" "),s("li",[a._v("进入target目录,使用命令"),s("code",[a._v("java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar")]),a._v("启动服务")])]),a._v(" "),s("p",[a._v("网关访问地址格式:")]),a._v(" "),s("p",[a._v("http://127.0.0.1:8600/proxy/[服务名]/[API Path]")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.52740b54.js b/docs/assets/js/13.52740b54.js deleted file mode 100644 index ce4fcbc..0000000 --- a/docs/assets/js/13.52740b54.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{367:function(t,a,v){"use strict";v.r(a);var i=v(42),_=Object(i.a)({},(function(){var t=this,a=t.$createElement,v=t._self._c||a;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h2",{attrs:{id:"什么是fizz网关"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#什么是fizz网关"}},[t._v("#")]),t._v(" 什么是Fizz网关")]),t._v(" "),v("p",[t._v("A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。")]),t._v(" "),v("h2",{attrs:{id:"fizz的设计"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#fizz的设计"}},[t._v("#")]),t._v(" Fizz的设计")]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz_design.png",alt:""}})]),t._v(" "),v("h2",{attrs:{id:"产品特性"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#产品特性"}},[t._v("#")]),t._v(" 产品特性")]),t._v(" "),v("ul",[v("li",[t._v("集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。")]),t._v(" "),v("li",[t._v("服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。")]),t._v(" "),v("li",[t._v("负载均衡:支持round-robin负载均衡。")]),t._v(" "),v("li",[t._v("服务发现:支持从Eureka注册中心发现后端服务器。")]),t._v(" "),v("li",[t._v("配置中心:支持接入apollo配置中心。")]),t._v(" "),v("li",[t._v("HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。")]),t._v(" "),v("li",[t._v("访问策略:支持不同策略访问不同的API、配置不同的鉴权等。")]),t._v(" "),v("li",[t._v("IP黑白名单:支持配置IP黑白名单。")]),t._v(" "),v("li",[t._v("自定义插件:强大的插件机制支持自由扩展。")]),t._v(" "),v("li",[t._v("可扩展:简单易用的插件机制方便扩展功能。")]),t._v(" "),v("li",[t._v("高性能:性能在众多网关之中表现优异。")]),t._v(" "),v("li",[t._v("版本控制:支持操作的发布和多次回滚。")]),t._v(" "),v("li",[t._v("管理后台:通过管理后台界面对网关集群进行各项配置。")])])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/14.27ba8a23.js b/docs/assets/js/14.27ba8a23.js deleted file mode 100644 index 9a00334..0000000 --- a/docs/assets/js/14.27ba8a23.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{359:function(a,t,s){"use strict";s.r(t);var r=s(42),e=Object(r.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),s("p",[a._v("接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。")]),a._v(" "),s("h2",{attrs:{id:"接口列表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口列表"}},[a._v("#")]),a._v(" 接口列表")]),a._v(" "),s("p",[a._v("菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_list_query.png",alt:"manager_aggregate_list_query"}})]),a._v(" "),s("h2",{attrs:{id:"新增接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#新增接口"}},[a._v("#")]),a._v(" 新增接口")]),a._v(" "),s("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_1.png",alt:"manager_aggregate_add_1"}})]),a._v(" "),s("h3",{attrs:{id:"基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#基础信息"}},[a._v("#")]),a._v(" 基础信息")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_2.png",alt:"manager_aggregate_add_2"}})]),a._v(" "),s("p",[a._v("所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;")]),a._v(" "),s("p",[a._v("接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("方法:接口请求方法类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("路径:接口请求路径后缀,长度不能超过2000个字符,必填;")]),a._v(" "),s("p",[a._v("开发人员:接口对应负责的开发人员,长度不能超过200个字符;")]),a._v(" "),s("p",[a._v("描述:接口功能描述,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。")]),a._v(" "),s("h3",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[a._v("#")]),a._v(" 配置输入")]),a._v(" "),s("p",[a._v("聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。")]),a._v(" "),s("h4",{attrs:{id:"json-schema介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#json-schema介绍"}},[a._v("#")]),a._v(" JSON Schema介绍")]),a._v(" "),s("p",[a._v("JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。")]),a._v(" "),s("p",[a._v("作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。")]),a._v(" "),s("blockquote",[s("p",[a._v("要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。")]),a._v(" "),s("p",[a._v("JSON包含以下数据结构:")]),a._v(" "),s("ul",[s("li",[a._v("object:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"value2"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("array:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"second"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"third"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("number:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token number"}},[a._v("42")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("3.1415926")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("string:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"This is a string"')]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("boolean:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("false")]),a._v("\n")])])])]),a._v(" "),s("li",[a._v("null:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("null")]),a._v("\n")])])])])]),a._v(" "),s("p",[a._v("通过以上的简单数据类型,就能构造复杂的结构化数据了。下面举两个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"February 22, 1732"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon, Virginia, United States"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"George"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Washington"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"1732-02-22"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"3200 Mount Vernon Memorial Highway"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Mount Vernon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Virginia"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"United States"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上两个例子都是有效的JSON数据,包含一样的有效信息,但是当程序读取数据时,需要准确的知道数据是怎么组织的,比如哪些字段是必须,这些字段是什么类型。这时候JSON Schema就派上用场了,看以下JSON Schema例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"birthday"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"format"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"date"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"street_address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"city"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"state"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"country"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。")]),a._v(" "),s("p",[a._v("JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。")])]),a._v(" "),s("p",[a._v("更多JSON Schema知识可以阅读"),s("a",{attrs:{href:"https://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Understanding JSON Schema"),s("OutboundLink")],1),a._v("。")]),a._v(" "),s("h4",{attrs:{id:"请求头部"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求头部"}},[a._v("#")]),a._v(" 请求头部")]),a._v(" "),s("p",[a._v("定义聚合接口的请求Header参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_3.png",alt:"manager_aggregate_add_3"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求头参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求头参数"),s("code",[a._v("headerParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_header_1.png",alt:"manager_aggregate_add_input_header_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_header_2.png",alt:"manager_aggregate_add_input_header_2"}})]),a._v(" "),s("h4",{attrs:{id:"请求体"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#请求体"}},[a._v("#")]),a._v(" 请求体")]),a._v(" "),s("p",[a._v("定义聚合接口的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_4.png",alt:"manager_aggregate_add_4"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"请求体参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"bodyParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传请求体参数"),s("code",[a._v("bodyParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_body_1.png",alt:"manager_aggregate_add_input_body_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_body_2.png",alt:"manager_aggregate_add_input_body_2"}})]),a._v(" "),s("h4",{attrs:{id:"query参数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query参数"}},[a._v("#")]),a._v(" Query参数")]),a._v(" "),s("p",[a._v("定义聚合接口的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_5.png",alt:"manager_aggregate_add_5"}})]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"query参数1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"titleEn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("以上例子定义了必传Query参数"),s("code",[a._v("queryParam1")]),a._v("。")]),a._v(" "),s("p",[s("code",[a._v("title")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_query_1.png",alt:"manager_aggregate_add_input_query_1"}})]),a._v(" "),s("p",[a._v("当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用"),s("code",[a._v("titleEn")]),a._v("字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_query_2.png",alt:"manager_aggregate_add_input_query_2"}})]),a._v(" "),s("h4",{attrs:{id:"脚本校验"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本校验"}},[a._v("#")]),a._v(" 脚本校验")]),a._v(" "),s("p",[a._v("对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_6.png",alt:"manager_aggregate_add_6"}})]),a._v(" "),s("p",[a._v("点击 新增 按钮后弹出脚本配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_7.png",alt:"manager_aggregate_add_7"}})]),a._v(" "),s("p",[a._v("脚本类型:可选javascript|groovy,必选;")]),a._v(" "),s("p",[a._v("脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。")]),a._v(" "),s("p",[a._v("举个例子:")]),a._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// javascript脚本函数名不能修改")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("function")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("dyFunc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[a._v("paramsJsonStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 上下文, 数据结构请参考 context.js")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("paramsJsonStr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'context'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// common为内置的上下文便捷操作工具类,详情请参考common.js;例如:")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// var data = common.getStepRespBody(context, 'step2', 'request1', 'data');")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// do something")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'headerParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" bodyParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'bodyParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'queryParam1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("var")]),a._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("new")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("queryParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" bodyParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"queryParam1与bodyParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("headerParam1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!=")]),a._v(" queryParam1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"headerParam1与queryParam1不一致"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("// 返回结果为Array或Object时要先转为json字符串")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("return")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[a._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n")])])]),s("p",[a._v("以上例子使用javascript编写参数校验,限制入参"),s("code",[a._v("headerParam1")]),a._v("、"),s("code",[a._v("bodyParam1")]),a._v("、"),s("code",[a._v("queryParam1")]),a._v("必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_input_script.png",alt:"manager_aggregate_add_input_script"}})]),a._v(" "),s("h4",{attrs:{id:"语言配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#语言配置"}},[a._v("#")]),a._v(" 语言配置")]),a._v(" "),s("p",[a._v("聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_8.png",alt:"manager_aggregate_add_8"}})]),a._v(" "),s("p",[a._v("字段:入参字段值,例如"),s("code",[a._v("input.request.body.languageCode")]),a._v("使用请求体参数"),s("code",[a._v("languageCode")]),a._v("的值来决定使用哪种语言;")]),a._v(" "),s("p",[a._v("中文:中文与入参字段值的映射关系,例如配置"),s("code",[a._v("0")]),a._v(",当请求入参字段值为"),s("code",[a._v("0")]),a._v("时使用中文提示校验结果;")]),a._v(" "),s("p",[a._v("英文:英文与入参字段值的映射关系,例如配置"),s("code",[a._v("1")]),a._v(",当请求入参字段值为"),s("code",[a._v("1")]),a._v("时使用中文提示校验结果。")]),a._v(" "),s("h3",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[a._v("#")]),a._v(" 配置步骤")]),a._v(" "),s("p",[a._v("聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_9.png",alt:"manager_aggregate_add_9"}})]),a._v(" "),s("p",[a._v("是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;")]),a._v(" "),s("p",[a._v("请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;")]),a._v(" "),s("p",[a._v("默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;")]),a._v(" "),s("p",[a._v("开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;")]),a._v(" "),s("p",[a._v("测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;")]),a._v(" "),s("p",[a._v("预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;")]),a._v(" "),s("p",[a._v("生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;")]),a._v(" "),s("p",[a._v("超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;")]),a._v(" "),s("p",[a._v("Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;")]),a._v(" "),s("p",[a._v("请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_10.png",alt:"manager_aggregate_add_10"}})]),a._v(" "),s("p",[a._v("配置入参:配置调用底层服务接口的请求参数;")]),a._v(" "),s("p",[a._v("配置响应:配置调用底层服务接口的响应内容。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_11.png",alt:"manager_aggregate_add_11"}})]),a._v(" "),s("p",[a._v("配置步骤结果:配置step执行完成后的响应内容。")]),a._v(" "),s("h3",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[a._v("#")]),a._v(" 配置输出")]),a._v(" "),s("p",[a._v("配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_12.png",alt:"manager_aggregate_add_12"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_13.png",alt:"manager_aggregate_add_13"}})]),a._v(" "),s("h3",{attrs:{id:"校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#校验结果"}},[a._v("#")]),a._v(" 校验结果")]),a._v(" "),s("p",[a._v("配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_14.png",alt:"manager_aggregate_add_14"}})]),a._v(" "),s("p",[a._v("校验结果有一个专用的引用值"),s("code",[a._v("validateMsg")]),a._v(",该引用值用于存放入参验证错误提示信息。")]),a._v(" "),s("h3",{attrs:{id:"保存接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#保存接口"}},[a._v("#")]),a._v(" 保存接口")]),a._v(" "),s("p",[a._v("所有配置完成后点击 保存 按钮,完成聚合接口的配置。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_add_15.png",alt:"manager_aggregate_add_15"}})]),a._v(" "),s("h2",{attrs:{id:"导出接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导出接口"}},[a._v("#")]),a._v(" 导出接口")]),a._v(" "),s("p",[a._v("导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_export_1.png",alt:"manager_aggregate_export_1"}})]),a._v(" "),s("p",[a._v("勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_export_2.png",alt:"manager_aggregate_export_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮,浏览器保存配置文件,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_export_3.png",alt:"manager_aggregate_export_3"}})]),a._v(" "),s("h2",{attrs:{id:"导入接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入接口"}},[a._v("#")]),a._v(" 导入接口")]),a._v(" "),s("p",[a._v("导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_import_1.png",alt:"manager_aggregate_import_1"}})]),a._v(" "),s("p",[a._v("点击 导入 按钮弹出导入配置窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_import_2.png",alt:"manager_aggregate_import_2"}})]),a._v(" "),s("p",[a._v("点击 选取文件 按钮后选取要导入的配置文件;")]),a._v(" "),s("p",[a._v("强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后导入聚合接口配置。")]),a._v(" "),s("h2",{attrs:{id:"调试模式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#调试模式"}},[a._v("#")]),a._v(" 调试模式")]),a._v(" "),s("p",[a._v("调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。")]),a._v(" "),s("p",[a._v("勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_1.png",alt:"manager_aggregate_debug_mode_1"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认打开调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_2.png",alt:"manager_aggregate_debug_mode_2"}})]),a._v(" "),s("p",[a._v("勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_3.png",alt:"manager_aggregate_debug_mode_3"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮确认关闭调试模式。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_debug_mode_4.png",alt:"manager_aggregate_debug_mode_4"}})]),a._v(" "),s("h2",{attrs:{id:"编辑接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#编辑接口"}},[a._v("#")]),a._v(" 编辑接口")]),a._v(" "),s("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_edit_1.png",alt:"manager_aggregate_edit_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_edit_2.png",alt:"manager_aggregate_edit_2"}})]),a._v(" "),s("h2",{attrs:{id:"删除接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#删除接口"}},[a._v("#")]),a._v(" 删除接口")]),a._v(" "),s("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_delete_1.png",alt:"manager_aggregate_delete_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_delete_2.png",alt:"manager_aggregate_delete_2"}})]),a._v(" "),s("p",[a._v("点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。")]),a._v(" "),s("h2",{attrs:{id:"发布-下线申请"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线申请"}},[a._v("#")]),a._v(" 发布|下线申请")]),a._v(" "),s("p",[a._v("发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。")]),a._v(" "),s("p",[a._v("点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_1.png",alt:"manager_aggregate_apply_1"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_2.png",alt:"manager_aggregate_apply_2"}})]),a._v(" "),s("p",[a._v("点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_3.png",alt:"manager_aggregate_apply_3"}})]),a._v(" "),s("p",[a._v("标题:申请的标题,长度不能超过200个字符,必填;")]),a._v(" "),s("p",[a._v("类型:申请类型,可选发布|下线,必选;")]),a._v(" "),s("p",[a._v("申请原因:申请的原因,长度不能超过2000个字符;")]),a._v(" "),s("p",[a._v("选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;")]),a._v(" "),s("p",[a._v("点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_apply_4.png",alt:"manager_aggregate_apply_4"}})]),a._v(" "),s("h2",{attrs:{id:"接口测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口测试"}},[a._v("#")]),a._v(" 接口测试")]),a._v(" "),s("p",[a._v("后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_1.png",alt:"manager_aggregate_test_1"}})]),a._v(" "),s("p",[a._v("跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_2.png",alt:"manager_aggregate_test_2"}})]),a._v(" "),s("p",[a._v("点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_3.png",alt:"manager_aggregate_test_3"}})]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_4.png",alt:"manager_aggregate_test_4"}})]),a._v(" "),s("p",[a._v("请求体tab用于配置请求的请求体参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_5.png",alt:"manager_aggregate_test_5"}})]),a._v(" "),s("p",[a._v("请求头tab用于配置请求的请求头参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_6.png",alt:"manager_aggregate_test_6"}})]),a._v(" "),s("p",[a._v("Query参数用于配置请求的Query参数。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_7.png",alt:"manager_aggregate_test_7"}})]),a._v(" "),s("p",[a._v("返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。")]),a._v(" "),s("p",[a._v("未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_8.png",alt:"manager_aggregate_test_8"}})]),a._v(" "),s("p",[a._v("勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_9.png",alt:"manager_aggregate_test_9"}})]),a._v(" "),s("p",[a._v("测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};")]),a._v(" "),s("p",[a._v("正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_10.png",alt:"manager_aggregate_test_10"}})]),a._v(" "),s("p",[a._v("点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_11.png",alt:"manager_aggregate_test_11"}})]),a._v(" "),s("p",[a._v("标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。")]),a._v(" "),s("p",[s("img",{attrs:{src:"/manager_aggregate_test_12.png",alt:"manager_aggregate_test_12"}})])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/15.791d6b9d.js b/docs/assets/js/15.791d6b9d.js deleted file mode 100644 index 00c65dc..0000000 --- a/docs/assets/js/15.791d6b9d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{360:function(a,r,t){"use strict";t.r(r);var e=t(42),_=Object(e.a)({},(function(){var a=this,r=a.$createElement,t=a._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),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("菜单位置:发布申请 > 待审核。点击菜单后进入审核列表页面,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_list_query.png",alt:"manager_aggregate_approve_list_query"}})]),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",[a._v("申请列表页提供快速审核操作,点击 审核 按钮后弹出审核确认窗口,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_op_1.png",alt:"manager_aggregate_approve_op_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_op_2.png",alt:"manager_aggregate_approve_op_2"}})]),a._v(" "),t("p",[a._v("审核结果:勾选通过,审核后申请能可执行申请的操作;勾选不通过,审核后申请失败,申请人不能执行申请的操作。")]),a._v(" "),t("p",[a._v("审核后申请人会收到审核结果邮件通知,如下图是审核通过的邮件通知。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_approve_op_3.png",alt:"manager_aggregate_approve_op_3"}})])])}),[],!1,null,null,null);r.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/16.c487dae0.js b/docs/assets/js/16.c487dae0.js deleted file mode 100644 index 436d37a..0000000 --- a/docs/assets/js/16.c487dae0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{361:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了发布|下线申请的审核操作日志,审核日志功能提供界面查询后台记录的审核操作日志。")]),a._v(" "),e("h2",{attrs:{id:"审核日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志列表"}},[a._v("#")]),a._v(" 审核日志列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 审核日志。点击菜单后进入审核日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_approve_op_log_list_query.png",alt:"manager_aggregate_approve_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"审核日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#审核日志详情"}},[a._v("#")]),a._v(" 审核日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出审核日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_approve_op_log_detail_1.png",alt:"manager_aggregate_approve_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_approve_op_log_detail_2.png",alt:"manager_aggregate_approve_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/17.65f826a9.js b/docs/assets/js/17.65f826a9.js deleted file mode 100644 index f9aa195..0000000 --- a/docs/assets/js/17.65f826a9.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{363:function(a,_,e){"use strict";e.r(_);var g=e(42),t=Object(g.a)({},(function(){var a=this,_=a.$createElement,e=a._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。")]),a._v(" "),e("h2",{attrs:{id:"申请列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请列表"}},[a._v("#")]),a._v(" 申请列表")]),a._v(" "),e("p",[a._v("菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_list_query.png",alt:"manager_aggregate_my_apply_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"申请撤回"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请撤回"}},[a._v("#")]),a._v(" 申请撤回")]),a._v(" "),e("p",[a._v("对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_1.png",alt:"manager_aggregate_my_apply_revoke_1"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后确认撤回申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_2.png",alt:"manager_aggregate_my_apply_revoke_2"}})]),a._v(" "),e("p",[a._v("撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_3.png",alt:"manager_aggregate_my_apply_revoke_3"}})]),a._v(" "),e("p",[a._v("撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_4.png",alt:"manager_aggregate_my_apply_revoke_4"}})]),a._v(" "),e("p",[a._v("点击 确定 按钮后再次提交申请,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_revoke_5.png",alt:"manager_aggregate_my_apply_revoke_5"}})]),a._v(" "),e("h2",{attrs:{id:"申请详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#申请详情"}},[a._v("#")]),a._v(" 申请详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮查看申请详情。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_1.png",alt:"manager_aggregate_my_apply_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_2.png",alt:"manager_aggregate_my_apply_detail_2"}})]),a._v(" "),e("p",[a._v("操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。")]),a._v(" "),e("p",[a._v("待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_3.png",alt:"manager_aggregate_my_apply_detail_3"}})]),a._v(" "),e("p",[a._v("重新选择审核人后点击 确定 按钮,修改审核人完成。")]),a._v(" "),e("p",[a._v("修改后原审核人会收到邮件提醒无须再处理该申请。")]),a._v(" "),e("p",[a._v("修改后新的审核人会收到邮件提醒需要处理该申请。")]),a._v(" "),e("p",[a._v("审核通过后可以对接口进行发布操作,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_4.png",alt:"manager_aggregate_my_apply_detail_4"}})]),a._v(" "),e("p",[a._v("批量发布:对申请内的接口批量发布推送到Fizz网关。")]),a._v(" "),e("p",[a._v("批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。")]),a._v(" "),e("p",[a._v("对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_5.png",alt:"manager_aggregate_my_apply_detail_5"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_my_apply_detail_6.png",alt:"manager_aggregate_my_apply_detail_6"}})])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/18.603a235b.js b/docs/assets/js/18.603a235b.js deleted file mode 100644 index 61172ba..0000000 --- a/docs/assets/js/18.603a235b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{364:function(a,t,e){"use strict";e.r(t);var _=e(42),r=Object(_.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h2",{attrs:{id:"概述"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),e("p",[a._v("管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。")]),a._v(" "),e("h2",{attrs:{id:"操作日志列表"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#操作日志列表"}},[a._v("#")]),a._v(" 操作日志列表")]),a._v(" "),e("p",[a._v("菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_op_log_list_query.png",alt:"manager_aggregate_op_log_list_query"}})]),a._v(" "),e("h2",{attrs:{id:"查看日志详情"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看日志详情"}},[a._v("#")]),a._v(" 查看日志详情")]),a._v(" "),e("p",[a._v("点击 查看 按钮弹出操作日志详情页面,如图所示。")]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_op_log_detail_1.png",alt:"manager_aggregate_op_log_detail_1"}})]),a._v(" "),e("p",[e("img",{attrs:{src:"/manager_aggregate_op_log_detail_2.png",alt:"manager_aggregate_op_log_detail_2"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/19.14c3cafc.js b/docs/assets/js/19.14c3cafc.js deleted file mode 100644 index 667b94b..0000000 --- a/docs/assets/js/19.14c3cafc.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{362:function(a,t,_){"use strict";_.r(t);var r=_(42),p=Object(r.a)({},(function(){var a=this,t=a.$createElement,_=a._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。")]),a._v(" "),_("h2",{attrs:{id:"路由列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#路由列表"}},[a._v("#")]),a._v(" 路由列表")]),a._v(" "),_("p",[a._v("菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_list_query.png",alt:"manager_api_auth_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增路由"}},[a._v("#")]),a._v(" 新增路由")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_1.png",alt:"manager_api_auth_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_2.png",alt:"manager_api_auth_add_2"}})]),a._v(" "),_("p",[a._v("网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;")]),a._v(" "),_("p",[a._v("服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;")]),a._v(" "),_("p",[a._v("API方法:请求的method类型,可选GET|POST;")]),a._v(" "),_("p",[a._v('API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;')]),a._v(" "),_("p",[a._v("应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;")]),a._v(" "),_("p",[a._v("访问:可选允许|禁止,必选;")]),a._v(" "),_("p",[a._v("转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。")]),a._v(" "),_("p",[a._v("点击 添加插件 按钮为路由添加插件,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_3.png",alt:"manager_api_auth_add_3"}})]),a._v(" "),_("p",[a._v("配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_4.png",alt:"manager_api_auth_add_4"}})]),a._v(" "),_("p",[a._v("配置完成后点击 保存 按钮保存路由规则。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_add_5.png",alt:"manager_api_auth_add_5"}})]),a._v(" "),_("h2",{attrs:{id:"编辑路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑路由"}},[a._v("#")]),a._v(" 编辑路由")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_edit_1.png",alt:"manager_api_auth_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_edit_2.png",alt:"manager_api_auth_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除路由"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除路由"}},[a._v("#")]),a._v(" 删除路由")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_delete_1.png",alt:"manager_api_auth_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_api_auth_delete_2.png",alt:"manager_api_auth_delete_2"}})])])}),[],!1,null,null,null);t.default=p.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/2.60c09e20.js b/docs/assets/js/2.60c09e20.js deleted file mode 100644 index d4dedef..0000000 --- a/docs/assets/js/2.60c09e20.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{301:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return v})),n.d(e,"j",(function(){return m}));n(24),n(98),n(165),n(92),n(170),n(64),n(43),n(302),n(65),n(318),n(101);var i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function u(t){return s.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(u(t))return t;var e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function f(t,e){var n=decodeURIComponent(t.hash),r=function(t){var e=t.match(i);if(e)return e[0]}(e);return(!r||n===r)&&o(t.path)===o(e)}function p(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){var i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;var r=e.split("/");n&&r[r.length-1]||r.pop();for(var a=t.replace(/^\//,"").split("/"),s=0;s3&&void 0!==arguments[3]?arguments[3]:1;if("string"==typeof e)return p(n,e,i);if(Array.isArray(e))return Object.assign(p(n,e[0],i),{title:e[1]});var a=e.children||[];return 0===a.length&&e.path?Object.assign(p(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:a.map((function(e){return t(e,n,i,r+1)})),collapsable:!1!==e.collapsable}}(t,r,l)})):[]}return[]}function g(t){var e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map((function(e){return{type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}}))}]}function v(t){var e;return(t=t.map((function(t){return Object.assign({},t)}))).forEach((function(t){2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)})),t.filter((function(t){return 2===t.level}))}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},302:function(t,e,n){"use strict";var i=n(167),r=n(5),a=n(13),s=n(23),o=n(168),u=n(169);i("match",1,(function(t,e,n){return[function(e){var n=s(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,n):new RegExp(e)[t](String(n))},function(t){var i=n(e,t,this);if(i.done)return i.value;var s=r(t),l=String(this);if(!s.global)return u(s,l);var c=s.unicode;s.lastIndex=0;for(var h,f=[],p=0;null!==(h=u(s,l));){var d=String(h[0]);f[p]=d,""===d&&(s.lastIndex=o(l,a(s.lastIndex),c)),p++}return 0===p?null:f}]}))},303:function(t,e,n){},304:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},305:function(t,e,n){},306:function(t,e,n){},307:function(t,e,n){},308:function(t,e,n){},309:function(t,e,n){},310:function(t,e,n){},311:function(t,e,n){},312:function(t,e,n){},313:function(t,e,n){},314:function(t,e,n){},315:function(t,e,n){},316:function(t,e,n){},318:function(t,e,n){"use strict";var i=n(167),r=n(166),a=n(5),s=n(23),o=n(97),u=n(168),l=n(13),c=n(169),h=n(67),f=n(1),p=[].push,d=Math.min,g=!f((function(){return!RegExp(4294967295,"y")}));i("split",2,(function(t,e,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=String(s(this)),a=void 0===n?4294967295:n>>>0;if(0===a)return[];if(void 0===t)return[i];if(!r(t))return e.call(i,t,a);for(var o,u,l,c=[],f=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,g=new RegExp(t.source,f+"g");(o=h.call(g,i))&&!((u=g.lastIndex)>d&&(c.push(i.slice(d,o.index)),o.length>1&&o.index=a));)g.lastIndex===o.index&&g.lastIndex++;return d===i.length?!l&&g.test("")||c.push(""):c.push(i.slice(d)),c.length>a?c.slice(0,a):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var r=s(this),a=null==e?void 0:e[t];return void 0!==a?a.call(e,r,n):i.call(String(r),e,n)},function(t,r){var s=n(i,t,this,r,i!==e);if(s.done)return s.value;var h=a(t),f=String(this),p=o(h,RegExp),v=h.unicode,m=(h.ignoreCase?"i":"")+(h.multiline?"m":"")+(h.unicode?"u":"")+(g?"y":"g"),b=new p(g?h:"^(?:"+h.source+")",m),k=void 0===r?4294967295:r>>>0;if(0===k)return[];if(0===f.length)return null===c(b,f)?[f]:[];for(var _=0,x=0,C=[];x-1)&&(e=e.replace(/y/g,""));var o=s(x?new m(t,e):m(t,e),i?this:b,$);return C&&n&&d(o,{sticky:n}),o},y=function(t){t in $||o($,t,{configurable:!0,get:function(){return m[t]},set:function(e){m[t]=e}})},L=u(m),w=0;L.length>w;)y(L[w++]);b.constructor=$,$.prototype=b,f(r,"RegExp",$)}g("RegExp")},322:function(t,e){t.exports=function(t){return null==t}},323:function(t,e,n){"use strict";n.r(e);n(164);var i=n(301),r={name:"SidebarGroup",components:{DropdownTransition:n(324).a},props:["item","open","collapsable","depth"],beforeCreate:function(){this.$options.components.SidebarLinks=n(323).default},methods:{isActive:i.e}},a=(n(344),n(42)),s=Object(a.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?n("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):n("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),n("DropdownTransition",[t.open||!t.collapsable?n("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null).exports;n(345),n(64);function o(t,e,n,i,r){var a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return r>2&&(a.style={"padding-left":r+"rem"}),t("RouterLink",a,n)}function u(t,e,n,r,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1;return!e||s>a?null:t("ul",{class:"sidebar-sub-headers"},e.map((function(e){var l=Object(i.e)(r,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[o(t,n+"#"+e.slug,e.title,l,e.level-1),u(t,e.children,n,r,a,s+1)])})))}var l={functional:!0,props:["item","sidebarDepth"],render:function(t,e){var n=e.parent,r=n.$page,a=(n.$site,n.$route),s=n.$themeConfig,l=n.$themeLocaleConfig,c=e.props,h=c.item,f=c.sidebarDepth,p=Object(i.e)(a,h.path),d="auto"===h.type?p||h.children.some((function(t){return Object(i.e)(a,h.basePath+"#"+t.slug)})):p,g="external"===h.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,h.path,h.title||h.path):o(t,h.path,h.title||h.path,d),v=[r.frontmatter.sidebarDepth,f,l.sidebarDepth,s.sidebarDepth,1].find((function(t){return void 0!==t})),m=l.displayAllHeaders||s.displayAllHeaders;return"auto"===h.type?[g,u(t,h.children,h.basePath,a,v)]:(d||m)&&h.headers&&!i.d.test(h.path)?[g,u(t,Object(i.c)(h.headers),h.path,a,v)]:g}};n(346);function c(t,e){return"group"===e.type&&e.children.some((function(e){return"group"===e.type?c(t,e):"page"===e.type&&Object(i.e)(t,e.path)}))}var h={name:"SidebarLinks",components:{SidebarGroup:s,SidebarLink:Object(a.a)(l,void 0,void 0,!1,null,null,null).exports},props:["items","depth","sidebarDepth"],data:function(){return{openGroupIndex:0}},watch:{$route:function(){this.refreshIndex()}},created:function(){this.refreshIndex()},methods:{refreshIndex:function(){var t=function(t,e){for(var n=0;n-1&&(this.openGroupIndex=t)},toggleGroup:function(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive:function(t){return Object(i.e)(this.$route,t.regularPath)}}},f=Object(a.a)(h,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.items.length?n("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(e,i){return n("li",{key:i},["group"===e.type?n("SidebarGroup",{attrs:{item:e,open:i===t.openGroupIndex,collapsable:e.collapsable||e.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):n("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:e}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=f.exports},324:function(t,e,n){"use strict";var i={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},r=(n(336),n(42)),a=Object(r.a)(i,(function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.a=a.exports},325:function(t,e,n){"use strict";var i=n(0),r=n(326);i({target:"String",proto:!0,forced:n(327)("link")},{link:function(t){return r(this,"a","href",t)}})},326:function(t,e,n){var i=n(23),r=/"/g;t.exports=function(t,e,n,a){var s=String(i(t)),o="<"+e;return""!==n&&(o+=" "+n+'="'+String(a).replace(r,""")+'"'),o+">"+s+""}},327:function(t,e,n){var i=n(1);t.exports=function(t){return i((function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}))}},328:function(t,e,n){"use strict";var i=n(303);n.n(i).a},329:function(t,e,n){var i=n(0),r=n(330);i({global:!0,forced:parseInt!=r},{parseInt:r})},330:function(t,e,n){var i=n(3),r=n(319).trim,a=n(304),s=i.parseInt,o=/^[+-]?0[Xx]/,u=8!==s(a+"08")||22!==s(a+"0x16");t.exports=u?function(t,e){var n=r(String(t));return s(n,e>>>0||(o.test(n)?16:10))}:s},331:function(t,e,n){var i=n(1),r=n(304);t.exports=function(t){return i((function(){return!!r[t]()||"​…᠎"!="​…᠎"[t]()||r[t].name!==t}))}},332:function(t,e,n){var i=n(4),r=n(96);t.exports=function(t,e,n){var a,s;return r&&"function"==typeof(a=e.constructor)&&a!==n&&i(s=a.prototype)&&s!==n.prototype&&r(t,s),t}},333:function(t,e,n){"use strict";var i,r=n(0),a=n(25).f,s=n(13),o=n(99),u=n(23),l=n(100),c=n(20),h="".endsWith,f=Math.min,p=l("endsWith");r({target:"String",proto:!0,forced:!!(c||p||(i=a(String.prototype,"endsWith"),!i||i.writable))&&!p},{endsWith:function(t){var e=String(u(this));o(t);var n=arguments.length>1?arguments[1]:void 0,i=s(e.length),r=void 0===n?i:f(s(n),i),a=String(t);return h?h.call(e,a,r):e.slice(r-a.length,r)===a}})},334:function(t,e,n){"use strict";var i=n(305);n.n(i).a},335:function(t,e,n){"use strict";var i=n(306);n.n(i).a},336:function(t,e,n){"use strict";var i=n(307);n.n(i).a},337:function(t,e,n){"use strict";var i=n(308);n.n(i).a},338:function(t,e,n){"use strict";var i=n(309);n.n(i).a},339:function(t,e,n){"use strict";var i=n(310);n.n(i).a},340:function(t,e,n){"use strict";var i=n(311);n.n(i).a},341:function(t,e,n){var i=n(30),r=n(14),a=n(26);t.exports=function(t){return"string"==typeof t||!r(t)&&a(t)&&"[object String]"==i(t)}},342:function(t,e,n){"use strict";var i=n(312);n.n(i).a},343:function(t,e,n){"use strict";var i=n(313);n.n(i).a},344:function(t,e,n){"use strict";var i=n(314);n.n(i).a},345:function(t,e,n){"use strict";var i=n(0),r=n(29).find,a=n(94),s=n(17),o=!0,u=s("find");"find"in[]&&Array(1).find((function(){o=!1})),i({target:"Array",proto:!0,forced:o||!u},{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),a("find")},346:function(t,e,n){"use strict";var i=n(315);n.n(i).a},347:function(t,e,n){"use strict";var i=n(316);n.n(i).a},349:function(t,e,n){"use strict";n.r(e);n(164),n(91),n(325);var i=n(301),r={name:"NavLink",props:{item:{required:!0}},computed:{link:function(){return Object(i.b)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some((function(e){return e===t.link})):"/"===this.link},isNonHttpURI:function(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget:function(){return"_blank"===this.target},isInternal:function(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target:function(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel:function(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction:function(){this.$emit("focusout")}}},a=n(42),s=Object(a.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction(e)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null).exports,o={name:"Home",components:{NavLink:s},computed:{data:function(){return this.$page.frontmatter},actionLink:function(){return{link:this.data.actionLink,text:this.data.actionText}}}},u=(n(328),Object(a.a)(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("main",{staticClass:"home",attrs:{"aria-labelledby":"main-title"}},[n("header",{staticClass:"hero"},[t.data.heroImage?n("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),null!==t.data.heroText?n("h1",{attrs:{id:"main-title"}},[t._v("\n "+t._s(t.data.heroText||t.$title||"Hello")+"\n ")]):t._e(),t._v(" "),null!==t.data.tagline?n("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]):t._e(),t._v(" "),t.data.actionText&&t.data.actionLink?n("p",{staticClass:"action"},[n("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?n("div",{staticClass:"features"},t._l(t.data.features,(function(e,i){return n("div",{key:i,staticClass:"feature"},[n("h2",[t._v(t._s(e.title))]),t._v(" "),n("p",[t._v(t._s(e.details))])])})),0):t._e(),t._v(" "),n("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t.data.footer?n("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+" | "),n("a",{staticStyle:{"font-weight":"normal","font-size":"16px",color:"#4e6e8e"},attrs:{href:"http://beian.miit.gov.cn"}},[t._v("粤ICP备19131807号")])]):t._e()],1)}),[],!1,null,null,null).exports),l=(n(329),n(24),n(172),n(165),n(92),n(43),n(174),n(302),n(320),n(170),n(64),n(321),n(93),n(333),n(65),n(318),n(176)),c=n.n(l),h=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=c()(e,"title","");return c()(e,"frontmatter.tags")&&(i+=" ".concat(e.frontmatter.tags.join(" "))),n&&(i+=" ".concat(n)),f(t,i)},f=function(t,e){var n=function(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},i=new RegExp("[^\0-]"),r=t.split(/\s+/g).map((function(t){return t.trim()})).filter((function(t){return!!t}));if(i.test(t))return r.some((function(t){return e.toLowerCase().indexOf(t)>-1}));var a=t.endsWith(" ");return new RegExp(r.map((function(t,e){return r.length!==e+1||a?"(?=.*\\b".concat(n(t),"\\b)"):"(?=.*\\b".concat(n(t),")")})).join("")+".+","gi").test(e)},p={name:"SearchBox",data:function(){return{query:"",focused:!1,focusIndex:0,placeholder:void 0}},computed:{showSuggestions:function(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions:function(){var t=this.query.trim().toLowerCase();if(t){for(var e=this.$site.pages,n=this.$site.themeConfig.searchMaxSuggestions||5,i=this.$localePath,r=[],a=0;a=n);a++){var s=e[a];if(this.getPageLocalePath(s)===i&&this.isSearchable(s))if(h(t,s))r.push(s);else if(s.headers)for(var o=0;o=n);o++){var u=s.headers[o];u.title&&h(t,s,u.title)&&r.push(Object.assign({},s,{path:s.path+"#"+u.slug,header:u}))}}return r}},alignRight:function(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted:function(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy:function(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath:function(t){for(var e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable:function(t){var e=null;return null===e||(e=Array.isArray(e)?e:new Array(e)).filter((function(e){return t.path.match(e)})).length>0},onHotkey:function(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp:function(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown:function(){this.showSuggestions&&(this.focusIndex "+t._s(e.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports),g=(n(335),Object(a.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"sidebar-button",on:{click:function(e){return t.$emit("toggle-sidebar")}}},[n("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null).exports),v=(n(175),n(40)),m=n(324),b=n(177),k=n.n(b),_={name:"DropdownLink",components:{NavLink:s,DropdownTransition:m.a},props:{item:{required:!0}},data:function(){return{open:!1}},computed:{dropdownAriaLabel:function(){return this.item.ariaLabel||this.item.text}},watch:{$route:function(){this.open=!1}},methods:{setOpen:function(t){this.open=t},isLastItemOfArray:function(t,e){return k()(e)===t}}},x=(n(337),{name:"NavLinks",components:{NavLink:s,DropdownLink:Object(a.a)(_,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[n("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[n("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),n("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),n("DropdownTransition",[n("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(e,i){return n("li",{key:e.link||i,staticClass:"dropdown-item"},["links"===e.type?n("h4",[t._v("\n "+t._s(e.text)+"\n ")]):t._e(),t._v(" "),"links"===e.type?n("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(e.items,(function(i){return n("li",{key:i.link,staticClass:"dropdown-subitem"},[n("NavLink",{attrs:{item:i},on:{focusout:function(n){t.isLastItemOfArray(i,e.items)&&t.isLastItemOfArray(e,t.item.items)&&t.setOpen(!1)}}})],1)})),0):n("NavLink",{attrs:{item:e},on:{focusout:function(n){t.isLastItemOfArray(e,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null).exports},computed:{userNav:function(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav:function(){var t=this,e=this.$site.locales;if(e&&Object.keys(e).length>1){var n=this.$page.path,i=this.$router.options.routes,r=this.$site.themeConfig.locales||{},a={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(e).map((function(a){var s,o=e[a],u=r[a]&&r[a].label||o.lang;return o.lang===t.$lang?s=n:(s=n.replace(t.$localeConfig.path,a),i.some((function(t){return t.path===s}))||(s=a)),{text:u,link:s}}))};return[].concat(Object(v.a)(this.userNav),[a])}return this.userNav},userLinks:function(){return(this.nav||[]).map((function(t){return Object.assign(Object(i.j)(t),{items:(t.items||[]).map(i.j)})}))},repoLink:function(){var t=this.$site.themeConfig.repo;return t?/^https?:/.test(t)?t:"https://github.com/".concat(t):null},repoLabel:function(){if(this.repoLink){if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;for(var t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"],n=0;nMath.abs(n)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}}),B=Object(a.a)(W,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),n("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?n("Home"):n("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=B.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/20.b646f0b0.js b/docs/assets/js/20.b646f0b0.js deleted file mode 100644 index 5a40160..0000000 --- a/docs/assets/js/20.b646f0b0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{365:function(a,_,p){"use strict";p.r(_);var t=p(42),r=Object(t.a)({},(function(){var a=this,_=a.$createElement,p=a._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[p("h2",{attrs:{id:"概述"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),p("p",[a._v("appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。")]),a._v(" "),p("h2",{attrs:{id:"appid列表"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#appid列表"}},[a._v("#")]),a._v(" appID列表")]),a._v(" "),p("p",[a._v("菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_list_query.png",alt:"manager_app_id_list_query"}})]),a._v(" "),p("h2",{attrs:{id:"新增appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#新增appid"}},[a._v("#")]),a._v(" 新增appID")]),a._v(" "),p("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_add_1.png",alt:"manager_app_id_add_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_add_2.png",alt:"manager_app_id_add_2"}})]),a._v(" "),p("p",[a._v("appID:第三方应用唯一标识,长度不能超过64个字符,必填;")]),a._v(" "),p("p",[a._v("应用名:第三方应用名称,长度不能超过128个字符,必填;")]),a._v(" "),p("p",[a._v("是否启用签名:当启动时必须配置 认证方式 和 密钥;")]),a._v(" "),p("p",[a._v("认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;")]),a._v(" "),p("p",[a._v("密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;")]),a._v(" "),p("p",[a._v("是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;")]),a._v(" "),p("p",[a._v("IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;")]),a._v(" "),p("p",[a._v("自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。")]),a._v(" "),p("h2",{attrs:{id:"编辑appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#编辑appid"}},[a._v("#")]),a._v(" 编辑appID")]),a._v(" "),p("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_edit_1.png",alt:"manager_app_id_edit_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_edit_2.png",alt:"manager_app_id_edit_2"}})]),a._v(" "),p("h2",{attrs:{id:"删除appid"}},[p("a",{staticClass:"header-anchor",attrs:{href:"#删除appid"}},[a._v("#")]),a._v(" 删除appID")]),a._v(" "),p("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_delete_1.png",alt:"manager_app_id_delete_1"}})]),a._v(" "),p("p",[p("img",{attrs:{src:"/manager_app_id_delete_2.png",alt:"manager_app_id_delete_2"}})]),a._v(" "),p("p",[a._v("点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。")])])}),[],!1,null,null,null);_.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/21.081e4e30.js b/docs/assets/js/21.081e4e30.js deleted file mode 100644 index 60dba6b..0000000 --- a/docs/assets/js/21.081e4e30.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{368:function(a,e,t){"use strict";t.r(e);var _=t(42),r=Object(_.a)({},(function(){var a=this,e=a.$createElement,t=a._self._c||e;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),t("p",[a._v("网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。")]),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",{attrs:{src:"/manager_aggregate_gateway_list_query.png",alt:"manager_aggregate_gateway_list_query"}})]),a._v(" "),t("p",[a._v("Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。")]),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",{attrs:{src:"/manager_aggregate_gateway_cache_list_query_1.png",alt:"manager_aggregate_gateway_cache_list_query_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_gateway_cache_list_query_2.png",alt:"manager_aggregate_gateway_cache_list_query_2"}})]),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",{attrs:{src:"/manager_aggregate_gateway_cache_detail_1.png",alt:"manager_aggregate_gateway_cache_detail_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_aggregate_gateway_cache_detail_2.png",alt:"manager_aggregate_gateway_cache_detail_2"}})])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/22.ddeb9465.js b/docs/assets/js/22.ddeb9465.js deleted file mode 100644 index d91f043..0000000 --- a/docs/assets/js/22.ddeb9465.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{366:function(_,a,t){"use strict";t.r(a);var r=t(42),e=Object(r.a)({},(function(){var _=this,a=_.$createElement,t=_._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[_._v("#")]),_._v(" 概述")]),_._v(" "),t("p",[_._v("网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。")]),_._v(" "),t("h2",{attrs:{id:"分组示例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#分组示例"}},[_._v("#")]),_._v(" 分组示例")]),_._v(" "),t("p",[_._v("我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。")]),_._v(" "),t("table",[t("thead",[t("tr",[t("th",[_._v("分组ID")]),_._v(" "),t("th",[_._v("分组名称")]),_._v(" "),t("th",[_._v("描述")])])]),_._v(" "),t("tbody",[t("tr",[t("td",[_._v("default")]),_._v(" "),t("td",[_._v("默认分组")]),_._v(" "),t("td",[_._v("默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除")])]),_._v(" "),t("tr",[t("td",[_._v("c")]),_._v(" "),t("td",[_._v("2c分组")]),_._v(" "),t("td",[_._v("只接受面向个人用户的请求")])]),_._v(" "),t("tr",[t("td",[_._v("b")]),_._v(" "),t("td",[_._v("2b分组")]),_._v(" "),t("td",[_._v("只接受面向企业的请求")])]),_._v(" "),t("tr",[t("td",[_._v("t")]),_._v(" "),t("td",[_._v("面向第三方的分组")]),_._v(" "),t("td",[_._v("只接受面向第三方的请求")])])])]),_._v(" "),t("p",[_._v("下面介绍网关分组功能的操作。")]),_._v(" "),t("h2",{attrs:{id:"分组列表"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#分组列表"}},[_._v("#")]),_._v(" 分组列表")]),_._v(" "),t("p",[_._v("菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_list_query.png",alt:"manager_gateway_group_list_query"}})]),_._v(" "),t("h2",{attrs:{id:"新增分组"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#新增分组"}},[_._v("#")]),_._v(" 新增分组")]),_._v(" "),t("p",[_._v("点击 新增 按钮弹出新增窗口,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_add_1.png",alt:"manager_gateway_group_add_1"}})]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_add_2.png",alt:"manager_gateway_group_add_2"}})]),_._v(" "),t("p",[_._v("分组ID:分组的唯一标识,长度不能超过32个字符,必填;")]),_._v(" "),t("p",[_._v("分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;")]),_._v(" "),t("p",[_._v("网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。")]),_._v(" "),t("h2",{attrs:{id:"编辑分组"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#编辑分组"}},[_._v("#")]),_._v(" 编辑分组")]),_._v(" "),t("p",[_._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_edit_1.png",alt:"manager_gateway_group_edit_1"}})]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_edit_2.png",alt:"manager_gateway_group_edit_2"}})]),_._v(" "),t("h2",{attrs:{id:"删除分组"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#删除分组"}},[_._v("#")]),_._v(" 删除分组")]),_._v(" "),t("p",[_._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_delete_1.png",alt:"manager_gateway_group_delete_1"}})]),_._v(" "),t("p",[t("img",{attrs:{src:"/manager_gateway_group_delete_2.png",alt:"manager_gateway_group_delete_2"}})]),_._v(" "),t("p",[_._v("点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/23.f1118a32.js b/docs/assets/js/23.f1118a32.js deleted file mode 100644 index 66421aa..0000000 --- a/docs/assets/js/23.f1118a32.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{372:function(v,_,i){"use strict";i.r(_);var a=i(42),t=Object(a.a)({},(function(){var v=this,_=v.$createElement,i=v._self._c||_;return i("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[i("h2",{attrs:{id:"概述"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[v._v("#")]),v._v(" 概述")]),v._v(" "),i("p",[v._v("Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。")]),v._v(" "),i("h2",{attrs:{id:"功能"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#功能"}},[v._v("#")]),v._v(" 功能")]),v._v(" "),i("p",[v._v("Fizz管理后台包含如下功能:")]),v._v(" "),i("ul",[i("li",[v._v("网关管理\n"),i("ul",[i("li",[v._v("网关分组:对Fizz网关集群内的机器进行逻辑上的分组,针对不同的分组可配置不同的路由策略。")]),v._v(" "),i("li",[v._v("插件管理:维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。")]),v._v(" "),i("li",[v._v("appID管理:配置应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。")]),v._v(" "),i("li",[v._v("路由管理:配置服务或API路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。")]),v._v(" "),i("li",[v._v("接口统计:Fizz网关接口访问统计功能,以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。")])])]),v._v(" "),i("li",[v._v("服务编排\n"),i("ul",[i("li",[v._v("服务管理:聚合接口归属于服务,服务通过该功能维护,创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")]),v._v(" "),i("li",[v._v("接口列表:基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口,同时提供在线测试功能,发布历史版本查看。")]),v._v(" "),i("li",[v._v("操作日志:查看聚合接口的新增、修改、发布、下线、回滚、删除操作日志。")]),v._v(" "),i("li",[v._v("网关缓存:查看Fizz网关当前在线的实例列表以及对应实例本地缓存的已发布接口信息。")])])]),v._v(" "),i("li",[v._v("发布申请\n"),i("ul",[i("li",[v._v("我的申请:提交接口发布|下线申请,审核通过后可以对相关接口执行发布|下线操作。")]),v._v(" "),i("li",[v._v("待审核:审核发布|下线申请。")]),v._v(" "),i("li",[v._v("审核日志:查看审核发布|下线申请操作日志。")])])]),v._v(" "),i("li",[v._v("权限管理\n"),i("ul",[i("li",[v._v("角色管理:维护角色数据,为角色分配权限。")])])]),v._v(" "),i("li",[v._v("系统管理\n"),i("ul",[i("li",[v._v("用户管理:维护用户数据,为用户分配角色。")])])])]),v._v(" "),i("h2",{attrs:{id:"界面"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#界面"}},[v._v("#")]),v._v(" 界面")]),v._v(" "),i("p",[i("img",{attrs:{src:"/manager_overview_1.png",alt:"manager_overview_1"}})]),v._v(" "),i("p",[i("img",{attrs:{src:"/manager_overview_2.png",alt:"manager_overview_2"}})])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/24.72fe0b8b.js b/docs/assets/js/24.72fe0b8b.js deleted file mode 100644 index 2ad6773..0000000 --- a/docs/assets/js/24.72fe0b8b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{370:function(t,s,a){"use strict";a.r(s);var n=a(42),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),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",[t._v("菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_list_query.png",alt:"manager_plugin_list_query"}})]),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",{attrs:{src:"/manager_plugin_add_1.png",alt:"manager_plugin_add_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_add_2.png",alt:"manager_plugin_add_2"}})]),t._v(" "),a("p",[t._v("插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("插件描述:插件的简要描述,长度不能超过50个字符,必填;")]),t._v(" "),a("p",[t._v("默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;")]),t._v(" "),a("p",[t._v("表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*\n* plugin_config_design\n* 动态插件参考结构\n* */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" pluginConfig "),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 必有字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"inputVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"input"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// input, select, radio, checkbox,")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean, array")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 可选字段 */")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"字段的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Aa123"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 初始默认值")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// for select, radio, checkbox")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number(long, double), string, boolean,")]),t._v("\n\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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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("2")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\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"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// min|max / range / length / regex pattern")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"输入框不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),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 comment"}},[t._v("// required 必填")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "min": 3, "ma x": 5, "message": "长度在 3 到 5 个字符", "trigger": "change" }, // range 长度范围(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "len": 8, "message": "长度需 8 个字符", "trigger": "change" }, // length 长度限制(for dataType:"string")')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "number", "message": "请输入数字类型"}, // for dataType:"number" 校验数值')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "integer", "message": "请输入整数数值", "trigger": "change" }, // for dataType:"long" 校验整数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "type": "float", "message": "请输入浮点数数值", "trigger": "change" }, // for dataType:"double" 校验浮点数')]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pattern"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^[A-Za-z\\\\d]+$"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"只能是字母或数字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// regex pattern正则")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),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("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"selectVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"select"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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 "),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 punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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("2")]),t._v("\n\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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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("3")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\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"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"placeholder"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选择器不能为空"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),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("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radioVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n\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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\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"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"单选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择单选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),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("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkboxVal"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"checkbox"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options"')]),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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("11")]),t._v("\n\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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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("22")]),t._v("\n\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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"选项3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token string"}},[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("33")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\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"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"多选框的说明文字"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rules"')]),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"message"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请选择多选框"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"change"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),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("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// TODO 注意!!")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "checkbox" 的dataType = "array"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 组件 "radio/select" 的实际值类型等于options内的value值类型')]),t._v("\n")])])]),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("p",[a("img",{attrs:{src:"/manager_plugin_edit_1.png",alt:"manager_plugin_edit_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_edit_2.png",alt:"manager_plugin_edit_2"}})]),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",{attrs:{src:"/manager_plugin_delete_1.png",alt:"manager_plugin_delete_1"}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/manager_plugin_delete_2.png",alt:"manager_plugin_delete_2"}})]),t._v(" "),a("p",[t._v("点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/25.bbf8bff1.js b/docs/assets/js/25.bbf8bff1.js deleted file mode 100644 index 7f3b92c..0000000 --- a/docs/assets/js/25.bbf8bff1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{371:function(a,r,t){"use strict";t.r(r);var _=t(42),e=Object(_.a)({},(function(){var a=this,r=a.$createElement,t=a._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h2",{attrs:{id:"概述"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),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("菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_list_query.png",alt:"manager_role_list_query"}})]),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",{attrs:{src:"/manager_role_add_1.png",alt:"manager_role_add_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_add_2.png",alt:"manager_role_add_2"}})]),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",{attrs:{src:"/manager_role_auth_1.png",alt:"manager_role_auth_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_auth_2.png",alt:"manager_role_auth_2"}})]),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("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_edit_1.png",alt:"manager_role_edit_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_edit_2.png",alt:"manager_role_edit_2"}})]),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",{attrs:{src:"/manager_role_delete_1.png",alt:"manager_role_delete_1"}})]),a._v(" "),t("p",[t("img",{attrs:{src:"/manager_role_delete_2.png",alt:"manager_role_delete_2"}})]),a._v(" "),t("p",[a._v("点击 确定 按钮后删除角色。")])])}),[],!1,null,null,null);r.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/26.92e9b6ec.js b/docs/assets/js/26.92e9b6ec.js deleted file mode 100644 index 5049d5e..0000000 --- a/docs/assets/js/26.92e9b6ec.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{369:function(a,e,_){"use strict";_.r(e);var r=_(42),t=Object(r.a)({},(function(){var a=this,e=a.$createElement,_=a._self._c||e;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。")]),a._v(" "),_("h2",{attrs:{id:"服务列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#服务列表"}},[a._v("#")]),a._v(" 服务列表")]),a._v(" "),_("p",[a._v("菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_list_query.png",alt:"manager_service_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"新增服务"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#新增服务"}},[a._v("#")]),a._v(" 新增服务")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_add_1.png",alt:"manager_service_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_add_2.png",alt:"manager_service_add_2"}})]),a._v(" "),_("p",[a._v("服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;")]),a._v(" "),_("p",[a._v("服务名:服务名称,用于展示或者选项使用,必填;")]),a._v(" "),_("p",[a._v("团队:团队名称,长度不能超过200个字符;")]),a._v(" "),_("p",[a._v("负责人:负责人名称,长度不能超过200个字符;")]),a._v(" "),_("p",[a._v("描述:服务描述,长度不能超过2000个字符。")]),a._v(" "),_("h2",{attrs:{id:"编辑服务"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑服务"}},[a._v("#")]),a._v(" 编辑服务")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_edit_1.png",alt:"manager_service_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_edit_2.png",alt:"manager_service_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除服务"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除服务"}},[a._v("#")]),a._v(" 删除服务")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_delete_1.png",alt:"manager_service_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_delete_2.png",alt:"manager_service_delete_2"}})]),a._v(" "),_("p",[a._v("点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。")]),a._v(" "),_("h2",{attrs:{id:"服务权限分配"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#服务权限分配"}},[a._v("#")]),a._v(" 服务权限分配")]),a._v(" "),_("p",[a._v("点击 权限 按钮弹出权限配置窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_auth_1.png",alt:"manager_service_auth_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_service_auth_2.png",alt:"manager_service_auth_2"}})]),a._v(" "),_("p",[a._v("服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。")])])}),[],!1,null,null,null);e.default=t.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/27.505a813e.js b/docs/assets/js/27.505a813e.js deleted file mode 100644 index 2af9848..0000000 --- a/docs/assets/js/27.505a813e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{373:function(t,a,s){"use strict";s.r(a);var _=s(42),r=Object(_.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),s("p",[t._v("Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。")]),t._v(" "),s("p",[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("菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/manager_source_statistics_1.png",alt:"manager_source_statistics_1.png"}})]),t._v(" "),s("p",[t._v("今天接口总数:从0时到当前时刻被调用不同接口的总数;")]),t._v(" "),s("p",[t._v("今天访问次数:从0时到当前时刻访问请求的总次数。")]),t._v(" "),s("p",[t._v("接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;")]),t._v(" "),s("p",[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("接口统计界面下部为请求统计列表,如图所示。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/manager_source_statistics_2.png",alt:"manager_source_statistics_2.png"}})]),t._v(" "),s("p",[t._v("来源IP:网关请求的实际入口IP地址;")]),t._v(" "),s("p",[t._v("请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;")]),t._v(" "),s("p",[t._v("最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/28.cdddd7aa.js b/docs/assets/js/28.cdddd7aa.js deleted file mode 100644 index 215e2d7..0000000 --- a/docs/assets/js/28.cdddd7aa.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{374:function(a,r,_){"use strict";_.r(r);var t=_(42),e=Object(t.a)({},(function(){var a=this,r=a.$createElement,_=a._self._c||r;return _("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[_("h2",{attrs:{id:"概述"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[a._v("#")]),a._v(" 概述")]),a._v(" "),_("p",[a._v("用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。")]),a._v(" "),_("h2",{attrs:{id:"用户列表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#用户列表"}},[a._v("#")]),a._v(" 用户列表")]),a._v(" "),_("p",[a._v("菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_list_query.png",alt:"manager_user_list_query"}})]),a._v(" "),_("h2",{attrs:{id:"添加用户"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#添加用户"}},[a._v("#")]),a._v(" 添加用户")]),a._v(" "),_("p",[a._v("点击 新增 按钮弹出新增窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_add_1.png",alt:"manager_user_add_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_add_2.png",alt:"manager_user_add_2"}})]),a._v(" "),_("p",[a._v("电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。")]),a._v(" "),_("h2",{attrs:{id:"重置密码"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#重置密码"}},[a._v("#")]),a._v(" 重置密码")]),a._v(" "),_("p",[a._v("勾选用户后点击 密码重置 按钮可为用户重置密码。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_reset_password_1.png",alt:"manager_user_reset_password_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_reset_password_2.png",alt:"manager_user_reset_password_2"}})]),a._v(" "),_("p",[a._v("重置后的默认密码为"),_("code",[a._v("AsdF1234!")]),a._v("。")]),a._v(" "),_("h2",{attrs:{id:"编辑用户"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#编辑用户"}},[a._v("#")]),a._v(" 编辑用户")]),a._v(" "),_("p",[a._v("点击 编辑 按钮弹出编辑窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_edit_1.png",alt:"manager_user_edit_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_edit_2.png",alt:"manager_user_edit_2"}})]),a._v(" "),_("h2",{attrs:{id:"删除用户"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#删除用户"}},[a._v("#")]),a._v(" 删除用户")]),a._v(" "),_("p",[a._v("点击 删除 按钮弹出删除确认窗口,如图所示。")]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_delete_1.png",alt:"manager_user_delete_1"}})]),a._v(" "),_("p",[_("img",{attrs:{src:"/manager_user_delete_2.png",alt:"manager_user_delete_2"}})])])}),[],!1,null,null,null);r.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/29.ab810898.js b/docs/assets/js/29.ab810898.js deleted file mode 100644 index 3d4bbe5..0000000 --- a/docs/assets/js/29.ab810898.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{377:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:"),a("br"),t._v("\n1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;"),a("br"),t._v("\n2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;"),a("br"),t._v("\n3、若有多个插件,当前插件可获取前面插件的执行结果。")]),t._v(" "),a("p",[t._v("插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。")]),t._v(" "),a("h2",{attrs:{id:"gateway开发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateway开发"}},[t._v("#")]),t._v(" gateway开发")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" 实现\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),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("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),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("\n 即定义了一个插件。\n \n 比如\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Component")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" log "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LoggerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" TEST_PLUGIN_FILTER "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testPlugin"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),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 class-name"}},[t._v("String")]),t._v(" rid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),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(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getId")]),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 class-name"}},[t._v("Boolean")]),t._v(" logReqId "),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 class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),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 comment"}},[t._v("// 是否记录请求id日志,可通过manager配置")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" logReqId"),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 log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),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(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getURI")]),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(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),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 operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" 的请求id: "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" rid"),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("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" appendFizzRsv "),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 class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),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("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" appendFizzRsv"),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 class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FIZZ-RSV"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rid"),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("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("transmitSuccessFilterResultAndEmptyMono")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),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 comment"}},[t._v("// 保存插件执行结果,并返回")]),t._v("\n "),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("\n 这个插件,插件必须是一个spring的"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Component")]),t._v("(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("RSV请求头,并且功能是可打开或关闭的。\n \n 另外可通过:\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getPrevFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),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 class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plugin.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("h2",{attrs:{id:"manager配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manager配置"}},[t._v("#")]),t._v(" manager配置")]),t._v(" "),a("p",[t._v("1、定义插件")]),t._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[t._v(" 在插件表中,定义上面的插件: \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INSERT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INTO")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("tb_plugin"),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 punctuation"}},[t._v("`")]),t._v("eng_name"),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("chn_name"),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("config"),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("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("order")]),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("VALUES")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testPlugin'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'测试插件'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'[{\\"field\\":\\"logReqId\\",\\"label\\":\\"打印请求id日志\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]},{\\"field\\":\\"appendFizzRsv\\",\\"label\\":\\"添加fizzRsv请求头\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]}]\'')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。\n \n config:\n "),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("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[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 "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[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("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),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("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),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("\n "),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("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"添加fizzRsv请求头"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[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("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),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("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),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("\n "),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("\n 前端据此生成插件的配置表单,具体参前端说明。\n")])])]),a("p",[t._v("2、应用插件")]),t._v(" "),a("p",[t._v("如对\n"),a("img",{attrs:{src:"/xapi.png",alt:""}})]),t._v(" "),a("p",[t._v("接口应用插件:\n"),a("img",{attrs:{src:"/test-plugin.png",alt:""}})]),t._v(" "),a("p",[t._v('上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应')]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),a("p",[t._v("中config的logReqId和appendFizzRsv key。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/3.c3fe6d17.js b/docs/assets/js/3.c3fe6d17.js deleted file mode 100644 index feed03c..0000000 --- a/docs/assets/js/3.c3fe6d17.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{317:function(t,e,n){},348:function(t,e,n){"use strict";var i=n(317);n.n(i).a},378:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,i=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||i().default)}},r=(n(348),n(42)),a=Object(r.a)(i,void 0,void 0,!1,null,"0d148f50",null);e.default=a.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/30.0222f21c.js b/docs/assets/js/30.0222f21c.js deleted file mode 100644 index ab69ee4..0000000 --- a/docs/assets/js/30.0222f21c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{375:function(t,e,s){"use strict";s.r(e);var a=s(42),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[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("支持服务注册与发现")]),t._v(" "),s("li",[t._v("支持负载均衡")]),t._v(" "),s("li",[t._v("支持黑白名单机制")]),t._v(" "),s("li",[t._v("支持配置插件")])]),t._v(" "),s("h2",{attrs:{id:"接入路由转发"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接入路由转发"}},[t._v("#")]),t._v(" 接入路由转发")]),t._v(" "),s("ul",[s("li",[t._v("前提条件:接入Eureka注册中心")]),t._v(" "),s("li",[t._v("开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)")]),t._v(" "),s("li",[t._v("配置访问权限 (管理后台-接口代理-API查询)")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/31.0012b621.js b/docs/assets/js/31.0012b621.js deleted file mode 100644 index e1b94aa..0000000 --- a/docs/assets/js/31.0012b621.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{376:function(v,t,_){"use strict";_.r(t);var a=_(42),s=Object(a.a)({},(function(){var v=this,t=v.$createElement,_=v._self._c||t;return _("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[_("h2",{attrs:{id:"v1-2-x"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v1-2-x"}},[v._v("#")]),v._v(" v1.2.x")]),v._v(" "),_("ul",[_("li",[v._v("支持Nacos注册中心和配置中心")]),v._v(" "),_("li",[v._v("输出服务编排脚本异常信息")]),v._v(" "),_("li",[v._v("支持在服务编排里配置重定向")]),v._v(" "),_("li",[v._v("增加内置的默认common.js")]),v._v(" "),_("li",[v._v("支持接口统计")])]),v._v(" "),_("h2",{attrs:{id:"v1-3-x"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v1-3-x"}},[v._v("#")]),v._v(" v1.3.x")]),v._v(" "),_("ul",[_("li",[v._v("支持接口回调")]),v._v(" "),_("li",[v._v("优先路由配置")]),v._v(" "),_("li",[v._v("支持后台查看日志")]),v._v(" "),_("li",[v._v("优化单机部署")])]),v._v(" "),_("h2",{attrs:{id:"v1-4-x"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v1-4-x"}},[v._v("#")]),v._v(" v1.4.x")]),v._v(" "),_("ul",[_("li",[v._v("支持流控管理(限流,降级,流速等)")]),v._v(" "),_("li",[v._v("支持内容模块插件化")]),v._v(" "),_("li",[v._v("支持动态添加插件")]),v._v(" "),_("li",[v._v("支持使用正则匹配路由")])]),v._v(" "),_("h2",{attrs:{id:"v1-5-x"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v1-5-x"}},[v._v("#")]),v._v(" v1.5.x")]),v._v(" "),_("ul",[_("li",[v._v("支持Docker容器部署")]),v._v(" "),_("li",[v._v("支持MySQL input")]),v._v(" "),_("li",[v._v("发布审核功能使用工作流")])]),v._v(" "),_("h2",{attrs:{id:"v1-6-x"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v1-6-x"}},[v._v("#")]),v._v(" v1.6.x")]),v._v(" "),_("ul",[_("li",[v._v("支持Dubbo")])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/4.9e51e17c.js b/docs/assets/js/4.9e51e17c.js deleted file mode 100644 index bddefe5..0000000 --- a/docs/assets/js/4.9e51e17c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{350:function(t,e,s){"use strict";s.r(e);var n=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],o={methods:{getMsg:function(){return n[Math.floor(Math.random()*n.length)]}}},i=s(42),h=Object(i.a)(o,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"theme-container"},[e("div",{staticClass:"theme-default-content"},[e("h1",[this._v("404")]),this._v(" "),e("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),e("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=h.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/5.ddeac0a1.js b/docs/assets/js/5.ddeac0a1.js deleted file mode 100644 index 71e393b..0000000 --- a/docs/assets/js/5.ddeac0a1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{351:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/6.e883523c.js b/docs/assets/js/6.e883523c.js deleted file mode 100644 index b633ff3..0000000 --- a/docs/assets/js/6.e883523c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{354:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/7.00dd2642.js b/docs/assets/js/7.00dd2642.js deleted file mode 100644 index 04bd9a0..0000000 --- a/docs/assets/js/7.00dd2642.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{353:function(t,n,s){"use strict";s.r(n);var e=s(42),o=Object(e.a)({},(function(){var t=this.$createElement,n=this._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("p",[this._v("coming soon")])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/8.b37e0826.js b/docs/assets/js/8.b37e0826.js deleted file mode 100644 index 3dfa6f8..0000000 --- a/docs/assets/js/8.b37e0826.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{352:function(t,a,r){"use strict";r.r(a);var s=r(42),_=Object(s.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"什么是服务编排"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是服务编排"}},[t._v("#")]),t._v(" 什么是服务编排")]),t._v(" "),r("p",[t._v("服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。")]),t._v(" "),r("p",[t._v("特点: 在线API设计、在线测试、快速开发")]),t._v(" "),r("h2",{attrs:{id:"举例说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#举例说明"}},[t._v("#")]),t._v(" 举例说明")]),t._v(" "),r("p",[t._v("订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。")]),t._v(" "),r("h2",{attrs:{id:"服务编排架构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#服务编排架构"}},[t._v("#")]),t._v(" 服务编排架构")]),t._v(" "),r("p",[r("img",{attrs:{src:"/fizz_aggregate.jpg",alt:""}})]),t._v(" "),r("h2",{attrs:{id:"适用场景"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),r("h3",{attrs:{id:"前端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前端"}},[t._v("#")]),t._v(" 前端")]),t._v(" "),r("p",[t._v("1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度")]),t._v(" "),r("p",[t._v("2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应")]),t._v(" "),r("h3",{attrs:{id:"后端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#后端"}},[t._v("#")]),t._v(" 后端")]),t._v(" "),r("p",[t._v("1、替换应用层的聚合接口,减少应用层的胶水代码")]),t._v(" "),r("p",[t._v("2、快速生成透传数据类型的接口")]),t._v(" "),r("p",[t._v("3、数据转换和映射")])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/9.88cc55c9.js b/docs/assets/js/9.88cc55c9.js deleted file mode 100644 index 6a43770..0000000 --- a/docs/assets/js/9.88cc55c9.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{356:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"创建服务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#创建服务"}},[t._v("#")]),t._v(" 创建服务")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_newservice.png",alt:""}})]),t._v(" "),a("h2",{attrs:{id:"创建聚合接口"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#创建聚合接口"}},[t._v("#")]),t._v(" 创建聚合接口")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_newapi0.png",alt:""}}),t._v(" "),a("img",{attrs:{src:"/aggr_newapi.png",alt:""}})]),t._v(" "),a("h2",{attrs:{id:"配置输入"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[t._v("#")]),t._v(" 配置输入")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_input.png",alt:""}})]),t._v(" "),a("ul",[a("li",[t._v("配置输入的定义包括3部分:请求头、请求体和Query参数")]),t._v(" "),a("li",[t._v("基于JSON Schema规范")]),t._v(" "),a("li",[t._v("自带校验规则")]),t._v(" "),a("li",[t._v("支持自定义脚本实现复杂的逻辑校验")])]),t._v(" "),a("p",[t._v("JSON Schema规范,详见:")]),t._v(" "),a("p",[a("a",{attrs:{href:"http://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/specification.html"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"http://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/understanding-json-schema/"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"配置校验结果"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置校验结果"}},[t._v("#")]),t._v(" 配置校验结果")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_input_validate_result.png",alt:""}})]),t._v(" "),a("ul",[a("li",[t._v("校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里")]),t._v(" "),a("li",[t._v("可以自定义返回给调用方的报文格式,如 msgCode, message")]),t._v(" "),a("li",[t._v("支持自定义响应头")]),t._v(" "),a("li",[t._v("支持自定义脚本处理校验结果")])]),t._v(" "),a("h2",{attrs:{id:"配置步骤"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[t._v("#")]),t._v(" 配置步骤")]),t._v(" "),a("h3",{attrs:{id:"配置步骤的基础信息"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的基础信息"}},[t._v("#")]),t._v(" 配置步骤的基础信息")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step1.png",alt:""}})]),t._v(" "),a("h3",{attrs:{id:"配置步骤的接口入出参"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的接口入出参"}},[t._v("#")]),t._v(" 配置步骤的接口入出参")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step2.png",alt:""}})]),t._v(" "),a("h3",{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("li",[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("支持配置固定值,引用值和脚本")]),t._v(" "),a("h4",{attrs:{id:"固定值"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#固定值"}},[t._v("#")]),t._v(" 固定值")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step_mapping_1.png",alt:""}})]),t._v(" "),a("h4",{attrs:{id:"引用值"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#引用值"}},[t._v("#")]),t._v(" 引用值")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step_mapping_2.png",alt:""}})]),t._v(" "),a("h4",{attrs:{id:"脚本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step_mapping_3.png",alt:""}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step_mapping_4.png",alt:""}})]),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("p",[a("img",{attrs:{src:"/aggr_config_step_mapping_5.png",alt:""}})]),t._v(" "),a("p",[t._v('样例:userInfo = {"userName": "Fizz", "userID": 1234}')]),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("p",[t._v("当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高")]),t._v(" "),a("h4",{attrs:{id:"引用值规范"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#引用值规范"}},[t._v("#")]),t._v(" 引用值规范")]),t._v(" "),a("div",{staticClass:"language-properties extra-class"},[a("pre",{pre:!0,attrs:{class:"language-properties"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求头aaa的值")]),t._v("\ninput.request.headers.aaa\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求体bbb字段的值")]),t._v("\ninput.request.body.bbb\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参URL Query参数fff字段的值")]),t._v("\ninput.request.params.fff\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的请求头ccc的值")]),t._v("\nstep1.request1.request.headers.ccc\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的响应体ddd的值")]),t._v("\nstep1.request1.response.body.ddd\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1结果里eee的值")]),t._v("\nstep1.result.eee\n\n")])])]),a("ul",[a("li",[t._v("支持单值引用,如:string,int等")]),t._v(" "),a("li",[t._v("支持对象类型的引用")])]),t._v(" "),a("p",[t._v("input: 表示调用方的输入数据,如H5页面提交上来的参数")]),t._v(" "),a("p",[t._v("stepN.requestN: 表示步骤N里调用接口N的相关参数")]),t._v(" "),a("p",[t._v("stepN.result: 表示步骤N的转换结果")]),t._v(" "),a("h4",{attrs:{id:"fallback与预处理条件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fallback与预处理条件"}},[t._v("#")]),t._v(" Fallback与预处理条件")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step_fallback.png",alt:""}})]),t._v(" "),a("p",[t._v("Fallback:")]),t._v(" "),a("p",[t._v("当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:")]),t._v(" "),a("ul",[a("li",[t._v("Stop: 终止请求并立即返回")]),t._v(" "),a("li",[t._v("Continue: 继续后续的操作,且要设置默认的fallback json")])]),t._v(" "),a("p",[t._v("预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口")]),t._v(" "),a("h4",{attrs:{id:"配置步骤结果处理"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤结果处理"}},[t._v("#")]),t._v(" 配置步骤结果处理")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_step_result.png",alt:""}})]),t._v(" "),a("ul",[a("li",[a("p",[t._v("支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用")])]),t._v(" "),a("li",[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("img",{attrs:{src:"/aggr_config_output.png",alt:""}})]),t._v(" "),a("p",[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("h2",{attrs:{id:"脚本-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#脚本-2"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),a("p",[t._v("目前支持以下脚本语言:")]),t._v(" "),a("p",[t._v("Javascript (推荐) - ECMAScript 5标准")]),t._v(" "),a("p",[t._v("JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_script_1.png",alt:""}})]),t._v(" "),a("p",[t._v("Groovy")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_script_2.png",alt:""}})]),t._v(" "),a("h3",{attrs:{id:"common-js-提供了操作context上下文的便捷操作函数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#common-js-提供了操作context上下文的便捷操作函数"}},[t._v("#")]),t._v(" common.js 提供了操作context上下文的便捷操作函数")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * context 上下文便捷操作函数\n *\n */")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" common "),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 "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function begin *********** */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文中客户端请求对象")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReq")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx")]),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 keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),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 string"}},[t._v("'request'")]),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 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),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 punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),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 string"}},[t._v("'request'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的请求对象")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReq")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),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 keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),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 keyword"}},[t._v("return")]),t._v(" "),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 punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),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 string"}},[t._v("'request'")]),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 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),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 punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),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 string"}},[t._v("'request'")]),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的响应对象")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResp")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),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 keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),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 keyword"}},[t._v("return")]),t._v(" "),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 punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),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 string"}},[t._v("'response'")]),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 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),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 punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'requests'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),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 string"}},[t._v("'response'")]),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function end *********** */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqHeader")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),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("var")]),t._v(" headers "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端URL请求参数(query string)\n * @param {*} ctx 上下文 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqParam")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),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("var")]),t._v(" params "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqBody")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),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("var")]),t._v(" body "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespHeader")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),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("var")]),t._v(" headers "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应体\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespBody")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),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("var")]),t._v(" body "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request begin ************ */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqHeader")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),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("var")]),t._v(" headers "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的URL参数\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqParam")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),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("var")]),t._v(" params "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqBody")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),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 keyword"}},[t._v("var")]),t._v(" req "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),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("var")]),t._v(" body "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespHeader")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),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 keyword"}},[t._v("var")]),t._v(" resp "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),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("var")]),t._v(" headers "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应头\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespBody")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),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 keyword"}},[t._v("var")]),t._v(" resp "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),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("var")]),t._v(" body "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤结果\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象\n */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResult")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),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 keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),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 punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ctx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),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 string"}},[t._v("'result'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" result"),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("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request end ************ */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),a("h3",{attrs:{id:"context-js-数据结构"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#context-js-数据结构"}},[t._v("#")]),t._v(" context.js 数据结构")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),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"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 各个操作的耗时")]),t._v("\n\telapsedTimes"),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 punctuation"}},[t._v("[")]),t._v("actionName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 操作名称:耗时")]),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\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 客户输入和接口的返回结果")]),t._v("\n input"),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 request"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n params"),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 聚合接口的响应")]),t._v("\n headers"),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤")]),t._v("\n step1"),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 requests"),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 "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口1")]),t._v("\n request1"),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 "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求相关参数")]),t._v("\n request"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),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 "),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 comment"}},[t._v("// 根据转换规则转换后的接口响应")]),t._v("\n response"),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 headers"),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),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 comment"}},[t._v("// 接口2")]),t._v("\n request2"),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 request"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),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 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),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 headers"),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("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),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 "),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("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤结果")]),t._v("\n result"),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\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),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",{attrs:{src:"/aggr_config_exception.png",alt:""}})]),t._v(" "),a("p",[t._v("返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。")]),t._v(" "),a("h2",{attrs:{id:"重定向"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#重定向"}},[t._v("#")]),t._v(" 重定向")]),t._v(" "),a("p",[t._v("通过脚本可以实现重定向,脚本返回一个对象且这个对象同时包含_stopAndResponse=true和_redirectUrl属性,_redirectUrl的值为重定向的目标URL,Fizz会终止后续的操作并进行重定向。JavaScript脚本样例如下:")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_redirect.png",alt:""}})]),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",{attrs:{src:"/aggr_config_route.png",alt:""}})]),t._v(" "),a("h2",{attrs:{id:"在线测试"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在线测试"}},[t._v("#")]),t._v(" 在线测试")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_test.png",alt:""}})]),t._v(" "),a("ul",[a("li",[t._v("支持在线实时测试")]),t._v(" "),a("li",[t._v("支持测试接口和正式接口隔离")]),t._v(" "),a("li",[t._v("支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出")]),t._v(" "),a("li",[t._v("支持保存历史测试记录")])]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_test2.png",alt:""}})]),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("当脚本执行异常时context里会记录异常信息")]),t._v(" "),a("ul",[a("li",[t._v("exceptionMessage 异常信息")]),t._v(" "),a("li",[t._v("exceptionStacks 异常堆栈信息")]),t._v(" "),a("li",[t._v("exceptionData 引起异常的脚本数据")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文数据结构设计")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),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"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// exception info")]),t._v("\n\texceptionMessage"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\texceptionStacks"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n exceptionData"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// such as script source code that cause exception")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ... other fields")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),a("p",[t._v("在请求里加上returnContext=true可以返回context上下文,异常信息样例:")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_exception2.png",alt:""}})]),t._v(" "),a("h2",{attrs:{id:"导入导出"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#导入导出"}},[t._v("#")]),t._v(" 导入导出")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_config_import_export.png",alt:""}})]),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("img",{attrs:{src:"/aggr_release_1.png",alt:""}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_release_2.png",alt:""}})]),t._v(" "),a("p",[t._v("目前发布|下线申请有以上两个入口。")]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_release_rollback1.png",alt:""}})]),t._v(" "),a("p",[a("img",{attrs:{src:"/aggr_release_rollback.png",alt:""}})]),t._v(" "),a("ul",[a("li",[t._v("批量发布:对发布单里的接口进行批量发布")]),t._v(" "),a("li",[t._v("批量回滚:对发布单里的接口进行批量回滚")]),t._v(" "),a("li",[t._v("发布:实时发布到网关")]),t._v(" "),a("li",[t._v("回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚")]),t._v(" "),a("li",[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("申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.efb450d4.js b/docs/assets/js/app.efb450d4.js deleted file mode 100644 index 868880c..0000000 --- a/docs/assets/js/app.efb450d4.js +++ /dev/null @@ -1,13 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,u=e[0],c=e[1],s=e[2],f=0,p=[];f0?o(r(t),9007199254740991):0}},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(31),o=n(23);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(140),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e,n){var r=n(6),o=n(1),i=n(7),a=Object.defineProperty,u={},c=function(t){throw t};t.exports=function(t,e){if(i(u,t))return u[t];e||(e={});var n=[][t],s=!!i(e,"ACCESSORS")&&e.ACCESSORS,l=i(e,0)?e[0]:c,f=i(e,1)?e[1]:void 0;return u[t]=!!n&&!o((function(){if(s&&!r)return!0;var t={length:-1};s?a(t,1,{enumerable:!0,get:c}):t[1]=1,n.call(t,l,f)}))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(110),o=n(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e){t.exports=!1},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e,n){var r=n(220),o=n(223);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),o=n(29).filter,i=n(51),a=n(17),u=i("filter"),c=a("filter");r({target:"Array",proto:!0,forced:!u||!c},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(6),o=n(75),i=n(32),a=n(15),u=n(44),c=n(7),s=n(105),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=a(t),e=u(e,!0),s)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){"use strict";var r=n(128).charAt,o=n(28),i=n(111),a=o.set,u=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r,o,i,a=n(180),u=n(3),c=n(4),s=n(11),l=n(7),f=n(48),p=n(34),d=u.WeakMap;if(a){var h=new d,v=h.get,g=h.has,m=h.set;r=function(t,e){return m.call(h,t,e),e},o=function(t){return v.call(h,t)||{}},i=function(t){return g.call(h,t)}}else{var y=f("state");p[y]=!0,r=function(t,e){return s(t,y,e),e},o=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(50),o=n(31),i=n(12),a=n(13),u=n(127),c=[].push,s=function(t){var e=1==t,n=2==t,s=3==t,l=4==t,f=6==t,p=5==t||f;return function(d,h,v,g){for(var m,y,b=i(d),_=o(b),x=r(h,v,3),w=a(_.length),O=0,S=g||u,j=e?S(d,w):n?S(d,0):void 0;w>O;O++)if((p||O in _)&&(y=x(m=_[O],O,b),t))if(e)j[O]=y;else if(y)switch(t){case 3:return!0;case 5:return m;case 6:return O;case 2:c.call(j,m)}else if(l)return!1;return f?-1:s||l?l:j}};t.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(t,e,n){var r=n(39),o=n(205),i=n(206),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},function(t,e,n){var r=n(1),o=n(18),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r,o=n(5),i=n(179),a=n(73),u=n(34),c=n(109),s=n(70),l=n(48),f=l("IE_PROTO"),p=function(){},d=function(t){return" - - diff --git a/docs/guide/aggregate/configuration.html b/docs/guide/aggregate/configuration.html deleted file mode 100644 index 3c8a65a..0000000 --- a/docs/guide/aggregate/configuration.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - 服务编排配置 | Fizz Gateway - - - - - - - -

# 创建服务

# 创建聚合接口

# 配置输入

  • 配置输入的定义包括3部分:请求头、请求体和Query参数
  • 基于JSON Schema规范
  • 自带校验规则
  • 支持自定义脚本实现复杂的逻辑校验

JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

# 配置校验结果

  • 校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 msgCode, message
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

# 配置步骤

# 配置步骤的基础信息

# 配置步骤的接口入出参

# 步骤说明

  • 一个聚合接口可包含多个步骤
  • 一个步骤可包含多个请求(即调用多个接口)
  • 步骤间是串联顺序执行
  • 一个步骤内的多个请求并行执行

# 数据转换

支持配置固定值,引用值和脚本

# 固定值

# 引用值

# 脚本

# 星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

# 优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

# 引用值规范

# 获取入参请求头aaa的值
-input.request.headers.aaa
-
-# 获取入参请求体bbb字段的值
-input.request.body.bbb
-
-# 获取入参URL Query参数fff字段的值
-input.request.params.fff
-
-# 获取步骤1里request1的请求头ccc的值
-step1.request1.request.headers.ccc
-
-# 获取步骤1里request1的响应体ddd的值
-step1.request1.response.body.ddd
-
-# 获取步骤1结果里eee的值
-step1.result.eee
-
-
  • 支持单值引用,如:string,int等
  • 支持对象类型的引用

input: 表示调用方的输入数据,如H5页面提交上来的参数

stepN.requestN: 表示步骤N里调用接口N的相关参数

stepN.result: 表示步骤N的转换结果

# Fallback与预处理条件

Fallback:

当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:

  • Stop: 终止请求并立即返回
  • Continue: 继续后续的操作,且要设置默认的fallback json

预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口

# 配置步骤结果处理

  • 支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用

  • 支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理

# 配置输出

配置返回给调用方的结果

  • 支持配置响应头
  • 支持配置响应体
  • 支持自定脚本处理复杂的业务逻辑

# 脚本

目前支持以下脚本语言:

Javascript (推荐) - ECMAScript 5标准

JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明

Groovy

# common.js 提供了操作context上下文的便捷操作函数

/**
- * context 上下文便捷操作函数
- *
- */
-var common = {
-  /* *********** private function begin *********** */
-
-  // 获取上下文中客户端请求对象
-  getInputReq: function (ctx) {
-    if (!ctx || !ctx['input'] || !ctx['input']['request']) {
-      return {};
-    }
-    return ctx['input']['request']
-  },
-
-  // 获取上下文步骤中请求接口的请求对象
-  getStepReq: function (ctx, stepName, requestName) {
-    if (!ctx || !stepName || !requestName) {
-      return {};
-    }
-    if (!ctx[stepName] || !ctx[stepName]['requests'] || !ctx[stepName]['requests'][requestName] ||
-      !ctx[stepName]['requests'][requestName]['request']) {
-      return {};
-    }
-    return ctx[stepName]['requests'][requestName]['request'];
-  },
-
-  // 获取上下文步骤中请求接口的响应对象
-  getStepResp: function (ctx, stepName, requestName) {
-    if (!ctx || !stepName || !requestName) {
-      return {};
-    }
-    if (!ctx[stepName] || !ctx[stepName]['requests'] || !ctx[stepName]['requests'][requestName] ||
-      !ctx[stepName]['requests'][requestName]['response']) {
-      return {};
-    }
-    return ctx[stepName]['requests'][requestName]['response'];
-  },
-
-  /* *********** private function end *********** */
-
-  /* *********** input begin ************ */
-
-  /**
-   * 获取客户端请求头
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
-   */
-  getInputReqHeader: function (ctx, headerName) {
-    var req = this.getInputReq(ctx);
-    var headers = req['headers'] || {};
-    return headerName ? headers[headerName] : headers;
-  },
-
-  /**
-   * 获取客户端URL请求参数(query string)
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数
-   */
-  getInputReqParam: function (ctx, paramName) {
-    var req = this.getInputReq(ctx);
-    var params = req['params'] || {};
-    return paramName ? params[paramName] : params;
-  },
-
-  /**
-   * 获取客户端请求体
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} field 字段名 【选填】,不传时返回整个请求体
-   */
-  getInputReqBody: function (ctx, field) {
-    var req = this.getInputReq(ctx);
-    var body = req['body'] || {};
-    return field ? body[field] : body;
-  },
-
-  /**
-   * 获取返回给客户端的响应头
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
-   */
-  getInputRespHeader: function (ctx, headerName) {
-    var req = this.getInputReq(ctx);
-    var headers = req['headers'] || {};
-    return headerName ? headers[headerName] : headers;
-  },
-
-  /**
-   * 获取返回给客户端的响应体
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} field 字段名 【选填】,不传时返回整个响应体
-   */
-  getInputRespBody: function (ctx, field) {
-    var req = this.getInputReq(ctx);
-    var body = req['body'] || {};
-    return field ? body[field] : body;
-  },
-
-  /* *********** input begin ************ */
-
-  /* *********** step request begin ************ */
-
-  /**
-   * 获取步骤中调用的接口的请求头
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} stepName 步骤名【必填】
-   * @param {*} requestName 请求的接口名 【必填】
-   * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
-   */
-  getStepReqHeader: function (ctx, stepName, requestName, headerName) {
-    var req = this.getStepReq(ctx, stepName, requestName);
-    var headers = req['headers'] || {};
-    return headerName ? headers[headerName] : headers;
-  },
-
-  /**
-   * 获取步骤中调用的接口的URL参数
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} stepName 步骤名【必填】
-   * @param {*} requestName 请求的接口名 【必填】
-   * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数
-   */
-  getStepReqParam: function (ctx, stepName, requestName, paramName) {
-    var req = this.getStepReq(ctx, stepName, requestName);
-    var params = req['params'] || {};
-    return paramName ? params[paramName] : params;
-  },
-
-  /**
-   * 获取步骤中调用的接口的请求体
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} stepName 步骤名【必填】
-   * @param {*} requestName 请求的接口名 【必填】
-   * @param {*} field 字段名 【选填】,不传时返回整个请求体
-   */
-  getStepReqBody: function (ctx, stepName, requestName, field) {
-    var req = this.getStepReq(ctx, stepName, requestName);
-    var body = req['body'] || {};
-    return field ? body[field] : body;
-  },
-
-  /**
-   * 获取步骤中调用的接口的响应头
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} stepName 步骤名【必填】
-   * @param {*} requestName 请求的接口名 【必填】
-   * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
-   */
-  getStepRespHeader: function (ctx, stepName, requestName, headerName) {
-    var resp = this.getStepResp(ctx, stepName, requestName);
-    var headers = resp['headers'] || {};
-    return headerName ? headers[headerName] : headers;
-  },
-
-  /**
-   * 获取步骤中调用的接口的响应头
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} stepName 步骤名【必填】
-   * @param {*} requestName 请求的接口名 【必填】
-   * @param {*} field 字段名 【选填】,不传时返回整个响应头
-   */
-  getStepRespBody: function (ctx, stepName, requestName, field) {
-    var resp = this.getStepResp(ctx, stepName, requestName);
-    var body = resp['body'] || {};
-    return field ? body[field] : body;
-  },
-
-  /**
-   * 获取步骤结果
-   * @param {*} ctx 上下文 【必填】
-   * @param {*} stepName 步骤名【必填】
-   * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象
-   */
-  getStepResult: function (ctx, stepName, field) {
-    if (!ctx || !stepName || !ctx[stepName]) {
-      return {};
-    }
-    var result = ctx[stepName]['result'] || {};
-    return field ? result[field] : result;
-  }
-
-  /* *********** step request end ************ */
-
-};
-
-

# context.js 数据结构


-// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果
-var context = {
-	// 是否DEBUG模式
-	debug:false,
-
-	// 各个操作的耗时
-	elapsedTimes: [{
-		[actionName]: 123, // 操作名称:耗时
-	}],
-
-  // 客户输入和接口的返回结果
-  input: {
-      request:{
-        path: "",
-          method: "GET/POST",
-          headers: {},
-          body: {},
-          params: {}
-      },
-      response: { // 聚合接口的响应
-          headers: {},
-          body: {}
-      }
-  },
-
-  // 步骤
-  step1: {
-      requests: {
-        // 接口1
-          request1: {
-            // 请求相关参数
-              request:{
-                  url: "",
-                  method: "GET/POST",
-                  headers: {},
-                  body: {}
-              },
-              // 根据转换规则转换后的接口响应
-              response: {
-                  headers: {},
-                  body: {}
-              }
-          },
-          // 接口2
-          request2: {
-              request:{
-                  url: "",
-                  method: "GET/POST",
-                  headers: {},
-                  body: {}
-              },
-              response: {
-              headers: {},
-                  body: {}
-              }
-          }
-          //...
-      },
-
-      // 步骤结果
-      result: {}
-
-  }
-};
-
-

# 抛出异常

当要在脚本里中止请求时可以通过以下方式来实现

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

# 重定向

通过脚本可以实现重定向,脚本返回一个对象且这个对象同时包含_stopAndResponse=true和_redirectUrl属性,_redirectUrl的值为重定向的目标URL,Fizz会终止后续的操作并进行重定向。JavaScript脚本样例如下:

# 配置路由

至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由

# 在线测试

  • 支持在线实时测试
  • 支持测试接口和正式接口隔离
  • 支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出
  • 支持保存历史测试记录

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

# 脚本执行异常

当脚本执行异常时context里会记录异常信息

  • exceptionMessage 异常信息
  • exceptionStacks 异常堆栈信息
  • exceptionData 引起异常的脚本数据
// 上下文数据结构设计
-// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果
-var context = {
-	// 是否DEBUG模式
-	debug:false,
-	
-	// exception info
-	exceptionMessage: "",
-	exceptionStacks: "",
-  exceptionData: "", // such as script source code that cause exception
-
-  // ... other fields
-} 
-

在请求里加上returnContext=true可以返回context上下文,异常信息样例:

# 导入导出

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

# 发布|下线和审核

目前发布|下线申请有以上两个入口。

  • 批量发布:对发布单里的接口进行批量发布
  • 批量回滚:对发布单里的接口进行批量回滚
  • 发布:实时发布到网关
  • 回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚
  • 下线:从网关删除接口,在后台可以通过发布功能再次上线

# 发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

上次更新: 2020-11-24 18:2
- - - diff --git a/docs/guide/aggregate/index.html b/docs/guide/aggregate/index.html deleted file mode 100644 index e3d18ce..0000000 --- a/docs/guide/aggregate/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 服务编排介绍 | Fizz Gateway - - - - - - - -

# 什么是服务编排

服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。

特点: 在线API设计、在线测试、快速开发

# 举例说明

订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。

# 服务编排架构

# 适用场景

# 前端

1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度

2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应

# 后端

1、替换应用层的聚合接口,减少应用层的胶水代码

2、快速生成透传数据类型的接口

3、数据转换和映射

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/aggregate/overview.html b/docs/guide/aggregate/overview.html deleted file mode 100644 index 13acc32..0000000 --- a/docs/guide/aggregate/overview.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 步骤总览 | Fizz Gateway - - - - - - - - - - - diff --git a/docs/guide/benchmark/index.html b/docs/guide/benchmark/index.html deleted file mode 100644 index c5d9822..0000000 --- a/docs/guide/benchmark/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - benchmark | Fizz Gateway - - - - - - - -

# 基准测试结果

我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。

产品 QPS 90% Latency(ms)
直接访问后端服务 9087.46 10.76
fizz-gateway 5927.13 19.86
spring-cloud-gateway 5044.04 22.91

# 基准测试详情

# 硬件环境

后端服务所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

节点所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

压测程序所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

# 压测工具

压测软件:wrk

并发连接: 100

# 压测结果截图

  • 直接访问后端服务: -

  • fizz-gateway: -

  • spring-cloud-gateway: -

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/index.html b/docs/guide/index.html deleted file mode 100644 index 41279c5..0000000 --- a/docs/guide/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Fizz网关 | Fizz Gateway - - - - - - - - - - - diff --git a/docs/guide/installation/index.html b/docs/guide/installation/index.html deleted file mode 100644 index 3020fdc..0000000 --- a/docs/guide/installation/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - 安装 | Fizz Gateway - - - - - - - -

# 安装依赖

安装以下依赖软件:

  • Redis 2.8或以上版本
  • MySQL 5.7或以上版本
  • Apollo配置中心 (可选)
  • Eureka服务注册中心

# 安装MySQL

  • 操作系统 CentOS 6.5
  • MySQL 5.7.30
  1. 下载MySQL
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
-
  1. 解压
tar -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
-
  1. 安装
sudo yum install mysql-community-{server,client,common,libs}-*
-
  1. 启动
sudo service mysqld start
-

启动成功会显示以下信息:

[root@localhost ~]# sudo service mysqld start
-Initializing MySQL database:                               [  OK  ]
-Starting mysqld:                                           [  OK  ]
-
  1. 初始密码
sudo grep 'temporary password' /var/log/mysqld.log
-
  1. 使用初始密码登录
mysql -uroot -p
-
  1. 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
-
  1. 退出登录
quit
-

# 安装Redis 6.0.8

  1. 下载解压并编译
$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz
-$ tar xzf redis-6.0.8.tar.gz
-$ cd redis-6.0.8
-$ make
-
  1. 启动redis

运行编译后的文件:

$ src/redis-server
-
  1. 客户端连接
$ src/redis-cli
-redis> set foo bar
-OK
-redis> get foo
-"bar"
-

# 安装Apollo配置中心

说明: apollo是可选组件,如果不使用apollo可使用本地配置文件(application.yml), 如果不使用apollo可跳过此步骤。

安装步骤详见apollo官方文档:

# 安装Eureka服务注册中心

环境要求:

  • JDK 1.8 或以上版本
  • Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)
  1. 安装JDK 1.8

1)下载JDK,如: jdk-8u192-linux-x64.tar.gz

tar -zxvf jdk-8u192-linux-x64.tar.gz
-mv jdk1.8.0_192 /usr/local/
-
-

2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面

JAVA_HOME=/usr/local/jdk/jdk1.8.0_192
-JRE_HOME=$JAVA_HOME/jre
-PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
-CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar
-export JAVA_HOME JRE_HOME PATH CLASSPATH
-
-

3)执行以下命令全环境变量生效:

source /etc/profile
-
-

4)查看是否安装成功

java -version
-
  1. 安装eureka

1)使用IDE创建一个spring boot项目,如:sc-eureka-server

pom.xml:

<dependency>
-    <groupId>org.springframework.cloud</groupId>
-    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
-</dependency>
-

在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:

@SpringBootApplication
-@EnableEurekaServer
-public class ScEurekaServerApplication {
-
-	public static void main(String[] args) {
-		SpringApplication.run(ScEurekaServerApplication.class, args);
-	}
-
-}
-

application.properties配置文件:

spring.application.name=sc-eureka-server
-
-server.port=8761
-eureka.instance.hostname=localhost
-eureka.client.registerWithEureka=false
-eureka.client.fetchRegistry=false
-eureka.server.enableSelfPreservation=false
-

2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面

3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)

nohub java -jar sc-eureka-server-1.0.0.jar & 
-

4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)

eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
-

# 安装Fizz

# 管理后台

从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包

  • 管理后台服务端(fizz-manager-professional)
  1. 首次安装执行fizz-manager-professional-1.1.0-mysql.sql数据库脚本,低版本升级执行update目录下的升级脚本
  2. application-prod.ymlboot.shfizz-manager-professional-1.1.0.jar拷贝到/data/webapps/fizz-manager-professional目录下
  3. 修改application-prod.yml文件,将相关配置修改成部署环境的配置
  4. 修改boot.sh文件,将RUN_CMD变量值修改成部署环境的JAVA实际路径
  5. 执行 chmod +x boot.sh 命令给boot.sh增加执行权限
  6. 执行 ./boot.sh start 命令启动服务,支持 start/stop/restart(升级发布时需要手动kill原进程)/status命令
  7. 服务启动后访问前端登录地址,使用超级管理员账户admin密码Aa123!登录
  • 管理后台前端(fizz-admin-professional)

zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/

nginx配置

server {
-  listen 9000;
-  server_name localhost:9000;
-  location / {
-    root /home/data/fizzAdmin;
-  }
-  location ^~ /api {
-    rewrite ^/api/(.*) /$1 break;
-    proxy_pass http://127.0.0.1:8000;
-  }
-}
-
-# 注:root中地址需与资源包存放目录路径一致
-# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址
-

访问地址

【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/

(端口号与nginx配置端口号一致)

# fizz-gateway-community社区版

说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。

脚本启动:

  1. 下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录
  2. 修改boot.sh脚本的apollo连接,JVM内存配置,
  3. 执行 ./boot.sh start 命令启动服务,支持 start/stop/restart/status命令

IDE启动:

  1. 本地clone仓库上的最新代码
  2. 将项目fizz-gateway导入IDE
  3. 导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入-Denv=dev -Dapollo.meta=http://localhost:66(Apollo配置中心地址)

jar启动:

  1. 本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置
  2. 在项目根目录fizz-gateway-community下执行Maven命令mvn clean package -DskipTests=true打包
  3. 进入target目录,使用命令java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar启动服务

网关访问地址格式:

http://127.0.0.1:8600/proxy/[服务名]/[API Path]

上次更新: 2020-10-27 14:46
- - - diff --git a/docs/guide/intro/index.html b/docs/guide/intro/index.html deleted file mode 100644 index ad03674..0000000 --- a/docs/guide/intro/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - 什么是Fizz网关 | Fizz Gateway - - - - - - - -

# 什么是Fizz网关

A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。

# Fizz的设计

# 产品特性

  • 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。
  • 服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。
  • 负载均衡:支持round-robin负载均衡。
  • 服务发现:支持从Eureka注册中心发现后端服务器。
  • 配置中心:支持接入apollo配置中心。
  • HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。
  • 访问策略:支持不同策略访问不同的API、配置不同的鉴权等。
  • IP黑白名单:支持配置IP黑白名单。
  • 自定义插件:强大的插件机制支持自由扩展。
  • 可扩展:简单易用的插件机制方便扩展功能。
  • 高性能:性能在众多网关之中表现优异。
  • 版本控制:支持操作的发布和多次回滚。
  • 管理后台:通过管理后台界面对网关集群进行各项配置。
上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_aggregate.html b/docs/guide/manager/manager_aggregate.html deleted file mode 100644 index 18f8129..0000000 --- a/docs/guide/manager/manager_aggregate.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - 接口列表 | Fizz Gateway - - - - - - - -

# 概述

接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式,更多详情请查看服务编排介绍,下面介绍接口列表功能的操作。

# 接口列表

菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。

manager_aggregate_list_query

# 新增接口

点击 新增 按钮弹出新增窗口,如图所示。

manager_aggregate_add_1

# 基础信息

manager_aggregate_add_2

所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;

接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;

方法:接口请求方法类型,可选GET|POST,必选;

路径:接口请求路径后缀,长度不能超过2000个字符,必填;

开发人员:接口对应负责的开发人员,长度不能超过200个字符;

描述:接口功能描述,长度不能超过2000个字符;

举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。

# 配置输入

聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。

# JSON Schema介绍

JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。

作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。

要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。

JSON包含以下数据结构:

  • object:
    { "key1": "value1", "key2": "value2" }
    -
  • array:
    [ "first", "second", "third" ]
    -
  • number:
    42
    -3.1415926
    -
  • string:
    "This is a string"
    -
  • boolean:
    true
    -false
    -
  • null:
    null
    -

通过以上的简单数据类型,就能构造复杂的结构化数据了。下面举两个例子:

{
-  "name": "George Washington",
-  "birthday": "February 22, 1732",
-  "address": "Mount Vernon, Virginia, United States"
-}
-
{
-  "first_name": "George",
-  "last_name": "Washington",
-  "birthday": "1732-02-22",
-  "address": {
-    "street_address": "3200 Mount Vernon Memorial Highway",
-    "city": "Mount Vernon",
-    "state": "Virginia",
-    "country": "United States"
-  }
-}
-

以上两个例子都是有效的JSON数据,包含一样的有效信息,但是当程序读取数据时,需要准确的知道数据是怎么组织的,比如哪些字段是必须,这些字段是什么类型。这时候JSON Schema就派上用场了,看以下JSON Schema例子:

{
-  "type": "object",
-  "properties": {
-    "first_name": { "type": "string" },
-    "last_name": { "type": "string" },
-    "birthday": { "type": "string", "format": "date" },
-    "address": {
-      "type": "object",
-      "properties": {
-        "street_address": { "type": "string" },
-        "city": { "type": "string" },
-        "state": { "type": "string" },
-        "country": { "type" : "string" }
-      }
-    }
-  }
-}
-

用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。

JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。

更多JSON Schema知识可以阅读Understanding JSON Schema

# 请求头部

定义聚合接口的请求Header参数。

manager_aggregate_add_3

举个例子:

{
-  "type": "object",
-  "properties": {
-    "headerParam1": {
-      "type": "string",
-      "title": "请求头参数1",
-      "titleEn": "headerParam1"
-    }
-  },
-  "required": [
-    "headerParam1"
-  ]
-}
-

以上例子定义了必传请求头参数headerParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_2

# 请求体

定义聚合接口的请求体参数。

manager_aggregate_add_4

举个例子:

{
-  "type": "object",
-  "properties": {
-    "bodyParam1": {
-      "type": "string",
-      "title": "请求体参数1",
-      "titleEn": "bodyParam1"
-    }
-  },
-  "required": [
-    "bodyParam1"
-  ]
-}
-

以上例子定义了必传请求体参数bodyParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_2

# Query参数

定义聚合接口的Query参数。

manager_aggregate_add_5

举个例子:

{
-  "type": "object",
-  "properties": {
-    "queryParam1": {
-      "type": "string",
-      "title": "query参数1",
-      "titleEn": "queryParam1"
-    }
-  },
-  "required": [
-    "queryParam1"
-  ]
-}
-

以上例子定义了必传Query参数queryParam1

title字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_1

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_2

# 脚本校验

对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。

manager_aggregate_add_6

点击 新增 按钮后弹出脚本配置窗口,如图所示。

manager_aggregate_add_7

脚本类型:可选javascript|groovy,必选;

脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。

举个例子:

// javascript脚本函数名不能修改
-function dyFunc(paramsJsonStr) {
-  // 上下文, 数据结构请参考 context.js
-  var context = JSON.parse(paramsJsonStr)['context'];
-  // common为内置的上下文便捷操作工具类,详情请参考common.js;例如:
-  // var data = common.getStepRespBody(context, 'step2', 'request1', 'data');
-
-  // do something
-  var headerParam1 = common.getInputReqHeader(context, 'headerParam1');
-  var bodyParam1 = common.getInputReqBody(context, 'bodyParam1');
-  var queryParam1 = common.getInputReqParam(context, 'queryParam1');
-  var result = new Array();
-  if (headerParam1 != bodyParam1) {
-    result.push("headerParam1与bodyParam1不一致");
-  }
-  if (queryParam1 != bodyParam1) {
-    result.push("queryParam1与bodyParam1不一致");
-  }
-  if (headerParam1 != queryParam1) {
-    result.push("headerParam1与queryParam1不一致");
-  }
-
-  // 返回结果为Array或Object时要先转为json字符串
-  return JSON.stringify(result);
-}
-
-

以上例子使用javascript编写参数校验,限制入参headerParam1bodyParam1queryParam1必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_script

# 语言配置

聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。

manager_aggregate_add_8

字段:入参字段值,例如input.request.body.languageCode使用请求体参数languageCode的值来决定使用哪种语言;

中文:中文与入参字段值的映射关系,例如配置0,当请求入参字段值为0时使用中文提示校验结果;

英文:英文与入参字段值的映射关系,例如配置1,当请求入参字段值为1时使用中文提示校验结果。

# 配置步骤

聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。

manager_aggregate_add_9

是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;

请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;

默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;

开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;

测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;

预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;

生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;

超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;

Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;

请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。

manager_aggregate_add_10

配置入参:配置调用底层服务接口的请求参数;

配置响应:配置调用底层服务接口的响应内容。

manager_aggregate_add_11

配置步骤结果:配置step执行完成后的响应内容。

# 配置输出

配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_12

manager_aggregate_add_13

# 校验结果

配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_14

校验结果有一个专用的引用值validateMsg,该引用值用于存放入参验证错误提示信息。

# 保存接口

所有配置完成后点击 保存 按钮,完成聚合接口的配置。

manager_aggregate_add_15

# 导出接口

导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_export_1

勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。

manager_aggregate_export_2

点击 确定 按钮,浏览器保存配置文件,如图所示。

manager_aggregate_export_3

# 导入接口

导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_import_1

点击 导入 按钮弹出导入配置窗口,如图所示。

manager_aggregate_import_2

点击 选取文件 按钮后选取要导入的配置文件;

强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;

点击 确定 按钮后导入聚合接口配置。

# 调试模式

调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。

勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_1

点击 确定 按钮确认打开调试模式。

manager_aggregate_debug_mode_2

勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_3

点击 确定 按钮确认关闭调试模式。

manager_aggregate_debug_mode_4

# 编辑接口

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_aggregate_edit_1

manager_aggregate_edit_2

# 删除接口

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_aggregate_delete_1

manager_aggregate_delete_2

点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。

# 发布|下线申请

发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。

点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。

manager_aggregate_apply_1

manager_aggregate_apply_2

点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。

manager_aggregate_apply_3

标题:申请的标题,长度不能超过200个字符,必填;

类型:申请类型,可选发布|下线,必选;

申请原因:申请的原因,长度不能超过2000个字符;

选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;

点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。

manager_aggregate_apply_4

# 接口测试

后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。

manager_aggregate_test_1

跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。

manager_aggregate_test_2

点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。

manager_aggregate_test_3

manager_aggregate_test_4

请求体tab用于配置请求的请求体参数。

manager_aggregate_test_5

请求头tab用于配置请求的请求头参数。

manager_aggregate_test_6

Query参数用于配置请求的Query参数。

manager_aggregate_test_7

返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。

未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。

manager_aggregate_test_8

勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。

manager_aggregate_test_9

测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};

正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};

manager_aggregate_test_10

点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。

manager_aggregate_test_11

标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。

manager_aggregate_test_12

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_aggregate_approve.html b/docs/guide/manager/manager_aggregate_approve.html deleted file mode 100644 index 30c25ff..0000000 --- a/docs/guide/manager/manager_aggregate_approve.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 待审核 | Fizz Gateway - - - - - - - -

# 概述

聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。待审核功能用于审核发布|下线申请,下面介绍待审核功能。

# 审核列表

菜单位置:发布申请 > 待审核。点击菜单后进入审核列表页面,如图所示。

manager_aggregate_approve_list_query

# 审核操作

点击 查看 按钮可以查看发布|下线申请详情,详情页中可执行审核操作。

申请列表页提供快速审核操作,点击 审核 按钮后弹出审核确认窗口,如图所示。

manager_aggregate_approve_op_1

manager_aggregate_approve_op_2

审核结果:勾选通过,审核后申请能可执行申请的操作;勾选不通过,审核后申请失败,申请人不能执行申请的操作。

审核后申请人会收到审核结果邮件通知,如下图是审核通过的邮件通知。

manager_aggregate_approve_op_3

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_aggregate_approve_op_log.html b/docs/guide/manager/manager_aggregate_approve_op_log.html deleted file mode 100644 index f339c39..0000000 --- a/docs/guide/manager/manager_aggregate_approve_op_log.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 审核日志 | Fizz Gateway - - - - - - - - - - - diff --git a/docs/guide/manager/manager_aggregate_my_apply.html b/docs/guide/manager/manager_aggregate_my_apply.html deleted file mode 100644 index 2a711c7..0000000 --- a/docs/guide/manager/manager_aggregate_my_apply.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 我的申请 | Fizz Gateway - - - - - - - -

# 概述

聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作。我的申请功能用于发布|下线申请过程的相关操作,下面介绍我的申请功能。

# 申请列表

菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。

manager_aggregate_my_apply_list_query

# 申请撤回

对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。

manager_aggregate_my_apply_revoke_1

点击 确定 按钮后确认撤回申请,如图所示。

manager_aggregate_my_apply_revoke_2

撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。

manager_aggregate_my_apply_revoke_3

撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。

manager_aggregate_my_apply_revoke_4

点击 确定 按钮后再次提交申请,如图所示。

manager_aggregate_my_apply_revoke_5

# 申请详情

点击 查看 按钮查看申请详情。

manager_aggregate_my_apply_detail_1

manager_aggregate_my_apply_detail_2

操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。

待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。

manager_aggregate_my_apply_detail_3

重新选择审核人后点击 确定 按钮,修改审核人完成。

修改后原审核人会收到邮件提醒无须再处理该申请。

修改后新的审核人会收到邮件提醒需要处理该申请。

审核通过后可以对接口进行发布操作,如图所示。

manager_aggregate_my_apply_detail_4

批量发布:对申请内的接口批量发布推送到Fizz网关。

批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。

对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。

manager_aggregate_my_apply_detail_5

manager_aggregate_my_apply_detail_6

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_aggregate_op_log.html b/docs/guide/manager/manager_aggregate_op_log.html deleted file mode 100644 index 443a4f3..0000000 --- a/docs/guide/manager/manager_aggregate_op_log.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 操作日志 | Fizz Gateway - - - - - - - -

# 概述

管理后台记录了聚合接口的新增、修改、发布、下线、回滚、删除操作日志,通过查看操作日志可以清楚地掌握接口的操作轨迹。操作日志功能提供界面查询聚合接口的操作日志。

# 操作日志列表

菜单位置:服务编排 > 操作日志。点击菜单后进入操作日志列表页面,如图所示。

manager_aggregate_op_log_list_query

# 查看日志详情

点击 查看 按钮弹出操作日志详情页面,如图所示。

manager_aggregate_op_log_detail_1

manager_aggregate_op_log_detail_2

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_api_auth.html b/docs/guide/manager/manager_api_auth.html deleted file mode 100644 index a4f5f61..0000000 --- a/docs/guide/manager/manager_api_auth.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 路由管理 | Fizz Gateway - - - - - - - -

# 概述

路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。下面介绍路由管理的操作。

# 路由列表

菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。

manager_api_auth_list_query

# 新增路由

点击 新增 按钮弹出新增窗口,如图所示。

manager_api_auth_add_1

manager_api_auth_add_2

网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;

服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;

API方法:请求的method类型,可选GET|POST;

API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;

应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;

访问:可选允许|禁止,必选;

转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path。

点击 添加插件 按钮为路由添加插件,如图所示。

manager_api_auth_add_3

配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。

manager_api_auth_add_4

配置完成后点击 保存 按钮保存路由规则。

manager_api_auth_add_5

# 编辑路由

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_api_auth_edit_1

manager_api_auth_edit_2

# 删除路由

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_api_auth_delete_1

manager_api_auth_delete_2

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_app_id.html b/docs/guide/manager/manager_app_id.html deleted file mode 100644 index 3e57c3a..0000000 --- a/docs/guide/manager/manager_app_id.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - appID管理 | Fizz Gateway - - - - - - - -

# 概述

appID管理功能维护应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。appID用于在路由管理配置中关联路由规则,当对应路由规则触发时会对应用进行鉴权。

# appID列表

菜单位置:网关管理 > appID管理。点击菜单后进入appID列表页面,如图所示。

manager_app_id_list_query

# 新增appID

点击 新增 按钮弹出新增窗口,如图所示。

manager_app_id_add_1

manager_app_id_add_2

appID:第三方应用唯一标识,长度不能超过64个字符,必填;

应用名:第三方应用名称,长度不能超过128个字符,必填;

是否启用签名:当启动时必须配置 认证方式 和 密钥;

认证方式:可选 密钥(使用网关内置鉴权方式验证)|自定义认证插件(使用自定义的鉴权逻辑),更多信息请查看Fizz网关的介绍;启用签名时必填;

密钥:第三方应用使用的密钥,可通过 生成随机密钥 按钮生成一个随机的密钥,启用签名时必填;

是否启用IP白名单:当启用时可以配置 IP白名单,网关会根据请求来源IP地址进行过滤;

IP白名单:IP段支持 1.2.3.100-120 和 1.2.3.*两种格式,仅最后一段可用范围或星号表示;

自定义配置:AppID级别的自定义配置供自定义插件使用,所有插件均可获取到此配置信息。

# 编辑appID

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_app_id_edit_1

manager_app_id_edit_2

# 删除appID

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_app_id_delete_1

manager_app_id_delete_2

点击 确定 按钮后删除appID,如果appID存在关联的路由配置时,对应关联的路由配置也会一起删除。

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_gateway_aggregate_cache.html b/docs/guide/manager/manager_gateway_aggregate_cache.html deleted file mode 100644 index 9c05dbe..0000000 --- a/docs/guide/manager/manager_gateway_aggregate_cache.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 网关缓存 | Fizz Gateway - - - - - - - -

# 概述

网关缓存功能用于查询Fizz网关实例本地缓存的已发布接口信息,可以快速的了解当前网关实例生效的全部接口,同时通过查看后台接口发布版本号与网关实例本地缓存的接口版本号是否一致可以排查接口缓存问题,下面介绍网关缓存功能的操作。

# 网关列表

菜单位置:服务编排 > 网关缓存。点击菜单后进入网关列表页面,如图所示。

manager_aggregate_gateway_list_query

Fizz网关与后台注册到同一个eureka注册中心,后台通过eureka获取网关的实例列表。

# 网关缓存列表

点击 查看 按钮后弹出网关详情页面,该页面显示所选网关实例的接口缓存列表,如图所示。

manager_aggregate_gateway_cache_list_query_1

manager_aggregate_gateway_cache_list_query_2

# 网关缓存详情

点击 查看 按钮弹出所选接口的配置详情,如图所示。

manager_aggregate_gateway_cache_detail_1

manager_aggregate_gateway_cache_detail_2

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_gateway_group.html b/docs/guide/manager/manager_gateway_group.html deleted file mode 100644 index ee14bed..0000000 --- a/docs/guide/manager/manager_gateway_group.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 网关分组 | Fizz Gateway - - - - - - - -

# 概述

网关分组功能用于维护分组元数据,将网关实例IP与分组关联,通过为不同的分组配置不同的路由策略,从而实现网关的分组管理。

# 分组示例

我们的线上业务涉及To C(个人用户)、To B(企业)、To T(第三方),对于不同业务会有对应的机器接受请求访问,不同的业务需要有各自的路由策略,因此进行了如下的分组划分。

分组ID 分组名称 描述
default 默认分组 默认分组是后台默认创建的分组,不用指定IP,不属于其它分组的机器都归到默认分组,默认分组不可修改或删除
c 2c分组 只接受面向个人用户的请求
b 2b分组 只接受面向企业的请求
t 面向第三方的分组 只接受面向第三方的请求

下面介绍网关分组功能的操作。

# 分组列表

菜单位置:网关管理 > 网关分组。点击菜单后进入分组列表页面,如图所示。

manager_gateway_group_list_query

# 新增分组

点击 新增 按钮弹出新增窗口,如图所示。

manager_gateway_group_add_1

manager_gateway_group_add_2

分组ID:分组的唯一标识,长度不能超过32个字符,必填;

分组名称:分组的名称,用于在分组选项时展示,长度不能超过32个字符,必填;

网关实例IP:Fizz网关集群内的机器IP地址,多个IP地址使用逗号分隔。

# 编辑分组

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_gateway_group_edit_1

manager_gateway_group_edit_2

# 删除分组

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_gateway_group_delete_1

manager_gateway_group_delete_2

点击 确定 按钮后删除网关分组,如果网关分组存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除分组。

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_overview.html b/docs/guide/manager/manager_overview.html deleted file mode 100644 index 0773d9e..0000000 --- a/docs/guide/manager/manager_overview.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - 管理后台简介 | Fizz Gateway - - - - - - - -

# 概述

Fizz管理后台是Fizz网关的配套系统,基于Java、Vue开发,通过界面对Fizz网关集群进行各项配置。

# 功能

Fizz管理后台包含如下功能:

  • 网关管理 -
    • 网关分组:对Fizz网关集群内的机器进行逻辑上的分组,针对不同的分组可配置不同的路由策略。
    • 插件管理:维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。
    • appID管理:配置应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。
    • 路由管理:配置服务或API路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。
    • 接口统计:Fizz网关接口访问统计功能,以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。
  • 服务编排 -
    • 服务管理:聚合接口归属于服务,服务通过该功能维护,创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。
    • 接口列表:基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口,同时提供在线测试功能,发布历史版本查看。
    • 操作日志:查看聚合接口的新增、修改、发布、下线、回滚、删除操作日志。
    • 网关缓存:查看Fizz网关当前在线的实例列表以及对应实例本地缓存的已发布接口信息。
  • 发布申请 -
    • 我的申请:提交接口发布|下线申请,审核通过后可以对相关接口执行发布|下线操作。
    • 待审核:审核发布|下线申请。
    • 审核日志:查看审核发布|下线申请操作日志。
  • 权限管理 -
    • 角色管理:维护角色数据,为角色分配权限。
  • 系统管理 -
    • 用户管理:维护用户数据,为用户分配角色。

# 界面

manager_overview_1

manager_overview_2

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_plugin.html b/docs/guide/manager/manager_plugin.html deleted file mode 100644 index 9faafcb..0000000 --- a/docs/guide/manager/manager_plugin.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - 插件管理 | Fizz Gateway - - - - - - - -

# 概述

插件管理功能用于维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。创建的插件用于路由管理设置时启用,当网关接受请求匹配路由规则时会触发启用的插件逻辑执行,插件逻辑中可获取到自定义的属性数据。

# 插件列表

菜单位置:网关管理 > 插件管理。点击菜单后进入插件管理列表页面,如图所示。

manager_plugin_list_query

# 新增插件

点击 新增 按钮弹出新增窗口,如图所示。

manager_plugin_add_1

manager_plugin_add_2

插件名称:插件名称由英文字母、下划线或数字组成,不能以数字开头,长度不能超过50个字符,必填;

插件描述:插件的简要描述,长度不能超过50个字符,必填;

默认执行顺序:插件的默认执行顺序,按从小到大排序,值越小越先执行,取值范围0~255,必填;

表单定义:路由级别的自定义属性,在路由管理配置启用插件时前端会将表单定义转化为表单输入界面,更多信息请查看路由管理介绍。表单规范说明如下:

/*
-* plugin_config_design
-* 动态插件参考结构
-* */
-
-const pluginConfig = [
-  {
-	/* 必有字段 */
-	"field": "inputVal",
-	"label": "输入框",
-	"component": "input", // input, select, radio, checkbox,
-	"dataType": "string", // number(long, double), string, boolean, array
-	/* 可选字段 */
-	"desc": "字段的说明文字",
-	"placeholder": "placeholder文字",
-	"default": "Aa123", // 初始默认值
-	"options": [ // for select, radio, checkbox
-	  {
-		"label": "选项1",
-		"value": 1  // number(long, double), string, boolean,
-	  },
-	  {
-		"label": "选项2",
-		"value": 2
-	  }
-	],
-	"rules": [ // min|max / range / length / regex pattern
-	  { "required": true, "message": "输入框不能为空", "trigger": "change" }, // required 必填
-	  // { "min": 3, "ma x": 5, "message": "长度在 3 到 5 个字符", "trigger": "change" }, // range 长度范围(for dataType:"string")
-	  // { "len": 8, "message": "长度需 8 个字符", "trigger": "change" }, // length 长度限制(for dataType:"string")
-	  // { "type": "number", "message": "请输入数字类型"}, // for dataType:"number" 校验数值
-	  // { "type": "integer", "message": "请输入整数数值", "trigger": "change" }, // for dataType:"long" 校验整数
-	  // { "type": "float", "message": "请输入浮点数数值", "trigger": "change" }, // for dataType:"double" 校验浮点数
-	  { "pattern": "^[A-Za-z\\d]+$", "message": "只能是字母或数字", "trigger": "change" } // regex pattern正则
-	]
-  },
-  {
-	"field": "selectVal",
-	"label": "选择器",
-	"component": "select",
-	"dataType": "number",
-	"options": [
-	  {
-		"label": "选项1",
-		"value": 1
-	  },
-	  {
-		"label": "选项2",
-		"value": 2
-	  },
-	  {
-		"label": "选项3",
-		"value": 3
-	  }
-	],
-	"desc": "选择器的说明文字",
-	"placeholder": "请选择",
-	"rules": [
-	  { "required": true, "message": "选择器不能为空", "trigger": "change" }
-	]
-  },
-  {
-	"field": "radioVal",
-	"label": "单选框",
-	"component": "radio",
-	"dataType": "boolean",
-	"default": true,
-	"options": [
-	  {
-		"label": "是",
-		"value": true
-	  },
-	  {
-		"label": "否",
-		"value": false
-	  }
-	],
-	"desc": "单选框的说明文字",
-	"rules": [
-	  { "required": true, "message": "请选择单选框", "trigger": "change" }
-	]
-  },
-  {
-	"field": "checkboxVal",
-	"label": "多选框",
-	"component": "checkbox",
-	"dataType": "array",
-	"options": [
-	  {
-		"label": "选项1",
-		"value": 11
-	  },
-	  {
-		"label": "选项2",
-		"value": 22
-	  },
-	  {
-		"label": "选项3",
-		"value": 33
-	  }
-	],
-	"desc": "多选框的说明文字",
-	"rules": [
-	  { "required": true, "message": "请选择多选框", "trigger": "change" }
-	]
-  }
-];
-
-// TODO 注意!!
-//  组件 "checkbox" 的dataType = "array"
-//  组件 "radio/select" 的实际值类型等于options内的value值类型
-

自定义配置:插件级别的自定义配置信息,插件逻辑中可获取到该信息。

# 编辑插件

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_plugin_edit_1

manager_plugin_edit_2

# 删除插件

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_plugin_delete_1

manager_plugin_delete_2

点击 确定 按钮后删除插件,如果插件存在关联的路由配置时,需要将关联的路由配置全部删除后才能删除插件。

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_role.html b/docs/guide/manager/manager_role.html deleted file mode 100644 index 2329efa..0000000 --- a/docs/guide/manager/manager_role.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 角色管理 | Fizz Gateway - - - - - - - -

# 概述

角色管理功能维护角色元数据,通过配置角色拥有的菜单资源,限制用户只能操作拥有的角色对应的菜单资源,下面介绍角色管理功能的操作。

# 角色列表

菜单位置:权限管理 > 角色管理。点击菜单后进入角色列表页面,如图所示。

manager_role_list_query

# 添加角色

点击 新增 按钮弹出新增窗口,如图所示。

manager_role_add_1

manager_role_add_2

# 权限设置

勾选需要分配权限的角色,点击 权限设置 按钮弹出角色权限配置窗口,如图所示。

manager_role_auth_1

manager_role_auth_2

勾选菜单后点击 确定 按钮确认给角色分配菜单权限。

# 编辑角色

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_role_edit_1

manager_role_edit_2

# 删除角色

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_role_delete_1

manager_role_delete_2

点击 确定 按钮后删除角色。

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_service.html b/docs/guide/manager/manager_service.html deleted file mode 100644 index 185f1b2..0000000 --- a/docs/guide/manager/manager_service.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 服务管理 | Fizz Gateway - - - - - - - -

# 概述

服务管理功能维护服务元数据。服务编排中的服务是一个逻辑上的概念,用于对聚合接口的归类以及权限的分配。Fizz网关聚合接口的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段。

# 服务列表

菜单位置:服务编排 > 服务管理。点击菜单后进入服务列表页面,如图所示。

manager_service_list_query

# 新增服务

点击 新增 按钮弹出新增窗口,如图所示。

manager_service_add_1

manager_service_add_2

服务 ID:服务唯一标识,对应Fizz网关聚合接口请求路径(格式为 http://{ip}:{port}/proxy/{service}{apiPath})的{service}段,长度不能超过200个字符,必填;

服务名:服务名称,用于展示或者选项使用,必填;

团队:团队名称,长度不能超过200个字符;

负责人:负责人名称,长度不能超过200个字符;

描述:服务描述,长度不能超过2000个字符。

# 编辑服务

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_service_edit_1

manager_service_edit_2

# 删除服务

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_service_delete_1

manager_service_delete_2

点击 确定 按钮后删除服务,如果服务存在关联的聚合接口时,需要将关联的聚合接口全部删除后才能删除服务。

# 服务权限分配

点击 权限 按钮弹出权限配置窗口,如图所示。

manager_service_auth_1

manager_service_auth_2

服务创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_source_statistics.html b/docs/guide/manager/manager_source_statistics.html deleted file mode 100644 index 18d2f12..0000000 --- a/docs/guide/manager/manager_source_statistics.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - 接口统计 | Fizz Gateway - - - - - - - -

# 概述

Fizz网关会将访问请求数据(IP地址、网关分组、服务、应用、请求方法、API Path、请求时间)推送到Kafka中,管理后台消费Kafka消息统计接口访问数据。

接口统计功能以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。

# 接口访问统计

菜单位置:网关管理 > 接口统计。点击菜单后进入接口统计页面,如图所示。

manager_source_statistics_1.png

今天接口总数:从0时到当前时刻被调用不同接口的总数;

今天访问次数:从0时到当前时刻访问请求的总次数。

接口总数图表:显示指定时间段内每日被调用不同接口的总数曲线;

访问次数图表:显示指定时间段内每日访问请求的总次数曲线。

# 请求统计

接口统计界面下部为请求统计列表,如图所示。

manager_source_statistics_2.png

来源IP:网关请求的实际入口IP地址;

请求次数:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])历史总请求次数;

最近请求时间:( 唯一[来源IP、网关分组、服务名、请求方法、appID、API Path])最近一次调用时间。

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/manager/manager_user.html b/docs/guide/manager/manager_user.html deleted file mode 100644 index 0940643..0000000 --- a/docs/guide/manager/manager_user.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 用户管理 | Fizz Gateway - - - - - - - -

# 概述

用户管理功能用于维护用户元数据,包括用户信息维护、密码维护、角色配置。

# 用户列表

菜单位置:系统管理 > 用户管理。点击菜单后进入用户列表页面,如图所示。

manager_user_list_query

# 添加用户

点击 新增 按钮弹出新增窗口,如图所示。

manager_user_add_1

manager_user_add_2

电子邮箱:用户用于接收电子邮件的邮箱地址,后台涉及邮件发送业务使用该字段设置的邮箱地址来进行邮箱发送。

# 重置密码

勾选用户后点击 密码重置 按钮可为用户重置密码。

manager_user_reset_password_1

manager_user_reset_password_2

重置后的默认密码为AsdF1234!

# 编辑用户

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_user_edit_1

manager_user_edit_2

# 删除用户

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_user_delete_1

manager_user_delete_2

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/plugin/index.html b/docs/guide/plugin/index.html deleted file mode 100644 index 4a2e599..0000000 --- a/docs/guide/plugin/index.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - 插件开发 | Fizz Gateway - - - - - - - -

# 概述

当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:
-1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;
-2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;
-3、若有多个插件,当前插件可获取前面插件的执行结果。

插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。

# gateway开发

    实现
-    public abstract class PluginFilter {
-        public abstract Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig);
-    }
-    即定义了一个插件。
-    
-    比如
-    @Component(TestPluginFilter.TEST_PLUGIN_FILTER)
-    public class TestPluginFilter extends PluginFilter {
-    
-        private static final Logger log = LoggerFactory.getLogger(TestPluginFilter.class);
-    
-        public  static final String TEST_PLUGIN_FILTER = "testPlugin";
-    
-        @Override
-        public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) {
-            String rid = exchange.getRequest().getId();
-            Boolean logReqId = (Boolean) config.get("logReqId"); // 是否记录请求id日志,可通过manager配置
-            if (logReqId == null || logReqId) {
-                log.info(exchange.getRequest().getURI().toString() + " 的请求id: " + rid);
-            }
-            Boolean appendFizzRsv = (Boolean) config.get("appendFizzRsv");
-            if (appendFizzRsv == null || appendFizzRsv) {
-                WebUtils.appendHeader(exchange, "FIZZ-RSV", rid);
-            }
-            return WebUtils.transmitSuccessFilterResultAndEmptyMono(exchange, TEST_PLUGIN_FILTER, null); // 保存插件执行结果,并返回
-        }
-    }
-    这个插件,插件必须是一个spring的Component(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ-RSV请求头,并且功能是可打开或关闭的。
-    
-    另外可通过:
-    WebUtils.getPrevFilterResult(exchange); 获取上一个插件的执行结果,
-    WebUtils.getFilterResult(exchange, "plugin.id"); 获取已执行的任意一个插件的执行结果。
-

# manager配置

1、定义插件

    在插件表中,定义上面的插件:        
-    INSERT INTO `tb_plugin` (`eng_name`, `chn_name`, `config`, `order`) 
-    VALUES
-    (
-    'testPlugin',
-    '测试插件',
-    '[{\"field\":\"logReqId\",\"label\":\"打印请求id日志\",\"component\":\"radio\",\"dataType\":\"boolean\",\"default\":false,\"options\":[{\"label\":\"是\",\"value\":true},{\"label\":\"否\",\"value\":false}]},{\"field\":\"appendFizzRsv\",\"label\":\"添加fizzRsv请求头\",\"component\":\"radio\",\"dataType\":\"boolean\",\"default\":false,\"options\":[{\"label\":\"是\",\"value\":true},{\"label\":\"否\",\"value\":false}]}]',
-    250
-    );
-
    eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。
-    
-    config:
-    [
-        {
-            "field":"logReqId",
-            "label":"打印请求id日志",
-            "component":"radio",
-            "dataType":"boolean",
-            "default":false,
-            "options":[
-                {
-                    "label":"是",
-                    "value":true
-                },
-                {
-                    "label":"否",
-                    "value":false
-                }
-            ]
-        },
-        {
-            "field":"appendFizzRsv",
-            "label":"添加fizzRsv请求头",
-            "component":"radio",
-            "dataType":"boolean",
-            "default":false,
-            "options":[
-                {
-                    "label":"是",
-                    "value":true
-                },
-                {
-                    "label":"否",
-                    "value":false
-                }
-            ]
-        }
-    ]
-    前端据此生成插件的配置表单,具体参前端说明。
-

2、应用插件

如对 -

接口应用插件: -

上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应

public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) 
-

中config的logReqId和appendFizzRsv key。

上次更新: 2020-11-9 11:50
- - - diff --git a/docs/guide/proxy/index.html b/docs/guide/proxy/index.html deleted file mode 100644 index acbd81d..0000000 --- a/docs/guide/proxy/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - 路由转发 | Fizz Gateway - - - - - - - -

# 路由转发介绍

路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:

  • 支持服务注册与发现
  • 支持负载均衡
  • 支持黑白名单机制
  • 支持配置插件

# 接入路由转发

  • 前提条件:接入Eureka注册中心
  • 开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)
  • 配置访问权限 (管理后台-接口代理-API查询)
上次更新: 2020-9-8 15:3
- - - diff --git a/docs/guide/roadmap/index.html b/docs/guide/roadmap/index.html deleted file mode 100644 index 7225645..0000000 --- a/docs/guide/roadmap/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Roadmap | Fizz Gateway - - - - - - - -

# v1.2.x

  • 支持Nacos注册中心和配置中心
  • 输出服务编排脚本异常信息
  • 支持在服务编排里配置重定向
  • 增加内置的默认common.js
  • 支持接口统计

# v1.3.x

  • 支持接口回调
  • 优先路由配置
  • 支持后台查看日志
  • 优化单机部署

# v1.4.x

  • 支持流控管理(限流,降级,流速等)
  • 支持内容模块插件化
  • 支持动态添加插件
  • 支持使用正则匹配路由

# v1.5.x

  • 支持Docker容器部署
  • 支持MySQL input
  • 发布审核功能使用工作流

# v1.6.x

  • 支持Dubbo
上次更新: 2020-11-24 17:59
- - - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 99b8b71..0000000 --- a/docs/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Fizz Gateway - - - - - - - -

- Fizz网关 -

- 快速构建起基于API的生态体系 -

- 快速开始 -

智能路由

支持服务注册与发现,支持负载均衡,支持配置插件和黑白名单。

服务编排

基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口。减少中间层胶水代码以及降低编码投入

插件机制

强大的插件系统,内置通用常用插件,同时支持自定义插件开发。

- - - diff --git a/docs/manager_aggregate_add_1.png b/docs/manager_aggregate_add_1.png deleted file mode 100644 index 6041352..0000000 Binary files a/docs/manager_aggregate_add_1.png and /dev/null differ diff --git a/docs/manager_aggregate_add_10.png b/docs/manager_aggregate_add_10.png deleted file mode 100644 index ab7293d..0000000 Binary files a/docs/manager_aggregate_add_10.png and /dev/null differ diff --git a/docs/manager_aggregate_add_11.png b/docs/manager_aggregate_add_11.png deleted file mode 100644 index 0b1a51d..0000000 Binary files a/docs/manager_aggregate_add_11.png and /dev/null differ diff --git a/docs/manager_aggregate_add_12.png b/docs/manager_aggregate_add_12.png deleted file mode 100644 index a7017b2..0000000 Binary files a/docs/manager_aggregate_add_12.png and /dev/null differ diff --git a/docs/manager_aggregate_add_13.png b/docs/manager_aggregate_add_13.png deleted file mode 100644 index aa3f205..0000000 Binary files a/docs/manager_aggregate_add_13.png and /dev/null differ diff --git a/docs/manager_aggregate_add_14.png b/docs/manager_aggregate_add_14.png deleted file mode 100644 index 28f02f7..0000000 Binary files a/docs/manager_aggregate_add_14.png and /dev/null differ diff --git a/docs/manager_aggregate_add_15.png b/docs/manager_aggregate_add_15.png deleted file mode 100644 index 66d9225..0000000 Binary files a/docs/manager_aggregate_add_15.png and /dev/null differ diff --git a/docs/manager_aggregate_add_2.png b/docs/manager_aggregate_add_2.png deleted file mode 100644 index 77fdf91..0000000 Binary files a/docs/manager_aggregate_add_2.png and /dev/null differ diff --git a/docs/manager_aggregate_add_3.png b/docs/manager_aggregate_add_3.png deleted file mode 100644 index 2c377d6..0000000 Binary files a/docs/manager_aggregate_add_3.png and /dev/null differ diff --git a/docs/manager_aggregate_add_4.png b/docs/manager_aggregate_add_4.png deleted file mode 100644 index 46a935b..0000000 Binary files a/docs/manager_aggregate_add_4.png and /dev/null differ diff --git a/docs/manager_aggregate_add_5.png b/docs/manager_aggregate_add_5.png deleted file mode 100644 index 8e101c6..0000000 Binary files a/docs/manager_aggregate_add_5.png and /dev/null differ diff --git a/docs/manager_aggregate_add_6.png b/docs/manager_aggregate_add_6.png deleted file mode 100644 index 32fb14e..0000000 Binary files a/docs/manager_aggregate_add_6.png and /dev/null differ diff --git a/docs/manager_aggregate_add_7.png b/docs/manager_aggregate_add_7.png deleted file mode 100644 index 735641e..0000000 Binary files a/docs/manager_aggregate_add_7.png and /dev/null differ diff --git a/docs/manager_aggregate_add_8.png b/docs/manager_aggregate_add_8.png deleted file mode 100644 index 0c55dbc..0000000 Binary files a/docs/manager_aggregate_add_8.png and /dev/null differ diff --git a/docs/manager_aggregate_add_9.png b/docs/manager_aggregate_add_9.png deleted file mode 100644 index a416688..0000000 Binary files a/docs/manager_aggregate_add_9.png and /dev/null differ diff --git a/docs/manager_aggregate_add_input_body_1.png b/docs/manager_aggregate_add_input_body_1.png deleted file mode 100644 index e34fa58..0000000 Binary files a/docs/manager_aggregate_add_input_body_1.png and /dev/null differ diff --git a/docs/manager_aggregate_add_input_body_2.png b/docs/manager_aggregate_add_input_body_2.png deleted file mode 100644 index 0d23459..0000000 Binary files a/docs/manager_aggregate_add_input_body_2.png and /dev/null differ diff --git a/docs/manager_aggregate_add_input_header_1.png b/docs/manager_aggregate_add_input_header_1.png deleted file mode 100644 index 7b40898..0000000 Binary files a/docs/manager_aggregate_add_input_header_1.png and /dev/null differ diff --git a/docs/manager_aggregate_add_input_header_2.png b/docs/manager_aggregate_add_input_header_2.png deleted file mode 100644 index 357195c..0000000 Binary files a/docs/manager_aggregate_add_input_header_2.png and /dev/null differ diff --git a/docs/manager_aggregate_add_input_query_1.png b/docs/manager_aggregate_add_input_query_1.png deleted file mode 100644 index acc5077..0000000 Binary files a/docs/manager_aggregate_add_input_query_1.png and /dev/null differ diff --git a/docs/manager_aggregate_add_input_query_2.png b/docs/manager_aggregate_add_input_query_2.png deleted file mode 100644 index e520bfb..0000000 Binary files a/docs/manager_aggregate_add_input_query_2.png and /dev/null differ diff --git a/docs/manager_aggregate_add_input_script.png b/docs/manager_aggregate_add_input_script.png deleted file mode 100644 index 4f4eb3e..0000000 Binary files a/docs/manager_aggregate_add_input_script.png and /dev/null differ diff --git a/docs/manager_aggregate_apply_1.png b/docs/manager_aggregate_apply_1.png deleted file mode 100644 index 2cc2f06..0000000 Binary files a/docs/manager_aggregate_apply_1.png and /dev/null differ diff --git a/docs/manager_aggregate_apply_2.png b/docs/manager_aggregate_apply_2.png deleted file mode 100644 index 65ff714..0000000 Binary files a/docs/manager_aggregate_apply_2.png and /dev/null differ diff --git a/docs/manager_aggregate_apply_3.png b/docs/manager_aggregate_apply_3.png deleted file mode 100644 index 1e5a70f..0000000 Binary files a/docs/manager_aggregate_apply_3.png and /dev/null differ diff --git a/docs/manager_aggregate_apply_4.png b/docs/manager_aggregate_apply_4.png deleted file mode 100644 index dcb4ac3..0000000 Binary files a/docs/manager_aggregate_apply_4.png and /dev/null differ diff --git a/docs/manager_aggregate_approve_list_query.png b/docs/manager_aggregate_approve_list_query.png deleted file mode 100644 index 2584cd9..0000000 Binary files a/docs/manager_aggregate_approve_list_query.png and /dev/null differ diff --git a/docs/manager_aggregate_approve_op_1.png b/docs/manager_aggregate_approve_op_1.png deleted file mode 100644 index 8c40f21..0000000 Binary files a/docs/manager_aggregate_approve_op_1.png and /dev/null differ diff --git a/docs/manager_aggregate_approve_op_2.png b/docs/manager_aggregate_approve_op_2.png deleted file mode 100644 index ec6e954..0000000 Binary files a/docs/manager_aggregate_approve_op_2.png and /dev/null differ diff --git a/docs/manager_aggregate_approve_op_3.png b/docs/manager_aggregate_approve_op_3.png deleted file mode 100644 index fc87e17..0000000 Binary files a/docs/manager_aggregate_approve_op_3.png and /dev/null differ diff --git a/docs/manager_aggregate_approve_op_log_detail_1.png b/docs/manager_aggregate_approve_op_log_detail_1.png deleted file mode 100644 index aed288e..0000000 Binary files a/docs/manager_aggregate_approve_op_log_detail_1.png and /dev/null differ diff --git a/docs/manager_aggregate_approve_op_log_detail_2.png b/docs/manager_aggregate_approve_op_log_detail_2.png deleted file mode 100644 index 12b9fb2..0000000 Binary files a/docs/manager_aggregate_approve_op_log_detail_2.png and /dev/null differ diff --git a/docs/manager_aggregate_approve_op_log_list_query.png b/docs/manager_aggregate_approve_op_log_list_query.png deleted file mode 100644 index 9325638..0000000 Binary files a/docs/manager_aggregate_approve_op_log_list_query.png and /dev/null differ diff --git a/docs/manager_aggregate_debug_mode_1.png b/docs/manager_aggregate_debug_mode_1.png deleted file mode 100644 index 05790e1..0000000 Binary files a/docs/manager_aggregate_debug_mode_1.png and /dev/null differ diff --git a/docs/manager_aggregate_debug_mode_2.png b/docs/manager_aggregate_debug_mode_2.png deleted file mode 100644 index 45be5a9..0000000 Binary files a/docs/manager_aggregate_debug_mode_2.png and /dev/null differ diff --git a/docs/manager_aggregate_debug_mode_3.png b/docs/manager_aggregate_debug_mode_3.png deleted file mode 100644 index 198f4f3..0000000 Binary files a/docs/manager_aggregate_debug_mode_3.png and /dev/null differ diff --git a/docs/manager_aggregate_debug_mode_4.png b/docs/manager_aggregate_debug_mode_4.png deleted file mode 100644 index e0479c8..0000000 Binary files a/docs/manager_aggregate_debug_mode_4.png and /dev/null differ diff --git a/docs/manager_aggregate_delete_1.png b/docs/manager_aggregate_delete_1.png deleted file mode 100644 index 70ee50e..0000000 Binary files a/docs/manager_aggregate_delete_1.png and /dev/null differ diff --git a/docs/manager_aggregate_delete_2.png b/docs/manager_aggregate_delete_2.png deleted file mode 100644 index 86d597d..0000000 Binary files a/docs/manager_aggregate_delete_2.png and /dev/null differ diff --git a/docs/manager_aggregate_edit_1.png b/docs/manager_aggregate_edit_1.png deleted file mode 100644 index 1244b82..0000000 Binary files a/docs/manager_aggregate_edit_1.png and /dev/null differ diff --git a/docs/manager_aggregate_edit_2.png b/docs/manager_aggregate_edit_2.png deleted file mode 100644 index 2905092..0000000 Binary files a/docs/manager_aggregate_edit_2.png and /dev/null differ diff --git a/docs/manager_aggregate_export_1.png b/docs/manager_aggregate_export_1.png deleted file mode 100644 index e785657..0000000 Binary files a/docs/manager_aggregate_export_1.png and /dev/null differ diff --git a/docs/manager_aggregate_export_2.png b/docs/manager_aggregate_export_2.png deleted file mode 100644 index b785eb8..0000000 Binary files a/docs/manager_aggregate_export_2.png and /dev/null differ diff --git a/docs/manager_aggregate_export_3.png b/docs/manager_aggregate_export_3.png deleted file mode 100644 index e049b95..0000000 Binary files a/docs/manager_aggregate_export_3.png and /dev/null differ diff --git a/docs/manager_aggregate_gateway_cache_detail_1.png b/docs/manager_aggregate_gateway_cache_detail_1.png deleted file mode 100644 index 584a58a..0000000 Binary files a/docs/manager_aggregate_gateway_cache_detail_1.png and /dev/null differ diff --git a/docs/manager_aggregate_gateway_cache_detail_2.png b/docs/manager_aggregate_gateway_cache_detail_2.png deleted file mode 100644 index 46d293b..0000000 Binary files a/docs/manager_aggregate_gateway_cache_detail_2.png and /dev/null differ diff --git a/docs/manager_aggregate_gateway_cache_list_query_1.png b/docs/manager_aggregate_gateway_cache_list_query_1.png deleted file mode 100644 index a7b26d3..0000000 Binary files a/docs/manager_aggregate_gateway_cache_list_query_1.png and /dev/null differ diff --git a/docs/manager_aggregate_gateway_cache_list_query_2.png b/docs/manager_aggregate_gateway_cache_list_query_2.png deleted file mode 100644 index 2a861ea..0000000 Binary files a/docs/manager_aggregate_gateway_cache_list_query_2.png and /dev/null differ diff --git a/docs/manager_aggregate_gateway_list_query.png b/docs/manager_aggregate_gateway_list_query.png deleted file mode 100644 index b093a3b..0000000 Binary files a/docs/manager_aggregate_gateway_list_query.png and /dev/null differ diff --git a/docs/manager_aggregate_import_1.png b/docs/manager_aggregate_import_1.png deleted file mode 100644 index 800ea68..0000000 Binary files a/docs/manager_aggregate_import_1.png and /dev/null differ diff --git a/docs/manager_aggregate_import_2.png b/docs/manager_aggregate_import_2.png deleted file mode 100644 index 5550600..0000000 Binary files a/docs/manager_aggregate_import_2.png and /dev/null differ diff --git a/docs/manager_aggregate_list_query.png b/docs/manager_aggregate_list_query.png deleted file mode 100644 index cb5416f..0000000 Binary files a/docs/manager_aggregate_list_query.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_detail_1.png b/docs/manager_aggregate_my_apply_detail_1.png deleted file mode 100644 index 89493d9..0000000 Binary files a/docs/manager_aggregate_my_apply_detail_1.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_detail_2.png b/docs/manager_aggregate_my_apply_detail_2.png deleted file mode 100644 index af3d90f..0000000 Binary files a/docs/manager_aggregate_my_apply_detail_2.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_detail_3.png b/docs/manager_aggregate_my_apply_detail_3.png deleted file mode 100644 index 286ad50..0000000 Binary files a/docs/manager_aggregate_my_apply_detail_3.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_detail_4.png b/docs/manager_aggregate_my_apply_detail_4.png deleted file mode 100644 index e61f5fb..0000000 Binary files a/docs/manager_aggregate_my_apply_detail_4.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_detail_5.png b/docs/manager_aggregate_my_apply_detail_5.png deleted file mode 100644 index 63541e7..0000000 Binary files a/docs/manager_aggregate_my_apply_detail_5.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_detail_6.png b/docs/manager_aggregate_my_apply_detail_6.png deleted file mode 100644 index a48075a..0000000 Binary files a/docs/manager_aggregate_my_apply_detail_6.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_list_query.png b/docs/manager_aggregate_my_apply_list_query.png deleted file mode 100644 index 9e82fb1..0000000 Binary files a/docs/manager_aggregate_my_apply_list_query.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_revoke_1.png b/docs/manager_aggregate_my_apply_revoke_1.png deleted file mode 100644 index 75bc28c..0000000 Binary files a/docs/manager_aggregate_my_apply_revoke_1.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_revoke_2.png b/docs/manager_aggregate_my_apply_revoke_2.png deleted file mode 100644 index 55ccb9d..0000000 Binary files a/docs/manager_aggregate_my_apply_revoke_2.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_revoke_3.png b/docs/manager_aggregate_my_apply_revoke_3.png deleted file mode 100644 index 0e22434..0000000 Binary files a/docs/manager_aggregate_my_apply_revoke_3.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_revoke_4.png b/docs/manager_aggregate_my_apply_revoke_4.png deleted file mode 100644 index d6302a8..0000000 Binary files a/docs/manager_aggregate_my_apply_revoke_4.png and /dev/null differ diff --git a/docs/manager_aggregate_my_apply_revoke_5.png b/docs/manager_aggregate_my_apply_revoke_5.png deleted file mode 100644 index 08fc1ee..0000000 Binary files a/docs/manager_aggregate_my_apply_revoke_5.png and /dev/null differ diff --git a/docs/manager_aggregate_op_log_detail_1.png b/docs/manager_aggregate_op_log_detail_1.png deleted file mode 100644 index de2d35e..0000000 Binary files a/docs/manager_aggregate_op_log_detail_1.png and /dev/null differ diff --git a/docs/manager_aggregate_op_log_detail_2.png b/docs/manager_aggregate_op_log_detail_2.png deleted file mode 100644 index 09e7086..0000000 Binary files a/docs/manager_aggregate_op_log_detail_2.png and /dev/null differ diff --git a/docs/manager_aggregate_op_log_list_query.png b/docs/manager_aggregate_op_log_list_query.png deleted file mode 100644 index 9db6e84..0000000 Binary files a/docs/manager_aggregate_op_log_list_query.png and /dev/null differ diff --git a/docs/manager_aggregate_test_1.png b/docs/manager_aggregate_test_1.png deleted file mode 100644 index b2b9658..0000000 Binary files a/docs/manager_aggregate_test_1.png and /dev/null differ diff --git a/docs/manager_aggregate_test_10.png b/docs/manager_aggregate_test_10.png deleted file mode 100644 index 2adee66..0000000 Binary files a/docs/manager_aggregate_test_10.png and /dev/null differ diff --git a/docs/manager_aggregate_test_11.png b/docs/manager_aggregate_test_11.png deleted file mode 100644 index b74df26..0000000 Binary files a/docs/manager_aggregate_test_11.png and /dev/null differ diff --git a/docs/manager_aggregate_test_12.png b/docs/manager_aggregate_test_12.png deleted file mode 100644 index 62b4e16..0000000 Binary files a/docs/manager_aggregate_test_12.png and /dev/null differ diff --git a/docs/manager_aggregate_test_2.png b/docs/manager_aggregate_test_2.png deleted file mode 100644 index 64b7ff2..0000000 Binary files a/docs/manager_aggregate_test_2.png and /dev/null differ diff --git a/docs/manager_aggregate_test_3.png b/docs/manager_aggregate_test_3.png deleted file mode 100644 index 023e254..0000000 Binary files a/docs/manager_aggregate_test_3.png and /dev/null differ diff --git a/docs/manager_aggregate_test_4.png b/docs/manager_aggregate_test_4.png deleted file mode 100644 index 3db699a..0000000 Binary files a/docs/manager_aggregate_test_4.png and /dev/null differ diff --git a/docs/manager_aggregate_test_5.png b/docs/manager_aggregate_test_5.png deleted file mode 100644 index 20ed473..0000000 Binary files a/docs/manager_aggregate_test_5.png and /dev/null differ diff --git a/docs/manager_aggregate_test_6.png b/docs/manager_aggregate_test_6.png deleted file mode 100644 index 8c710aa..0000000 Binary files a/docs/manager_aggregate_test_6.png and /dev/null differ diff --git a/docs/manager_aggregate_test_7.png b/docs/manager_aggregate_test_7.png deleted file mode 100644 index 5c63539..0000000 Binary files a/docs/manager_aggregate_test_7.png and /dev/null differ diff --git a/docs/manager_aggregate_test_8.png b/docs/manager_aggregate_test_8.png deleted file mode 100644 index 86a5dbf..0000000 Binary files a/docs/manager_aggregate_test_8.png and /dev/null differ diff --git a/docs/manager_aggregate_test_9.png b/docs/manager_aggregate_test_9.png deleted file mode 100644 index 835639e..0000000 Binary files a/docs/manager_aggregate_test_9.png and /dev/null differ diff --git a/docs/manager_api_auth_add_1.png b/docs/manager_api_auth_add_1.png deleted file mode 100644 index 02663cd..0000000 Binary files a/docs/manager_api_auth_add_1.png and /dev/null differ diff --git a/docs/manager_api_auth_add_2.png b/docs/manager_api_auth_add_2.png deleted file mode 100644 index 78a7344..0000000 Binary files a/docs/manager_api_auth_add_2.png and /dev/null differ diff --git a/docs/manager_api_auth_add_3.png b/docs/manager_api_auth_add_3.png deleted file mode 100644 index 13b8db3..0000000 Binary files a/docs/manager_api_auth_add_3.png and /dev/null differ diff --git a/docs/manager_api_auth_add_4.png b/docs/manager_api_auth_add_4.png deleted file mode 100644 index 33d3ba3..0000000 Binary files a/docs/manager_api_auth_add_4.png and /dev/null differ diff --git a/docs/manager_api_auth_add_5.png b/docs/manager_api_auth_add_5.png deleted file mode 100644 index 2bdeb9a..0000000 Binary files a/docs/manager_api_auth_add_5.png and /dev/null differ diff --git a/docs/manager_api_auth_delete_1.png b/docs/manager_api_auth_delete_1.png deleted file mode 100644 index 22e38ac..0000000 Binary files a/docs/manager_api_auth_delete_1.png and /dev/null differ diff --git a/docs/manager_api_auth_delete_2.png b/docs/manager_api_auth_delete_2.png deleted file mode 100644 index 8043c05..0000000 Binary files a/docs/manager_api_auth_delete_2.png and /dev/null differ diff --git a/docs/manager_api_auth_edit_1.png b/docs/manager_api_auth_edit_1.png deleted file mode 100644 index 8922df5..0000000 Binary files a/docs/manager_api_auth_edit_1.png and /dev/null differ diff --git a/docs/manager_api_auth_edit_2.png b/docs/manager_api_auth_edit_2.png deleted file mode 100644 index 666e471..0000000 Binary files a/docs/manager_api_auth_edit_2.png and /dev/null differ diff --git a/docs/manager_api_auth_list_query.png b/docs/manager_api_auth_list_query.png deleted file mode 100644 index f9aa0bd..0000000 Binary files a/docs/manager_api_auth_list_query.png and /dev/null differ diff --git a/docs/manager_app_id_add_1.png b/docs/manager_app_id_add_1.png deleted file mode 100644 index bee8a07..0000000 Binary files a/docs/manager_app_id_add_1.png and /dev/null differ diff --git a/docs/manager_app_id_add_2.png b/docs/manager_app_id_add_2.png deleted file mode 100644 index 30ff412..0000000 Binary files a/docs/manager_app_id_add_2.png and /dev/null differ diff --git a/docs/manager_app_id_delete_1.png b/docs/manager_app_id_delete_1.png deleted file mode 100644 index c80ae6d..0000000 Binary files a/docs/manager_app_id_delete_1.png and /dev/null differ diff --git a/docs/manager_app_id_delete_2.png b/docs/manager_app_id_delete_2.png deleted file mode 100644 index 1002250..0000000 Binary files a/docs/manager_app_id_delete_2.png and /dev/null differ diff --git a/docs/manager_app_id_edit_1.png b/docs/manager_app_id_edit_1.png deleted file mode 100644 index 69ee38e..0000000 Binary files a/docs/manager_app_id_edit_1.png and /dev/null differ diff --git a/docs/manager_app_id_edit_2.png b/docs/manager_app_id_edit_2.png deleted file mode 100644 index 1ca5a58..0000000 Binary files a/docs/manager_app_id_edit_2.png and /dev/null differ diff --git a/docs/manager_app_id_list_query.png b/docs/manager_app_id_list_query.png deleted file mode 100644 index b038ed2..0000000 Binary files a/docs/manager_app_id_list_query.png and /dev/null differ diff --git a/docs/manager_gateway_group_add_1.png b/docs/manager_gateway_group_add_1.png deleted file mode 100644 index 654b0bf..0000000 Binary files a/docs/manager_gateway_group_add_1.png and /dev/null differ diff --git a/docs/manager_gateway_group_add_2.png b/docs/manager_gateway_group_add_2.png deleted file mode 100644 index 2798120..0000000 Binary files a/docs/manager_gateway_group_add_2.png and /dev/null differ diff --git a/docs/manager_gateway_group_delete_1.png b/docs/manager_gateway_group_delete_1.png deleted file mode 100644 index 3e5170a..0000000 Binary files a/docs/manager_gateway_group_delete_1.png and /dev/null differ diff --git a/docs/manager_gateway_group_delete_2.png b/docs/manager_gateway_group_delete_2.png deleted file mode 100644 index ef0ca72..0000000 Binary files a/docs/manager_gateway_group_delete_2.png and /dev/null differ diff --git a/docs/manager_gateway_group_edit_1.png b/docs/manager_gateway_group_edit_1.png deleted file mode 100644 index b37b868..0000000 Binary files a/docs/manager_gateway_group_edit_1.png and /dev/null differ diff --git a/docs/manager_gateway_group_edit_2.png b/docs/manager_gateway_group_edit_2.png deleted file mode 100644 index 2f6b253..0000000 Binary files a/docs/manager_gateway_group_edit_2.png and /dev/null differ diff --git a/docs/manager_gateway_group_list_query.png b/docs/manager_gateway_group_list_query.png deleted file mode 100644 index 9ecc87e..0000000 Binary files a/docs/manager_gateway_group_list_query.png and /dev/null differ diff --git a/docs/manager_overview_1.png b/docs/manager_overview_1.png deleted file mode 100644 index 5e4cce8..0000000 Binary files a/docs/manager_overview_1.png and /dev/null differ diff --git a/docs/manager_overview_2.png b/docs/manager_overview_2.png deleted file mode 100644 index fdd4ab7..0000000 Binary files a/docs/manager_overview_2.png and /dev/null differ diff --git a/docs/manager_plugin_add_1.png b/docs/manager_plugin_add_1.png deleted file mode 100644 index 8a80fb3..0000000 Binary files a/docs/manager_plugin_add_1.png and /dev/null differ diff --git a/docs/manager_plugin_add_2.png b/docs/manager_plugin_add_2.png deleted file mode 100644 index 0f700a9..0000000 Binary files a/docs/manager_plugin_add_2.png and /dev/null differ diff --git a/docs/manager_plugin_delete_1.png b/docs/manager_plugin_delete_1.png deleted file mode 100644 index bda77fc..0000000 Binary files a/docs/manager_plugin_delete_1.png and /dev/null differ diff --git a/docs/manager_plugin_delete_2.png b/docs/manager_plugin_delete_2.png deleted file mode 100644 index a2e9473..0000000 Binary files a/docs/manager_plugin_delete_2.png and /dev/null differ diff --git a/docs/manager_plugin_edit_1.png b/docs/manager_plugin_edit_1.png deleted file mode 100644 index bbc22c1..0000000 Binary files a/docs/manager_plugin_edit_1.png and /dev/null differ diff --git a/docs/manager_plugin_edit_2.png b/docs/manager_plugin_edit_2.png deleted file mode 100644 index 828787a..0000000 Binary files a/docs/manager_plugin_edit_2.png and /dev/null differ diff --git a/docs/manager_plugin_list_query.png b/docs/manager_plugin_list_query.png deleted file mode 100644 index 2346eb3..0000000 Binary files a/docs/manager_plugin_list_query.png and /dev/null differ diff --git a/docs/manager_role_add_1.png b/docs/manager_role_add_1.png deleted file mode 100644 index 4aa55ee..0000000 Binary files a/docs/manager_role_add_1.png and /dev/null differ diff --git a/docs/manager_role_add_2.png b/docs/manager_role_add_2.png deleted file mode 100644 index 61ba935..0000000 Binary files a/docs/manager_role_add_2.png and /dev/null differ diff --git a/docs/manager_role_auth_1.png b/docs/manager_role_auth_1.png deleted file mode 100644 index 70076bd..0000000 Binary files a/docs/manager_role_auth_1.png and /dev/null differ diff --git a/docs/manager_role_auth_2.png b/docs/manager_role_auth_2.png deleted file mode 100644 index 398b298..0000000 Binary files a/docs/manager_role_auth_2.png and /dev/null differ diff --git a/docs/manager_role_delete_1.png b/docs/manager_role_delete_1.png deleted file mode 100644 index 6f854e5..0000000 Binary files a/docs/manager_role_delete_1.png and /dev/null differ diff --git a/docs/manager_role_delete_2.png b/docs/manager_role_delete_2.png deleted file mode 100644 index 998b2c2..0000000 Binary files a/docs/manager_role_delete_2.png and /dev/null differ diff --git a/docs/manager_role_edit_1.png b/docs/manager_role_edit_1.png deleted file mode 100644 index 58dc3b4..0000000 Binary files a/docs/manager_role_edit_1.png and /dev/null differ diff --git a/docs/manager_role_edit_2.png b/docs/manager_role_edit_2.png deleted file mode 100644 index 0677d93..0000000 Binary files a/docs/manager_role_edit_2.png and /dev/null differ diff --git a/docs/manager_role_list_query.png b/docs/manager_role_list_query.png deleted file mode 100644 index 9729783..0000000 Binary files a/docs/manager_role_list_query.png and /dev/null differ diff --git a/docs/manager_service_add_1.png b/docs/manager_service_add_1.png deleted file mode 100644 index 71806d4..0000000 Binary files a/docs/manager_service_add_1.png and /dev/null differ diff --git a/docs/manager_service_add_2.png b/docs/manager_service_add_2.png deleted file mode 100644 index 4ebe681..0000000 Binary files a/docs/manager_service_add_2.png and /dev/null differ diff --git a/docs/manager_service_auth_1.png b/docs/manager_service_auth_1.png deleted file mode 100644 index 9d78dde..0000000 Binary files a/docs/manager_service_auth_1.png and /dev/null differ diff --git a/docs/manager_service_auth_2.png b/docs/manager_service_auth_2.png deleted file mode 100644 index cd7ede7..0000000 Binary files a/docs/manager_service_auth_2.png and /dev/null differ diff --git a/docs/manager_service_delete_1.png b/docs/manager_service_delete_1.png deleted file mode 100644 index f8c3abc..0000000 Binary files a/docs/manager_service_delete_1.png and /dev/null differ diff --git a/docs/manager_service_delete_2.png b/docs/manager_service_delete_2.png deleted file mode 100644 index 3e65628..0000000 Binary files a/docs/manager_service_delete_2.png and /dev/null differ diff --git a/docs/manager_service_edit_1.png b/docs/manager_service_edit_1.png deleted file mode 100644 index 2bcc623..0000000 Binary files a/docs/manager_service_edit_1.png and /dev/null differ diff --git a/docs/manager_service_edit_2.png b/docs/manager_service_edit_2.png deleted file mode 100644 index 5c345fc..0000000 Binary files a/docs/manager_service_edit_2.png and /dev/null differ diff --git a/docs/manager_service_list_query.png b/docs/manager_service_list_query.png deleted file mode 100644 index 3b762cf..0000000 Binary files a/docs/manager_service_list_query.png and /dev/null differ diff --git a/docs/manager_source_statistics_1.png b/docs/manager_source_statistics_1.png deleted file mode 100644 index 8873e80..0000000 Binary files a/docs/manager_source_statistics_1.png and /dev/null differ diff --git a/docs/manager_source_statistics_2.png b/docs/manager_source_statistics_2.png deleted file mode 100644 index aced270..0000000 Binary files a/docs/manager_source_statistics_2.png and /dev/null differ diff --git a/docs/manager_user_add_1.png b/docs/manager_user_add_1.png deleted file mode 100644 index 2827108..0000000 Binary files a/docs/manager_user_add_1.png and /dev/null differ diff --git a/docs/manager_user_add_2.png b/docs/manager_user_add_2.png deleted file mode 100644 index 7ac623a..0000000 Binary files a/docs/manager_user_add_2.png and /dev/null differ diff --git a/docs/manager_user_delete_1.png b/docs/manager_user_delete_1.png deleted file mode 100644 index 4638f5d..0000000 Binary files a/docs/manager_user_delete_1.png and /dev/null differ diff --git a/docs/manager_user_delete_2.png b/docs/manager_user_delete_2.png deleted file mode 100644 index 95cf5a3..0000000 Binary files a/docs/manager_user_delete_2.png and /dev/null differ diff --git a/docs/manager_user_edit_1.png b/docs/manager_user_edit_1.png deleted file mode 100644 index 2424aaf..0000000 Binary files a/docs/manager_user_edit_1.png and /dev/null differ diff --git a/docs/manager_user_edit_2.png b/docs/manager_user_edit_2.png deleted file mode 100644 index 353720f..0000000 Binary files a/docs/manager_user_edit_2.png and /dev/null differ diff --git a/docs/manager_user_list_query.png b/docs/manager_user_list_query.png deleted file mode 100644 index 74bd861..0000000 Binary files a/docs/manager_user_list_query.png and /dev/null differ diff --git a/docs/manager_user_reset_password_1.png b/docs/manager_user_reset_password_1.png deleted file mode 100644 index 394ebf1..0000000 Binary files a/docs/manager_user_reset_password_1.png and /dev/null differ diff --git a/docs/manager_user_reset_password_2.png b/docs/manager_user_reset_password_2.png deleted file mode 100644 index a2ed18b..0000000 Binary files a/docs/manager_user_reset_password_2.png and /dev/null differ diff --git a/docs/test-plugin.png b/docs/test-plugin.png deleted file mode 100644 index 75c070d..0000000 Binary files a/docs/test-plugin.png and /dev/null differ diff --git a/docs/ui_intro_aggr1.png b/docs/ui_intro_aggr1.png deleted file mode 100644 index 93ac5d0..0000000 Binary files a/docs/ui_intro_aggr1.png and /dev/null differ diff --git a/docs/ui_intro_aggr2.png b/docs/ui_intro_aggr2.png deleted file mode 100644 index 812d074..0000000 Binary files a/docs/ui_intro_aggr2.png and /dev/null differ diff --git a/docs/ui_intro_appid.png b/docs/ui_intro_appid.png deleted file mode 100644 index 0ef9ca7..0000000 Binary files a/docs/ui_intro_appid.png and /dev/null differ diff --git a/docs/ui_intro_plugin.png b/docs/ui_intro_plugin.png deleted file mode 100644 index 3f75a80..0000000 Binary files a/docs/ui_intro_plugin.png and /dev/null differ diff --git a/docs/ui_intro_route.png b/docs/ui_intro_route.png deleted file mode 100644 index 094ca69..0000000 Binary files a/docs/ui_intro_route.png and /dev/null differ diff --git a/docs/xapi.png b/docs/xapi.png deleted file mode 100644 index ea2591a..0000000 Binary files a/docs/xapi.png and /dev/null differ diff --git a/fizz-spring-boot-starter/pom.xml b/fizz-spring-boot-starter/pom.xml index 7f69171..7a410b9 100644 --- a/fizz-spring-boot-starter/pom.xml +++ b/fizz-spring-boot-starter/pom.xml @@ -2,35 +2,18 @@ + + fizz-gateway-community + we + 1.5.0 + ../pom.xml + 4.0.0 - - - 1.5.0 - 2.2.13.RELEASE - 5.2.13.RELEASE - Dysprosium-SR18 - 5.3.6.RELEASE - 0.2.7 - 4.1.63.Final - 4.4.14 - 2.13.3 - 2.7.5 - 1.16.1 - 3.4.6 - 4.0.1 - 3.5.9 - - - - org.springframework.boot - spring-boot-starter-parent - 2.2.13.RELEASE - - - we fizz-spring-boot-starter - 1.5.0 + + +